跳转至

默认动作

默认动作是对话管理器默认内置的动作。其中大部分动作都是根据特定对话情况自动预测的。你可以自定义这些动作来个性化对话机器人。

这些动作中的每一个都有默认行为,如以下部分所述。为了覆盖此默认行为,请编写一个自定义动作,其 name() 方法返回与默认动作相同的名称:

class ActionRestart(Action):

  def name(self) -> Text:
      return "action_restart"

  async def run(
      self, dispatcher, tracker: Tracker, domain: Dict[Text, Any]
  ) -> List[Dict[Text, Any]]:

      # custom behavior

      return [...]

将此动作添加到领域文件的 actions 部分,以便对话机器人知道使用自定义定义而不是默认定义:

actions:
  - action_restart

警告

将此动作添加到领域文件后,使用 rasa train --force 重新训练模型。否则,Rasa 将不知道已更改的任何内容,并且可能会跳过重新训练对话模型。

action_listen

此动作表示对话机器人不应执行任何动作并等待下一个用户输入。

action_restart

此动作将重置整个对话历史记录,包括对话期间设置的任何槽。

如果模型配置中包含 RulePolicy,则用户可以在对话中通过发送 /restart 消息来触发此动作。如果在领域中定义了 utter_restart 响应,此响应也会发送给用户。

action_session_start

此动作将启动新的对话会话,其在以下情况下执行:

  • 每次新对话开始时。
  • 用户在领域的会话配置session_expiration_time 参数定义的时间段内处于不活动状态后。
  • 当用户在对话期间发送 /session_start 消息时。

此动作将重置对话追踪器,但默认情况下不会清除已设置的任何插槽。

自定义

会话启动动作的默认行为是获取所有现有槽并将其延续到下一个会话。假如你不想延续所有槽,而只想延续用户的姓名和电话号码。为此,你可以使用自定义动作覆盖 action_session_start,该动作可能如下所示:

from typing import Any, Text, Dict, List
from rasa_sdk import Action, Tracker
from rasa_sdk.events import SlotSet, SessionStarted, ActionExecuted, EventType


class ActionSessionStart(Action):
    def name(self) -> Text:
        return "action_session_start"

    @staticmethod
    def fetch_slots(tracker: Tracker) -> List[EventType]:
        """Collect slots that contain the user's name and phone number."""

        slots = []
        for key in ("name", "phone_number"):
            value = tracker.get_slot(key)
            if value is not None:
                slots.append(SlotSet(key=key, value=value))
        return slots

    async def run(
      self, dispatcher, tracker: Tracker, domain: Dict[Text, Any]
    ) -> List[Dict[Text, Any]]:

        # the session should begin with a `session_started` event
        events = [SessionStarted()]

        # any slots that should be carried over should come after the
        # `session_started` event
        events.extend(self.fetch_slots(tracker))

        # an `action_listen` should be added at the end as a user message follows
        events.append(ActionExecuted("action_listen"))

        return events

如果你想要访问随触发会话启动的用户消息一起发送的元数据,你可以访问特殊槽 session_started_metadata

from typing import Any, Text, Dict, List
from rasa_sdk import Action, Tracker
from rasa_sdk.events import SessionStarted, ActionExecuted


class ActionSessionStart(Action):
    def name(self) -> Text:
        return "action_session_start"

    async def run(
      self, dispatcher, tracker: Tracker, domain: Dict[Text, Any]
    ) -> List[Dict[Text, Any]]:
        metadata = tracker.get_slot("session_started_metadata")

        # Do something with the metadata
        print(metadata)

        # the session should begin with a `session_started` event and an `action_listen`
        # as a user message follows
        return [SessionStarted(), ActionExecuted("action_listen")]

action_default_fallback

此动作撤消最后一次用户与对话机器人的交互,并发送 utter_default 响应(如果已定义)。如果你启用了此回退机制,则它会因动作预测置信度低而触发。

注意

如果 action_default_fallback 是对话机器人预测并执行的下一个动作,这将导致 UserUtteranceReverted 事件,该事件将取消设置上一个用户回合中填充的槽。

action_run_slot_rejections

此动作运行直接在 flows.yaml 文件中编写的槽验证规则。当对话机器人在流中向用户询问信息时,action_run_slot_rejections 将作为默认流 pattern_collect_information 中的一个步骤执行。如果动作将其中一个规则评估为 True,则它将重置最初请求的槽,并通过分派 utter 属性中指示的响应再次向用户询问槽。如果没有规则被评估为 True,则动作将保留填充槽的原始值,对话机器人将继续执行流中的下一步。

注意

此动作需要企业搜索策略

此动作可用于从任何、规则或故事触发企业搜索策略。它通过操纵对话堆栈框架来工作。此动作的结果是 LLM 生成的对用户的响应。企业搜索策略通过使用相关知识库文档、槽上下文和对话记录提示 LLM 来生成响应。

如果你有 out_of_scope 意图,可以按照以下方式使用此动作:

rules:
- rule: Out of scope
  steps:
  - intent: out_of_scope
  - action: action_trigger_search

如果你使用 FallbackClassifier,可以按照以下方式使用此动作:

rules:
- rule: Respond with a knowledge base search if user sends a message with low NLU confidence
  steps:
  - intent: nlu_fallback
  - action: action_trigger_search

action_reset_routing

此动作是 NLU 系统和 CALM 系统共存所必需的。它充当默认动作 action_restart 的软版本:

  • 它会重置所有未标记为持久性的槽(请参阅此章节)。
  • 它不会完全重置追踪器,而是隐藏基于 NLU 的系统策略的所有先前追踪器事件。这样,在 CALM 中发生的事情将不会显示在基于 NLU 的系统策略的追踪器中,但你仍然可以在 rasa inspect 等工具中查看完整的追踪器历史记录。如果事件没有被隐藏,则在推理过程中,基于 NLU 的系统策略的追踪器看起来与训练期间的样子不同。这会导致错误的预测。隐藏事件的一个例外是持久化槽的 SlotSet 事件(请参阅此章节)。

此动作还会重置槽 route_session_to_calm,确保共存路由器在下一个传入用户消息时再次启用。这样,用户可以在一次会话中掌握多种技能。

action_clean_stack

此动作在对话机器人更新后维护堆栈完整性方面起着至关重要的作用。

对话机器人更新是指对对话机器人代码库进行的修改或增强,通常是为了引入新功能、修复错误或提高性能。在这种情况下,对话机器人版本从 A 过渡到 B 表示正在向对话机器人部署更新,这可能包括对其行为、响应或底层功能的更改。当对话机器人更新发生在正在进行的对话期间时,它需要特殊处理以确保对话保持一致且不受更新的影响。

此动作通过将堆栈中的所有帧设置为结束步骤来实现这一点。目前,它在 pattern_code_change 流中使用。