场景

意图结合使用时,场景是对话模型的另一个主要构成要素。场景代表对话的各个状态,其主要用途是将对话整理为逻辑区块、执行任务以及向用户返回提示。

场景的一些功能包括:

  • 循环执行 - 场景在循环中执行,直到满足您定义的过渡标准。这样一来,您可以在单个场景中更高效地创建控制逻辑流。
  • 对话框分离 - 场景与 intent 搭配使用时,您可以将对话框分组为逻辑区块,从而轻松构建用户请求和操作响应对。
  • intent 匹配范围限定 - 由于一次只能有一个场景处于活动状态,因此您可以将 intent 匹配范围限定为您选择的场景,并使它们仅在这些场景处于活动状态时才匹配。
  • 槽填充 - 您可以在场景中使用槽填充来收集多段用户输入的输入内容,而无需创建多个 intent
  • 场景条件 - 您可以检查槽、会话、用户和主存储空间,以便在不触发 webhook 的情况下执行简单的条件逻辑。

您可以将场景定义为对话模型的一部分,将其定义为自定义场景。Google 助理的对话逻辑还包括系统场景,这些场景可为对话提供标准功能。

自定义场景

自定义场景是对话逻辑的构建块,构成了 Action 对话模型的一部分。自定义场景有多个阶段,用于定义开始的方式和时间(称为“激活”)、其执行的对话处理(称为“执行生命周期”)和场景的结束方式(称为“转换”)

  • 激活 - 您必须先通过全局 intent 匹配或场景转换激活场景,然后才能执行场景。
  • 执行 - 当场景处于活动状态时,它会在明确定义的生命周期中执行,让您可以执行各种任务,例如槽位填充、条件检查、提示生成和触发 webhook 事件。
  • 过渡 - 当某个场景满足您定义的条件(例如匹配 intent 或完成槽填充)时,您可以过渡到另一个场景以执行更多逻辑。或者,您可以过渡到“结束对话”系统场景,以结束与用户的对话。
图 1.常见的场景转换。全局 intent 会在调用期间激活某个场景,该场景会使用用户输入并匹配 intent,进而转换并激活另一个场景。

提升活跃度

场景必须处于活动状态后才能执行。任何时候都只能有一个场景处于活动状态。您可以通过以下方式激活场景:

  • 调用 - 当用户输入与全局 intent 的语言模型匹配时,您可以激活场景来处理调用。
  • 静态场景过渡 - 当场景满足过渡标准时,您可以定义向另一个场景的过渡。
  • 动态场景转换 - 在 webhook 处理程序中,您可以以编程方式过渡到其他场景

执行生命周期

当场景处于活动状态时,它会在明确定义的生命周期内执行,该生命周期会循环执行,直到场景满足您设置的过渡标准。场景的执行生命周期分为多个可选阶段,这些阶段按以下顺序运行:

  1. 进入 - 此阶段仅在场景激活时运行一次。您可以触发网络钩子或提示用户对场景进行一次性设置。

  2. 条件 - 使用条件,您可以在推进生命周期阶段、触发 webhook 或发送提示之前评估某些条件。此阶段可以定义退出执行循环的过渡条件。

  3. 槽填充 - 场景可以自动提示用户,直到收集到所有必需的槽(类型化数据)。场景每次都会通过其执行循环提示单个槽位。如果缺少任何槽位,场景的生命周期最终会循环回到槽位填充阶段,并提示下一个必需的槽位。此阶段可以定义退出执行循环的过渡条件。

  4. 提示 - Google 助理将提示队列传递给用户并清除队列。提示队列是自此阶段上次清除队列以来聚合的提示的合并集合。

  5. 输入 - Google 助理会使用用户输入并将其返回给场景,以便您可以对其进行处理,其中可能包括 intent 匹配(场景内的全局 intent 或用户 intent)、继续进行槽填充(如果未完成),或处理不匹配或无输入错误。此阶段可以定义退出执行循环的过渡条件。如果没有过渡,执行循环会返回到条件阶段。

图 2. 场景执行生命周期

以下部分更详细地介绍了每个生命周期阶段。

进入时

进入时是唯一不在场景执行循环中执行的阶段。它会按以下顺序执行一次性的场景初始化:

  • 如果 Google 助理运行时可以从之前匹配的 intent 中填充任何槽位,它现在就会执行此操作,以便为槽位填充阶段准备场景。例如,某些用户输入可能与 intent 匹配并提供槽。该 intent 匹配会激活场景,如果槽名称匹配,则可以填充场景中的槽位。
  • 如果启用了网络钩子,它会同步触发事件,并等待您的网络服务返回响应。
  • 运行时收到 webhook 响应时,会解析提示中的任何参数引用,并根据用户 Surface 选择候选提示,然后为候选变体选择一个变体,以稍后发送给用户。
  • 如果 webhook 响应包含提示,则会将其添加到提示队列中。 如果也存在静态提示,则 webhook 提示会先合并到提示队列中,然后是静态提示。
  • 如果 webhook 响应包含过渡,它就会立即包含过渡。否则,场景会继续进行槽位填充阶段。

条件

借助条件,您可以检查会话、用户或槽数据,确定某个条件是否为 true。例如,您可以检查是否所有槽都已填充,并将其设为转换到另一个场景以处理槽时的条件。

  • Google 助理运行时会按照指定顺序评估每个条件。计算结果为 true 的第一个条件会执行关联的处理程序并停止条件评估。
  • 如果执行槽填充,则条件 else if scene.slots.status = "FINAL" 会自动添加到条件列表中。此可选条件用于检查槽填充是否已完成,并可触发网络钩子或向提示队列添加提示。

条件评估后,如果场景未定义过渡,则会继续进行槽位填充。

槽填充

此阶段会为必需但未填充的单个广告位添加槽提示。如果您没有在场景中定义任何槽,此阶段将不执行任何操作。

  • Google 助理运行时会选择第一个未填充的槽,并将相应的提示添加到提示队列。由于场景的执行循环,因此当执行循环返回此阶段时,系统会稍后处理其他未填充的槽。
  • 当前活跃槽位的错误处理提示可以替换在场景输入阶段中定义的提示。
  • 当用户填充槽时,您可以通过触发网络钩子在网络服务中对其进行验证。

提示

Google 助理运行时会将提示队列传送给用户、清除队列并使用用户输入。

输入

Google 助理运行时会尝试将输入与 intent 或槽位匹配:

  • 如果是用户 intent 匹配,场景会执行关联的 intent 处理程序(用户 intent 或系统 intent)。场景的 intent 处理程序优先于所有全局 intent。如果您没有定义过渡,则场景执行会返回到条件阶段。
  • 在槽匹配的情况下,场景会返回到槽填充阶段。
  • 如果系统 intent 匹配(例如,无输入或无匹配),您可以将提示添加到提示队列、触发 webhook 或转换。如果定义了多个不匹配提示,Google 助理运行时将按以下顺序选择最相关的提示:槽填充、场景和全局无匹配提示。如果连续没有匹配项,会生成相应的事件:

    • no_match_1
    • no_match_2
    • no_match_final

    每个不匹配级别(槽位填充、场景和全局)都会触发 webhook 事件。默认情况下,第三次(也就是最后一次)不匹配会结束对话。

转换

转换可以分为以下阶段:

  • 条件 - 您可以根据自己定义的条件过渡到其他场景。一种常见的检查条件是槽填充是否已完成。
  • 输入(用户 intent 匹配)- 如果 intent 匹配,则可以触发向另一个场景的过渡。
  • 输入(系统 intent 匹配)- 您可以在任何系统 intent 匹配事件期间触发 webhook。对于无匹配项和无输入事件,场景默认在发生三次后过渡到结束对话场景。

系统场景

借助系统场景,您可以使用 Google 助理提供的内置对话逻辑,从而将标准对话流程添加到用户体验中。例如,账号关联系统场景可让 Google 助理暂时接管账号关联流程,返回实际关联用户账号所需的信息。系统场景不遵循标准场景生命周期。

以下列表介绍了支持的系统场景及其使用方法:

  • 结束对话 - 关闭麦克风并结束与用户的对话。在此场景执行后,Google 助理会重新控制用户体验。
  • 帐号关联 - 引导用户完成帐号关联流程,并为您的 Action 提供所需信息,以便将后端服务器上的用户账号与用户的 Google 账号相关联。如需详细了解如何使用此场景,请参阅帐号关联文档。
  • 每日更新 - 引导用户完成确认流程,以将您的 Action 添加到用户的每日更新中。如需详细了解如何使用此场景,请参阅每日更新文档。
  • 通知 - 引导用户完成确认流程,以接收来自您的 Action 的通知。如需详细了解如何使用此场景,请参阅推送通知文档。