Rivescript:在条件响应中使用关键字触发器

时间:2019-02-08 13:58:21

标签: javascript chatbot rivescript

我正在使用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.

因此,没有明确用户输入,有没有办法使用条件响应?而是仅仅包含某种回应的人?我想这是在两个实例中同时使用*<star>的情况下出现的问题,但是无法在框架内找到解决方案吗?也许我缺少什么?我也尝试过使用[*]*yes*

更新:

也许,我使用的条件运算符有问题吗?当我只是想找出一个值是否包含在另一个值中时,也许*no*不是比较两个值的正确方法?此后,我发现了 Working Draft,但这里也没有运气...

2 个答案:

答案 0 :(得分:1)

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

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

如果存在匹配项,则将action变量更新为yesno并中断循环,如果没有匹配项,则{{1} }变量仍为action。然后,将此undefined变量返回到条件响应,并通过rivescript进行评估,以查看它是否符合任何条件。

action

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

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

答案 1 :(得分:0)

因此,我设法与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

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

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