Transformer课程 业务对话机器人Rasa 3.x Fallback and Human Handoff
Transformer课程 业务对话机器人Rasa 3.x Fallback and Human Handoff
Rasa 官网
Fallback and Human Handoff
回退和人工切换:这是关于如何处理助理的各种故障的指南。
即使你完美地设计了你的机器人,用户也不可避免地会对你的助理说一些你没有预料到的话。在这种情况下,您的助理将失败,您必须确保它优雅地失败。
Handling Out-of-scope Messages
为了避免用户失望,您可以处理您知道用户可能会问但尚未实现用户目标的问题。
1. Creating an Out-of-scope Intent
您需要在NLU训练数据中定义out_of_scope的意图,并添加任何已知的范围外请求作为训练示例,例如:
nlu.yml
nlu:
- intent: out_of_scope
examples: |
- I want to order food
- What is 2 + 2?
- Who's the US President?
正如所有的意图一样,你应该从实际的对话中获取大部分的例子
2. Defining the response message
您需要在域文件中定义一个超出范围的响应。使用范围外的话语utter_out_of_scope作为默认响应,如下所示:
domain.yml
responses:
utter_out_of_scope:
- text: Sorry, I can't handle that request.
3. Creating an Out-of-Scope Rule
您需要为范围外的请求编写规则:
rules.yml
rules:
- rule: out-of-scope
steps:
- intent: out_of_scope
- action: utter_out_of_scope
Handling Specific Out-of-scope Messages
如果你观察到你的用户要求你将来想要变成用户目标的某些事情,你可以将这些作为单独的意图来处理,让用户知道你已经理解了他们的信息,但还没有一个解决方案。例如,如果用户问“我想在Rasa申请一份工作”,我们可以回答“我知道你在找工作,但恐怕我还不能掌握这项技能。”
与范围外意图out_of_scope示例类似,您需要使用训练示例创建新意图,定义响应消息,并创建规则。
Fallbacks
虽然Rasa将泛化为看不见的消息,但某些消息可能会收到较低的分类置信度。使用回退将有助于确保这些低置信度消息得到妥善处理,让您的助手可以选择使用默认消息进行响应或尝试消除用户输入的歧义。
NLU Fallback
要处理NLU可信度较低的传入消息,请使用FallbackClassifier。使用此配置,当所有其他意图预测低于配置的置信阈值时,将预测意图nlu_fallback回退。然后,您可以编写一条规则,说明当预测nlu_fallback回退时,bot应该做什么。
1. Updating the configuration#
要使用Fallback分类器,请将其添加到NLU管道
config.yml
pipeline:
# other components
- name: FallbackClassifier
threshold: 0.7
2. Defining the response message
通过添加响应,定义当消息被分类为低可信度时,bot应发送的消息:
domain.yml
responses:
utter_please_rephrase:
- text: I'm sorry, I didn't quite understand that. Could you rephrase?
3. Creating an NLU fallback rule
用户在发送置信度较低消息的规则
rules.yml
rules:
- rule: Ask the user to rephrase whenever they send a message with low NLU confidence
steps:
- intent: nlu_fallback
- action: utter_please_rephrase
Handling Low Action Confidence
由于用户可能会发送意外消息,他们的行为可能会导致他们进入未知的对话路径。Rasa的机器学习策略(如TED策略)经过优化以处理这些未知路径。
要处理机器学习策略无法以高置信度预测下一个操作的情况,可以将规则策略配置为预测默认操作,前提是没有任何策略的下一个操作预测的置信度高于可配置的阈值。
您可以使用以下步骤配置操作置信度低时运行的操作以及相应的置信阈值:
1. Updating the configuration
您需要将RulePolicy添加到配置中的策略中config.yml。默认情况下,规则策略附带以下设置:
config.yml
policies:
- name: RulePolicy
# Confidence threshold for the `core_fallback_action_name` to apply.
# The action will apply if no other action was predicted with
# a confidence >= core_fallback_threshold
core_fallback_threshold: 0.4
core_fallback_action_name: "action_default_fallback"
enable_fallback_prediction: True
2. Defining the default response message
要定义当动作置信度低于阈值时,您的机器人会说什么,请定义一个完全默认的响应 utter_default
domain.yml
responses:
utter_default:
- text: Sorry I didn't get that. Can you rephrase?
当动作置信度低于阈值时,Rasa将运行动作默认值回退action_default_fallback。这将发送响应utter_default并恢复到导致回退的用户消息之前的对话状态,因此不会影响对未来操作的预测。
3. Customizing the default action (optional)
action_default_fallback是Rasa开源中的默认操作,它向用户发送完全默认响应utter_default。您可以创建自己的自定义操作以用作回退(有关自定义操作的更多信息,请参阅自定义操作)。以下代码段是一个自定义操作的实现,该操作与操作action_default_fallback相同,但发送不同的模板utter_fallback_template:
actions.py
from typing import Any, Text, Dict, List
from rasa_sdk import Action, Tracker
from rasa_sdk.events import UserUtteranceReverted
from rasa_sdk.executor import CollectingDispatcher
class ActionDefaultFallback(Action):
"""Executes the fallback action and goes back to the previous state
of the dialogue"""
def name(self) -> Text:
return ACTION_DEFAULT_FALLBACK_NAME
async def run(
self,
dispatcher: CollectingDispatcher,
tracker: Tracker,
domain: Dict[Text, Any],
) -> List[Dict[Text, Any]]:
dispatcher.utter_message(template="my_custom_fallback_template")
# Revert user message which led to fallback.
return [UserUtteranceReverted()]
Two-Stage Fallback
为了让bot有机会了解用户想要什么,您通常希望它通过询问澄清问题来尝试消除用户消息的歧义。两阶段回退是为了使用以下顺序在多个阶段处理低NLU置信度信息:
1.用户消息的分类可信度较低
- 要求用户确认意图
2.用户确认或否认该意图
- 如果他们确认,对话将继续进行,就好像从一开始就高度自信地对意图进行了分类一样。没有采取进一步的后退步骤。
- 如果他们拒绝,则要求用户重新表述其消息。
- 用户重新表述了他们的意图
- 如果消息被高置信度地分类,则对话将继续进行,就好像用户从一开始就有此意图一样。
- 如果采用重新措辞的用户消息的可信度仍然较低,则要求用户确认意图。
4.用户确认或拒绝重新表述的意图
如果他们确认,对话将继续,就好像用户从一开始就有这个意图一样。
如果他们拒绝,则会触发最终的回退操作(例如,向客服人员进行切换)。默认的最终回退操作是调用回退操作action_default_fallback。此操作会导致bot发出utter_default默认响应,并重置对话状态,就好像两阶段回退期间 Two-Stage Fallback发生的回合没有发生一样。
可以使用以下步骤启用两阶段回退:
1. Updating the configuration#
将FallbackClassifier添加到管道中,并将RulePolicy添加到策略配置中:
config.yml
recipe: default.v1
pipeline:
# other components
- name: FallbackClassifier
threshold: 0.7
policies:
# other policies
- RulePolicy
2. Defining the fallback responses
要定义您的机器人如何要求用户对其消息进行重新修改措辞,请定义响应utter_ask_rephrase:
domain.yml
responses:
utter_ask_rephrase:
- text: I'm sorry, I didn't quite understand that. Could you rephrase?
Rasa提供了默认的实现,用于询问用户的意图和要求用户重新修改措辞。要自定义这些操作的行为,请参阅有关默认操作的文档。
3. Defining a Two-Stage Fallback rule
将以下规则添加到训练数据中。此规则将确保在收到分类置信度较低的消息时激活两阶段回退Two-Stage-Fallback:
rules.yml
rules:
- rule: Implementation of the Two-Stage-Fallback
steps:
- intent: nlu_fallback
- action: action_two_stage_fallback
- active_loop: action_two_stage_fallback
4. Defining an ultimate fallback action
要在用户拒绝重新表述的意图时定义bot的响应,请定义响应的默认值utter_default:
domain.yml
responses:
utter_default:
- text: I'm sorry, I can't help you.
或者,您可以通过编写自定义操作来自定义操作action_default_fallback默认回退,以获得更复杂的行为。例如,如果希望bot调用一个人工客服并停止与用户交互:
actions.py
from typing import Any, Dict, List, Text
from rasa_sdk import Action, Tracker
from rasa_sdk.events import UserUtteranceReverted
from rasa_sdk.executor import CollectingDispatcher
class ActionDefaultFallback(Action):
def name(self) -> Text:
return "action_default_fallback"
def run(
self,
dispatcher: CollectingDispatcher,
tracker: Tracker,
domain: Dict[Text, Any],
) -> List[Dict[Text, Any]]:
# tell the user they are being passed to a customer service agent
dispatcher.utter_message(text="I am passing you to a human...")
# assume there's a function to call customer service
# pass the tracker so that the agent has a record of the conversation between the user
# and the bot for context
call_customer_service(tracker)
# pause the tracker so that the bot stops responding to user input
return [ConversationPaused(), UserUtteranceReverted()]
自定义最终回退操作返回的事件
您应该将UserUtteranceReverted() 作为自定义操作action_default_fallback的事件之一,不包括此事件将导致跟踪器包括两阶段回退过程中发生的所有事件,这些事件可能会干扰来自bot策略管道的后续操作预测。最好将在两阶段回退过程中发生的事件视为未发生,以便您的机器人可以应用其规则或记忆的故事来正确预测下一个动作。
Human Handoff
人工切换
作为回退操作的一部分,您可能希望机器人移交给人工代理,例如作为两阶段回退中的最终操作,或者当用户明确要求人工代理时。实现人工切换的一种简单方法是根据特定的机器人或用户消息配置消息或语音频道,以切换它侦听的主机。
例如,作为两阶段回退的最后一个操作,bot可以询问用户,“您想被转移到人工助理吗?”如果他们说是,机器人会向通道发送一条带有特定负载的消息,如“切换到人工”。当频道看到此消息时,它将停止侦听Rasa服务器,并向人工频道发送一条消息,其中包含聊天对话的记录本。
从前端传递给人工的实现将取决于您使用的通道。您可以在Financial Demo和Helpdesk Assistant启动器包中看到一个使用聊天室频道自适应的示例实现。
Summary
要让助理优雅地处理故障,您应该处理已知的范围外消息,并添加一种表单的回退行为。如果您想添加人工切换,您可以添加它,或者作为回退设置的最后一步。以下是您需要为每个方法所做更改的摘要:
对于超出范围的意图:
为NLU数据中的每个超出范围的意图添加训练示例
定义超出范围的响应或操作
为每个超出范围的意图定义规则
将规则策略添加到配置中config.yml
对于单阶段NLU回退:
在配置中将FallbackClassifier添加到管道中 config.yml
定义回退响应或操作
为nlu_fallback意图定义规则
将规则策略添加到配置中 config.yml
对于处理低置信度信息:
在配置中为核心回退配置规则策略 config.yml
(可选)自定义您配置的回退操作
定义一个完全默认utter_default的响应
对于两阶段回退:
在配置中将FallbackClassifier添加到管道中config.yml
为nlu_fallback回退意图定义触发操作action_two_stage_fallback 规则
在您的域中定义超出范围的意图
将RulePolicy添加到配置config.yml
人工切换:
配置前端以切换主机
编写一个自定义操作(可能是您的回退操作)来发送切换负载
添加触发切换的规则(如果不是回退的一部分)
将RulePolicy添加到配置中config.yml