Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之教育领域Education Bot项目Slots解析、Slot Validation Action剖析(七十四)

   本文继续围绕工业级业务对话平台和框架Rasa,对Rasa对话机器人项目实战之教育领域Education Bot项目Slots的各种类型及运用实践、如何通过Slot Validation Action来自定义slot mapping及运用实践,以及项目使用的entities及intents等内容进行解析。

一、Rasa对话机器人项目实战之教育领域Education Bot项目Slots内幕解析、Slot Validation Action剖析、entities及intents解析

  1. Rasa slots工作机制及最佳实践解析

Slots在rasa对话系统状态管理中发挥着核心作用,用户与对话机器人的交互会产生slots需要的信息,而Rasa调用微服务返回的事件可以更新tracker中的slots的值。从某种程度上来说,slots控制了对话流程,slots构成了对话机器人的memory。Slots是以key-value的形式来存储用户提供的信息,以及通过外部调用获取的信息,譬如数据库查询结果等。

下面是在domain文件中定义的slots样例:

 2.  Slot和conversation behavior详解及示例剖析

你可以使用influence_conversation来决定是否让一个slot影响到对话行为。设置为false则只会存储信息而不会影响到对话状态。下面的样例定义了slot age来存储用户的年龄信息,但是对话机器人在每次预测下一个action时会忽略掉这个slot的信息,从而不会影响到对话流程。

当不设置这个属性或者设置为true,则会影响到对话流程,除非这个slot的type为any,slot影响对话的方式取决于slot type。在下面的样例中,slot home_city为text类型的slot,如果有值则会影响对话,具体是什么值在影响对话流程方面并没有区别。

 3.  Slot types:Text slot、boolean slot、categorical slot、float slot、list slot、any slot详解及示例

Text slot:用于存储文本值

样例如下:

可以使用额外的属性influence_conversation来决定是否让一个slot影响到对话行为。

Boolean slot:存储bool值true或者false

样例如下:

可以使用额外的属性influence_conversation来决定是否让一个slot影响到对话行为。需要注意的是一个空值或false值在影响对话方面是不一样的。

Categorical slot:用于slot的值是从预定义的值的分类列表中选择一个的情况

样例如下:

如果属性influence_conversation设置为true,对话行为的改变取决于slot的值,一个默认值__other__会被自动添加到用户定义的值列表中。如果没有值匹配用户定义的值列表中的任何一个,则会被匹配为__other__。

Float slot:用于存储实数值

样例如下:

默认max_value=1.0, min_value=0.0,判断规则如下:

-如果slot的值在max_value和min_value之间,就使用这个slot的值

-如果slot的值低于min_value,则使用min_value定义的值

-如果slot的值大于max_value,则使用max_value定义的值

List slot:用于存储值列表

样例如下:

如果属性influence_conversation设置为true,list是否有值会影响到对话,而list的长度大小对对话流程没有影响。

Any slot:用于存储任意值,可以是任意类型的,譬如dictionary或者list等

样例如下:

这个类型的slot在对话中总是会被忽略,对于这个类型,属性influence_conversation不能被设置为true。

 4.  Custom slot types工作机制及示例剖析

在开发餐馆预定对话系统时,可能需要处理如订位人数上限最多为6人的情况,在这种情况下可以开发一个自定义的slot类通过控制slot的值来影响对话下一个action的行为。

在下面例子中定义了slot NumberOfPeopleSlot,通过特征化处理来把一个slot的值转换为一个vector,以方便Rasa的机器学习模型能够进行处理slot的值。slot NumberOfPeopleSlot有以下3个可能的值,可以使用长度为2的vector来表示:

(0,0) 没有设置slot值

(1,0) slot值在1和6之间

(0,1) slot值>6

以下是示例:

你可以把实现的自定义的slot 类作为单独的一个Python模块来使用,以便于和其它的自定义action代码区分开,即把自定义的slot类放在一个目录里,添加一个名为"__init__.py"的空文件,然后通过模块路径来引用这个自定义slot类。

样例如下:

接下来在domain文件中配置如下:

为了能够让Rasa框架使用你的自定义slot类,基于各种不同的slot people的值添加训练数据,以下是stories数据样例:

 5.  Slot mappings详解及示例剖析

从Rasa 3.0开始,slot mapping定义在domain的slots部分,移除了之前的版本提供的slot隐式自动填充机制,取而代之的是明确定义如何根据用户输入来把值映射到slot中。你需要明确为domain中定义的每一个slot提供明确的slot mapping。对于slot mapping的默认行为来说,当每次用户输入消息后就会运行slot mapping来提取用户信息,这与对话上下文无关。为了使一个slot mapping只在一个form的上下文中运用,可以使用mapping conditions。

关于from_entity:

这种mapping是基于提取的entities来填充slots,需要提供参数entity,这些参数是可选的:intent,not_intent,role,group。

以下是样例:

当在form上下文中使用from_entity的mapping时会有限制,在form激活时,只有满足下面的一个或者多个条件才能使用mapping:

-使用from_entity的slot正在被form所请求

-form定义的required_slots中只有一个slot使用特定的from_entity mapping,这就是form的唯一entity mapping机制,如果存在多个from_entity mapping,那么提取的entity就会被忽略,这是会了防止同一个entity的值被填充到多个slots中

样例如下:

关于from_text:

使用用户最近输入的文本信息来填充slot,如果指定了intent,那么只有触发这个intent时才会进行填充,否则填充slot与intent无关。如果用户输入对应的intent包含在excluded_intent中,那么也不会执行填充。

样例如下:

关于from_intent:

只有当通过用户输入识别到的intent与slot mapping中intent参数的值匹配时才会进行slot填充,如果不指定intent,那么只要intent不在not_intent里面就可以填充slot。

样例如下:

关于from_trigger_intent:

当一个form通过具有特定intent的用户消息来激活时,就会使用slot mapping中指定的值来填充slot。如果intent在not_intent里面则 不会填充slot。

样例如下:

 6.  Mapping conditions详解及示例剖析

为了只在一个form的上下文中运用slot mapping,可以在slot mapping中使用conditions key来指定form,在active_loop中指定可以运用mapping的form名称。如果不指定requested_slot,那么只要相关信息被提取就会填充slot,而与当前哪个slot正在被请求无关。

样例如下:

 7.  Custom slot mapping详解及示例剖析

你可以使用slot validation actions来自定义slot mappings,这时需要设置slot mapping的类型为custom。

样例如下:

你也可以不指定action,让任意的自定义action可以填充自定义mapping中的slot,譬如通过自定义action返回的SlotSet事件来填充slot。

样例如下:

 8.  Action_validate_slot_mappings详解及源码剖析

你可以使用action_validate_slot_mapping来在一个form上下文环境之外提取或者验证slots。这个action会自动在默认action action_extract_slots运行后被调用,所以名称不能被改变,并且这个自定义action应该继承自Rasa SDK的ValidationAction。你不需要在自定义slot mapping中指定action的名称,只要这个action在domain文件中的actions部分被列出。

 9.  Entities详解及示例剖析

Domain中的entities部分列出了在NLU pipeline里配置的任何entity extractor可以提取的entities。样例如下:

 10.  Intents详解及示例剖析

Domain文件中的intents部分列出了NLU数据和stories数据中使用的所有intents,样例如下:

可以使用use_entities: []来针对一个intent忽略所有的entities:

猜你喜欢

转载自blog.csdn.net/m0_49380401/article/details/123413487
今日推荐