后续会补充案例
本文主要介绍Rasa Core中几个重要组成部分的用法:词槽、故事、策略、表单及规则等。
1. 词槽
词槽(slot)是对话机器人的记忆,用于存储用户提供的信息以及外部信息。这些信息对于对话的走向起着至关重要的作用。Rasa中词槽的定义需要在领域文件(domain.yml
)中完成。简单举例如下:
slots:slot_name:type: textinfluence_conversation: falsemappings:- type: from_entityentity: entity_name
关于词槽的定义有以下几点需要说明:
influence_conversation
: 指定词槽是否影响对话过程。槽影响对话的方式将取决于词槽的具体类型。目前词槽的类型主要有:bool
、text
、categorical
、float
、list
、any
以及自定义槽类型。mappings
指定该槽位的赋值方式,并且每个词槽可以同时有多个映射。type
字段指定映射的类型。目前支持的映射类型有:from_entity
、from_text
、from_intent
、from_trigger_intent
和自定义槽映射custom
。- 如果要仅在表单的上下文中使用槽映射,可以通过
conditions
来指定表单的名称。
2. 表单
Rasa中比较常见的对话模式之一就是从用户那里收集信息以便完成特定的任务。这个任务就需要用到表单。比如,天气预报机器人需要从用户那里收集待查询天气的地点和日期信息。
在使用表单之前,需要先在领域文件中完成其定义。表单的定义需要包含两个部分:槽映射和响应器。
2.1 槽映射
表单中的槽映射代表要收集的信息,其定义举例如下:
forms:weather_form:required_slots:- address- date-time
注意,出现在required_slots
中的槽都必须在领域文件中的slots
部分定义。
1.2 响应器
响应器则指定对话机器人应当如何询问信息。响应其需要在领域文件中的response
部分定义,每个槽位对应的响应器的名字为utter_ask_{slotname}
。具体举例如下:
responses:utter_ask_address:- text: 想查询哪里的天气呢?utter_ask_date-time:- text: 想查询什么时候的天气呢?
如果执行表单是发现date-time
的槽位为空时,机器人会自动执行utter_ask_date-time
让用户输入相关信息。
3. 故事
Rasa中的故事(story)是用于训练对话管理模型的数据,并且故事可以泛化到未见过的对话路径的模型上。Rasa中的故事主要由用户消息及机器人动作(action)两部分交替形成的。
2.1 用户消息
故事中的用户消息由用户的意图和实体信息组成。具体举例如下:
- intent: weatherentities: - address: 上海- date-time: 明天
这里要说明一点:entities表示希望从用户输入中抽取的实体类型和值,但这个值(比如,本例中的“上海”和“明天”)并不表示实体的默认值,这些值只是用于示例化一个具体的用户输入,帮助训练对话管理模型。
2.2 动作和事件
Rasa中的动作(action)可以接收用户输入和对话状态信息,并按照业务逻辑进行处理,并输出改变对话状态的事件和回复用户的消息。而在story部分中,机器人动作包括:机器人动作名和动作返回事件两部分。举例如下:
- intent: intentAentities:- address: 北京
- action: action_intentA_modify
- slot_was_set:- address: 上海
- active_loop: weather_form
其中action_intentA_modify
即为机器人动作名,而slot_was_set
和active_loop
即为两种常见的动作返回事件。具体如下:
slot_was_set
: 词槽状态更改事件。当用户在自定义动作中使用SlotSet
事件设置新的槽位时,该事件会自动触发并更新对话状态。active_loop
:主要用于激活和取消激活表单。当active_loop:表单名
表示激活表单,而active_loop:null
表示结束或取消表单。
2.3 其他辅助符号
story中除了包含上述部分之外,还提供了一些非常有用的辅助符号。具体如下:
checkpoint
: 用来减少story中的重复部分。名字相同的检查点之间可以相互跳转。同时,一个故事结束时的检查点可以和另一个故事开始时的名字相同的检查点连接,形成新的故事。or
:当故事中处理多个不同的意图可以触发相同的响应或动作时,使用or
运算符来简化定义。
4. 规则
4.1 规则定义
与故事一样,规则也是对话管理模型的训练数据。但与故事不同的地方在于,规则可以保证,当某个意图出现时,无论什么样的上下文都能百分百触发某个或多个特定的动作时。所以,规则没有泛化能力。关于规则的设置,举例如下:
rules:
- rule:steps:- intent: some_intent- action: some_action
利用该规则,可以保证当用户触发了some_intent
意图之后,百分百触发some_action
动作。
与故事相比,规则适合处理小型的特定对话模式,但它没有能力泛化至未见过的对话路径。所以,在实际使用时,不要过度使用规则。通常在以下情况时使用规则:
- 单轮交互:有些消息不需要上下文就可以进行回答。规则是一种将意图映射到响应的简单方法,可以为这些消息指定固定的答案。
- 回退行为:结合 FallbackClassifier,可以编写规则来响应具有一定回退行为的低置信度用户消息。
- 表单:激活和提交表单通常都会遵循固定的路径。你可以编写规则来处理表单期间的非预期输入。
3.2 使用规则激活及取消表单
前文已经介绍了表单的定义,这里主要如何在规则中使用表单(故事中也可以使用表单)。
3.2.1 激活表单
开发者可以通过规则设定什么时候进入表单。具体举例如下:
rules:- rule: 激活formsteps:- intent: intentA- action: intentA_form- active_loop: intentA_form
该规则表示的意思是:当用户表达了意图intentA
之后,会进入intentA_form
动作,而这个动作会进入填槽-询问的循环过程。
3.2.2 执行表单任务
当表单需求的槽位全部获得之后,就可以执行表单任务了。而表单任务需要执行什么动作,也是通过规则设定的。具体举例如下:
- rule: 提交formcondition:- active_loop: intentA_formsteps:- action: intentA_form- active_loop: null - slot_was_set:- requested_slot: null- action: action_intentA_form_submit
4 策略
策略负责学习故事,从而预测动作。在Rasa中,可以同时设置多种策略,这些策略可独立进行训练和预测,最后通过优先级及预测得分共同决策。目前Rasa中的内置策略主要包括以下几种:
- RulePolicy: 它通过使用规则(rules)来控制对话的特定部分,从而使对话管理更加可预测和结构化。
- TEDPolicy: 这是Rasa自行研发的一套对话预测算法。
- MemoizationPolicy: 根据训练数据中已经看到的对话历史来决定下一步的对话行动,从而实现更加精确和高效的对话管理。
参考资料:
- 《Rasa实战: 构建开源对话机器人》
- https://rasa.leovan.tech