使用参数创建意图

我们现在需要一个可以安排自行车店预约的意图。第一个意图 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 会使用实体和参数这些概念从用户话语中提取目标信息,并将其转换为一组参数,然后由其他功能或系统处理这些参数以执行各种任务。

如需使用参数创建新意图,请执行以下步骤:

  1. 创建一个名为 Make Appointment 的意图。
  2. 训练短语 (Training Phrases) 部分,添加以下训练短语:

    I need to make an appointment at 3 PM today.

  3. 操作和参数 (Action and parameters) 表中,确认系统实体 @sys.date@sys.time 已显示。

  4. 文本响应 (Text response) 表中,添加以下响应短语:

    Got it. I have your appointment scheduled on $date at $time. See you soon. Good-bye.

  5. 点击保存 (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 参数设为必需参数并为这些参数提供提示问题,请按以下步骤操作:

  1. 点击 Make Appointment 意图。
  2. 操作和参数 (Action and parameters) 表中,勾选参数 $time$date 对应的 REQUIRED 复选框。此时,系统会创建名为 PROMPTS 的列。
  3. 如果在表中,$date 参数位于 $time 参数的下方,请将 $date 参数所在的行拖动到 $time 参数的上方。(参数在表中的位置决定了意图询问提示问题的顺序。)
  4. 对于 $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?
  5. 对于 $time 参数,点击定义提示问题 (Define prompts) 链接,并添加以下提示问题:
    • And what time works for you?
    • What time?
    • Now, what time do you want the appointment?
  6. 点击保存 (SAVE)。
  7. 使用 Dialogflow 控制台中的模拟器测试槽位填充设置。

    Figure 6. 显示针对必需参数的槽位填充提示的流程图。

我们已创建了一项意图,该意图能够确保,一旦用户表明预约需求,代理便可从用户那里获取日期和时间信息。但是,目前该意图只是通过模拟响应进行了回复;系统并未真正安排预约。我们需要创建一个后端进程(即 fulfillment),以执行在 Google 日历上安排预约这一任务。

在下一部分中,我们将探讨如何为 Make Appointment 意图创建 fulfillment