rasa_tutorial_core_background.png
Rasa 入门教程 Core 系列包括十一个部分,前面介绍了
Rasa 框架 Core 系列的第三部分:响应
。本文主要介绍 Rasa 框架 Core 系列的第四部分:
动作
。动作是你的机器人根据用户输入做出响应的动作,Rasa 中有四种类型的动作:
-
话术动作
:以
utter_
开头,向用户发送特定消息
-
检索动作
:以
respond_
开头,通过检索模型向用户发送消息
-
自定义动作
:运行任意代码,发送任意数量的消息(或不发送消息)
-
默认动作
:例如:
action_listen
、
action_restart
、
action_default_fallback
。
本文的目录结构:
-
话术动作
-
检索动作
-
自定义动作
-
使用其他代码执行动作
-
使用动作主动与用户联系
-
默认动作
1. 话术动作
定义话术动作
ActionUtterTemplate
,以
utter_
开头在 domain 文件中添加话术模板:
templates:
utter_my_message:
- "this is what I want my action to say!"
通常使用
utter_
开头的话术动作,如果没有此前缀,任然可以在自定义动作中使用模板,但是无法将模板直接预测为自己的动作,有关更多信息详见响应。
如果使用外部 NLG 服务,则无需在 domain 中指定模板,但仍需要将话术名称添加到 domain 的动作列表中。
2. 检索动作
检索动作使的处理大量类似意图变得更加容易。请参阅检索动作以了解更多信息。
3. 自定义动作
一个动作可以运行您想要的任何代码。自定义动作可以打开灯,将事件添加到日历,检查用户的银行余额,或者您其他任何事情。
当预测到自定义动作时,Rasa 会调用你指定的端点。该端点应该是一个 web 服务器用来响应此调用,运行代码并有选择地返回信息以修改对话状态。
使用
endpoints.yml
指定你的动作服务器:
action_endpoint:
url: "http://localhost:5055/webhook"
并使用
--endpoints endpoints.yml
将其传递给脚本。
您可以使用 node.js、.NET、java 或任何其他语言创建动作服务器,定义你的动作,同时我们也提供了一个小型 python SDK,使用它可以使得开发更加容易。
3.1 使用 Python 自定义动作
对于用 python 编写的动作,我们有一个方便的 SDK,可以很方便的启动该动作服务器。
你的动作服务器只需安装
rasa-sdk
:
pip install rasa-sdk
包含你的自定义动作的文件应称为
actions.py
。或者,你可以使用一个名为的软件包目录,
actions
或者使用
--actions
标志手动指定一个动作模块或软件包。
如果已安装
rasa
,请运行以下命令以启动动作服务器:
rasa run actions
否则,如果未安装
rasa
,请运行以下命令:
python -m rasa_sdk --actions actions
在餐馆机器人中,如果用户说“给我推荐一家墨西哥餐馆”,则你的机器人可以执行
ActionCheckRestaurants
动作,如下所示:
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 [])]
你应该将动作名称
action_check_restaurants
添加到 domain 文件的动作中。动作的
run
方法接收三个参数。你可以访问 slot 值以及用户使用
tracke
对象发送的最新消息,还可以通过
dispatcher.utter_message()
调用
dispatcher
对象发给用户。
run()
方法细节:
Action.run(dispatcher, tracker, domain)
类型
|
说明
|
参数
|
dispatcher
:用于将消息发给用户的调度程序。使用
dipatcher.utter_message()
或任何其他
rasa_sdk.executor.CollectingDispatcher
方法。
|
|
tracker
:当前用户的状态跟踪器。你可以使用
tracker.get_slot(slot_name)
来访问槽位值,最近的用户消息是
tracker.latest_message.text
以及任何其他
rasa_sdk.Tracker
属性。
|
|
domain
:机器人的 domain 文件
|
返回值
|
rasa_sdk.events.Event
实例的字典,通过端点返回。
|
返回类型
|
List[Dict[str, Any]]
|
上面的 Python 代码就是一个
SlotSet
事件示例,在
这里
包含了所有可能的事件的完整列表。
4. 使用其他代码执行动作
Rasa 会将 HTTP
POST
请求发送到服务器,其中包含要运行的动作信息。此外,此请求将包含有关对话的所有信息。
Action Server
显示了详细的API规范。
作为对来自 Rasa 的动作调用的响应,你可以修改跟踪器,例如通过设置槽位并将响应发给用户。所有修改都是使用事件完成的。在
Events
中的列表包含了所有事件类型。
5. 使用动作主动与用户联系
你可能希望主动与用户联系,例如显示长时间在后台运行的输出或将外部事件通知给用户。
为此,您可以
POST
到此端点,在请求正文中指定特定用户运行的操作。使用
output_channel
参数可以指定使用哪个输出通道将助手的响应发送给用户。如果你的消息是静态的,则可以使用
utter_
对应的模板在 domain 文件中定义动作。如果需要更多控制,请在你的 domain 文件中添加自定义动作,然后在动作服务器中实现所需的步骤。在自定义动作中调度的所有消息都将转发到指定的输出通道。
主动联系用户取决于通道的能力,因此并非每个通道都支持。如果你的通道不支持它,请考虑使用 CallbackInput 通道将消息发送到 Webhook。
6. 默认动作
有八种默认动作:
动作名
|
说明
|
action_listen
|
停止预测更多动作,等待用户输入。
|
action_restart
|
重置整个对话。如果在策略配置中包含了
MappingPolicy
,那么可以在对话期间通过输入
/restart
来出发重置整个对话。
|
action_default_fallback
|
撤消上一条用户消息(就像用户消息未发送该消息并且机器人没有反应),并发送机器人不理解的消息。请参阅撤销动作。
|
action_deactivate_form
|
停用表单动作并重置已请求槽位。
|
action_revert_fallback_events
|
还原在 TwoStageFallbackPolicy 期间发生的事件,请参阅后备动作。
|
action_default_ask_affirmation
|
要求用户确认其意图,建议使用自定义操作覆盖此默认操作,以获取更有意义的提示。
|
action_default_ask_rephrase
|
要求用户重新表达自己的意图。
|
action_back
|
撤消上一条用户消息(就像用户消息未发送该消息并且机器人没有反应),如果在策略配置中包含了
MappingPolicy
,那么可以在对话期间通过输入
/restart
来出发重置整个对话。
|
所有默认动作都可以被覆盖。为此,请将动作名称添加到你的 domain 文件中的动作列表中:
actions:
- action_default_ask_affirmation
然后,Rasa 将调用你的动作端点,并将其视为其他所有自定义动作。
作者:
关于我
备注:转载请注明出处。
如发现错误,欢迎留言指正。