输入和输出上下文

输入和输出上下文会应用于意图。它们可以协同工作,控制对话流程:

  • 输出上下文控制活跃的上下文。当某个意图发生匹配时,为该意图配置的所有输出上下文都将变为活跃状态。
  • 输入上下文控制意图匹配。当上下文处于活跃状态时,Dialogflow 更可能匹配配置了输入上下文,且该上下文与当前活跃上下文匹配的意图。

通过上下文,您可以执行以下操作:

  • 控制意图匹配的顺序。
  • 使用相同的训练语句创建特定于上下文的意图。

例如,请考虑以下意图:

意图名称 训练语句 参数 输入上下文 输出上下文 响应
pet-init "What do they look like?" - - - "What kind of pet do you like?"
pet-select-dogs "I like dogs" - - dogs "What do you want to know about dogs?"
pet-select-cats "I like cats" - - cats "What do you want to know about cats?"
dog-show "What do they look like?" - dogs - "Here is a picture of a dog."
cat-show "What do they look like?" - cats - "Here is a picture of a cat."

当最终用户说 I like dogs 时:

  • 匹配 pet-select-dogs 意图。
  • 输出上下文为 dogs,因此它将成为活跃上下文。

当最终用户说 I like cats 时:

  • 匹配 pet-select-cats 意图。
  • 输出上下文为 cats,因此它将成为活跃上下文。

当最终用户说 What do they look like? 时:

  • 如果 dogs 是活跃上下文:
    • 匹配 dog-show 意图。
    • 最终用户会看到一张狗的图片。
  • 如果 cats 是活跃上下文:
    • 匹配 cat-show 意图。
    • 最终用户会看到一张猫的图片。
  • 如果没有活跃上下文:
    • 匹配 pet-init 意图。
    • 系统会询问最终用户喜欢哪种宠物。

输出上下文

您可以对一个意图应用多个输出上下文。当某个意图得到匹配时,应用于该意图的所有输出上下文都会变为活跃状态。

活跃上下文的参数引用

当匹配的意图含有输出上下文时,该意图收集的参数值可用作活跃上下文的参数引用的临时存储空间。只要相应上下文保持活跃状态,这些值就可供未来的意图匹配作业访问。

例如,以下是上述宠物示例的变化形式:

意图名称 训练语句 参数 输入上下文 输出上下文 响应
pet-init "What do they look like?" - - - "What kind of pet do you like?"
pet-select "I like dogs", "I like cats" pet - pet-chosen "What do you want to know about $pet?"
pet-show "What do they look like?" - pet-chosen - "Here is a picture of a #pet-chosen.pet."

当最终用户说 I like dogsI like cats 时:

  • 匹配 pet-select 意图。
  • pet 参数设置为所选的宠物类型。
  • 输出上下文为 pet-chosen,因此它将成为活跃上下文。

当最终用户说 What do they look like? 时:

  • 如果 pet-chosen 是活跃上下文:
    • 匹配 pet-show 意图。
    • 如果最终用户在上一轮对话中选择了 dogs,则最终用户会看到一张狗的图片。
    • 如果最终用户在上一轮对话中选择了 cats,则最终用户会看到一张猫的图片。
  • 如果没有活跃上下文:
    • 匹配 pet-init 意图。
    • 系统会要求最终用户选择宠物类型。

有效期

每个活跃上下文都有一个有效期,用于定义该上下文保持活跃状态的对话回合数。常规意图的默认有效期为 5 个对话回合,而后续意图的默认有效期为两个对话回合。您可以替换任何上下文的默认有效期。此外,所有上下文都会在活跃 20 分钟后过期。当某个意图与处于活跃状态的输出上下文匹配时,系统会重置有效期和到期计时器。

例如,请参考以下意图列表和宠物信息代理的示例对话。

意图名称 训练语句 参数 输入上下文 输出上下文 响应
pet-init "What do they look like?", "What do they sound like?", "How big are they?" - - - "What kind of pet do you like?"
pet-select "I like dogs", "I like cats" pet - pet-chosen (lifespan = 2) "What do you want to know about $pet?"
pet-show "What do they look like?" - pet-chosen - "Here is a picture of a #pet-chosen.pet. What else do you want to know?"
pet-audio "What do they sound like?" - pet-chosen - "Here is a #pet-chosen.pet sound. What else do you want to know?"
pet-size "How big are they?" - pet-chosen - "Here is a #pet-chosen.pet size chart. What else do you want to know?"
回合 对话 说明
1 代理:What kind of pet do you like? 匹配 pet-init 意图。
2 用户:I like cats.
代理:What do you want to know about cats?
匹配 pet-select 意图。pet-chosen 输出上下文将成为活跃上下文。
3 用户:What do they look like?
代理:Here is a picture of a cat. What else do you want to know?
pet-show 意图具有 pet-chosen 输入上下文,因此该意图匹配。pet-chosen 上下文已活跃 1 个回合。
4 用户:What do they sound like?
代理:Here is a cat sound.What else do you want to know?
pet-audio 意图具有 pet-chosen 输入上下文,因此该意图匹配。pet-chosen 上下文已活跃两个回合。
5 用户:How big are they?
代理:What kind of pet do you like?
由于 pet-chosen 上下文不再活跃,因此再次匹配 pet-init 意图。

输入上下文

当上下文处于活跃状态时,Dialogflow 更可能匹配配置了输入上下文,且该上下文与当前活跃上下文匹配的意图。详细的意图匹配规则如下:

  1. 意图的输入上下文列表必须是当前活跃上下文列表的子集才能进行匹配。这也适用于没有输入上下文的意图。
  2. 对于符合规则 #1 的意图,输入上下文列表与当前活跃上下文列表最相符的意图更有可能匹配。

例如:

  • 没有任何输入上下文的意图可以随时进行匹配。
  • 如果没有活跃的上下文,则只能匹配没有输入上下文的意图。
  • 如果上下文“A”和“B”处于活跃状态,则无法匹配具有“A”和“C”输入上下文的意图。
  • 如果上下文“A”、“B”和“C”处于活跃状态,则可以匹配具有“A”和“B”输入上下文的意图。
  • 如果上下文“A”和“B”处于活跃状态,则具有“A”和“B”输入上下文的意图更可能匹配,而非没有输入上下文的意图或仅具有“A”输入上下文的意图。