【问题标题】:Multiple intents handling in chatbot聊天机器人中的多个意图处理
【发布时间】:2020-02-27 20:50:38
【问题描述】:

我正在使用 RASA 开发一个用于银行业务的机器人。我有资金转移、交易历史、贷款、余额、账单支付等的意图。我已经实现了一次处理一个功能的意图。现在,我想一次处理多个意图。

例如,如果用户说,

显示我最近的交易,然后在显示余额后支付我的账单。

当用户在单个话语中要求多于一个或两个功能时,我该如何处理这些类型的输入?

我知道,我可以用多个实体实现意图,但这似乎对我不起作用,因为我有太多的意图,以至于我无法承受组合 2 或 3 个实体的意图。

是否有可能使用 RASA 或任何其他技术来构建聊天机器人?

【问题讨论】:

标签: chatbot rasa


【解决方案1】:

方法 1 - 多意图

您可以使用多意图(不要与多实体混淆)。你需要做的是:

  • 分别为意图编写示例 nlu 数据(您已有的)
  • 为多意图组合写入 ​​nlu 数据。理论上,Rasa 将同时使用来自单一意图和多意图示例的信息来正确分类。这意味着您在多意图中不需要那么多训练示例
  • 写一些处理这些多意图的故事
  • 在分词器配置中指定一个分隔符:intent_split_symbol: "+"

请注意,您需要同时拥有要支持的多意图和故事的 NLU 数据,否则 Rasa 将无法在 NLU 中识别它们,并且不会在 Core 中执行任何操作。

参考资料:

示例

这可以给你这样的东西:

nlu.md

# intent:show transactions
- please show me my latest transactions
- show me my transactions
- ...

# intent:pay bill
- pay my bill please
- i want to pay my bill
- go ahead and pay the bills
- ...

# intent:show transactions+pay bill
- Show my latest transactions and then pay my bill after showing the balance.
- show me my transactions and go ahead and pay the bills
- 

请注意,您可以编写一个脚本来自动从单个意图生成一些多意图示例

stories.md

# story 1
* show transactions
- action_show_transactions

# story 2
* pay bill
- action_pay_bill

# story 3 (combined)
* show transactions+pay bill
- action_show_transactions
- action_pay_bill

config.yml

language: "en"

pipeline:
- name: "WhitespaceTokenizer"
  intent_split_symbol: "+"
- name: "CountVectorsFeaturizer"
- name: "EmbeddingIntentClassifier"

请注意,我使用的拆分符号与文档中的拆分符号不同。

方法 2 - 作为实体的指令

另一种方法是使用单个意图 ask_action 和一个或多个标识您的指令的实体。

然后您可以有一个操作action_execute_instructions 来处理所有这些问题。它会查看最新消息中的实体,并执行您需要的任何内容。

您如何理解指令很大程度上取决于您选择如何定义实体以及如何设法将它们映射到您想要的指令。有SynonymMapper,但它根本不灵活,如果您有一个不完全匹配的新示例,它将失败。在这种情况下,您最好编写自己的 NLU 管道组件。

说实话,我认为这不是一个好方法。实体应该是,嗯,实体(即:对象、位置等)

nlu.md

# intent:ask_action
- [Show my latest transactions](instruction) and then [pay my bill](instruction) after showing the balance.
- [show me my transactions](instruction) and go ahead and [pay the bills](instruction)
- [pay the bill](instruction)

stories.md

# story 1
* ask_action
- action_execute_instructions

建议

我强烈建议使用最简单的方法。一旦你的机器人上线,你应该检查你的用户如何使用它,看看是否需要更复杂的意图组合(如果你做多意图)。

【讨论】:

  • 谢谢@nbeuchat,根据你的方法,我可以结合这些意图。但是,如果我有 5 个不同的意图并且我必须将 3 和 4 个意图组合在一起怎么办?这似乎不可行。
  • 不幸的是,这就是它与多意图一起工作的方式,尽管我真的不确定在一个句子中结合 3-4 个意图时这有多好。您需要问自己的问题是真实用户如何实际使用您的机器人?你真的有一次有 3-4 个意图的案例吗?如果您真的想支持许多指令,您可以尝试实体方法,其中您有一个单一的意图,每条指令都是一个实体。但是,您需要小心实体解析,因为 SynonymMapper 还不够。我可以用这种方法更新我的答案
  • @VishalA。仅供参考,我已经用另一种使用实体的方法更新了答案(尽管我不建议使用这个 tbh)
  • 我认为方法 2 根本不会提供不错的准确性。 NER预测是基于实体值和句子结构围绕某类实体的出现。如果您将“指令”用作实体,则基本上是在要求模型预测一个实体指令下的“所有”意图。其次,您必须在自定义操作中构建/使用自己的意图预测器以理解指令是什么(基本上您没有使用 rasa 的意图预测器)。完全不推荐。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-29
  • 2018-10-15
  • 1970-01-01
相关资源
最近更新 更多