(十一)RASA CORE Action
共 4558字,需浏览 10分钟
·
2021-09-16 10:09
作者简介
作者:孟繁中(北京邮电大学 计算机科学与技术硕士)
原文:https://zhuanlan.zhihu.com/p/334500244
转载者:杨夕
面筋地址:https://github.com/km1994/NLP-Interview-Notes
个人笔记:https://github.com/km1994/nlp_paper_study
在收到每个用户消息之后,RASA CORE policy将预测机器人接下来应执行的动作。本文介绍RASA都支持哪些动作。
Responses
响应是机器人发回给用户的一个消息。当希望机器人向用户发送文本,图像,按钮或类似内容时,Responses是最常用到的action。
响应responses
位于domain.yml文件或单独的“ responses.yml”文件中的对应responses键的下方。每个响应名称都应以开头utter_
。
响应中可以加入变量,使用{slot_name}去引用变量。
同样一个响应名称,可以对应多个话术,调度器会随机访问,增加话术多样性。也可以指定哪个channel使用哪个话术。
响应内容可以是按钮,图片,连接等信息。
Custom Actions
自定义动作可以运行自定义代码,只要符合RASA-SDK定义的action的规范即可。例如,自定义动作用于进行API调用或查询数据库等。
自定义action需要action server去执行代码。具体参考下文的后半部分。
Form Action
Form Action是从用户那里收集一些信息,以便执行某些操作(预订餐厅、调用API、搜索数据库等)。这也称为“插槽填充”。使用FormAction的时候,必须定义有RulePolicy。
1、定义FormAction
forms:
restaurant_form:
cuisine:
- type: from_entity
entity: cuisine
num_people:
- type: from_entity
entity: number
通过在配置文件中填写forms段来定义表单。表单的名称就是story或rule中用于处理表单执行的action的名称。另外还需要为表单变量填写插槽映射。每个待填的槽,可以映射为多个表单变量。如上例中表单restaurant_form
将填充 cuisine
槽位,num_people
将填充到槽位number
。
一旦表单被激活后,系统会提示用户输入下一个所需的slot值。提示话术是通过寻找一个名为utter_ask_<form_name>_<slot_name>的action,如果找不到就查找utter_ask_<slot_name>的action。确保在Domain文件中为每个slot定义这些响应。
2、激活FormAction
要激活表单,您需要添加一个故事或规则,告诉助手应该何时运行该表单。在特定意图触发表单的情况下,可以使用以下规则:
rules:
- rule: Activate form
steps:
- intent: request_restaurant
- action: restaurant_form
- active_loop: restaurant_form
active_loop:restaurant_form步骤指示应该在运行restaurant_form之后激活该表单。
3、取消激活FormAction
一旦所有需要的Slot都被填满,表单将自动停用。你可以用一条规则或一个故事来描述你的助手在Form结束后的行为。如果不添加适用的故事或规则,则在表单完成后,助手将自动侦听下一条用户消息。下面示例在表单填充了所有需要的slot后,立即运行utter_all_slots_filled。
rules:
- rule: Submit form
condition:
# Condition that form is active.
- active_loop: restaurant_form
steps:
# Form is deactivated
- action: restaurant_form
- active_loop: null
- slot_was_set:
- requested_slot: null
# The actions we want to run when the form is submitted.
- action: utter_submit
- action: utter_slots_values
4、用户不配合时候处理
用户不会总是用你要求他们的信息来回应。通常情况下,用户会问问题,聊天,改变主意,偏离正常路径。当表单处于活动状态时,如果用户的输入没有填充请求的槽位,表单操作的执行将被拒绝,即表单将自动引发ActionExecutionRejection。
我们可以加入一些规则来避免未处理的ActionExecutionRejection。例如,对于下面这个场景,可以编写包含预期中断的规则或故事,当用户没有填槽时候,可以与您的机器人聊天:
rules:
- rule: Example of an unhappy path
condition:
# Condition that form is active.
- active_loop: restaurant_form
steps:
# This unhappy path handles the case of an intent `chitchat`.
- intent: chitchat
- action: utter_chitchat
# Return to form after handling the `chitchat` intent
- action: restaurant_form
- active_loop: restaurant_form
还有用户可能会在表单操作过程中改变主意,决定不继续执行表单了。在这种情况下,助理应该停止询问slot的对话。可以用系统内建的活动action_deactivate_loop来优雅地处理这种情况,该循环将停用表单并重置请求的槽位。这种对话的例子如下:
stories:
- story: User interrupts the form and doesn't want to continue
steps:
- intent: request_restaurant
- action: restaurant_form
- active_loop: restaurant_form
- intent: stop
- action: utter_ask_continue
- intent: stop
- action: action_deactivate_loop
- active_loop: null
强烈建议您使用交互式学习来构建这些规则或故事。如果你手写这些规则/故事,你很可能会错过重要的东西。
系统内建的一些Action
默认动作是RASA内置在对话管理器中的ACTION。大多数是根据对话场景自动调用的。也可能自定义一些参数来个性化机器人。
action_listen
此操作将指示助手什么都不做,并等待下一次用户输入。
action_restart
此操作将重置整个对话历史记录,包括在此过程中设置的所有轮次,槽位等信息。
如果模型配置中包含RulePolicy,则可以由用户在会话中通过发送“ /restart”消息来触发它。如果您utter_restart
在domain中定义了一个响应,则该响应也将发送给用户。
action_session_start
该操作将启动一个新的会话。在以下情况下该操作自动执行:
在每次新对话开始时
用户处于非活动状态超过
session_expiration_time
这个参数后当用户在对话期间发送“ / session_start”消息时
该操作将重置对话跟踪器,但默认情况下不会清除已设置的任何插槽。
会话开始操作的默认行为是将所有现有的插槽带入下一个会话。假设不想保留所有插槽或者只保留一个部分插槽,可以重写action_session_start
函数。
action_default_fallback
此操作将撤消上一次用户与机器人的交互,并发送utter_default
响应(如果已定义)。如果启用了此动作,NLU的置信度低于设置阈值将触发。
action_deactivate_loop
该操作将禁用处理表单的动作循环并重置请求的插槽。在处理表单的时候,如果用户填写的值不满足要求,可以采用此方法重新填槽。
action_two_stage_fallback
这也是一个fallback处理,在处理低NLU置信度的时候使用。它与action_default_fallback的区别是,action_default_fallback直接回复一句话,可能结束对话,而action_two_stage_fallback 会有个先调用action_default_ask_affirmation 二次询问确认后,再进入action_default_fallback。
action_default_ask_affirmation
该操作由action_two_stage_fallback
使用。它要求用户确认其的意图。可以自定义此操作,进行更个性化的设置。
action_default_ask_rephrase
action_two_stage_fallback
如果用户拒绝action_default_ask_affirmation
确认意图请求,则循环使用此操作。它要求用户重新表达他们的意图。
action_back
此操作将撤消上一次用户与机器人的交互。如果配置了RulePolicy,则用户可以通过向机器人发送“ / back”消息来触发它。
action这块可以做的非常灵活,可以外接action server,也可以自定义action。举个例子,我们只需要,指定kbqa意图,然后将kbqa的检索算法做成一个action,这就可以实现基于知识图谱的回答方法。它是机器人能力扩展的基础。现在不太确定的是,如何将外接能力,比如检索算法,阅读理解算法等置信度,和rasa内置的TED Policy的置信度能对应起来?不然在ranking的时候会有问题。