Transformer课程 业务对话机器人Rasa 3.x Reaching Out to the User
Transformer课程 业务对话机器人Rasa 3.x Reaching Out to the User
Rasa 官网
Reaching Out to the User
有时,您希望助理在没有用户提示的情况下与用户联系。例如,您可能希望助理在用户打开聊天窗口时发送消息,或者如果用户有一段时间没有发送消息,您可能希望提示用户。本页是帮助您的助理主动接触用户的指南。
Reaching out first
在大多数情况下,当用户与助理打开聊天窗口时,您会希望助理发送第一条消息。这样做可以让用户了解机器人可以做什么或不能做什么,并让他们进行更成功的对话。某些消息或语音频道具有现有配置选项,可在用户首次启动对话时向助理发送信息,但您也可以将此选项添加到自己的自定义频道。
一旦您将频道配置为发送有效信息,您将需要指定助理应如何反应和问候用户。您可以为此重复使用现有意图的行为,也可以为此指定新的意图和规则。下面是关于如何指定欢迎规则的指南。
1. Update the configuration
由于您 使用规则,因此需要将RulePolicy添加到配置文件中:
config.yml
policies:
# other policies
- name: RulePolicy
2. Add a rule
要让助理仅在对话开始时回复意向问候语,请添加以下规则:
rules:
- rule: welcome user
conversation_start: true # this rule only applies at the beginning of a conversation
steps:
- intent: greet
- action: utter_welcome
3. Add a response
在您的域中添加一个对utter_welcome 操作的响应:
domain.yml
responses:
utter_welcome:
- text: Hi there! What can I help you with today?
External Events
有时,您需要一个外部设备来改变正在进行的对话的进程。例如,如果你在树莓派上安装了一个水分传感器,你可以通过助理在植物需要浇水时通知你。
下面的示例来自reminderbot示例bot,它包括提醒和外部事件。
1. Trigger an Intent
要使来自外部设备的事件更改正在进行的对话的进程,您可以将设备发送到对话的触发意图端点,trigger_intent端点将用户意图(可能带有实体)注入到您的对话中。对于Rasa,就好像您输入了一条消息,该消息根据特定的意图和实体进行了分类。然后,助理将像往常一样预测并执行下一个操作。
例如,以下post请求会将EXTERNAL_dry_plant 和the plant注入id为user123的对话中:
curl -H "Content-Type: application/json" -X POST \
-d '{"name": "EXTERNAL_dry_plant", "entities": {"plant": "Orchid"}}' \
"http://localhost:5005/conversations/user123/trigger_intent?output_channel=latest"
2. Get the Conversation ID
在实际场景中,您的外部设备将从API或数据库获取会话ID。在干旱植物示例中,您可能有一个植物数据库、给它们浇水的用户以及用户的对话ID。您的Raspberry Pi将直接从数据库获取会话ID。要在本地试用reminderbot示例,您需要手动获取对话ID。有关更多信息,请参阅reminderbot自述。
3. Add NLU Training Data
在干旱植物示例中,您的Raspberry Pi需要向trigger_intent端点发送一条带有intent EXTERNAL_dry_plant的消息。这一意图将保留给Raspberry Pi使用,因此不会有任何NLU训练示例。
domain.yml
intents:
- EXTERNAL_dry_plant
注意:您应该使用EXTERNAL_前缀命名来自其他设备的意图,因为这样在处理训练数据时更容易看到哪些意图预期来自外部设备。
4. Update the Domain
要告诉助手哪种植物需要浇水,您可以定义一个实体,并随意图一起发布。为了能够在响应中直接使用实体值,请为plant插槽定义from_entity插槽映射:
domain.yml
entities:
- plant
slots:
plant:
type: text
influence_conversation: false
mappings:
- type: from_entity
entity: plant
5. Add a Rule
你需要一条规则,告诉你的助理在收到来自树莓派的消息时如何回应。
rules.yml
rules:
- rule: warn about dry plant
steps:
- intent: EXTERNAL_dry_plant
- action: utter_warn_dry
6. Add a Response
您需要为“utter_warn_dry”定义响应文本:
domain.yml
responses:
utter_warn_dry:
- text: "Your {plant} needs some water!"
响应将使用插槽plant的值来提示需要浇水的特定植物。
要测试干旱植物的通知示例,您需要启动Rasa X或CallbackChannel。
外部事件和提醒在请求-响应通道(如rest 或rasa shell)中不起作用。用于实现提醒或外部事件的助理的自定义连接器应使用CallbackInput通道而不是RestInput通道构建。
有关如何在本地测试的说明,请参阅reminderbot自述。
使用对话ID运行此POST请求以模拟外部事件:
curl -H "Content-Type: application/json" -X POST -d \
'{"name": "EXTERNAL_dry_plant", "entities": {"plant": "Orchid"}}' \
"http://localhost:5005/conversations/user1234/trigger_intent?output_channel=latest"
您应该在您的频道中看到bot响应:
Reminders
您可以让助理在设定的时间后使用提醒与用户联系。下面的示例来自reminderbot示例机器人。您可以克隆它并按照自述文件中的说明试用完整版本。
Scheduling Reminders
1. Define a Reminder
要安排提醒,您需要定义一个自定义操作以返回ReminderScheduled 提醒计划事件。例如,以下自定义操作计划从现在起五秒钟的提醒时间:
actions.py
import datetime
from rasa_sdk.events import ReminderScheduled
from rasa_sdk import Action
class ActionSetReminder(Action):
"""Schedules a reminder, supplied with the last message's entities."""
def name(self) -> Text:
return "action_set_reminder"
async def run(
self,
dispatcher: CollectingDispatcher,
tracker: Tracker,
domain: Dict[Text, Any],
) -> List[Dict[Text, Any]]:
dispatcher.utter_message("I will remind you in 5 seconds.")
date = datetime.datetime.now() + datetime.timedelta(seconds=5)
entities = tracker.latest_message.get("entities")
reminder = ReminderScheduled(
"EXTERNAL_reminder",
trigger_date_time=date,
entities=entities,
name="my_reminder",
kill_on_user_message=False,
)
return [reminder]
ReminderScheduled事件的第一个参数是提醒的名称,在本例中为EXTERNAL_reminder。提醒名称稍后将用作触发对提醒的反应的意图。使用外部前缀命名 EXTERNAL_提醒名称,以便于查看训练数据中发生的情况。
您可以看到,最后一条消息的实体也会传递给提醒。这允许对提醒作出反应的操作使用来自用户调度消息的实体。
例如,如果你想让你的助理提醒你给朋友打电话,你可以给他发一条类似“提醒我给保罗打电话”的信息。如果将“Paul”提取为个人实体PERSON ,则对提醒作出反应的动作可以使用它来表示“记得给Paul打电话!”
2. Add a Rule
要安排提醒,请添加规则
rules.yml
rules:
- rule: Schedule a reminder
steps:
- intent: ask_remind_call
entities:
- PERSON
- action: action_schedule_reminder
3. Add Training Data
您应该添加NLU训练示例以安排提醒:
nlu.yml
nlu:
- intent: ask_remind_call
examples: |
- remind me to call John
- later I have to call Alan
- Please, remind me to call Vova
- please remind me to call Tanja
- I must not forget to call Juste
您还应该将其添加到您的域中
domain.yml
intents:
- ask_remind_call
4. Update your Pipeline
通过将SpacyNLP和SpacyEntityExtractor添加到配置中的管道中config.yml,您不需要在训练数据中注释任何名称,因为Spacy有一个PERSON维度:
config.yml
pipeline:
# other components
- name: SpacyNLP
model: "en_core_web_md"
- name: SpacyEntityExtractor
dimensions: ["PERSON"]
Reacting to Reminders
1. Define a Reaction
bot在接收到对trigger_intent端点的POST请求后提醒用户。但是,提醒会在一定时间后使用您在提醒计划事件中定义的名称自动将请求发送到正确的对话ID。
要定义对提醒的反应,您只需编写一条规则,告诉bot在收到提醒意图时要采取的操作。
在呼叫提醒示例中,您希望使用要提醒所附带的实体来呼叫特定的人,因此您需要编写一个自定义操作来实现此目的:
actions.py
class ActionReactToReminder(Action):
"""Reminds the user to call someone."""
def name(self) -> Text:
return "action_react_to_reminder"
async def run(
self,
dispatcher: CollectingDispatcher,
tracker: Tracker,
domain: Dict[Text, Any],
) -> List[Dict[Text, Any]]:
name = next(tracker.get_slot("PERSON"), "someone")
dispatcher.utter_message(f"Remember to call {name}!")
return []
2. Add a Rule
要告诉您的机器人在触发提醒时要运行什么操作,请添加规则。
rules.yml
rules:
- rule: Trigger `action_react_to_reminder` for `EXTERNAL_reminder`
steps:
- intent: EXTERNAL_reminder
- action: action_react_to_reminder
3. Add Training Data
您需要定义触发对提醒作出反应的意图。您不需要添加任何训练示例,因为意图是为提醒保留的。
domain.yml
intents:
- intent: EXTERNAL_reminder
Cancelling Reminders
1. Define an Action that Cancels a Reminder
若要取消已计划的提醒,需要一个自定义操作,该操作将返回RememberCancelled()事件。
返回ReminderCancelled()将取消当前计划的所有提醒。如果您只想取消某些提醒,可以指定一些参数来缩小计划提醒的范围:
- ReminderCancelled(intent=“EXTERNAL_greet”) 取消所有带有iEXTERNAL_greet意图的提醒
- ReminderCancelled(entities={}) 取消具有给定实体的所有提醒
- ReminderCancelled("…") 取消您在其创建过程中提供的具有给定名称“…”的唯一提醒
对于呼叫提醒示例,您可以定义自定义操作 action_forget_reminders提醒,以取消所有提醒:
actions.py
class ForgetReminders(Action):
"""Cancels all reminders."""
def name(self) -> Text:
return "action_forget_reminders"
async def run(
self, dispatcher, tracker: Tracker, domain: Dict[Text, Any]
) -> List[Dict[Text, Any]]:
dispatcher.utter_message(f"Okay, I'll cancel all your reminders.")
# Cancel all reminders
return [ReminderCancelled()]
无论何时关闭Rasa服务器,所有提醒都将被取消
2. Add a Rule
您需要添加取消提醒的规则。
rules.yml
rules:
- rule: Cancel a reminder
steps:
- intent: ask_forget_reminders
- action: action_forget_reminders
3. Add Training Data
您需要定义触发取消提醒的意图
nlu.yml
nlu:
- intent: ask_forget_reminders
examples: |
- Forget about the reminder
- do not remind me
- cancel the reminder
- cancel all reminders please
您还应该将其添加到域中domain.yml
domain.yml
intents:
- intent: ask_forget_reminders
要测试提醒,您需要启动Rasa X或CallbackChannel。您还需要启动操作服务来计划、响应和取消提醒。有关详细信息,请参阅reminderbot自述。
然后,如果你向机器人发送一条类似提醒我给Paul Pots打电话这样的消息,你应该在五秒钟后收到一条提醒,上面写着“记住给Paul Pots打电话!”!。
rasa链接