需求背景
例如,我想让 Rasa 提示用户输入要购买的图书数量,需要输入 1 本到 100 本。
方案一
slots:
book_number:
type: float
min_value: 1
max_value: 100
但是这里的 min_value 及 max_value 只是限制了范围, 在输入的数字超过范围时,自动修正为边界值,没有起到校验失败时提示的效果。
这个方案不好。
注:
slot type 没有整型,只有 float 类型。
方案二
Rasa Custom Action validating:
https://rasa.com/docs/rasa/forms/#validating-form-input
即,实现一个与 Form 绑定的 Custom Action 来进行校验。
这个方案的好处是,避免了去写独立的校验失败 story,而且 rule 里没法实现 (不支持 checkpoint, 也不能写两套 form loop)。 看起来这是唯一可行的方案,没有退路。。。
具体规则如下:
- 继承类 FormValidationAction
- name: validate_formname
- 方法名:validate_slotname
- 不要忘记在 domain 中添加这个新增的 action 名字
示例代码:
class ValidateBookNumberForm(FormValidationAction):
def name(self) -> Text:
return "validate_book_number_form"
def validate_book_number(
self,
slot_value: Any,
dispatcher: CollectingDispatcher,
tracker: Tracker,
domain: DomainDict,
) -> Dict[Text, Any]:
try:
intValue = int(slot_value)
except Exception as e:
intValue = 0
if intValue > 0 and intValue < 101:
# validation succeeded, set the slot value
return {"book_number": slot_value}
# validation failed, set this slot to None so that the
# user will be asked for the slot again
dispatcher.utter_message(response="utter_invalid_book_number")
return {"book_number": None}
经测试,完美满足需求。
同时 utter_message 也支持返回自定义字段,兼容性也足够。
方案三
在接收 form slot 的 custom action python 逻辑中进行校验。
校验失败时,将 slot 置空,并 return。但是就如上面提到的,没法在 rule 中编写校验失败分支逻辑,至少我暂时是想不出来。
这个方案直接否决。
结论
目前看方案二是最优雅,且实用的校验方案。
Rasa 项目开发,大部分时间考验的是耐心,如果没有一个平和的心态,去面对奇怪的问题,很难坚持下去。
而整理笔记对我来说,就是平静下来的极佳手段。
查看合集
微信关注我哦 👍
我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式