本文继续围绕工业级业务对话平台和框架Rasa,对Rasa对话机器人项目实战之教育领域Education Bot项目关于Form的定义,如何激活一个form或者使当前运行的form进入不激活状态,如何在form中使用slots,以及如何对form收集的信息进行验证,关于dynamic form的行为等等内容进行详细分析。
一、Rasa对话机器人项目实战之教育领域Education Bot项目Form内幕解析及自定义全解
Form在开发Rasa对话机器人时起核心作用,它是目前Rasa对话机器人用于收集用户信息的最好方式。
下面是项目使用的一个form的定义,可以看到需要收集的信息定义在required_slots中:
另外也可以通过form来控制对话流程,form运行时的优先级比rules高,可以把需要的内容放在form中以确保按照预期的方式来运行。
2. Rasa form的定义与activation解析与案例剖析
Form是在domain文件中定义的,form的名称也是在stories或者rules中用于执行form的action的名称。你需要在required_slots中指定form需要收集的slots。下面是form定义样例:
可以使用key ignored_intents来定义需要form忽略的intents list,在这个key中定义的intents会被添加到每个slot mapping的key not_intent中。
通常使用rules来激活form和提交form,下面的rule用来激活form,步骤是先执行action “utter_ask_playground_help”,然后让用户进行确认,确认后会执行action “playground_form”来激活form:
下面的rule定义了如何提交一个form,条件是form需要处于激活状态,提交后需要设置active_loop为null:
为了使用Rasa提供的forms,你需要确保RulePolicy被添加到policies配置中:
当form通过action被激活后,会使用以下两个格式之一的response来请求用户提供form正在请求的slot信息:
utter_ask_
utter_ask_
3. Deactivating a form解析及最佳实践
一旦一个form需要的slots信息收集完成,那么这个form就会自动进入不激活状态。可以使用rule或者story来描述当form终止时对话机器人的行为,如果没有这样做,那么form运行停止后就会进入监听用户下一条消息的状态。下面的样例显示结束form运行之后会执行action utter_submit和utter_slots_values:
4. Writing stories/rules for unhappy form paths解析及案例剖析
当用户没有总是按照对话机器人要求提供信息时,那么form action的执行就会被拒绝,这时form会自动抛出异常ActionExecutionRejection,下面是针对这种情况的可能场景:
-一个slot被请求,但是用户没有使用最新的消息来填充slot,而且你没有定义一个自定义action用于slots验证或者提取
-一个slot被请求,但是用于slots验证或提取的自定义action没有返回任何SlotSet事件
为了明确拒绝form执行,可以让自定义action返回ActionExecutionRejected事件。为了处理form拒绝执行的情况,可以在rules或者stories中有针对性的进行处理,譬如下面的样例:
另外一种情况是,用户在form收集信息时改变决定不想再继续处理业务,这时form应该停止运行,具体做法是使用一个默认action action_deactivate_loop来使form进入不激活状态并且重置所请求的slot。样例如下:
强烈建议使用Rasa提供的interactive learning的方式来构建这些rules或者stories,如果自己写则可能会遗漏掉重要的内容。
5. Form slot mappings剖析
由于从Rasa 3.0开始,所有的slots定义在domain文件的slots部分,那么同一个slot mapping就可以跨多个forms来使用,从而移除不必要的重复部分,下面是项目使用的一个slot mapping,可以看到加入了conditions,只有这个form运行时才会使用entity的值来填充这个slot:
6. Validating form input解析及案例剖析
当从用户输入中提取到slot的值时,需要进行验证,Rasa默认只验证那些已经填充了值的slots。你可以实现一个自定义的验证action来验证任何提取的slots,需要确保这个action被添加到domain文件中:
这个自定义action可以继承自FormValidationAction,这样可以简化验证slots的过程,在这种情况下,需要为每一个提取的slot编写validate_
7. Custom slot mappings解析及案例剖析
如果没有任何预定义的slot mapping可以满足需求的情况下,可以使用自定义action validate_
-为使用custom类型的slot mapping中的每个slot定义一个方法:extract_
-在domain文件的form定义中的key required_slots中,列出所有使用预定义和自定义slot mappings的slots
下面的例子显示了如何根据用户输入文本中包含的outdoor信息来提取slot信息:
8. Dynamic form behavior解析及案例剖析
默认情况下Rasa是通过domain中form定义所列出的slots来依次向用户请求还没有填充值的slot信息。如果你使用自定义slot mappings和FormValidationAction,那么Rasa会根据方法required_slots返回的第一个为空的slot来向用户请求信息。可以通过覆写方法required_slots来动态添加要请求的slots,譬如需要基于之前请求的slot的信息来进一步获取更多内容时,通过覆写这个方法也可以改变slots的请求顺序。
你需要为每个不使用预定义slot mapping的slot定义一个方法extract_
如果想从domain中的form定义中的required_slots中移除一个slot,你应该先把上面例子中的domain_slots的值赋予另外一个新变量,然后在这个变量的基础上进行移除slot的操作,而不是去直接修改domain_slots,因为这样做可能会造成非预期的行为,样例如下:
9. Requested_slot slot解析及案例剖析
Requested_slot是一种text类型的slot,会被自动添加到domain中,在对话中requested_slot的值默认会被忽略,如果想改变这种行为,那么需要添加requested_slot到domain文件中,类型为categorical,属性influence_conversation设置为true。如果你想基于当前请求的slot对非预期情况进行处理时,譬如针对下面的样例,当用户使用其它的问题来响应当前对话的slot请求时:
10. Custom action to ask for the next slot解析及案例剖析
一旦form决定了需要向用户收集的下一个slot,就会执行相关的action utter_ask_xxx,如果这种常规的做法不能满足需求,也可以使用自定义action如action_ask_