本文继续围绕工业级业务对话平台和框架Rasa,对Rasa对话机器人项目实战之教育领域Education Bot微服务FormValidationAction案例实验进行剖析,并对form运行时收集的slots值如何进行验证以及Rasa SDK的form验证框架的相关源码进行解析。
一、Rasa对话机器人项目实战之教育领域Education Bot微服务FormValidationAction案例实验剖析及全生命周期运行源码详解
- 通过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是否有效: