Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot微服务FormValidationAction实验剖析及Form验证源码详解(六十六)

84 篇文章 16 订阅

   本文继续围绕工业级业务对话平台和框架Rasa,对Rasa对话机器人项目实战之教育领域Education Bot微服务FormValidationAction案例实验进行剖析,并对form运行时收集的slots值如何进行验证以及Rasa SDK的form验证框架的相关源码进行解析。

一、Rasa对话机器人项目实战之教育领域Education Bot微服务FormValidationAction案例实验剖析及全生命周期运行源码详解

  1. 通过Rasa Interactive演示调用FormValidationAction微服务过程问题分析

在Rasa对话机器人与用户交互的过程中,为了收集用户信息会使用Form,那么针对收集完的信息需要进行校验,这个校验的过程就是由验证微服务来完成的。

下面通过rasa interactive的方式演示如何对用户输入信息进行校验,首先输入信息:

根据对话提示运行action:

根据对话提示会执行form,从form定义中可以看出,需要收集slot “email”的信息,所以发送对应的消息给用户:

这是domain中的form定义:

另外从config.yml中可以看到是使用DucklingEntityExtractor来提取email:

输入一个错误格式的email:

这时可以看到由于识别的intent不正确,导致slot “email”并没有被填充:

如果继续按照所识别的intent执行,就会看到对应的输出信息:

继续输入一个email信息:

输入No,显示以下intent list:

参考nlu.yml的训练数据,在列表中选择执行intent “enter_data”并对数据进行标注:

执行action后输出:

继续执行action后输出:

根据提示输入信息:subscribing to our …:

继续执行提示的actions,输出:

再次输入错误格式的email,intent识别不正确:

这时输入正确格式的email:

可以看到slot “email”已经填充,但是提示要运行”action_default_fallback”,说明处理有问题:

继续执行这个action后,输入信息并执行,输出如下:

再次进入收集email的状态:

输入email:

这时没有正确识别输入,所以输入No获取intent list:

选择执行intent “signup_newsletter”,输出信息如下:

可以看到仍然在提示用户输入email信息,继续执行输入email,这次在intent list中选择执行intent “enter_data”,输出信息如下,可以看到提示执行action_default_fallback:

根据slot mapping的定义,在激活form时,一种方式是从提取的entity中填充,另外一种方式是通过intent “enter_data”使用输入信息填充:

所以会看到如下关于slot “email”的填充状态以及进行验证后给出的提示信息:

从action server端输出信息看,进行了多次的验证form的操作:

 2.  FormValidationAction架构设计及工作机制分析

自定义的form验证action需要继承自Rasa SDK的FormValidationAction,而FormValidationAction继承自ValidationAction,可以看到自定义的form验证action必须遵守命名规范:validate_xxx,xxx就是form名称:

当action server执行验证微服务时,实际是执行run方法,而在ValidationAction中定义了run方法,在run方法中会调用验证各个slot的方法,这些验证slot的方法会定义在自定义的form验证action中,譬如ValidateSubscribeNewsletterForm中的validate_email方法,email就是这个form “SubscribeNewsletterForm”要请求的slot。

 3.  从微服务进程的视角分析Endpoint到ActionExecutor到ValidationAction的整个调用链条

    Rasa Agent通过HTTP POST请求到Endpoint的/webhook地址来启动微服务action的调用,在action server启动的过程中会使用ActionExecutor中的方法register_action来注册自定义action。譬如ValidateSubscribeNewsletterForm,对于这个action来说,它的run方法就是父类 ValidationAction中定义的run方法,所以ActionExecutor会执行这个run方法来对form请求的slots的值进行验证。

 4.  ValidationAction的run方法代码调用FormValidationAction代码详解

FormValidationAction继承自ValidationAction,下面是ValidationAction定义的run方法,通过运行run方法来对form收集的slots的值进行验证,这是因为Rasa action server框架需要运行run方法来执行微服务:

首先调用下面的方法根据domain中form定义包含的key “required_slots”所指定的slots来提取slots信息:

下面是执行验证的方法,执行完成后会返回对应的events:

在这个方法中会分别对每一个slot调用它自己的验证方法,验证方法的格式为validate_xxx,xxx表示slot名称:

可以看到调用的method_name必须符合规则:

如果不是一个有效的slot验证方法,则给出提示信息,最后调用验证方法并返回结果,注意这里支持调用coroutine的验证方法:

关于这个方法,默认是返回domain中的slots,可以根据需要进行覆写,譬如在对话场景中需要根据情况动态调整向用户收集信息的内容时,就可以在下面的方法中写自定义逻辑来控制slots的填充:

 5.  FormValidationAction调用ValidateSubscribeNewsletterForm代码详解

这是ValidateSubscribeNewsletterForm类,继承自FormValidationAction:

在下面这个方法中,会调用API的验证email的方法对传入的email进行验证:

这是验证email的方法:

这个方法通过正则表达式来验证email是否有效:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值