问答机器人是最容易构建的机器人,通常也是很多人第一个搭建的机器人。本篇文章介绍的是处理非上下文问题时的相关概念和训练数据,例如常见问题和闲聊。
FAQs 和 chichat 是两种情况,机器人使用一组固定消息进行响应,无论对话中之前发生了什么,机器人都应该始终以相同的方式回答。例如,在下面的对话中,每个问题都可以在对话的任何时间点被提出,答案与用户之前说过的任何内容都无关。
1. 使用响应选择器进行常见问题和聊天的分步指南
要处理常见问题和闲聊,我们需要一个基于规则的对话管理策略(RulePolicy)和一个简单的方法来为问题返回适当的响应(ResponseSelector)。
1.1 更新配置
对于常见问题和闲聊,我们总是希望机器人能够对提出的相同问题采用相同的方式回答,规则完全支持我们这样做。为了使用规则,我们需要在配置文件中添加 RulePolicy
策略。
policies:
# other policies
- name: RulePolicy
接下来,在配置文件的 NLU 管道中包含 ResponseSelector
。ResponseSelector
需要特征化器和意图分类器才能工作,因此它应该在管道中的 处于这些组件之后,例如:
pipeline:
- name: WhitespaceTokenizer
- name: RegexFeaturizer
- name: LexicalSyntacticFeaturizer
- name: CountVectorsFeaturizer
- name: CountVectorsFeaturizer
analyzer: char_wb
min_ngram: 1
max_ngram: 4
- name: DIETClassifier
epochs: 100
- name: EntitySynonymMapper
- name: ResponseSelector
epochs: 100
默认情况下,ResponseSelector
将为所有检索意图构建单个检索模型。要分别检索常见问题和闲聊的回复,请使用多个 ResponseSelector
组件,并制定 retrieve_intent
键:
pipeline:
# Other components
- name: ResponseSelector
epochs: 100
retrieval_intent: faq
- name: ResponseSelector
epochs: 100
retrieval_intent: chitchat
1.2 定义检索意图和 ResponseSelector
考虑这样一个例子,其中有 20 个不同的常见问题解答。尽管每个问题都表示为一个单独的意图,但所有常见问题的意图在对话中的处理方式是相同的。对于每个常见问题的意图,机器人会根据提出的问题去检索正确的响应。
我们可以使用单个操作,而不是编写 20 条规则,例如使用 utter_faq
单个规则来处理所有常见问题,方法是将它们分组到一个 faq
的检索意图下。
针对用户询问的特定常见问题,单个动作将使用 ResponseSelector
的输出来返回正确的响应。
1.3 创建规则
我们只需要为每个检索意图编写一个规则,然后以相同的方式处理分组到该检索意图下的所有意图。动作名称为 utter_
开头,以检索意图的名称结尾。以下为编写回复常见问题和闲聊的规则示例:
rules:
- rule: respond to FAQs
steps:
- intent: faq
- action: utter_faq
- rule: respond to chitchat
steps:
- intent: chitchat
- action: utter_chitchat
动作 utter_faq
和 utter_chichat
将会使用 ResponseSelector
预测来返回实际的响应消息。
1.4 更新NLU训练数据
ResponseSelector
的 NLU 训练样本与常规的训练样本相同,只是它们的名称必须指代它们所在的检索意图。
nlu:
- intent: chitchat/ask_name
examples: |
- What is your name?
- May I know your name?
- What do people call you?
- Do you have a name for yourself?
- intent: chitchat/ask_weather
examples: |
- What's the weather like today?
- Does it look sunny outside today?
- Oh, do you mind checking the weather for me please?
- I like sunny days in Berlin.
请务必更新你的域文件以包含添加的 chichat
意图:
intents:
# other intents
- chitchat
1.5 定义响应
ResponseSelector
的响应遵循与检索意图相同命令的约定。除此之外,它们可以具有正常机器人响应的所有特征。对于上面所列出的闲聊意图,我们的响应定义如下所示:
responses:
utter_chitchat/ask_name:
- image: "https://i.imgur.com/zTvA58i.jpeg"
text: Hello, my name is Retrieval Bot.
- text: I am called Retrieval Bot!
utter_chitchat/ask_weather:
- text: Oh, it does look sunny right now in Berlin.
image: "https://i.imgur.com/vwv7aHN.png"
- text: I am not sure of the whole week but I can see the sun is out today.
2. 总结
完成以下操作后,我们可以尝试训练下机器人:
- 在 config.yml 配置文件中添加
RulePolicy
策略,以及在管道中添加ResponseSelector
。 - 至少添加一个规则来响应常规问题/闲聊
- 给常规问题和闲聊意图添加样本
- 给常规问题和闲聊意图添加响应
- 更新域文件中的意图
现在,机器人应该能够正确且一致地响应常见问题或闲聊,即使这些插话发生在机器人正在帮助用户完成另一项任务时。