本文继续围绕工业级业务对话平台和框架Rasa,对Rasa对话机器人项目实战之教育领域Education Bot项目中如何使用FormValidationAction来自定义form验证action,FormValidationAction和ValidationAction的架构与应用实践等内容进行详细分析。
一、Rasa对话机器人项目实战之教育领域Education Bot项目FormValidationAction内幕机制及源码逐行解密
在Education Bot项目中,使用了自定义的对form进行校验的actions,这些actions继承自FormValidationAction,这样可以简化验证slots的过程。在一个自定义验证form的action中,需要为每一个提取的slot编写命名规则为validate_
下面是针对另一个form的自定义validation action,其中定义了方法validate_business_email:
ValidationAction是围绕slots进行提取及验证操作,而FormValidationAction是面向form对收集的信息进行验证的,可以看做是ValidationAction提供的验证框架的一个子框架。
2. ValidationAction中提取slots信息代码逐行剖析
在方法get_extraction_events中调用方法extract_
参数包括dispatcher,tracker,domain
返回类型:SlotSet的list
在下面的代码中,首先从domain中当前需要进行校验的form定义中获取key required_slots定义的slots信息,然后循环调用方法_extract_slot来提取slot并更新tracker状态,最后返回SlotSet事件:
下面是提取slot的方法,首先根据slot名称获取对应的extract_
3. ValidationAction中validation操作源码逐行剖析
这是在ValidationAction的run方法中执行验证的方法:
在下面的方法中执行验证操作并返回事件:
首先根据domain中required_slots获取准备进行验证的slots信息赋予变量slots_to_validate,然后从tracker中获取当前需要进行验证的slots信息并循环检查是否从tracker中获取的slot存在于slots_to_validate中,如果不存在则跳过验证操作,否则调用方法validate_
4. ValidationAction中run方法源码逐行剖析
关于run方法,可以执行在方法extract_
参数:
-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]]
5. FormValidationAction的domain_slots方法代码逐行剖析
在方法domain_slots中,传入参数domain,根据FormValidationAction的form_name方法从domain中forms部分获取form,然后判断如果存在key required_slots,则返回slots list,否则返回空的list:
6. FormValidationAction的_extract_validation_events代码逐行剖析
这是_extract_validation_events方法,传入参数包括dispatcher,tracker,domain,首先调用方法get_validation_events,在这个方法中会对每一个slot进行验证,然后返回validation events,之后把这些events添加到tracker中,接下来再调用方法next_requested_slot来设置下一个需要向用户请求的slot:
7. FormValidationAction的next_requested_slot代码逐行剖析
这是方法next_requested_slot,用于设置需要向用户请求的下一个slot,在方法中会判断如果用户不覆写required_slots方法(通常用于动态form行为场景),那么会让Rasa使用FormAction根据form定义中的required_slot key指定的slots依次来向用户请求下一个slot:
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_
关于自定义slot mappings中的slots的抽取:
需要为slot mapping中的每个slot创建一个方法,方法名为extract_
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