Rasa 入门教程 Core 系列包括十一个部分,前面介绍了 。本文主要介绍 Rasa 框架 Core 系列的第四部分:动作。动作是你的机器人根据用户输入做出响应的动作,Rasa 中有四种类型的动作:
- 话术动作:以 utter_ 开头,向用户发送特定消息
- 检索动作:以 respond_ 开头,通过检索模型向用户发送消息
- 自定义动作:运行任意代码,发送任意数量的消息(或不发送消息)
- 默认动作:例如:action_listen、action_restart、action_default_fallback。
本文的目录结构:
- 话术动作
- 检索动作
- 自定义动作
- 使用其他代码执行动作
- 使用动作主动与用户联系
- 默认动作
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)
上面的 Python 代码就是一个 SlotSet 事件示例,在这里包含了所有可能的事件的完整列表。
4. 使用其他代码执行动作
Rasa 会将 HTTP POST请求发送到服务器,其中包含要运行的动作信息。此外,此请求将包含有关对话的所有信息。Action Server 显示了详细的API规范。
作为对来自 Rasa 的动作调用的响应,你可以修改跟踪器,例如通过设置槽位并将响应发给用户。所有修改都是使用事件完成的。在 Events 中的列表包含了所有事件类型。
5. 使用动作主动与用户联系
你可能希望主动与用户联系,例如显示长时间在后台运行的输出或将外部事件通知给用户。
为此,您可以 POST 到此端点,在请求正文中指定特定用户运行的操作。使用 output_channel 参数可以指定使用哪个输出通道将助手的响应发送给用户。如果你的消息是静态的,则可以使用 utter_ 对应的模板在 domain 文件中定义动作。如果需要更多控制,请在你的 domain 文件中添加自定义动作,然后在动作服务器中实现所需的步骤。在自定义动作中调度的所有消息都将转发到指定的输出通道。
主动联系用户取决于通道的能力,因此并非每个通道都支持。如果你的通道不支持它,请考虑使用 CallbackInput 通道将消息发送到 Webhook。
6. 默认动作
有八种默认动作:
所有默认动作都可以被覆盖。为此,请将动作名称添加到你的 domain 文件中的动作列表中:
<code>actions:
- action_default_ask_affirmation/<code>
然后,Rasa 将调用你的动作端点,并将其视为其他所有自定义动作。
閱讀更多 桃子說AI 的文章