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

如何在Rasa聊天机器人中强制用户输入affirm/deny意图(无按钮)

嘿,我来帮你搞定这个对话流程里强制用户输入affirm或deny意图的需求!结合你给出的主路径,我以Rasa框架为例(从你的故事结构来看应该是用这个),给你一套无按钮的实现方案:

无按钮实现强制输入affirm/deny的方法

1. 先把意图识别的基础打牢

首先得确保你的NLU模型能准确抓出affirm和deny意图,不然用户说“是的”“没有”这类常用表达都识别错了,后面的逻辑全白搭。给你的训练数据补全常见表达:

nlu:
- intent: affirm
  examples: |
    - 是
    - 对
    - 是的
    - 没错
    - 有
- intent: deny
  examples: |
    - 不是
    - 没有
    - 不对
    - 否

2. 用规则锁死无效输入的循环逻辑

这种“必须输入指定意图,否则重复提问”的强流程,用规则(Rules)来处理最靠谱,比故事灵活还不会乱。针对每个提问步骤写规则,捕获所有非affirm/deny的输入,直接重复当前提问:

rules:
# 发烧提问后,无效输入就重复问
- rule: Repeat fever question on invalid input
  steps:
  - action: utter_ask_fievre
  - intent: nlu_fallback  # 用fallback意图匹配所有识别不出的输入
  - action: utter_ask_fievre

# 咳嗽提问后同理
- rule: Repeat cough question on invalid input
  steps:
  - action: utter_ask_cough
  - intent: nlu_fallback
  - action: utter_ask_cough

# 疲劳提问后也一样
- rule: Repeat fatigue question on invalid input
  steps:
  - action: utter_ask_fatigue
  - intent: nlu_fallback
  - action: utter_ask_fatigue

小提示:如果你的框架支持直接排除指定意图,也可以把nlu_fallback换成“所有非affirm/deny的意图”,这样覆盖更全面。

3. 主故事保留正常流程就行

你的主路径故事不用大改,只需要处理用户输入正确意图后的推进逻辑:

stories:
- story: checking_coronavirus_path1
  steps:
  - intent: whichCheckCoronavirus
  - action: utter_ask_fievre
  - or:
    - intent: affirm
    - intent: deny
  - action: action_save_intent_and_user_message
  - action: utter_ask_cough
  - or:
    - intent: affirm
    - intent: deny
  - action: action_save_intent_and_user_message
  - action: utter_ask_fatigue
  - or:
    - intent: affirm
    - intent: deny
  - action: action_save_intent_and_user_message

4. 可选:用自定义动作做更严格的校验

如果想要更精准的控制(比如怕规则漏了某些情况),可以写个自定义动作,专门检查用户的意图是否合法,不合法就直接重复提问。比如在Rasa里写这样的动作:

from typing import Any, Text, Dict, List
from rasa_sdk import Action, Tracker
from rasa_sdk.executor import CollectingDispatcher

class ValidateRequiredIntent(Action):
    def name(self) -> Text:
        return "action_validate_required_intent"

    def run(self, dispatcher: CollectingDispatcher,
            tracker: Tracker,
            domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:
        last_intent = tracker.latest_message['intent']['name']
        last_bot_action = tracker.last_action_name
        
        # 检查意图是否是允许的
        if last_intent not in ["affirm", "deny"]:
            # 根据机器人上一个动作,重复对应的提问
            if last_bot_action == "utter_ask_fievre":
                dispatcher.utter_message(response="utter_ask_fievre")
            elif last_bot_action == "utter_ask_cough":
                dispatcher.utter_message(response="utter_ask_cough")
            elif last_bot_action == "utter_ask_fatigue":
                dispatcher.utter_message(response="utter_ask_fatigue")
            # 返回空列表,不让流程往下走
            return []
        # 意图合法,继续执行后续动作
        return []

然后把这个动作加到主故事里,放在保存意图的动作之前:

stories:
- story: checking_coronavirus_path1
  steps:
  - intent: whichCheckCoronavirus
  - action: utter_ask_fievre
  - or:
    - intent: affirm
    - intent: deny
  - action: action_validate_required_intent
  - action: action_save_intent_and_user_message
  # 后面的咳嗽、疲劳步骤也一样加上这个动作

这样一套下来,不管用户输入什么乱七八糟的内容,只要不是affirm或deny对应的表达,机器人就会一直重复当前的提问,直到用户输入符合要求的意图,才会推进到下一个步骤。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 10:22:29