操作和参数

本页面介绍意图的操作和参数设置,以及当意图在运行时匹配时,如何使用这些操作和参数。

如何查找此数据

构建代理时,最常见的方法是使用 Dialogflow ES 控制台(访问文档打开控制台)。以下说明着重介绍如何使用控制台。如需访问操作和参数数据,请执行以下操作:

  1. 转到 Dialogflow ES 控制台
  2. 选择一个代理。
  3. 在左侧边栏菜单中选择意图 (Intents)。
  4. 选择一个意图。
  5. 向下滚动到操作和参数 (Action and parameters) 部分。

操作和参数字段的屏幕截图

如果您要使用 API 而非控制台来构建代理,请参阅意图参考。API 字段名称与控制台字段名称类似。以下说明重点介绍控制台与 API 之间的重要区别。

操作

“Action”字段是一个简单方便的字段,可帮助您在服务中执行逻辑。

构建代理时,可以将此字段设置为您认为有用的任何文本。

当意图在运行时匹配时,Dialogflow 会为您的 fulfillment webhook 请求或 API 交互响应提供操作值。 它可用于在服务中触发特定逻辑。

参数

当系统在运行时环境中匹配了某个意图时,Dialogflow 会以参数形式提供最终用户表述中的提取值。每个参数都有一个类型,称为实体类型,用于确切规定提取该数据的方式。与原始的最终用户输入不同,参数是结构化数据,可以轻松用于执行某些逻辑或生成响应。

构建代理时,可以通过注释训练短语的特定部分并配置相关参数来控制数据的提取方式。

以下列表展示了参数配置的字段。 文中所举示例针对训练短语“book a room on Tuesday”,其中“Tuesday”进行了注释。

  • 必需 (Required):如果此参数对于保持意图完整是必需的,则勾选此复选框。 请参阅下文中的用必需参数进行槽位填充部分。
  • 参数名称 (Parameter Name):用于标识参数的名称。 示例:date
  • 实体 (Entity):与参数关联的实体类型。 示例:@sys.date
  • (Value):大多数情况下设置为 $parameter-name 之类的参数引用,用作在运行时提取值的占位符。 不过,此字段也可用于选择替代值。 请参阅下面的参数值和参数引用部分。 示例:$date
  • 是列表 (Is List):如果值应以列表形式返回,则勾选此复选框。请参阅下文中的列表参数部分。
  • 提示问题 (Prompts):在未提供参数时,代理将询问最终用户的问题。 仅在勾选必需 (Required) 字段时才使用此字段。请参阅下文中的用必需参数进行槽位填充部分。
  • 默认值 (Default value):当最终用户未提供参数时,则采用默认值。 如需使用控制台更改默认值,您必须将鼠标悬停在参数行上,然后点击右侧的菜单。

当意图在运行时匹配时,Dialogflow 会为您的 fulfillment webhook 请求或 API 交互响应提供参数数据。 这些数据会采用从参数名称到参数值的映射形式提供。

构建代理时,您的响应可以包含参数值。请参阅下文的参数值和参数引用

列表参数

使用控制台构建代理时,选中是列表 (Is List) 选项会将参数配置为列表。 列表可以包含多个元素。 例如,农产品订购代理可能预期会有以下最终用户表述:

  • “I want apples”
  • “I want apples and oranges”
  • “I want apples, oranges, and bananas”

使用列表参数为训练语句添加注释时,您的语句可以包含一个或多个参数示例,并且您可以分别对每个示例进行注释:

列表参数注解的屏幕截图。

当您在一个训练短语中为至少两个具有相同参数的单词或短语添加注解后,Is List 选项会自动启用。 如果您停用此选项但保留相同的注解,则在您打开带有此注解的页面后,系统会自动再次检查是列表

多语言代理中,是列表选项不是特定于语言

参数值和参数引用

参数引用是用于保存在运行时提取的参数值的变量。 构建代理时,您可以在意图响应、参数提示问题和参数 (Value) 字段中使用参数引用。

举例来说,您可以在意图响应中使用 $parameter-name。 当 Dialogflow 响应用户时,它会用在运行时提取的参数值替换掉参数引用。 这有助于简要重述最终用户提供的信息。 例如,意图响应可能如下:“Okay, I booked a room for you on $date”。

基本参数引用

如需引用关联实体提取的参数值,请使用以下格式:

$parameter-name

例如,如果参数名称为 date,您可以采用 $date 引用它。

原始值的参数引用

当文本与特定实体匹配时,它通常会转换为更便于处理的文本。 例如,最终用户表述中的单词“apples”可以被提取为水果实体的“apple”。如需原样引用最终用户写出或说出的参数值,请使用以下格式:

$parameter-name.original

例如,如果参数名称为 date,您可以采用 $date.original 引用原始值。

日期不明确的参数引用

当某个参数与 @sys.date 系统实体相关联,并且最终用户提供部分日期(未指定月、日和年)时,Dialogflow 将匹配到最接近的未来日期。不过,您也可以检索此日期的变体。

您可以检索显式部分匹配,其中 Dialogflow 使用以下格式将未知部分替换为 U

$parameter-name.partial

您可以使用以下格式检索过去最近的日期:

$parameter-name.recent

例如,如果今天的日期是 2021 年 8 月 11 日,您的参数名称为 date,而用户说“8 月 13 日”:

参数引用 解析后的值
$date 2021-08-13
$date.partial UUUU-08-13
$date.recent 2020-08-13

复合实体的参数引用

复合实体是包含其他子实体的实体。如需引用参数的子实体的值,请使用以下格式:

$parameter-name.sub-entity-name

例如,如果参数名称为 move,而子实体名称为 direction,您可以采用 $move.direction 引用子实体值。

活跃上下文的参数引用

上下文可用作参数值的临时存储空间。 如需引用从活跃上下文中获取的参数值,请使用以下格式:

#context-name.parameter-name

例如,如果参数名称为 roomreservation 为活跃上下文,则您可以采用 #reservation.room 引用该参数值。

事件参数的参数引用

如需引用事件参数,请使用以下格式:

#event-name.parameter-name

例如,如果参数名称为 duration 且事件名称为 alarm,则您可以采用 #alarm.duration 引用该事件参数。

参数“值” (Value) 字段

参数 (Value) 字段中的参数引用具有特殊含义。 此字段中的内容决定意图响应和参数提示问题中的 $parameter-name 的解析值。 Dialogflow 按以下顺序处理参数数据:

  1. 使用关联实体从最终用户表述中提取参数值。
  2. 解析参数 (Value) 字段的内容。
  3. $parameter-name 设置为参数 (Value) 字段的解析内容。 如果 (Value) 字段未设置为 $parameter-name,则会将 $parameter-name 的值重置为其他值。
  4. 解析意图响应和参数提示的内容。

以下示例说明这种排序对最终用户表述“I want to buy a small shirt”的影响。

参数引用位置 配置的内容 解析的内容
参数的 (Value) 字段 $size S
意图响应 您选择了尺寸:$size 您选择的尺寸:S
参数引用位置 配置的内容 解析的内容
参数的 (Value) 字段 $size.original small
意图响应 您选择了尺寸:$size 您选择的尺寸:small
参数引用位置 配置的内容 解析的内容
参数的 (Value) 字段 $size S
意图响应 您选择了尺寸:$size.original 您选择的尺寸:small

用必需参数进行槽位填充

构建代理时,可以将参数标记为“必需”。 若最终用户没有为每个必需参数提供数据,则意图不完整。

必需参数字段的屏幕截图

当意图在运行时中匹配时,Dialogflow 代理会继续收集最终用户提供的信息,直到最终用户为每个必需参数提供数据。 此过程称为“槽位填充”

除非启用了使用 webhook 进行槽位填充,否则在从最终用户处收集到所有必需数据之前,Dialogflow 不会发送 fulfillment webhook 请求。

Dialogflow 针对槽位填充的每个步骤发送 API 交互响应。 每个槽位填充响应的意图和操作相同,系统会提供目前为止收集的参数。

构建代理时,您可以提供一些提示问题,代理会向最终用户询问这些提示问题以获取参数数据。 您还可以提供一些提示问题的变体,这样代理就不会总是询问相同的问题了。

参数提示的屏幕截图

例如,假设您的服装店代理具有包含以下必需参数的意图:

  • clothing type
  • quantity
  • size
  • color

为使意图完整,用户和代理可能会发生以下对话:

用户:我想买 T 恤。
代理:How many do you want?
用户:3
代理:What color would you like?
用户:Black
代理:What size?
用户:Medium
代理:Got it, that was three black t-shirts in medium

如果最终用户在一句话中为多个参数提供数据,Dialogflow 将收集所提供的数据并继续询问缺失的数据。例如,最终用户可能会说“I'd like to buy three black t-shirts”。 那么 Dialogflow 会继续询问用户想买的尺寸。

为参数排序

构建代理时,您可以为参数排序,此顺序决定了代理向最终用户询问提示问题以获取缺失数据的顺序。

使用控制台构建代理时,将鼠标悬停在参数上,右侧将显示重新排序图标。 您可以拖动此图标以更改列表中参数的位置。

提示问题中的参数引用

构建代理时,您可以在提示问题中进行参数引用,但只能引用提示问题之前的必需参数。 举例来说,如果 color参数在 quantity 参数之前,您可以使用下列提示问题获取 quantity 参数: How many $color t-shirts would you like to buy?

取消槽位填充

当最终用户说出“Cancel”、“Stop it”、“That's enough”等停止性短语时,代理将回复“Okay, canceled”并清除槽位填充的上下文。

如果您使用的是 API,那么取消槽位填充后,DetectIntentResponse.queryResult.cancelsSlotFilling 字段会设置为 true。如需了解详情,请参阅 Sessions 类型的 detectIntent 文档。