问答机器人是最容易构建的机器人,通常也是很多人第一个搭建的机器人。本篇文章介绍的是处理非上下文问题时的相关概念和训练数据,例如常见问题和闲聊。
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: CountVectorsFeaturizeranalyzer: char_wbmin_ngram: 1max_ngram: 4- name: DIETClassifierepochs: 100- name: EntitySynonymMapper- name: ResponseSelectorepochs: 100
默认情况下,ResponseSelector 将为所有检索意图构建单个检索模型。要分别检索常见问题和闲聊的回复,请使用多个 ResponseSelector 组件,并制定 retrieve_intent 键:
pipeline:# Other components- name: ResponseSelectorepochs: 100retrieval_intent: faq- name: ResponseSelectorepochs: 100retrieval_intent: chitchat
1.2 定义检索意图和 ResponseSelector
考虑这样一个例子,其中有 20 个不同的常见问题解答。尽管每个问题都表示为一个单独的意图,但所有常见问题的意图在对话中的处理方式是相同的。对于每个常见问题的意图,机器人会根据提出的问题去检索正确的响应。
我们可以使用单个操作,而不是编写 20 条规则,例如使用 utter_faq 单个规则来处理所有常见问题,方法是将它们分组到一个 faq 的检索意图下。
针对用户询问的特定常见问题,单个动作将使用 ResponseSelector 的输出来返回正确的响应。
1.3 创建规则
我们只需要为每个检索意图编写一个规则,然后以相同的方式处理分组到该检索意图下的所有意图。动作名称为 utter_ 开头,以检索意图的名称结尾。以下为编写回复常见问题和闲聊的规则示例:
rules:- rule: respond to FAQssteps:- intent: faq- action: utter_faq- rule: respond to chitchatsteps:- intent: chitchat- action: utter_chitchat
动作 utter_faq 和 utter_chichat 将会使用 ResponseSelector 预测来返回实际的响应消息。
1.4 更新NLU训练数据
ResponseSelector 的 NLU 训练样本与常规的训练样本相同,只是它们的名称必须指代它们所在的检索意图。
nlu:- intent: chitchat/ask_nameexamples: |- What is your name?- May I know your name?- What do people call you?- Do you have a name for yourself?- intent: chitchat/ask_weatherexamples: |- 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。 - 至少添加一个规则来响应常规问题/闲聊
- 给常规问题和闲聊意图添加样本
- 给常规问题和闲聊意图添加响应
- 更新域文件中的意图
现在,机器人应该能够正确且一致地响应常见问题或闲聊,即使这些插话发生在机器人正在帮助用户完成另一项任务时。
