IBM Cloud Docs
使用槽收集信息

使用槽收集信息

向对话节点添加槽可从该节点内的用户那里收集多条信息。 槽会按用户的速度收集信息。 用户提前提供的详细信息已保存,并且助手仅要求提供满足请求所需的缺少的详细信息。

为什么要添加槽?

使用槽可获取所需的信息,然后可以准确响应用户。 例如,如果用户询问营业时间,但营业时间因商店位置而异,那么在回答之前,您可能会询问有关他们计划访问哪个商店位置的后续问题。 然后,可以添加将提供的位置信息考虑在内的响应条件。

在回答问题之前询问位置信息,何时打开
询问位置

槽可以帮助您收集完成用户复杂任务所需的多条信息,例如晚餐预订。

显示四个插槽,用于提示您提供预订晚餐所需的信息。
预留的四个插槽

用户可以一次为多个插槽提供值。 例如,输入可能包含信息 There will be 6 of us dining at 7 PM。 这一个输入包含两个缺少的必需值:客人数和预订时间。 助手可识别并存储这两个值,每个值都位于其相应的槽中。 然后服务会显示与下一个空槽关联的提示。

显示已填充两个插槽,并且服务会提示输入其余一个插槽。
两个插槽已填充

槽使助手能够回答跟进问题,而无需重新确定用户的目标。 例如,用户可能会询问天气预报,然后询问有关其他位置或其他日期天气情况的跟进问题。 如果在槽中保存必需的预测变量(例如,位置和日期),那么如果用户使用新的变量值询问跟进问题,就可以使用所提供的新值来覆盖槽值,并给出反映新信息的响应。 有关如何从对话调用外部服务的更多信息,请参阅 从对话节点进行程序化调用

显示有人要求天气预报,然后在不同的位置和时间跟踪有关天气的问题。
后续问题

使用槽可在用户和助手之间生成更自然的对话流,而且相比尝试使用许多单独的节点来收集信息,也更容易管理。

添加槽

  1. 确定要收集的信息单元。 例如,要为某人订披萨,您可能希望收集以下信息:

    • 送餐时间
    • 大小
  2. 在对话节点编辑视图中,单击定制,然后将开关设置为开启

    有关提示提供所有信息复选框的更多信息,请参阅一次询问所有信息

  3. 为每个所需信息单元添加槽。

    对于每个槽,请指定以下详细信息:

    • 检查: 确定要从用户对槽提示的响应中抽取的信息类型。 在大多数情况下,检查实体值。 事实上,显示的条件构建器会建议可以检查的实体。 但是,您还可以检查意向; 在字段中输入意向名称。 在此可以使用 AND 和 OR 运算符来定义更复杂的条件。

      检查对象值首先用作条件,然后成为在另存为字段中指定的上下文变量的值。 它指定要检查的对象要保存的对象。 如果要更改值的保存方式,请将用于重新设置值格式的表达式添加到另存为字段。

      例如,如果实体是模式实体 (例如 @email),请将 .literal 附加到该实体。 通过添加 .literal,即指示您要捕获的是由用户输入并基于其模式标识为电子邮件地址的确切文本。

      在某些情况下,您可能希望使用表达式来捕获值,但不将表达式应用于保存的内容。 您可以在 检查 字段中使用一个值来捕获值,然后打开 JSON 编辑器以更改上下文变量的值,从而保存其他内容。

      退出 JSON 编辑器后,在 JSON 编辑器中对槽的上下文变量值进行的任何编辑都不会反映在检查对象字段中。 您必须重新打开 JSON 编辑器以查看保存为上下文变量值的内容。

      避免在检查对象字段中检查上下文变量值。 因为您检查的值也是保存的值,所以条件中的上下文变量可能会导致意外行为。

    • 另存为:提供上下文变量的名称,以存储来自于用户对槽提示响应的关注内容值。

      不要复用在对话中其他位置使用的上下文变量。 如果上下文变量已具有值,那么不会显示槽的提示。 仅当槽的上下文变量为空时,才会显示该槽的提示。

    • 提示:编写语句,以引导用户提供所需的信息。 在此提示时,对话将暂停,您的助手将等待用户响应。

      如果希望提示不是文本响应,那么可以通过单击 定制槽 ![Customize slot] 图标来更改响应类型。 单击文本以选择其他响应类型。

      响应类型选项:

    下表显示了节点的示例槽值,通过收集两条信息(披萨尺寸和送货时间)来帮助用户订购披萨。

    披萨订购的示例槽
    检查对象 另存为 提示 如果已找到,跟进问题 如果找不到,跟进问题
    @size $size 您要订多大的披萨? 那就是 $size。 您要订多大的? 我们有小号、中号、大号。
    @sys-time $time 您需要何时送餐? 送餐时间是 $time。 您希望的送餐时间? 备餐时间最短半个小时。
  4. 添加槽值验证: 如果您希望根据用户是否提供响应初始槽提示所需的信息来显示不同的后续语句,那么可以编辑槽并定义后续语句:

    已找到:在用户提供期望的信息后显示。

    找不到: 仅当不了解用户提供的信息时才显示,这意味着以下所有内容均为 true:

    • 未成功填充节点中的任何活动插槽
    • 无法理解槽处理程序
    • 如果为节点启用了离题,那么不会将任何顶级对话节点作为离题从槽填充触发

    有关如何针对已找到找不到响应定义条件和关联操作的信息,请参阅向“已找到”和“找不到”响应添加条件

  5. 使槽可选或在特定条件下禁用槽。 您可以通过以下方式配置插槽:

    • 可选:要使槽可选,请添加不带提示的槽。 助手不会要求用户提供信息,但还是会在用户输入中查找信息,如果用户提供了值,将保存该值。 例如,您可以添加一个用于捕获饮食限制信息的槽,以防用户指定任何内容。 但是,您并不想向所有用户询问饮食信息,因为在大多数情况下这些信息都无关紧要。
    可选槽
    信息 检查对象 另存为
    忌食小麦 @dietary $dietary

    如果将槽设置为可选,请在节点级响应文本中引用其上下文变量 (如果可以对其进行字词处理),以便即使没有为槽提供任何值也有意义。 例如,您可以对类似如下的摘要语句进行文字说明: I am ordering a $size $dietary pizza for delivery at $time. 无论是否提供了饮食限制信息 (例如 gluten-freedairy-free),生成的文本都有意义。 结果为 I am ordering a large gluten-free pizza for delivery at 3:00PM.I am ordering a large pizza for delivery at 3:00PM.

    • 条件:如果希望槽仅在特定条件下启用,那么可以向其添加条件。 例如,如果槽 1 要求会议开始时间,那么槽 2 将捕获会议持续时间,而槽 3 将捕获结束时间,那么仅当未提供槽 2 的值时,您才可能希望启用槽 3。 要使槽有条件,请编辑该槽,然后从 更多 "更多" 图标 菜单中选择 启用条件。 定义要启用该槽必须满足的条件。

      您能以先前槽中的上下文变量值为条件,因为列出槽的顺序即是对其求值的顺序。 但是,在对槽上下文变量进行求值时,您可以确信的条件包含值。 例如,先前的槽必须是必填槽。

  6. 不让用户跑题。 您可以定义槽处理程序,以提供对用户在交互期间可能提出的与节点用途相切的问题的响应。

    例如,用户可能会询问番茄酱配方或配料购自哪里。 要处理此类跑题的问题,请单击管理处理程序链接,然后为每个预期问题添加条件和响应。

    显示用户询问有关酱菜谱的信息。 反应是,我把它带到我的坟墓里去。
    非主题问题

    响应离题问题后,将显示与当前空槽关联的提示。

    如果用户在对话节点流期间一直到显示节点级别响应之前的任意时间,提供与槽处理程序条件匹配的输入,都会触发此条件。 有关使用槽处理程序的更多方式,请参阅处理请求以退出过程

  7. 添加节点级别响应。 节点级别响应要在填充完所有必填槽后才会执行。 可以添加用于汇总所收集信息的响应。 例如, A $size pizza is scheduled for delivery at $time. Enjoy!

    您可以将图像或选项列表显示为响应,而不是文本响应。 请参阅响应类型选项

    如果要根据特定条件定义不同的响应,请单击定制,然后将多个响应开关设置为开启。 有关更多信息,请参阅 条件响应

  8. 添加用于重置槽上下文变量的逻辑。 从每个槽中收集用户的回答时,这些回答会保存在上下文变量中。 可以使用上下文变量将信息传递到其他节点、应用程序或外部服务以供使用。 但是,传递信息后,必须将上下文变量设置为空以重置节点,这样该节点才能再次开始收集信息。 不能将当前节点中的上下文变量作为空值,因为在填充所需槽之前,助手不会退出该节点。 请考虑使用以下某种方法:

    • 将处理添加到将变量设置为空的外部应用程序。
    • 添加将变量设置为空的子节点。
    • 插入将变量设置为空的父节点,然后跳转至使用槽的节点。

槽用法提示

以下槽属性可以帮助您检查和设置槽上下文变量的值。

槽属性
属性名 描述
all_slots_filled 仅当已为节点中的所有槽设置所有上下文变量时,才会求值为 true。 有关用法示例,请参阅阻止在不需要时显示“已找到”响应
event.current_value 此槽的上下文变量的当前值。 有关此属性和 event.previous_value 属性的用法示例,请参阅替换槽上下文变量值
event.previous_value 此槽的上下文变量的先前值。
has_skipped_slots 如果处理了任何配置有下一步选项(用于跳过槽)的槽或槽处理程序,那么值为 true。 有关槽的下一步选项的更多信息,请参阅向“已找到”和“找不到”响应添加条件,有关槽处理程序的下一步选项的信息,请参阅处理请求以退出过程
slot_in_focus 强制将槽条件仅应用于当前槽。 有关更多详细信息,请参阅获取确认。 您可以使用此属性来收集和存储客户提交的准确词。 请参阅 从客户收集摘要信息

请考虑使用以下方法来处理常见任务。

一次询问所有信息

包括整个节点的初始提示,以明确告诉用户您希望他们提供哪些信息单元。 首先显示此提示将使用户有机会一次性提供所有详细信息,而不必等待每次都提示一条信息。

例如,当由于客户想要订购披萨而触发节点时,您可以通过初步提示 I can take your pizza order. Tell me what size pizza you want and the time that you want it delivered. 进行响应

如果用户在其初始请求中提供了哪怕是此信息的一部分,就不会再显示此提示。 例如,初始输入可能是 I want to order a large pizza. 当助手分析输入时,它会将 large 识别为披萨大小,并使用提供的值填充 Size 槽。 由于其中一个槽已填充,因此服务将跳过显示初始提示,以避免再次询问披萨尺寸信息。 它会改为显示其余所有缺少信息的槽的提示。

从启用了“插槽”功能的“定制”窗格中,选中 提示所有内容 复选框以启用初始提示。 此设置会向节点添加如果未预填充任何槽,请首先询问此问题字段,在其中可以指定提示用户提供所有信息的文本。

捕获多个值

可以要求提供项列表,并将其保存在一个槽中。

例如,您可能希望询问用户是否要在披萨上加馅料。 为此,请定义实体 (@topping) 及其接受的值(洋葱胡椒、奶酪、蘑菇等等)。 添加一个槽,用于向用户询问有关馅料的问题。 使用该实体类型的值属性来捕获多个值(如果提供)。

多值槽
检查对象 另存为 提示 如果已找到,跟进问题 如果找不到,跟进问题
@toppings.values $toppings 要加馅料吗? 很不错的馅料。 要加哪种馅料? 我们有...

要稍后引用用户指定的 topping,请使用 <? $entity-name.join(',') ?> 语法列出 topping 数组中的每个项,并使用逗号分隔值。 例如, I am ordering you a $size pizza with <? $toppings.join(',') ?> for delivery by $time.

重新设置值的格式

由于您会要求用户提供信息,并且需要在响应中引用其输入,因此请考虑重新设置值的格式,以便可以使用更友好的格式来显示这些值。

例如,时间值以 hh:mm:ss 格式保存。 可以使用 JSON 编辑器来设置在槽保存时间值时重新设置值的格式,使其改为使用 hour:minutes AM/PM 格式:

{
  "context":{
    "time": "<? @sys-time.reformatDateTime('h:mm a') ?>"
  }
}

处理零

在槽条件中使用 @sys-number 有助于捕获用户在其输入中指定的任何数字。 但是,当用户指定数字 (0) 为零时,它的行为不符合预期。 此条件不会将零作为有效数字进行处理,而是会求值为 false,并且助手将再次提示用户输入数字。 为了避免此行为,请检查槽条件中是否有大于或等于零的 @sys-number 提及项。

要确保用于检查数字提及项的槽条件正确处理零,请完成以下步骤:

  1. @sys-number >= 0 添加到槽条件字段,然后提供上下文变量名称和文本提示。

    在输入中检查的内容也是槽上下文变量中保存的内容。 但是,在本例中,您只希望保存数字(如 5)。 您并不希望保存 5 > = 0。 要更改保存的内容,必须编辑上下文变量的值。

  2. 通过单击 定制槽 图标打开槽以进行编辑。 从 选项 "选项" 图标 菜单中,打开 JSON 编辑器。

  3. 更改上下文变量值。

    值如下所示:

    {
      "context": {
        "number": "@sys-number >= 0"
      }
    }
    

    将其更改为类似于以下内容:

    {
      "context": {
        "number": "@sys-number"
      }
    }
    
  4. 保存更改。

您对上下文变量值所作的更改不会反映在 检查对象 字段中。 您必须重新打开 JSON 编辑器以查看保存的内容。

如果您不希望接受 0 作为数字值,那么可以为槽添加条件响应以用于检查是否存在 0,并指示用户必须提供大于零的数字。 但是,务必注意的是,将槽条件作为输入提供时,它必须能够识别 0。

获取确认

在其他用户之后添加一个槽,要求用户确认您收集的信息是否准确完整。 该槽可以查找与 #yes 或 #no 意向相匹配的响应。

确认槽
检查对象 另存为 提示 如果已找到,跟进问题 如果找不到,跟进问题
#yes \ \ #no $confirmation 我会为您订一个 $size 披萨,送餐时间是 $time。 可以下单了吗?

复杂响应:由于用户可能在对话期间的其他时间包含肯定或否定的语句(对,我希望披萨下午 5 点送到今晚没其他客人,就订小号吧),因此请使用 slot_in_focus 属性以在槽条件中明确您查找的仅仅是对此槽的提示做出的“是”或“否”响应。

(#yes || #no) && slot_in_focus

slot_in_focus 属性始终求值为布尔值(true 或 false)。 将其包含在需要布尔值结果的条件中。 例如,不要在检查实体类型,然后保存实体值的槽条件中使用此属性。

找不到提示中,澄清您希望用户提供“是”或“否”回答。

{
  "output":{
    "text": {
      "values": [
        "Respond with Yes to indicate that you want the order to
         be placed as-is, or No to indicate that you do not."
      ]
    }
  }
}

已找到提示中,添加一个条件,用于检查“否”响应 (#no)。 找到时,从头开始要求提供信息,并重置先前保存的上下文变量。

{
  "conditions": "#no",
  "output":{
    "text": {
      "values": [
        "Let's try this again. Tell me what size pizza
         you want and the time..."
      ]
    }
  },
  "context":{
    "size": null,
    "time": null,
    "confirmation": null
  }
}

从客户收集摘要信息

您可能希望提示用户在对话节点中提供自由格式文本,并提供可保存和稍后引用的槽。 为此,请执行以下步骤:

  1. 检查 字段中,添加以下特殊属性: slot_in_focus

  2. (可选) 在 另存为 字段中更改槽的上下文变量名称。 例如,您可能希望将其更改为类似于 summary 的内容。

  3. 如果不存在,请询问 字段中,要求用户提供开放式信息。 例如, Can you summarize the problem?

  4. 要将输入存储在客户的准确词中,请使用 JSON 编辑器编辑保存的内容。

  5. 通过单击 定制槽 图标打开槽以进行编辑。 从 选项 "更多" 图标 菜单中,打开 JSON 编辑器。

  6. 更改上下文变量值。

    值如下所示:

    {
      "context": {
        "summary": "slot_in_focus"
      }
    }
    

    更改保存在 $summary 上下文变量中的值。 您希望捕获并存储用户提交的任何文本。 为此,请使用捕获输入文本的 SpEL 表达式。

    {
      "context": {
        "summary": "<? input.text ?>"
      }
    }
    
  7. 保存更改。

您对上下文变量值所作的更改不会反映在 检查对象 字段中。 您必须重新打开 JSON 编辑器以查看保存的内容。

替换槽上下文变量值

如果在用户退出具有槽的节点之前的任何时候,用户为槽提供新值,那么新值将保存在槽上下文变量中,以替换先前值。 对话可以通过使用为“已找到”条件定义的特殊属性来显式确认发生了此替换:

  • event.previous_value:此槽的上下文变量的先前值。
  • event.current_value:此槽的上下文变量的当前值。

例如,对话询问预订航班的目的地城市。 用户提供了Paris。 您将 $destination 槽上下文变量设置为巴黎。 然后,用户将显示 Oh wait. I want to fly to Madrid instead。 如果按如下所示设置了“已找到”条件,那么对话就可以正常处理此类型的更改。

当用户响应时,如果找到 @destination:

Condition: (event.previous_value != null) &&
           (event.previous_value != event.current_value)
    Response: Ok, updating destination from
    <? event.previous_value ?> to <? event.current_value ?>.
Response: Ok, destination is $destination.

此槽配置能够支持对话通过以下应答对用户的目的地更改做出反应:Ok, updating the destination from Paris to Madrid.

避免槽填充混淆

对用户输入求值时,仅填充第一个槽条件与其匹配的槽。 测试错误解释是否由以下可能的原因而导致,并予以解决:

  • 问题:同一实体在多个槽中使用。

    例如,@sys-date 用于在一个槽中捕获出发日期,在另一个槽中捕获到达日期。

    解决方案:使用槽“已找到”条件从用户那里澄清要在槽中保存的日期,然后再进行保存。

  • 问题:词汇完全或部分与多个槽条件中的实体相匹配。

    例如,如果一个槽使用类似 @id 的语法来捕获产品标识 (GR1234),另一个槽捕获数字 (@number),例如 1234,那么包含标识(例如,BR3344)的用户输入可能会被 @number 槽声明为数字引用,并使用 $number 来填充 3344 上下文变量。

    解决方案:在槽列表中,将所含实体条件是捕获较长模式 (@id) 的槽放置在所含条件是捕获较短模式 (@number) 的槽的上方。

  • 问题:词汇被识别为多种系统实体类型。

    例如,如果用户输入 5 月 2 日,那么助手会识别到 @sys-date (2017-05-02) 和 @sys-number (2) 实体。

    解决方案:在槽功能所独有的逻辑中,当在单个用户输入中识别到两个系统实体时,将使用其中一个具有较大范围的实体。 因此,尽管助手在文本中识别到两个系统实体,也只会注册范围较长(@sys-date2017-05-02)的系统实体并将其应用于槽。

    如果使用的是已修改的系统实体,那么此变通方法不是必需的。 对于更新的实体,日期引用仅被视为 @sys-date 提及项,不会还被视为 @sys-number 提及项。 有关更多信息,请参阅系统实体

向“已找到”和“找不到”响应添加条件

对于每个槽,您可以将条件响应与关联的操作配合使用,以帮助您从用户中抽取所需的信息。 为此,请执行以下步骤:

  1. 单击要向其添加条件“已找到”和“未找到”响应的槽的 定制槽 图标。

  2. 更多 "更多" 图标 菜单中,选择 启用条件响应

  3. 输入条件和满足条件时显示的响应。

    已找到示例: 插槽需要晚餐预订的时间。 您可在检查对象字段中使用 @sys-time 来捕获此信息。 为了防止保存无效时间,您可以添加条件响应,以检查所提供的时间是否早于餐厅的最后一个座位时间,例如 @sys-time.after('21:00:00')。 相应的响应可能类似于 我们的最后一个座位是在 9PM。

    找不到示例: 插槽需要 @sys-number 实体作为获取顺序中的 pizzas 数。 true 的“找不到”条件可用于显示提示用户的消息,仅当对话中未提供数字时 (例如,We need to know how many pizzas you want.)。

  4. 如果要定制满足条件时接下来发生的情况,请单击 定制处理程序 图标。

    对于当用户提供与“检查”字段中指定的值类型匹配的值时显示的“已找到”响应,您可以选择下列其中一项操作:

    • 离开(缺省):指示助手在显示响应后移至下一个空槽。 在关联的响应中,使用户确信其输入已得到理解。 例如,好。 您希望将其调度为 $date。
    • 清除槽并再次提示: 如果您正在使用 检查 字段中可能选取错误值的实体,请添加检测任何可能的错误解释的条件,然后使用此操作来清除当前槽值并提示输入正确的值。
    • 跳至响应: 如果满足您定义的条件,那么不再需要填充此节点中的任何剩余插槽,请选择此操作以跳过其余插槽,然后直接转至节点级别的响应。 例如,您可以添加一个条件来检查用户的年龄是否在 16 岁以下。 如果是这样,您可以跳过询问有关用户驾驶记录的问题的剩余时段。

    对于“找不到”响应 (当用户未提供有效值时显示),您可以选择下列其中一项操作:

    • 等待用户输入(缺省):暂停交谈,并且助手会等待用户进行响应。 在最简单的情况下,此处指定的文本可以更明确地声明您需要用户提供的信息类型。 如果对条件响应使用此操作,请确保在表述条件响应时明确声明用户的回答哪里有误,以及您期望他们改为提供哪些内容。

    • 再次提示: 在“未找到”响应之后,助手会再次重复插槽提示并等待用户响应。 如果对条件响应使用此操作,那么响应可以仅仅说明用户提供的回答哪里有误。 但不需要重申您希望用户提供的信息类型,因为槽提示通常会说明这一点。

      如果选择此选项,请考虑添加“找不到”响应的至少一个变体,以便用户不会多次看到完全相同的文本。 借此机会可使用不同的措辞向用户解释您需要他们提供哪些信息以及以何种格式提供。

    • 跳过此槽:指示助手停止尝试填充当前槽,而改为移至下一个空槽的提示。 如果您希望使槽可选,并在该槽中显示提示以要求用户输入信息,那么此选项很有用。 例如,您可能有一个 @seating 实体,用于捕获餐厅座位首选项,例如 靠近壁炉私人。 您可以添加一个插槽,用于提示用户 是否有任何座位首选项? 并检查 @seating.values。 如果提供了有效的响应,它会将偏好信息保存到 $seating_preferences。 但是,通过选择此操作作为“找不到”响应的下一步,可指示助手在用户没有为其提供有效值的情况下停止尝试填充此槽。

    • 跳至响应: 如果满足您定义的条件,那么不再需要填充此节点中的任何剩余插槽,请选择此操作以跳过其余插槽,然后直接转至节点级别的响应。 例如,如果在捕获单向航班信息时,时段提示为: 您是否购买往返机票?“未找到”条件可以检查 #No。 如果找到 #No,请使用此选项来跳过捕获有关返回航班的信息的其余槽,并直接转至节点级别响应。

    单击返回以返回到槽的编辑视图。

  5. 要添加其他条件响应,请单击添加响应,然后输入条件和满足条件时要显示的响应。

    请确保至少添加一个不管用的响应。 您可以将此 catchall 响应的条件字段留空。 助手会自动使用 true 特殊条件来填充空白条件字段。

  6. 单击保存以保存更改,关闭槽的编辑视图,并返回到节点的编辑视图。

多次失败尝试后离开

您可以使用“找不到”条件响应,让用户在多次尝试后仍然无法正确回答问题时退出槽。 在 catchall 响应中,打开 JSON 编辑器以添加计数器上下文变量,该变量跟踪返回“找不到”响应的次数。 在较早的节点中,请确保将初始计数器上下文变量值设置为 0。

在此示例中,助手要求提供披萨尺寸。 服务在用户错误回答该问题 3 次后,会将尺寸(中号)应用于用户的该变量。 (您可以包含确认槽,在要求用户确认订单信息时,用户始终可以在该槽中更正尺寸。)

检查对象:@size 另存为:$size “找不到”万能型条件:

{
  "output": {
    "text": {
      "values": [
        "What size did you want? We have small, medium, and large."
      ],
      "selection_policy": "sequential"
    }
  },
  "context": {
    "counter": "<? context['counter'] + 1 ?>"
  }
}

要在 3 次尝试后以不同方式进行响应,请添加类似于以下内容的另一个“找不到”条件:

{
  "conditions": "$counter > 1",
  "output": {
    "text": {
      "values": [
        "We will bring you a size medium pizza."
      ]
    }
  },
  "context": {
    "size": "medium"
  }
}

此“找不到”条件比“找不到”万能型条件(缺省值为 true)更精确。 因此,您必须移动此响应,使其位于原始条件响应之前,否则此响应将永远不会触发。 选择条件响应并使用向上箭头将其上移。

阻止在不需要时显示“已找到”响应

如果为多个槽指定“已找到”响应,那么当用户同时为多个槽提供值时,将显示至少一个槽的“已找到”响应。 您可能希望返回所有这些槽的“已找到”响应,或者不返回任何“已找到”响应。

要阻止显示“已找到”响应,可以对每个“已找到”响应执行以下某项操作:

  • 向响应添加条件,以阻止其在填充特定槽时显示。 例如,如果同时提供了 $size 和 $time 上下文变量,那么可以添加条件 (例如 !($size && $time)) 以阻止显示响应。
  • !all_slots_filled 条件添加到响应。 如果填充了所有槽,那么此设置将阻止显示响应。 如果要包含确认槽,请不要使用此方法。 确认槽也是一个槽,您通常希望在填充确认槽本身之前,阻止显示“已找到”响应。

处理请求以退出过程

添加至少一个槽处理程序,用于识别用户要退出节点的情况。

例如,在收集信息以调度宠物梳理预约的节点中,您可以添加以 #cancel 意向为条件的处理程序,以识别诸如 Forget it. I changed my mind 之类的话语。

  1. 在处理程序的 JSON 编辑器中,使用哑元值填充所有槽上下文变量,以阻止节点继续要求提供任何缺少的信息。 在处理程序响应中,添加一条消息,例如,Ok, we'll stop there. No appointment will be scheduled.

  2. 从以下选项中选择希望助手执行的下一个操作:

    • 再次提示(缺省):显示在用户提出跑题问题之前正在处理的槽的提示。
    • 跳过当前槽:显示与用户提出跑题问题之前正在处理的槽后面的槽关联的提示。 助手不会进一步尝试填充跳过的槽。
    • 跳至响应:跳过其余所有空槽的提示,包括在用户提出跑题问题之前正在处理的槽。
  3. 在节点级别响应中,添加一个条件,用于检查其中一个槽上下文变量中是否有哑元值。 如果找到,那么将显示最终消息,例如 If you decide to make an appointment later, I'm here to help. 如果找不到,那么将显示节点的标准摘要消息,例如 I am making a grooming appointment for your $animal at $time on $date.

下面是为披萨示例定义处理程序的 JSON 样本。 请注意,如前所述,上下文变量全部都设置为哑元值。 实际上,$size 上下文变量设置为 dummy。 此 $size 值触发节点级别的响应,以显示相应的消息并退出槽节点。

{
"conditions": "#cancel",
 "output": {
   "text": {
     "values": [
       "Ok, we'll stop there. No pizza delivery will be scheduled."
     ],
    "selection_policy": "sequential"
    }
  },
"context": {
   "time": "12:00:00",
   "size": "dummy",
   "confirmation":"true"
}
}

重要信息:考虑在此条件之前求值的条件中所使用的逻辑,以便您可以构建不同的条件。 收到用户输入时,将按以下顺序对条件求值:

  • 槽处理程序,按其列出顺序执行。
  • 第一个槽条件。
  • 当前槽级别“已找到”条件。
  • 如果允许离题,那么将检查根级别节点条件是否有匹配项(对话树根或根文件夹中的最后一个anything else节点除外)。
  • 当前槽级别“找不到”条件。
  • 最后一个anything else节点条件。

请注意添加始终求值为 true 的条件 (例如,特殊条件 trueanything_else) 作为槽处理程序。 对于每个槽,如果槽处理程序求值为 true,那么将完全跳过“找不到”条件。 因此,使用始终求值为 true 的槽处理程序实际上会阻止对每个槽的“找不到”条件求值。

例如,您为除猫以外的其他所有动物提供美容服务。 对于“动物”槽,可尝试使用以下槽条件来阻止cat保存在“动物”槽中:

Check for @animal && !@animal:cat, then save it as $animal.

要告诉用户您不接受猫,可以在“动物槽”的“找不到”条件中指定以下值:

If @animal:cat then, "I'm sorry. We do not groom cats."

如果还定义了 #exit 槽处理程序,那么当提供了条件求值顺序时,有可能从来都不会触发此“找不到”条件,这也是合乎逻辑的。 可以改为使用以下槽条件:

Check for @animal, then save it as $animal.

为了处理可能的cat响应,请将此值添加到“已找到”条件:

If @animal:cat then, "I'm sorry. We do not groom cats."

在 JSON 编辑器中,为“已找到”条件重置 $animal 上下文变量的值,因为该变量当前设置为猫,这是不应该的设置。

{
  "output":{
    "text": {
      "values": [
        "I'm sorry. We do not groom cats."
      ]
    }
  },
  "context":{
    "animal": null
  }
}

槽示例

要访问实现不同公共插槽使用方案的 JSON 文件,请转至 GitHub中的 社区存储库

要探索示例,请下载某个示例 JSON 文件,然后将其作为新的对话技能导入。 在“对话”选项卡中,可以查看对话节点以了解如何实现槽来解决不同用例。