如何让Rasa聊天机器人等待用户输入后再执行后续代码?
解决Rasa机器人等待用户输入后再执行后续代码的问题
你遇到的核心问题是:Rasa的自定义动作是同步执行的,同一个动作里的代码会一次性跑完,不会中途暂停等待用户输入。要实现“发送请求输入的消息→等待用户输入→执行后续逻辑”的流程,得利用Rasa的对话回合机制或者表单功能拆分逻辑。
方案一:用Rasa表单(推荐,适合收集用户信息场景)
表单是Rasa专门用来收集用户必填信息的工具,会自动等待用户输入直到收集完所有slot,之后再执行后续动作。
1. 在domain.yml中配置
slots: name: type: text influence_conversation: false forms: name_form: required_slots: - name responses: utter_ask_name: - text: "请输入你的名字"
2. 编写自定义动作处理表单完成后的逻辑
在actions.py里添加:
from rasa_sdk import Action, Tracker from rasa_sdk.executor import CollectingDispatcher from rasa_sdk.events import AllSlotsReset class ActionSubmitName(Action): def name(self) -> str: return "action_submit_name" def run(self, dispatcher: CollectingDispatcher, tracker: Tracker, domain: dict) -> list: # 获取用户输入的名字 user_name = tracker.get_slot("name") # 执行后续逻辑 print('hi') # 可选:发送确认消息 dispatcher.utter_message(text=f"你好{user_name}!") # 重置slot(如果不需要保留的话) return [AllSlotsReset()]
3. 编写规则触发表单
在rules.yml里添加:
rules: - rule: 触发收集名字的表单 steps: - intent: greet - action: name_form - active_loop: name_form - rule: 表单完成后执行后续动作 steps: - active_loop: name_form - active_loop: null - action: action_submit_name
方案二:拆分自定义动作+故事/规则
如果不需要表单,也可以把逻辑拆成两个独立动作,通过对话流程控制顺序:
1. 第一个动作:仅发送请求输入的消息
在actions.py里:
class ActionAskName(Action): def name(self) -> str: return "action_ask_name" def run(self, dispatcher: CollectingDispatcher, tracker: Tracker, domain: dict) -> list: dispatcher.utter_message(text="请输入你的名字") return []
2. 第二个动作:执行后续逻辑(打印hi)
class ActionAfterNameInput(Action): def name(self) -> str: return "action_after_name_input" def run(self, dispatcher: CollectingDispatcher, tracker: Tracker, domain: dict) -> list: print('hi') # 可选:发送后续消息 dispatcher.utter_message(text="已收到你的名字") return []
3. 编写故事控制流程
在stories.yml里:
stories: - story: 收集名字后执行逻辑 steps: - intent: greet - action: action_ask_name - intent: inform_name # 需在nlu.yml中定义识别用户输入名字的intent - action: action_after_name_input
同时要在nlu.yml中添加训练数据,让Rasa能识别用户输入名字的意图:
nlu: - intent: inform_name examples: | - 我叫张三 - 李四 - 我的名字是王五
两种方案的核心都是把“请求输入”和“后续逻辑”拆分成不同的对话回合,让Rasa在两个动作之间等待用户的输入。
内容的提问来源于stack exchange,提问作者Ramin Bakhtiyari
相关产品推荐
相关产品推荐

