12.24 Rasa 入门教程 Core 系列(四)

Rasa 入门教程 Core 系列(四)

rasa_tutorial_core_background.png

Rasa 入门教程 Core 系列包括十一个部分,前面介绍了 。本文主要介绍 Rasa 框架 Core 系列的第四部分:动作。动作是你的机器人根据用户输入做出响应的动作,Rasa 中有四种类型的动作:

  • 话术动作:以 utter_ 开头,向用户发送特定消息
  • 检索动作:以 respond_ 开头,通过检索模型向用户发送消息
  • 自定义动作:运行任意代码,发送任意数量的消息(或不发送消息)
  • 默认动作:例如:action_listen、action_restart、action_default_fallback。

本文的目录结构:

  1. 话术动作
  2. 检索动作
  3. 自定义动作
  4. 使用其他代码执行动作
  5. 使用动作主动与用户联系
  6. 默认动作

1. 话术动作

定义话术动作 ActionUtterTemplate,以 utter_ 开头在 domain 文件中添加话术模板:

<code>templates:
utter_my_message:
- "this is what I want my action to say!"/<code>

通常使用 utter_ 开头的话术动作,如果没有此前缀,任然可以在自定义动作中使用模板,但是无法将模板直接预测为自己的动作,有关更多信息详见响应。

如果使用外部 NLG 服务,则无需在 domain 中指定模板,但仍需要将话术名称添加到 domain 的动作列表中。

2. 检索动作

检索动作使的处理大量类似意图变得更加容易。请参阅检索动作以了解更多信息。

3. 自定义动作

一个动作可以运行您想要的任何代码。自定义动作可以打开灯,将事件添加到日历,检查用户的银行余额,或者您其他任何事情。

当预测到自定义动作时,Rasa 会调用你指定的端点。该端点应该是一个 web 服务器用来响应此调用,运行代码并有选择地返回信息以修改对话状态。

使用 endpoints.yml 指定你的动作服务器:

<code>action_endpoint:
url: "http://localhost:5055/webhook"/<code>

并使用 --endpoints endpoints.yml 将其传递给脚本。

您可以使用 node.js、.NET、java 或任何其他语言创建动作服务器,定义你的动作,同时我们也提供了一个小型 python SDK,使用它可以使得开发更加容易。

3.1 使用 Python 自定义动作

对于用 python 编写的动作,我们有一个方便的 SDK,可以很方便的启动该动作服务器。

你的动作服务器只需安装 rasa-sdk:

<code>pip install rasa-sdk/<code>

包含你的自定义动作的文件应称为 actions.py。或者,你可以使用一个名为的软件包目录,actions或者使用 --actions 标志手动指定一个动作模块或软件包。

如果已安装 rasa,请运行以下命令以启动动作服务器:

<code>rasa run actions/<code>

否则,如果未安装 rasa,请运行以下命令:

<code>python -m rasa_sdk --actions actions/<code>

在餐馆机器人中,如果用户说“给我推荐一家墨西哥餐馆”,则你的机器人可以执行 ActionCheckRestaurants 动作,如下所示:

<code>from rasa_sdk import Action
from rasa_sdk.events import SlotSet

class ActionCheckRestaurants(Action):
def name(self) -> Text:
return "action_check_restaurants"

def run(self,
dispatcher: CollectingDispatcher,
tracker: Tracker,
domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:

cuisine = tracker.get_slot('cuisine')
q = "select * from restaurants where cuisine='{0}' limit 1".format(cuisine)
result = db.query(q)

return [SlotSet("matches", result if result is not None else [])]/<code>

你应该将动作名称 action_check_restaurants 添加到 domain 文件的动作中。动作的 run 方法接收三个参数。你可以访问 slot 值以及用户使用 tracke 对象发送的最新消息,还可以通过 dispatcher.utter_message() 调用 dispatcher 对象发给用户。

run() 方法细节:Action.run(dispatcher, tracker, domain)

Rasa 入门教程 Core 系列(四)

rasa_tutorial_core_01.png

上面的 Python 代码就是一个 SlotSet 事件示例,在这里包含了所有可能的事件的完整列表。

4. 使用其他代码执行动作

Rasa 会将 HTTP POST请求发送到服务器,其中包含要运行的动作信息。此外,此请求将包含有关对话的所有信息。Action Server 显示了详细的API规范。

作为对来自 Rasa 的动作调用的响应,你可以修改跟踪器,例如通过设置槽位并将响应发给用户。所有修改都是使用事件完成的。在 Events 中的列表包含了所有事件类型。

5. 使用动作主动与用户联系

你可能希望主动与用户联系,例如显示长时间在后台运行的输出或将外部事件通知给用户。

为此,您可以 POST 到此端点,在请求正文中指定特定用户运行的操作。使用 output_channel 参数可以指定使用哪个输出通道将助手的响应发送给用户。如果你的消息是静态的,则可以使用 utter_ 对应的模板在 domain 文件中定义动作。如果需要更多控制,请在你的 domain 文件中添加自定义动作,然后在动作服务器中实现所需的步骤。在自定义动作中调度的所有消息都将转发到指定的输出通道。

主动联系用户取决于通道的能力,因此并非每个通道都支持。如果你的通道不支持它,请考虑使用 CallbackInput 通道将消息发送到 Webhook。

6. 默认动作

有八种默认动作:

Rasa 入门教程 Core 系列(四)

rasa_tutorial_core_02.png

所有默认动作都可以被覆盖。为此,请将动作名称添加到你的 domain 文件中的动作列表中:

<code>actions:
- action_default_ask_affirmation/<code>

然后,Rasa 将调用你的动作端点,并将其视为其他所有自定义动作。



分享到:


相關文章: