Rasa v3.5.13框架下表单槽位编辑与确认逻辑的实现问题求助
各位大佬好,我正在用Python结合Rasa开发一个预订类机器人,现在遇到了表单确认步骤的实现难题,想请教下大家的解决方案。
我的核心需求是:用户填完表单所有槽位后,机器人要触发一个确认流程,具体要求包括:
- 用户可以直接确认已填写的所有槽位值
- 用户可以选择修改某个/某些槽位的值
- 整个逻辑要具备扩展性,能兼容后续新增的用户输入和意图
我还画了一张流程图来更直观地展示想要实现的逻辑(核心流转:表单填完→展示所有槽位→询问确认→用户确认则完成预订;用户要修改则跳转回对应槽位重新填写;修改完再次回到确认环节)。
现在有两个核心问题想请教:
- 大家在Rasa里通常是怎么实现这种表单确认步骤的?有没有成熟的方案?
- 针对我设计的这套确认逻辑,具体该怎么落地实现?
先说明下我当前使用的版本:Rasa v3.5.13,Rasa SDK v3.5.1。
我自己已经尝试了几种方案,但都遇到了问题:
方案一:在表单内部嵌入确认逻辑
我给book_form添加了一个额外的confirmation槽位,也写好了对应的槽位提取和验证逻辑来处理用户的确认/修改输入,但遇到了几个棘手的问题:
- 没法让Rasa在调用
book_form的前后触发自定义动作 - 尝试继承
FormAction的时候发现根本行不通,因为它没有继承interfaces.py里的Action接口 - 配置的规则和
book_form执行后自动触发的action_listen冲突 - 试过写一个包装动作来调用
book_form,第一次运行正常,但之后活跃循环会直接调用原book_form,完全忽略我的包装动作
方案二:表单完成后单独处理确认逻辑
这个思路是在book_form填完所有槽位后,把自定义动作设置到活跃循环中,一开始看起来能运行,但很快发现了问题:Rasa只会执行自定义动作返回的最后一个FollowupAction,而我每次循环需要触发多个动作(比如先展示槽位,再询问确认)。
后来我又调整了思路,做了一个仅用来设置分类槽位confirmation_status的自定义动作,槽位值包括initialized(初次进入确认)、confirmed(用户确认)、rejected(用户要修改)、fixed(用户修改完槽位)。原本想通过故事来依赖这个槽位处理流转逻辑,但效果极差,甚至完全不生效——哪怕只是实现“活跃循环结束后触发action_extract_confirmation_status”这么简单的逻辑,两个故事都搞不定,更别说覆盖所有场景了。
目前来看,如果用规则替代故事,第二种方案似乎有可行性,但需要写大量规则,后续扩展肯定会成为瓶颈。对我来说,用Python硬编码逻辑会更健壮、更易维护,但我实在找不到在Rasa里正常实现这种自定义逻辑的方式。
更新:尝试了基于活跃循环的规则方案
我最近又试了一种新方法,写了以下规则:
- rule: Activate confirmation loop steps: - action: book_form - slot_was_set: - requested_slot: null - active_loop: null - action: action_extract_confirmation_status - active_loop: action_extract_confirmation_status wait_for_user_input: false - rule: Ask for confirmation the first time condition: - active_loop: action_extract_confirmation_status steps: - action: action_extract_confirmation_status - slot_was_set: - confirmation_status: initialized - action: utter_introduce_slots - action: action_utter_slots - action: utter_ask_for_confirmation - rule: Ask for confirmation condition: - active_loop: action_extract_confirmation_status steps: - action: action_extract_confirmation_status - slot_was_set: - confirmation_status: fixed - action: action_utter_slots - action: utter_ask_for_confirmation - rule: Ask for correction in confirmation loop condition: - active_loop: action_extract_confirmation_status steps: - action: action_extract_confirmation_status - slot_was_set: - confirmation_status: rejected - action: utter_ask_for_correction - rule: Finish confirmation condition: - active_loop: action_extract_confirmation_status steps: - action: action_extract_confirmation_status - slot_was_set: - confirmation_status: confirmed - active_loop: null - action: utter_booking_completed
结果又遇到了规则冲突的问题,报错信息如下:
- the prediction of the action 'action_utter_slots' in rule 'Ask for confirmation' is contradicting with rule(s) 'handling active loops and forms - action_extract_confirmation_status - action_listen' which predicted action 'action_listen'.
- the prediction of the action 'utter_ask_for_correction' in rule 'Ask for correction in confirmation loop' is contradicting with rule(s) 'handling active loops and forms - action_extract_confirmation_status - action_listen' which predicted action 'action_listen'.
- the prediction of the action 'utter_introduce_slots' in rule 'Ask for confirmation the first time' is contradicting with rule(s) 'handling active loops and forms - action_extract_confirmation_status - action_listen' which predicted action 'action_listen'.
提示我必须更新故事和规则避免冲突,这真的太让人崩溃了。有没有大佬能指点下我该怎么解决?
备注:内容来源于stack exchange,提问作者Alexei Sischin




