如何在Rasa 1.X中正确使用UserUttered事件?——Rasa 1.5.3自动纠错场景回退动作报错问题
解决Rasa 1.5.3中
UserUttered事件在默认回退动作里的使用问题 你遇到的问题核心是动作返回值格式不符合Rasa SDK要求,我来帮你拆解问题并给出落地的修正方案:
直接报错原因:返回单个事件而非事件列表
你的run方法直接返回了UserUttered对象,但Rasa SDK明确要求动作的run方法必须返回事件的列表(list),单个事件会导致Core处理器无法正确处理,从而抛出你看到的错误。
修正后的完整代码示例
下面是调整后的代码,不仅修复了返回值问题,还补充了优化对话流程的必要处理:
from rasa_sdk import Action from rasa_sdk.events import UserUttered, UserUtteranceReverted class ActionDefaultFallback(Action): def name(self): return "action_default_fallback" def run(self, dispatcher, tracker, domain): # 获取用户的原始输入文本 original_text = tracker.latest_message['text'] # 调用你的自定义拼写纠正工具 correct_text = my_custom_spellcheck.correct(original_text) # 如果纠正前后文本一致,说明无法修正,直接返回默认提示 if correct_text == original_text: dispatcher.utter_message(text="抱歉,我没太理解你的意思,可以再详细说一下吗?") return [] # 1. 先回退之前无法解析的原始输入,避免它留在对话轨迹中干扰后续流程 events = [UserUtteranceReverted()] # 2. 添加纠正后的用户输入事件,让Rasa自动重新运行NLU流水线解析 events.append(UserUttered(text=correct_text, parse_data=None)) # 给用户一个反馈,告知已修正输入 dispatcher.utter_message(text=f"我猜你想说的是:{correct_text}?") return events
几个关键细节说明
- 必须返回事件列表:所有要触发的对话事件都要放在列表里返回,这是Rasa SDK的硬性要求,也是解决你当前报错的核心。
- 回退原始输入:使用
UserUtteranceReverted可以把之前无法解析的用户输入从对话轨迹中移除,避免错误的输入记录影响后续的意图识别和对话状态。 - 自动触发NLU重解析:给
UserUttered设置parse_data=None,Rasa会自动对纠正后的文本重新运行NLU流水线,生成对应的意图和实体解析结果,这样后续的对话流程就能正确响应了。 - 用户反馈:添加提示消息告知用户输入已修正,能提升对话的透明度和用户体验。
另外,还要确保你的动作服务器正常运行,并且Rasa Core的配置文件中正确配置了action_endpoint,这样动作返回的事件才能被Core正确接收和处理。
内容的提问来源于stack exchange,提问作者gfyhser
相关产品推荐
相关产品推荐

