Actions(操作)是机器人对用户输入的响应,在Rasa有四种actions:
(1)Utterance actions: 以utter_
为前缀并向用户发送特定信息
(2)Retrieval actions: 以respond_
为前缀,所发送的信息来自于 retrieval model
(3)Custom actions: 运行任意代码并发送任意数量的消息 (or none)
(4)Default actions: 如action_listen
, action_restart
, action_default_fallback
定义utterance action
(ActionUtterTemplate),可以向domain文件中添加以utter_
为前缀的utterance template,如下:
templates:
utter_my_message:
- "this is what I want my action to say!"
utterance action 的名称通常以utter_
为前缀。如果缺少这个前缀,仍然可以在自定义action中使用该模板,但是模板不能被直接预测为它自己的操作。更多细节见Responses。
如果使用外部 NLG service,则不需要在domain中指定模板,但是仍然需要将utterance names添加到domain的 actions 列表中。
检索操作使得处理大量类似的意图(如聊天和常见问题FAQs)变得更容易。更多信息参见检索操作。
一个action 可以运行任何你想要的代码。自定义action 可以打开灯,将事件添加到日历中,检查用户的银行余额,或者可以想象的任何其他事情。
当预测自定义action时,Rasa将调用预先指定的endpoint 。这个endpoint 是一个webserver,能够响应这个调用,运行代码并可选地返回修改对话状态的信息。
在endpoints.yml
中指定action server如下:
action_endpoint:
url: "http://localhost:5055/webhook"
endpoints.yml
的传递方式是用--endpoints
参数来指定的,即在脚本后跟上--endpoints endpoints.yml
。
虽然可以用node.js, .NET, java等其他语言创建action server,但是官方提供了一个小型的python SDK,这使开发变得更加容易。
注意:
Rasa使用票证锁定(ticket lock)机制来确保来自相同会话ID的传入消息不会相互干扰,并按正确的顺序进行处理。如果希望自定义 action 的运行时间超过60秒,请将TICKET_LOCK_LIFETIME
环境变量设置为你自己的期望值。
对于用python编写的 actions,官方提供了一个方便的Rasa SDK,它可以启动 action server。
Rasa将向你的服务器发送一个HTTP POST请求,其中包含要运行哪个action。此外,此请求将包含关于对话的所有信息。Action Server展示了详细的API规范。
作为对来自Rasa的action 调用的响应,我们可以修改tracker,例如通过设置槽位并将响应发送回用户。所有修改都是使用events事件完成的。事件中有所有可能的事件类型的列表参考这里。
如何使用动作主动接触用户?当希望主动接触用户,例如显示长时间运行的后台操作的输出或将外部事件通知用户。
为此,可以POST 到此endpoint,在请求体中为特定用户指定需要运行的action。使用output_channel
查询参数指定应该使用哪个输出通道将助理的响应返回给用户。如果消息是静态的,则可以在domain文件中使用相应的模板定义一个utter_
action。如果需要更多控制,可以在domain中添加自定义action,并在action server中实现所需的步骤。在自定义 action 中分发的任何消息都将被转发到指定的输出通道。
主动接触用户取决于通道的能力,因此并非每个通道都支持。如果有些通道不支持,可以考虑使用CallbackInput通道向webhook发送消息。
注意:
在对话中运行一个 action 会改变对话历史并影响助手的下一次预测。如果不希望发生这种情况,请确保action通过将一个ActionReverted
事件附加到对话 tracker 的末尾来恢复自身。
默认的actions如下列表:
默认 action | 介绍 |
---|---|
action_listen | 停止预测更多action,等待用户输入 |
action_restart | 重置整个对话。如果映射策略包含在策略配置中,则可以通过输入/restart 在对话期间触发。 |
action_session_start | 开始一个新的对话会话。占据所有设置的槽位,标记新对话会话的开始,并重新应用现有的SlotSet 事件。domain中Session configuration 中的session_expiration_time 参数定义的不活动时长,超过之后自动触发该action。可以通过输入/session_start 在对话期间手动触发。所有的对话都以action_session_start 开始。 |
action_default_fallback | 撤消最后一条用户消息(就好像用户没有发送它,机器人也没有反应一样),并发出一条机器人不理解的消息。具体看回退操作。 |
action_deactivate_form | 解除激活形态并重置请求的槽位。也可以参见处理不愉快的路径。 |
action_revert_fallback_events | 恢复TwoStageFallbackPolicy 期间发生的事件。参看回退操作。 |
action_default_ask_affirmation | 请用户确认他们的意图。建议使用自定义action 覆盖此默认操作,以获得更有意义的提示。 |
action_default_ask_rephrase | 要求用户重新表述他们的意图。 |
action_back | 撤消最后一条用户消息(就好像用户没有发送它,机器人也没有反应一样)。如果策略配置中包含映射策略,则可以通过输入/back 在对话期间触发。 |
所有默认action都可以覆盖。为此,请将 action 名称添加到domain中的 actions 列表中:
actions:
- action_default_ask_affirmation
然后,Rasa将调用你的action endpoint
,并将其视为所有其他自定义action。