我们现在需要一个可以安排自行车店预约的意图。第一个意图 Hours 只返回静态响应“We're open from 9 AM to 6 PM every day. Is there anything else I can do for you?”,而新意图与此不同,它必须能够执行一组更复杂的任务。
我们来分析用户与代理之间的以下互动:
用户:Hi.
代理:Welcome.I can tell you the shop hours, or I can set up an appointment. Which would you like?
User: I need to make an appointment at 3 PM today.
代理:Got it. I have your appointment scheduled on Wednesday, August 1 at 3 PM. See you soon. Good-bye.
在上面的对话中,用户话语“I need to make an appointment at 3 PM today”包含了重要信息“3 PM”和“today”,这表示用户想要造访自行车店的时间和日期。代理的响应包括用户话语中提到的时间和日期信息:“Got it. I have your appointment scheduled on Wednesday, August 1 at 3 PM. See you soon. Good-bye.”
对我们来说,从话语中识别重要信息很简单;但对机器而言,这是一项复杂的任务。我们需要赋予意图从用户话语中提取重要信息(即“参数”)的能力。
使用实体和参数提取信息
Dialogflow 会使用实体和参数这些概念从用户话语中提取目标信息,并将其转换为一组参数,然后由其他功能或系统处理这些参数以执行各种任务。
如需使用参数创建新意图,请执行以下步骤:
- 创建一个名为
Make Appointment
的意图。 在训练短语 (Training Phrases) 部分,添加以下训练短语:
I need to make an appointment at 3 PM today.
在操作和参数 (Action and parameters) 表中,确认系统实体
@sys.date
和@sys.time
已显示。在文本响应 (Text response) 表中,添加以下响应短语:
Got it. I have your appointment scheduled on $date at $time. See you soon. Good-bye.
点击保存 (SAVE)。
图 5. 添加 Make Appointment 意图的流程图。
通过此设置,Make Appointment 意图会检查用户表述,捕获与 Dialogflow 的 @sys.date
和 @sys.time
内置系统实体相对应的任何字词,并将这些捕获的值放入 $date
和 $time
参数中。因此,在响应中,我们可以使用 $date
和 $time
来引用从用户话语中捕获的日期和时间值:“Got it. I have your appointment scheduled on $date at $time. See you soon. Good-bye.”
借助 Dialogflow,您还可以创建自定义实体,以提取不常见或未分类的参数。不过,在我们的场景中,使用系统实体便足以捕获时间和日期等典型参数。如需详细了解实体,请参阅实体。
使用槽位填充获取必要参数
在完成前面部分介绍的最佳做法后,现在我们需要在当前训练语句“I need to make an appointment at 3 PM today”的基础上,提供更多训练语句。
添加以下训练语句:
Can I schedule service for 4 PM tomorrow?
Can I set up an appointment for noon on Friday?
到目前为止,所有训练语句都包含时间和日期信息:“3 PM today”、“4 PM tomorrow”和“noon on Friday”。但是,在现实中,用户话语可能并不总是包含所有必要参数。添加以下训练语句:
Can you fix my road bike?
My bike is broken.
I'd like to get my bike fixed, I have a mountain bike that needs servicing.
I need to fix my bike today.
I'd like to schedule an appointment on this Thursday.
上述所有语句都表明用户想进行预约;因此,我们的新意图应与这些语句相匹配,以处理安排预约这一任务。但是,所有这些语句都缺少时间信息或日期信息,或同时缺少时间和日期信息。这类语句较难处理,因为如果没有时间和日期信息,意图便无法安排预约。
Dialogflow 提供了一种名为“槽位填充”的功能,该功能可确保意图从用户那里获取所有必要信息。如需激活此功能,我们需要将参数标记为“required”(必需)。
如果某项意图包含一些必要参数,但其匹配的用户话语缺少其中一项或多项必要参数,那么该意图会询问“提示问题”,以便从用户那里获取所有必要参数。我们来看下面的对话:
用户:Hi.
代理:Welcome.I can tell you the shop hours, or I can set up an appointment. Which would you like?
用户:I need to fix my bike.
代理:Okay, I can help you with that. What day do you want to come in?
用户:Today.
代理:And what time works for you?
用户:3 PM.
代理:Got it. I have your appointment scheduled on Wednesday, August 1 at 3 PM. See you soon. Good-bye.
如需将 $time
和 $date
参数设为必需参数并为这些参数提供提示问题,请按以下步骤操作:
- 点击 Make Appointment 意图。
- 在操作和参数 (Action and parameters) 表中,勾选参数
$time
和$date
对应的REQUIRED
复选框。此时,系统会创建名为PROMPTS
的列。 - 如果在表中,
$date
参数位于$time
参数的下方,请将$date
参数所在的行拖动到$time
参数的上方。(参数在表中的位置决定了意图询问提示问题的顺序。) - 对于
$date
参数,点击PROMPTS
列下方的定义提示问题 (Define prompts) 链接,并添加以下提示问题:Okay, I can help you with that. What day do you want to come in?
Sure, what day are you coming in?
Okay, what day will work for you?
- 对于
$time
参数,点击定义提示问题 (Define prompts) 链接,并添加以下提示问题:And what time works for you?
What time?
Now, what time do you want the appointment?
- 点击保存 (SAVE)。
使用 Dialogflow 控制台中的模拟器测试槽位填充设置。
Figure 6. 显示针对必需参数的槽位填充提示的流程图。
我们已创建了一项意图,该意图能够确保,一旦用户表明预约需求,代理便可从用户那里获取日期和时间信息。但是,目前该意图只是通过模拟响应进行了回复;系统并未真正安排预约。我们需要创建一个后端进程(即 fulfillment),以执行在 Google 日历上安排预约这一任务。
在下一部分中,我们将探讨如何为 Make Appointment 意图创建 fulfillment。