🚀 原文地址:https://rasa.com/docs/rasa/chitchat-faqs

问答机器人是最容易构建的机器人,通常也是很多人第一个搭建的机器人。本篇文章介绍的是处理非上下文问题时的相关概念和训练数据,例如常见问题和闲聊。

FAQschichat 是两种情况,机器人使用一组固定消息进行响应,无论对话中之前发生了什么,机器人都应该始终以相同的方式回答。例如,在下面的对话中,每个问题都可以在对话的任何时间点被提出,答案与用户之前说过的任何内容都无关。
image.png

1. 使用响应选择器进行常见问题和聊天的分步指南

要处理常见问题和闲聊,我们需要一个基于规则的对话管理策略(RulePolicy)和一个简单的方法来为问题返回适当的响应(ResponseSelector)。

1.1 更新配置

对于常见问题和闲聊,我们总是希望机器人能够对提出的相同问题采用相同的方式回答,规则完全支持我们这样做。为了使用规则,我们需要在配置文件中添加 RulePolicy 策略。

  1. policies:
  2. # other policies
  3. - name: RulePolicy

接下来,在配置文件的 NLU 管道中包含 ResponseSelectorResponseSelector 需要特征化器和意图分类器才能工作,因此它应该在管道中的 处于这些组件之后,例如:

  1. pipeline:
  2. - name: WhitespaceTokenizer
  3. - name: RegexFeaturizer
  4. - name: LexicalSyntacticFeaturizer
  5. - name: CountVectorsFeaturizer
  6. - name: CountVectorsFeaturizer
  7. analyzer: char_wb
  8. min_ngram: 1
  9. max_ngram: 4
  10. - name: DIETClassifier
  11. epochs: 100
  12. - name: EntitySynonymMapper
  13. - name: ResponseSelector
  14. epochs: 100

默认情况下,ResponseSelector 将为所有检索意图构建单个检索模型。要分别检索常见问题和闲聊的回复,请使用多个 ResponseSelector 组件,并制定 retrieve_intent 键:

  1. pipeline:
  2. # Other components
  3. - name: ResponseSelector
  4. epochs: 100
  5. retrieval_intent: faq
  6. - name: ResponseSelector
  7. epochs: 100
  8. retrieval_intent: chitchat

1.2 定义检索意图和 ResponseSelector

考虑这样一个例子,其中有 20 个不同的常见问题解答。尽管每个问题都表示为一个单独的意图,但所有常见问题的意图在对话中的处理方式是相同的。对于每个常见问题的意图,机器人会根据提出的问题去检索正确的响应。

我们可以使用单个操作,而不是编写 20 条规则,例如使用 utter_faq 单个规则来处理所有常见问题,方法是将它们分组到一个 faq 的检索意图下。

针对用户询问的特定常见问题,单个动作将使用 ResponseSelector 的输出来返回正确的响应。

1.3 创建规则

我们只需要为每个检索意图编写一个规则,然后以相同的方式处理分组到该检索意图下的所有意图。动作名称为 utter_ 开头,以检索意图的名称结尾。以下为编写回复常见问题和闲聊的规则示例:

  1. rules:
  2. - rule: respond to FAQs
  3. steps:
  4. - intent: faq
  5. - action: utter_faq
  6. - rule: respond to chitchat
  7. steps:
  8. - intent: chitchat
  9. - action: utter_chitchat

动作 utter_faqutter_chichat 将会使用 ResponseSelector 预测来返回实际的响应消息。

1.4 更新NLU训练数据

ResponseSelector 的 NLU 训练样本与常规的训练样本相同,只是它们的名称必须指代它们所在的检索意图。

  1. nlu:
  2. - intent: chitchat/ask_name
  3. examples: |
  4. - What is your name?
  5. - May I know your name?
  6. - What do people call you?
  7. - Do you have a name for yourself?
  8. - intent: chitchat/ask_weather
  9. examples: |
  10. - What's the weather like today?
  11. - Does it look sunny outside today?
  12. - Oh, do you mind checking the weather for me please?
  13. - I like sunny days in Berlin.

请务必更新你的域文件以包含添加的 chichat 意图:

  1. intents:
  2. # other intents
  3. - chitchat

1.5 定义响应

ResponseSelector 的响应遵循与检索意图相同命令的约定。除此之外,它们可以具有正常机器人响应的所有特征。对于上面所列出的闲聊意图,我们的响应定义如下所示:

  1. responses:
  2. utter_chitchat/ask_name:
  3. - image: "https://i.imgur.com/zTvA58i.jpeg"
  4. text: Hello, my name is Retrieval Bot.
  5. - text: I am called Retrieval Bot!
  6. utter_chitchat/ask_weather:
  7. - text: Oh, it does look sunny right now in Berlin.
  8. image: "https://i.imgur.com/vwv7aHN.png"
  9. - text: I am not sure of the whole week but I can see the sun is out today.

2. 总结

完成以下操作后,我们可以尝试训练下机器人:

  • config.yml 配置文件中添加 RulePolicy 策略,以及在管道中添加 ResponseSelector
  • 至少添加一个规则来响应常规问题/闲聊
  • 给常规问题和闲聊意图添加样本
  • 给常规问题和闲聊意图添加响应
  • 更新域文件中的意图

现在,机器人应该能够正确且一致地响应常见问题或闲聊,即使这些插话发生在机器人正在帮助用户完成另一项任务时。