Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot项目FormValidationAction机制及源码逐行解密(七十六)

   本文继续围绕工业级业务对话平台和框架Rasa,对Rasa对话机器人项目实战之教育领域Education Bot项目中如何使用FormValidationAction来自定义form验证action,FormValidationAction和ValidationAction的架构与应用实践等内容进行详细分析。

Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot项目FormValidationAction机制及源码逐行解密(七十六)_第1张图片

Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot项目FormValidationAction机制及源码逐行解密(七十六)_第2张图片

一、Rasa对话机器人项目实战之教育领域Education Bot项目FormValidationAction内幕机制及源码逐行解密

  1. 基于Rasa微服务的Action的ValidationAction架构解析

在Education Bot项目中,使用了自定义的对form进行校验的actions,这些actions继承自FormValidationAction,这样可以简化验证slots的过程。在一个自定义验证form的action中,需要为每一个提取的slot编写命名规则为validate_的方法。在下面的例子中,可以看到定义了方法validate_email来对用户输入的email信息进行校验:

Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot项目FormValidationAction机制及源码逐行解密(七十六)_第3张图片

下面是针对另一个form的自定义validation action,其中定义了方法validate_business_email:

Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot项目FormValidationAction机制及源码逐行解密(七十六)_第4张图片

ValidationAction是围绕slots进行提取及验证操作,而FormValidationAction是面向form对收集的信息进行验证的,可以看做是ValidationAction提供的验证框架的一个子框架。

 2.  ValidationAction中提取slots信息代码逐行剖析

在方法get_extraction_events中调用方法extract_来提取自定义slots。

参数包括dispatcher,tracker,domain

返回类型:SlotSet的list

Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot项目FormValidationAction机制及源码逐行解密(七十六)_第5张图片

在下面的代码中,首先从domain中当前需要进行校验的form定义中获取key required_slots定义的slots信息,然后循环调用方法_extract_slot来提取slot并更新tracker状态,最后返回SlotSet事件:

Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot项目FormValidationAction机制及源码逐行解密(七十六)_第6张图片

下面是提取slot的方法,首先根据slot名称获取对应的extract_方法,如果没有这样的方法并且slot在domain中不存在,那么给出提示并返回空的结果;如果找到方法,则调用提取方法获取slot,如果结果是Dict类型的,则返回结果,否则返回空的结果:

Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot项目FormValidationAction机制及源码逐行解密(七十六)_第7张图片

 3.  ValidationAction中validation操作源码逐行剖析

这是在ValidationAction的run方法中执行验证的方法:

Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot项目FormValidationAction机制及源码逐行解密(七十六)_第8张图片

在下面的方法中执行验证操作并返回事件:

首先根据domain中required_slots获取准备进行验证的slots信息赋予变量slots_to_validate,然后从tracker中获取当前需要进行验证的slots信息并循环检查是否从tracker中获取的slot存在于slots_to_validate中,如果不存在则跳过验证操作,否则调用方法validate_进行验证,并返回结果:

Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot项目FormValidationAction机制及源码逐行解密(七十六)_第9张图片

Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot项目FormValidationAction机制及源码逐行解密(七十六)_第10张图片

Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot项目FormValidationAction机制及源码逐行解密(七十六)_第11张图片

 4.  ValidationAction中run方法源码逐行剖析

关于run方法,可以执行在方法extract_中定义的提取slot的代码,然后使用返回的events更新tracker。Run方法也可以执行在方法validate_定义的验证代码,然后把返回的events添加到tracker中。

参数:

-dispatcher:dispatcher用于发送消息给用户,用法为dispatcher.utter_message()或参考CollectingDispatcher相关API说明

-tracker:当前用户的状态跟踪器,你可以使用tracker.get_slot(slot_name)访问slots的值,可以使用tracker.latest_message.text从tracker中获取用户最新消息。

-domain:对话机器人的domain系统配置

返回events列表,类型为List[Dict[str, Any]]

Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot项目FormValidationAction机制及源码逐行解密(七十六)_第12张图片

 5.  FormValidationAction的domain_slots方法代码逐行剖析

在方法domain_slots中,传入参数domain,根据FormValidationAction的form_name方法从domain中forms部分获取form,然后判断如果存在key required_slots,则返回slots list,否则返回空的list:

Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot项目FormValidationAction机制及源码逐行解密(七十六)_第13张图片

 6.  FormValidationAction的_extract_validation_events代码逐行剖析

这是_extract_validation_events方法,传入参数包括dispatcher,tracker,domain,首先调用方法get_validation_events,在这个方法中会对每一个slot进行验证,然后返回validation events,之后把这些events添加到tracker中,接下来再调用方法next_requested_slot来设置下一个需要向用户请求的slot:

Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot项目FormValidationAction机制及源码逐行解密(七十六)_第14张图片

Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot项目FormValidationAction机制及源码逐行解密(七十六)_第15张图片

 7.  FormValidationAction的next_requested_slot代码逐行剖析

这是方法next_requested_slot,用于设置需要向用户请求的下一个slot,在方法中会判断如果用户不覆写required_slots方法(通常用于动态form行为场景),那么会让Rasa使用FormAction根据form定义中的required_slot key指定的slots依次来向用户请求下一个slot:

Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot项目FormValidationAction机制及源码逐行解密(七十六)_第16张图片

Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot项目FormValidationAction机制及源码逐行解密(七十六)_第17张图片

 8.  Rasa文档中ValidationAction逐句解析

ValidationAction是所有执行slots抽取和验证的自定义action的父类,这些slots可以在一个form上下文环境之外被设置或者更新。为了实现自定义slot抽取和验证逻辑,你可以继承自ValidationAction或者FormValidationAction。取决于你是否想基于一个form上下文来设置或更新slots。

 ValidationAction这个类是用于在一个form上下文环境之外抽取slots,它会忽略在一   个form上下文环境里(由slot mapping’s conditions指定)的任何slots的抽取和验证方法。当指定的form是激活状态时,ValidationAction不会运行这些方法,没有form激活时也不会运行这些方法。为了在form上下文环境里应用自定义slot mappings,你需要继承FormValidationAction。

 如何继承ValidationAction:

-必须添加action name “action_validate_slot_mappings”到domain配置的action list中,在继承ValidationAction的自定义action中不需要实现name方法。由于name方法已经在ValidationAction中实现,方法中使用的name在action server调用default action “action_extract_slots”时是以hardcoded的方式来使用的,所以如果你在自定义action中覆写了此方法,那么会造成这个自定义的action不会被运行。

你应该只创建一个继承ValidationAction的自定义action,然后在这个action中根据你的业务场景针对不同的slots创建所有的slots抽取和验证方法。在自定义slot mapping中不需要指定action的key,这是因为default action “action_extract_slots”会自动运行action “action_validate_slot_mappings”,前提是这个action被添加到domain的actions里(即在domain里注册)。

关于预定义mapping中的slots的验证:

为了验证在预定义mapping中出现的slots,你必须创建方法,方法名为” validate_”。下面是一个自定义验证slots的action,在验证方法中检查从slot “location”抽取的值是否是str,如果是则对值进行相应的操作:

Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot项目FormValidationAction机制及源码逐行解密(七十六)_第18张图片

关于自定义slot mappings中的slots的抽取:

需要为slot mapping中的每个slot创建一个方法,方法名为extract_。下面的样例显示了一个自定义action如何从slot “count_of_insults”抽取值:

Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot项目FormValidationAction机制及源码逐行解密(七十六)_第19张图片

                                          

 9.  Rasa文档中FormValidationAction逐句解析

一个FormValidationAction的自定义action只在form激活时才会运行。如果基于一个form的上下文需要从自定义slot mapping中提取slots并且/或者验证slots时,这个自定义action需要继承来自FormValidationAction的方法而不是继承自ValidationAction。

只要form是激活状态,那么继承自FormValidationAction的自定义action就会在每个用户turn运行,所以不需要使用mapping conditions。

FormValidationAction继承自ValidationAction和Python抽象接口ABC,FormValidationAction继承了ValidationAction的大部分方法,但是覆写了name和domain_slots方法,实现了新方法next_requested_slot来扩展run方法的实现。

欢迎订阅Rasa系列课程:

=======================================================================

Rasa 3.x 源码高手之路:系统架构、内核算法、源码实现详解:
https://appz0c1mshy7438.h5.xiaoeknow.com/v1/auth?redirect_url=https%3A%2F%2Fappz0c1mshy7438.h5.xiaoeknow.com%2Fv1%2Fgoods%2Fgoods_detail%2Fp_62353091e4b0beaee43652c9%3Fentry%3D2%26entry_type%3D2001%26share_type%3D5%26share_user_id%3Du_621b7b85b8dc5_3yDAYnFXeM%26type%3D3

Rasa 3.x 源码高手之路:基于Transformer的对话机器人RasaPolice:
https://appz0c1mshy7438.h5.xiaoeknow.com/v1/auth?redirect_url=https%3A%2F%2Fappz0c1mshy7438.h5.xiaoeknow.com%2Fv1%2Fgoods%2Fgoods_detail%2Fp_62353421e4b04d7e2fd83665%3Fentry%3D2%26entry_type%3D2001%26share_type%3D5%26share_user_id%3Du_621b7b85b8dc5_3yDAYnFXeM%26type%3D3

星空NLP对话机器人论文班:NLP领域10篇最高质量的对话机器人经典论文解密:
https://appz0c1mshy7438.h5.xiaoeknow.com/v1/goods/goods_detail/p_623874b7e4b04e8d90256da1?type=3&share_type=5&share_user_id=u_621b7b85b8dc5_3yDAYnFXeM&entry=2&entry_type=2001

Rasa 3.X 智能对话机器人案例开发硬核实战高手之路 (7大项目Expert版本):
https://appz0c1mshy7438.h5.xiaoeknow.com/v1/goods/goods_detail/p_62276dd8e4b0beaee431c848?type=3&share_type=5&share_user_id=u_621b7b85b8dc5_3yDAYnFXeM&entry=2&entry_type=2001

Advanced Python硬核实力高手实战之路:架构、算法、源码、案例(81讲):
https://appz0c1mshy7438.h5.xiaoeknow.com/v1/goods/goods_detail/p_6227e564e4b0beaee431ce2a?type=3&share_type=5&share_user_id=u_621b7b85b8dc5_3yDAYnFXeM&entry=2&entry_type=2001

NLP on Transformers 高手之路137课Pro版:
https://appz0c1mshy7438.h5.xiaoeknow.com/v1/goods/goods_detail/p_621c0289e4b04d7e2fd0365a?type=3&share_type=5&share_user_id=u_621b7b85b8dc5_3yDAYnFXeM&entry=2&entry_type=2001
 

你可能感兴趣的:(Rasa,AI,transformer,深度学习,人工智能)