【问题标题】:Rivescript: Using Keyword Triggers in Conditional ResponsesRivescript:在条件响应中使用关键字触发器
【发布时间】:2019-02-11 07:24:55
【问题描述】:

我正在使用 Rivescript 开发聊天机器人,并尝试在条件响应中使用关键字触发器。

在网站上的tutorial中,有说明可以使用...

[*] 用于忽略部分消息的选项...

这在初始提示 + [*] you [*] 中运行良好,但是当我尝试使用此方法捕获包含 yesno 作为条件响应的一部分的 任何 响应时,它似乎打破它?我没有收到错误代码,但它只是默认为- So, back to the matter at hand... 作为响应。

  + [*] you [*]
  - Oh, so we're talking about me now?

  + *
  % oh so we are talking about me now
  * <star> == [*] no [*]  => Whatever...
  * <star> == [*] yes [*] => This should be fun.{topic=myself}
  - So, back to the matter at hand...

如果这行得通,我希望对话能够进行,例如:

User: What do you do?
Bot: Oh, so we're talking about me now?
User: Yes, I suppose so
Bot: This should be fun.

那么,有没有什么方法可以在没有显式用户输入的情况下使用条件响应?而是一个仅包含某种响应的?我想这是在两种情况下使用* 的问题,既作为&lt;star&gt;[*],但无法在框架内找到解决方案?也许我错过了什么?我也尝试过使用*yes**no*

更新:

也许是我使用的条件运算符有问题?也许== 不是比较两个值的正确方法,因为我只是想找出一个值是否 包含 在另一个值中?从那以后我找到了 Working Draft,但这里也没有运气......

【问题讨论】:

    标签: javascript chatbot rivescript


    【解决方案1】:

    好的,所以我找到了使用对象宏的解决方案——但它不是很优雅。

    此解决方案返回用户对 args 变量中的 test 对象宏的完整响应(所有单词都小写 - 与 lowercase - 分隔在一个数组中)。枚举此数组中的项目以查看它们中的任何一个是否与 positivesnegatives 数组中的项目匹配(这实际上是 rivescript 'brain' 中已经存在的重复替换)。

    如果匹配,action 变量将更新为yesno,循环中断,如果没有匹配,则action 变量保持undefined。然后将这个action 变量返回到条件响应并由 rivescript 评估以查看它是否符合任何条件。

    > object test javascript
        let positives = ['yes', 'yeah', 'yep', 'yup', 'yh', 'ya', 'y', 'sure'];
        let negatives = ['no', 'nope', 'na', 'nah', 'pass'];
        var action = 'undefined';
        for (var i = 0; i < args.length; i++) {
          if (positives.indexOf(args[i]) !== -1) {
            action = 'yes'
            break;
          } else if (negatives.indexOf(args[i]) !== -1){
            action = 'no'
            break;
          } else {
    
          }
        }
        return action;
    < object
    
    // In the topic/main section
    
    + [*] you [*]
    - Oh, so we're talking about me now?
    
    + *
    % oh so we are talking about me now
    * <call>test <lowercase></call> == no        => Whatever...
    * <call>test <lowercase></call> == yes       => This should be fun.{topic=myself}
    * <call>test <lowercase></call> == undefined => So, back to the matter at hand...
    - So, back to the matter at hand...
    

    这似乎工作得很好,但我相信一定有更好的解决方案,即使它只是清理对象宏本身(也许有一种方法可以将替换带入对象宏??)。

    我接受这个答案,但如果有人有任何替代建议/解决方案,我仍然很乐意听到。

    【讨论】:

      【解决方案2】:

      所以,我设法联系了 Noah Petherbridge,他在 Rivescript 工作,并非常友好地花时间纠正我的理解:

      + [*] you [*]
      - So you are talking about me now?
      
      + [*] (yes|no) [*]
      % so you are talking about me now
      * <star> == yes => yes answer
      * <star> == no => no answer
      - default, shouldn't happen answer
      

      出于某种原因,我想我认为我不能在条件触发器中使用触发器交替 - 毕竟有一个更优雅的解决方案!

      我现在会接受这个答案,并将这段小旅程留给其他可能正在挣扎的人。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-01
        • 1970-01-01
        • 2022-07-22
        • 1970-01-01
        • 2020-11-14
        相关资源
        最近更新 更多