Transformer课程 业务对话机器人Rasa 3.x Fallback and Human Handoff

Transformer课程 业务对话机器人Rasa 3.x Fallback and Human Handoff

Transformer课程 业务对话机器人Rasa 3.x Fallback and Human Handoff

Rasa 官网

www.zeeklog.com  - Transformer课程 业务对话机器人Rasa 3.x Fallback and Human Handoff

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.用户确认或否认该意图

  • 如果他们确认,对话将继续进行,就好像从一开始就高度自信地对意图进行了分类一样。没有采取进一步的后退步骤。
  • 如果他们拒绝,则要求用户重新表述其消息。
  1. 用户重新表述了他们的意图
  • 如果消息被高置信度地分类,则对话将继续进行,就好像用户从一开始就有此意图一样。
  • 如果采用重新措辞的用户消息的可信度仍然较低,则要求用户确认意图。

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

rasa 官网链接

Rasa系列博客:

Read more

深入理解 Proxy 和 Object.defineProperty

在JavaScript中,对象是一种核心的数据结构,而对对象的操作也是开发中经常遇到的任务。在这个过程中,我们经常会使用到两个重要的特性:Proxy和Object.defineProperty。这两者都允许我们在对象上进行拦截和自定义操作,但它们在实现方式、应用场景和灵活性等方面存在一些显著的区别。本文将深入比较Proxy和Object.defineProperty,包括它们的基本概念、使用示例以及适用场景,以帮助读者更好地理解和运用这两个特性。 1. Object.defineProperty 1.1 基本概念 Object.defineProperty 是 ECMAScript 5 引入的一个方法,用于直接在对象上定义新属性或修改已有属性。它的基本语法如下: javascript 代码解读复制代码Object.defineProperty(obj, prop, descriptor); 其中,obj是目标对象,prop是要定义或修改的属性名,descriptor是一个描述符对象,用于定义属性的特性。 1.2 使用示例 javascript 代码解读复制代码//

By Ne0inhk

Proxy 和 Object.defineProperty 的区别

Proxy 和 Object.defineProperty 是 JavaScript 中两个不同的特性,它们的作用也不完全相同。 Object.defineProperty 允许你在一个对象上定义一个新属性或者修改一个已有属性。通过这个方法你可以精确地定义属性的特征,比如它是否可写、可枚举、可配置等。该方法的使用场景通常是需要在一个对象上创建一个属性,然后控制这个属性的行为。 Proxy 也可以用来代理一个对象,但是相比于 Object.defineProperty,它提供了更加强大的功能。使用 Proxy 可以截获并重定义对象的基本操作,比如访问属性、赋值、函数调用等等。在这些操作被执行之前,可以通过拦截器函数对这些操作进行拦截和修改。因此,通过 Proxy,你可以完全重写一个对象的默认行为。该方法的使用场景通常是需要对一个对象的行为进行定制化,或者需要在对象上添加额外的功能。 对比 以下是 Proxy 和 Object.defineProperty 的一些区别对比: 方面ProxyObject.defineProperty语法使用 new Proxy(target,

By Ne0inhk