2

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

在网站上的教程中,解释说您可以使用...

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

这在初始提示中工作正常,+ [*] 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.

那么,有没有办法在没有明确用户输入的情况下使用条件响应?而是一个只包含某种响应的?我想这是*在两个实例中使用 as<star>和的问题[*],但无法在框架内找到解决方案?也许我错过了什么?我也尝试过使用*yes*and *no*

更新:

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

4

2 回答 2

1

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

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

如果匹配,则action变量更新为yesorno并且循环中断,如果不匹配,则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...

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

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

于 2019-02-10T14:08:06.127 回答
0

因此,我设法联系了负责 Rivescript 的Noah Petherbridge,他非常友好地花时间纠正我的理解:

+ [*] 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

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

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

于 2019-02-10T23:24:55.800 回答