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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 08:06:23