🚀 原文地址:https://rasa.com/docs/rasa/unexpected-input

在构建机器人时,我们必须需要考虑的一件事就是用户可能会说一些意外的事情。意外输入是指偏离了我们所定义的常规对话路径,例如:

  • 用户在谈论订阅时走开,然后回来说“嗨”
  • 当机器人询问他们电子邮箱地址时,用户问“你为什么需要知道那个?”

本篇文档介绍的是如何处理意外输入,根据尝试处理的意外输入类型,所描述的部分或全部方法可能是合适的。

1. 用户对话插入

意外输入有两种:通用对话插入和上下文对话插入。通用感叹词是中断,无论对话上下文如何,都应该始终得到相同的响应。如果我们已经有定义对意图响应的规则,则无需执行任何其他操作即可将其作为中断处理。常见问题和闲聊是常见的通用感叹词,语境感叹词的反应取决于对话语境。例如,如果用户问“你为什么需要那个?”,机器人的回复将取决于刚刚提出的要求。

1.1 上下文对话插入

处理上下文对话插入类似于处理一般的上下文对话。上下文插入的一种常见情况是在填写表单时,用户会问“你为什么需要知道那个?”,或者“你能解释一下么?”。对于每个插槽的响应也应该不同,例如:
image.png

由于我们想 requested_slot 插槽可以影响对话,所以我们需要将 requested_slot 插槽的 influence_conversation 设置为 true,并为其分配分类类型,这也意味着对话模型在进行预测时会关注槽值:

  1. slots:
  2. requested_slot:
  3. type: categorical
  4. values:
  5. - cuisine
  6. - num_people
  7. - outdoor_seating
  8. - preferences
  9. - feedback
  10. influence_conversation: true
  11. mappings:
  12. - type: custom

然后,我们可以根据 requested_slot 的值对用户的插话编写特定响应的故事,例如:

  1. stories:
  2. - story: cuisine interjection
  3. steps:
  4. - intent: request_restaurant
  5. - action: restaurant_form
  6. - active_loop: restaurant_form
  7. - slot_was_set:
  8. - requested_slot: cuisine
  9. - intent: explain
  10. - action: utter_explain_cuisine
  11. - action: restaurant_form
  12. - story: number of people interjection
  13. steps:
  14. - intent: request_restaurant
  15. - action: restaurant_form
  16. - active_loop: restaurant_form
  17. - slot_was_set:
  18. - requested_slot: num_people
  19. - intent: explain
  20. - action: utter_explain_num_people
  21. - action: restaurant_form

2. 总结

我们如何处理意外输入取决于响应是否是上下文敏感的。

对于通用的插话:

  • 定义单轮交互的规则
  • 使用 ResponseSelector 来进行常见问题解决和闲聊

对于上下文插话:

  • 使 requested_slot 成为分类插槽
  • 在使用的情况下根据槽值编写针对特性上下文插话的响应故事