You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rasa激活表单中展示用户选择按钮并暂停表单流程的实现方法

解决Rasa表单中展示用户选择按钮并暂停流程的方案

要实现收集邮箱/电话后调用API校验、展示选择按钮并暂停表单流程的需求,需要通过自定义表单验证动作+流程规则控制来实现,具体步骤如下:


1. 扩展Domain配置

首先在domain.yml中添加必要的槽、意图和实体,用于存储用户选择和捕捉按钮交互:

slots:
  # 保留原有email、phone、username等槽
  selected_user_id:
    type: text
    influence_conversation: true

intents:
  # 保留原有意图
  select_user:
    use_entities: true

entities:
  # 保留原有实体
  user_id:

2. 自定义表单验证动作

在actions.py中编写表单验证动作,负责调用API校验用户、生成按钮并暂停表单流程:

from rasa_sdk import Action, Tracker
from rasa_sdk.executor import CollectingDispatcher
from rasa_sdk.types import DomainDict
from rasa_sdk.events import ActiveLoop, SlotSet
import requests

class ValidateRegistrationForm(Action):
    def name(self) -> str:
        return "validate_registration_form"

    def run(
        self, dispatcher: CollectingDispatcher, tracker: Tracker, domain: DomainDict
    ) -> list[dict]:
        email = tracker.get_slot("email")
        phone = tracker.get_slot("phone")
        events = []

        # 当邮箱和电话都收集完成后调用API校验
        if email and phone:
            # 替换为你的实际API地址
            api_res = requests.get(
                "https://your-api-domain/check-user",
                params={"email": email, "phone": phone}
            )
            user_list = api_res.json()

            if user_list:
                # 生成按钮列表,payload直接触发选择意图并携带用户ID
                buttons = [
                    {
                        "title": f"{user['name']} ({user['email']})",
                        "payload": f"/select_user{{\"user_id\":\"{user['id']}\"}}"
                    }
                    for user in user_list
                ]
                dispatcher.utter_message(text="检测到已有相关用户,请选择:", buttons=buttons)
                # 暂停表单,不再自动请求下一个槽位
                events.append(ActiveLoop(None))
                return events

        # 无匹配用户时,继续表单原有流程
        return events

3. 处理用户选择动作

添加动作处理用户点击按钮后的逻辑,完成槽位存储并恢复表单流程:

class ActionSelectUser(Action):
    def name(self) -> str:
        return "action_select_user"

    def run(
        self, dispatcher: CollectingDispatcher, tracker: Tracker, domain: DomainDict
    ) -> list[dict]:
        user_id = next(tracker.get_latest_entity_values("user_id"), None)
        events = []

        if user_id:
            # 存储用户选择的ID
            events.append(SlotSet("selected_user_id", user_id))
            # 重新激活表单,继续收集剩余槽位(如username)
            events.append(ActiveLoop("registration_form"))
            dispatcher.utter_message(text="已选择用户,继续完成注册流程")

        return events

4. 配置规则控制流程

在rules.yml中添加规则,确保用户选择意图被正确处理并恢复表单:

rules:
  # 保留原有规则
  - rule: 处理注册流程中的用户选择
    condition:
      - active_loop: registration_form
    steps:
      - intent: select_user
      - action: action_select_user
      - active_loop: registration_form

5. 关联表单与自定义验证动作

最后在domain.yml的表单配置中,指定使用自定义的验证动作:

forms:
  registration_form:
    validate:
      - validate_registration_form
    # 保留原有email、phone、username等槽位映射

关键逻辑说明

  • 暂停表单:通过返回ActiveLoop(None)让表单停止主动请求下一个槽位,等待用户的按钮交互。
  • 按钮交互:按钮的payload采用/意图名{"实体名":"值"}格式,确保Rasa能直接识别意图并提取实体。
  • 流程恢复:用户选择后,通过规则重新激活表单,继续完成剩余槽位的收集(或根据业务需求直接结束表单)。

内容的提问来源于stack exchange,提问作者sarveshsta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 20:35:38