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

