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
相关产品推荐
相关产品推荐

