在构建机器人时,我们必须需要考虑的一件事就是用户可能会说一些意外的事情。意外输入是指偏离了我们所定义的常规对话路径,例如:
- 用户在谈论订阅时走开,然后回来说“嗨”
- 当机器人询问他们电子邮箱地址时,用户问“你为什么需要知道那个?”
本篇文档介绍的是如何处理意外输入,根据尝试处理的意外输入类型,所描述的部分或全部方法可能是合适的。
1. 用户对话插入
意外输入有两种:通用对话插入和上下文对话插入。通用感叹词是中断,无论对话上下文如何,都应该始终得到相同的响应。如果我们已经有定义对意图响应的规则,则无需执行任何其他操作即可将其作为中断处理。常见问题和闲聊是常见的通用感叹词,语境感叹词的反应取决于对话语境。例如,如果用户问“你为什么需要那个?”,机器人的回复将取决于刚刚提出的要求。
1.1 上下文对话插入
处理上下文对话插入类似于处理一般的上下文对话。上下文插入的一种常见情况是在填写表单时,用户会问“你为什么需要知道那个?”,或者“你能解释一下么?”。对于每个插槽的响应也应该不同,例如:
由于我们想 requested_slot
插槽可以影响对话,所以我们需要将 requested_slot
插槽的 influence_conversation
设置为 true
,并为其分配分类类型,这也意味着对话模型在进行预测时会关注槽值:
slots:
requested_slot:
type: categorical
values:
- cuisine
- num_people
- outdoor_seating
- preferences
- feedback
influence_conversation: true
mappings:
- type: custom
然后,我们可以根据 requested_slot
的值对用户的插话编写特定响应的故事,例如:
stories:
- story: cuisine interjection
steps:
- intent: request_restaurant
- action: restaurant_form
- active_loop: restaurant_form
- slot_was_set:
- requested_slot: cuisine
- intent: explain
- action: utter_explain_cuisine
- action: restaurant_form
- story: number of people interjection
steps:
- intent: request_restaurant
- action: restaurant_form
- active_loop: restaurant_form
- slot_was_set:
- requested_slot: num_people
- intent: explain
- action: utter_explain_num_people
- action: restaurant_form
2. 总结
我们如何处理意外输入取决于响应是否是上下文敏感的。
对于通用的插话:
- 定义单轮交互的规则
- 使用
ResponseSelector
来进行常见问题解决和闲聊
对于上下文插话:
- 使
requested_slot
成为分类插槽 - 在使用的情况下根据槽值编写针对特性上下文插话的响应故事