【问题标题】:How to preprocess a special trigger in Rivescript-Python?如何预处理 Rivescript-Python 中的特殊触发器?
【发布时间】:2018-01-22 07:43:38
【问题描述】:

我的机器人将用户名存储在数据库中,并且数据库会不时向会话发送一条消息“setname username”。示例铆钉:

+ setname *
- <set name=<formal>>

+ (what is my name|who am i)
- You're <get name>, right?

+ didntlike
- {topic=nlike}Why?

> topic nlike

+ *
- {topic=random}Thanks for charing.

< topic

+ *
- I don't have a reply for that.
- Try asking that a different way.

问题是当用户处于一个由 * 退出的“nlike”之类的主题中,我发送消息设置名称,然后对话退出该主题。

预期对话:

Me: hello
Bot: I don't have a reply for that.
Me: didntlike
Bot: Why?
Me: setname John
Bot:
Me: I didn't like because you are ugly.
Bot: Thanks for charing.
Me: Who am I?
Bot: You're John, right?

有没有办法在开始块中处理它?我尝试了不同的语法,但没有积极的结果。我想到了类似的东西:

> begin

+ setname *
- <set name=<formal>>

+ request
- {ok}

< begin

一种解决方法是在所有主题中添加相同的触发器,但我需要一个更好的解决方案,因为随着我的 rive 文件变大,这种方法很容易出错。

==== 根据 Nelson 的回答尝试的代码 =====

> begin
    + request
    - {ok}{topic=specialtriggers}
< begin

> topic specialtriggers

+ setname *
- <set name=<formal>>

< topic

+ (what is my name|who am i)
- You're <get name>, right?

+ didntlike
- {topic=nlike}Why?

> topic nlike

+ *
- {topic=random}Thanks for charing.

< topic

+ *
- I don't have a reply for that.
- Try asking that a different way.

我认为将主题添加到 {ok}{topic=specialtriggers} 会使该主题之外的所有触发器都失败。预处理后,Rivescript 应该回答是否是特殊触发器,否则搜索正常触发器。

【问题讨论】:

  • 我不明白你对谈话的期望是什么。你能举一些例句让这个观点更具体吗?您是否希望输入带有星号的消息setname *,而不是触发器?
  • 是的。我希望使用开始块来预处理此消息。每当我说“setname John”时,我都会将变量“name”设置为“John”。这很有用,因为我不必在 .rive 文件的每个主题中复制触发器“setname *”。我也可以说一些更简单的话,比如:'close',它会通过不输入 rive 规则来响应。

标签: rivescript


【解决方案1】:

如果您的问题只是关于如何始终使用 begin 块预处理用户消息,答案是:

  • 不需要将触发器输入到开始块中。 + request 是任何用户消息的通用表示。
  • 如果您想限制在当前主题的开始块中匹配触发器,{ok} 标签就足够了。

如下修改你的代码

+ didntlike
- {topic=nlike}Why?

> topic nlike
    + *
    - Thanks for charing.
< topic

> begin
    + request
    - {ok} (Preprocessed in begin)
< begin

尝试以下消息序列didntlikehello,您将看到回复附加了(Preprocessed in begin)

  • 否则,begin 块中的回复需要添加一个主题 where(哪个主题)来获取触发器和回复。如果您想在random 主题中获取setname 的触发器,您可以将开始块添加到您的第一个代码sn-p 的末尾。

RiveScript 代码

> begin
    + request
    - {ok}{topic=random}
< begin

在这种情况下,向setname 提供请求后的主题是主题random

【讨论】:

  • 您好@nelson-dinh,感谢您的友好回复,但没有成功。我想我没有说清楚,所以我在我的问题中添加了预期的对话结果,并添加了尝试使用您的答案的代码。
【解决方案2】:

答案基于Noah Petherbridge's response on chatbots.org,一种可行的解决方案是使用主题继承:

> topic specialtriggers
    + setname *{weight=9991234}
    - <set name=<star1>>
< topic

> topic random includes specialtriggers
    // you don't actually need to put anything inside here, since triggers
    // without a topic are in the "random" topic automatically, but this
    // topic declaration line will make "random" include "important"
< topic

// but for your other topics, include the specialtriggers one
> topic nlike includes specialtriggers
    + *
    - {topic=random}Thanks for caring.
< topic

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 2013-08-22
    相关资源
    最近更新 更多