You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Rasa v3.5.13框架下表单槽位编辑与确认逻辑的实现问题求助

Rasa v3.5.13框架下表单槽位编辑与确认逻辑的实现问题求助

各位大佬好,我正在用Python结合Rasa开发一个预订类机器人,现在遇到了表单确认步骤的实现难题,想请教下大家的解决方案。

我的核心需求是:用户填完表单所有槽位后,机器人要触发一个确认流程,具体要求包括:

  • 用户可以直接确认已填写的所有槽位值
  • 用户可以选择修改某个/某些槽位的值
  • 整个逻辑要具备扩展性,能兼容后续新增的用户输入和意图

我还画了一张流程图来更直观地展示想要实现的逻辑(核心流转:表单填完→展示所有槽位→询问确认→用户确认则完成预订;用户要修改则跳转回对应槽位重新填写;修改完再次回到确认环节)。

现在有两个核心问题想请教:

  1. 大家在Rasa里通常是怎么实现这种表单确认步骤的?有没有成熟的方案?
  2. 针对我设计的这套确认逻辑,具体该怎么落地实现?

先说明下我当前使用的版本:Rasa v3.5.13Rasa 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

火山引擎 最新活动