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

更新日期: 2023-09-17 阅读次数: 824 字数: 523 分类: AI

需求背景

例如,我想让 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 中文系列教程

tags: rasa

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式