🚀 原文地址:https://rasa.com/docs/rasa/contextual-conversations

考虑上下文通常是提供良好用户体验的关键,本篇文档介绍的是创建上下文对话模式的指南。

在上下文对话中,对话中上一步之外的事情可能会在接下来应该发生的事情中发挥作用。例如,如果用户询问“有多少?”,仅从消息中就不清楚用户在询问什么。在机器人说“你的邮件”的上下文中,响应可能是“你的邮箱里有五封信”。在有关未付账单的对话中,回复可能是“你有三张逾期未付的账单”。机器人需要知道上一个动作才能选择下一个动作。

要创建感知上下文的机器人,我们需要定义对话历史记录如何影响下一个响应。例如,如果用户询问音乐会何时开始,机器人会根据他们是否喜欢音乐做出不同的响应:

以下是用户喜欢音乐的一段对话:
image.png

以下是用户不喜欢音乐的一段对话:
image.png

1. 创建上下文对话模式的分步指南

1.1 定义插槽

插槽相当于机器人的记忆,它存储的是机器人后续需要参考的信息片段,并且可以根据 slot_was_set 事件引导对话流程。不同类型的插槽,每种插槽都以自己的方式影响对话流程。

在音乐会机器人示例中,like_music 插槽是一个布尔值插。如果该槽值是 true,则机器人会发送介绍消息;如果该槽值为 false,那么机器人会发送不同的消息。我们在域中定义该插槽及其类型:

  1. slots:
  2. likes_music:
  3. type: bool
  4. mappings:
  5. - type: custom

1.2 创建故事

以下故事是对话应该如何进行的示例,在上面的示例中,由于这两个故事,音乐机器人对喜欢音乐和不喜欢音乐的用户,所做的响应是不同的:

  1. stories:
  2. - story: User likes music
  3. steps:
  4. - intent: how_to_get_started
  5. - action: utter_get_started
  6. - intent: affirm
  7. - action: action_set_music_preference
  8. - slot_was_set:
  9. - likes_music: True
  10. - action: utter_awesome
  11. - story: User doesn't like music
  12. steps:
  13. - intent: how_to_get_started
  14. - action: utter_get_started
  15. - intent: deny
  16. - action: action_set_music_preference
  17. - slot_was_set:
  18. - likes_music: False
  19. - action: utter_goodbye

根据用户的意图(affirm 或者 deny)从而导致故事也会有所不同。根据用户的意图,自动以操作会设置一个槽来进一步引用对话。

1.3 配置 TEDPolicy

除了添加故事来解释上下文之外,机器学习策略还可以帮助您的模型泛化到未知的对话路径。重要的是,要了解使用机器学习策略,并不意味着放弃对机器人的控制。如果基于规则的策略能够进行预测,则该预测将始终具有更高的策略优先级,并将预测下一个动作。

TEDPolicy 策略用于处理意外的用户行为。例如,在下面的对话中(摘自 Rasa X 上的对话):

  1. stories:
  2. - story: Story from conversation with a2baab6c83054bfaa8d598459c659d2a on November 28th 2019
  3. steps:
  4. - checkpoint: STORY_START
  5. - intent: greet
  6. - action: action_greet_user
  7. - slot_was_set:
  8. - shown_privacy: true
  9. - intent: ask_whoisit
  10. - action: action_chitchat
  11. - intent: ask_whatspossible
  12. - action: action_chitchat
  13. - intent: telljoke
  14. - action: action_chitchat
  15. - intent: how_to_get_started
  16. entities:
  17. - product: x
  18. - slot_was_set:
  19. - product: x
  20. - action: utter_explain_x
  21. - action: utter_also_explain_nlucore
  22. - intent: affirm
  23. - action: utter_explain_nlu
  24. - action: utter_explain_core
  25. - action: utter_direct_to_step2

在这里,我们可以看到用户首先完成了一些聊天任务,然后问他们如何开始使用 Rasa X。TEDPolicy 正确地预测了 Rasa X 应该向用户解释,然后也会引导他们开始对话,而不需要先问所有符合条件的问题。

由于机器学习策略已经推广到这种情况,我们应该将故事添加到训练数据中,以不断改进机器人,并帮助模型在将来更好地推广。Rasa X 是一个工具,可以帮助我们改进机器人,使其更具上下文化。

1)设置最大历史条数

通常,只有一定数量的上下文与机器人有关。max_history 是 Rasa 对话管理策略的超参数,用于控制模型在对话中查看多少步骤来决定下部要采取的动作。

在下面的故事中,用户连续 3 次请求帮助。前 2 次,机器人发送相同的消息,但第三次,则被转交给人工。

  1. stories:
  2. - story: user persists in asking for help
  3. steps:
  4. - intent: help
  5. - action: utter_help
  6. - intent: help
  7. - action: utter_help
  8. - intent: help
  9. - action: action_human_handoff

为了让模型了解这种模式,它至少需要知道前面 4 个步骤,即 max_history 设置为 4。如果 max_history 设置为 3,则模型将没有足够的上下文来查看用户已经发送了 2 个帮助请求,并且永远不会预测人工切换的操作。

通过将 max_history 来传递到配置文件中的策略,例如:

  1. policies:
  2. - name: "TEDPolicy"
  3. max_history: 5

我们需要确保将 max_history 设置得足够高,以便机器人能够准确预测下一步要做什么。

2. 总结

以下是可以进行应用的概念摘要,以使得机器人能够进行上下文对话:

  • 为上下文对话编写故事
  • 使用插槽存储上下文信息以供后续使用
  • 根据机器人所需的上下文量,为策略设置 max_history 参数
  • 使用 TEDPolicy 策略对未知对话路径进行泛化