对话机器人 Rasa(二十五):Form Slot 输入校验

文章目录

    需求背景

    例如,我想让 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 项目开发,大部分时间考验的是耐心,如果没有一个平和的心态,去面对奇怪的问题,很难坚持下去。

    而整理笔记对我来说,就是平静下来的极佳手段。

    查看合集

    📖 对话机器人 Rasa 中文系列教程

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式