Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot项目Form解析及自定义全解(七十五)

   本文继续围绕工业级业务对话平台和框架Rasa,对Rasa对话机器人项目实战之教育领域Education Bot项目关于Form的定义,如何激活一个form或者使当前运行的form进入不激活状态,如何在form中使用slots,以及如何对form收集的信息进行验证,关于dynamic form的行为等等内容进行详细分析。

Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot项目Form解析及自定义全解(七十五)_第1张图片

Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot项目Form解析及自定义全解(七十五)_第2张图片

 一、Rasa对话机器人项目实战之教育领域Education Bot项目Form内幕解析及自定义全解

  1. Education Bot项目Form使用分析

Form在开发Rasa对话机器人时起核心作用,它是目前Rasa对话机器人用于收集用户信息的最好方式。

下面是项目使用的一个form的定义,可以看到需要收集的信息定义在required_slots中:

Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot项目Form解析及自定义全解(七十五)_第3张图片

另外也可以通过form来控制对话流程,form运行时的优先级比rules高,可以把需要的内容放在form中以确保按照预期的方式来运行。

 2.  Rasa form的定义与activation解析与案例剖析

Form是在domain文件中定义的,form的名称也是在stories或者rules中用于执行form的action的名称。你需要在required_slots中指定form需要收集的slots。下面是form定义样例:

Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot项目Form解析及自定义全解(七十五)_第4张图片

可以使用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:

Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot项目Form解析及自定义全解(七十五)_第5张图片

下面的rule定义了如何提交一个form,条件是form需要处于激活状态,提交后需要设置active_loop为null:

Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot项目Form解析及自定义全解(七十五)_第6张图片

为了使用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:

Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot项目Form解析及自定义全解(七十五)_第7张图片

 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中有针对性的进行处理,譬如下面的样例:

Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot项目Form解析及自定义全解(七十五)_第8张图片

另外一种情况是,用户在form收集信息时改变决定不想再继续处理业务,这时form应该停止运行,具体做法是使用一个默认action action_deactivate_loop来使form进入不激活状态并且重置所请求的slot。样例如下:

Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot项目Form解析及自定义全解(七十五)_第9张图片

强烈建议使用Rasa提供的interactive learning的方式来构建这些rules或者stories,如果自己写则可能会遗漏掉重要的内容。

 5.  Form slot mappings剖析

由于从Rasa 3.0开始,所有的slots定义在domain文件的slots部分,那么同一个slot mapping就可以跨多个forms来使用,从而移除不必要的重复部分,下面是项目使用的一个slot mapping,可以看到加入了conditions,只有这个form运行时才会使用entity的值来填充这个slot:

Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot项目Form解析及自定义全解(七十五)_第10张图片

 6.  Validating form input解析及案例剖析

当从用户输入中提取到slot的值时,需要进行验证,Rasa默认只验证那些已经填充了值的slots。你可以实现一个自定义的验证action来验证任何提取的slots,需要确保这个action被添加到domain文件中:

这个自定义action可以继承自FormValidationAction,这样可以简化验证slots的过程,在这种情况下,需要为每一个提取的slot编写validate_方法。下面的validation方法样例显示了如何对slot进行验证,即只有slot的值存在于数据库中才能设置这个值,否则设置为None:

Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot项目Form解析及自定义全解(七十五)_第11张图片

 7.  Custom slot mappings解析及案例剖析

如果没有任何预定义的slot mapping可以满足需求的情况下,可以使用自定义action validate_来写你自己的slots提取代码逻辑,Rasa在form运行时会触发这个action。如果使用Rasa SDK,那么推荐继承自FormValidationAction,为了提取自定义的slots,需要完成以下步骤:

-为使用custom类型的slot mapping中的每个slot定义一个方法:extract_

-在domain文件的form定义中的key required_slots中,列出所有使用预定义和自定义slot mappings的slots

下面的例子显示了如何根据用户输入文本中包含的outdoor信息来提取slot信息:

Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot项目Form解析及自定义全解(七十五)_第12张图片

 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_,下面的样例演示了如何根据一个slot的值来控制是否需要请求另一个slot的信息:

Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot项目Form解析及自定义全解(七十五)_第13张图片

如果想从domain中的form定义中的required_slots中移除一个slot,你应该先把上面例子中的domain_slots的值赋予另外一个新变量,然后在这个变量的基础上进行移除slot的操作,而不是去直接修改domain_slots,因为这样做可能会造成非预期的行为,样例如下:

Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot项目Form解析及自定义全解(七十五)_第14张图片

 9.  Requested_slot slot解析及案例剖析

Requested_slot是一种text类型的slot,会被自动添加到domain中,在对话中requested_slot的值默认会被忽略,如果想改变这种行为,那么需要添加requested_slot到domain文件中,类型为categorical,属性influence_conversation设置为true。如果你想基于当前请求的slot对非预期情况进行处理时,譬如针对下面的样例,当用户使用其它的问题来响应当前对话的slot请求时:

Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot项目Form解析及自定义全解(七十五)_第15张图片

 10.  Custom action to ask for the next slot解析及案例剖析

一旦form决定了需要向用户收集的下一个slot,就会执行相关的action utter_ask_xxx,如果这种常规的做法不能满足需求,也可以使用自定义action如action_ask__ 或者action_ask_来向用户请求下一个slot,样例如下:

Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot项目Form解析及自定义全解(七十五)_第16张图片

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