

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 添加条件以构建对话的分支
<a name="paths-branching"></a>

您可以使用*条件分支*来控制客户与机器人的对话路径。您可以根据槽位值、会话属性、输入模式的内容和输入转录字段或来自 Amazon Kendra 的响应来构建对话分支。

您可以定义最多 4 个分支。每个分支均设有条件，并且必须在满足该条件的情况下，Amazon Lex V2 才能采用该分支。如果所有分支的条件均不满足，则将采用默认分支。

定义分支时，您可以定义 Amazon Lex V2 在与该分支对应的条件评估为 true 时应执行的操作。您可以定义以下任一操作：
+ 发送给用户的回应。
+ 要应用于槽位的槽位值。
+ 当前会话的会话属性值。
+ 对话的下一步。有关更多信息，请参阅 [创建对话路径](building-paths.md)。

![\[您可以为条件分支选择不同的选项。\]](http://docs.aws.amazon.com/zh_cn/lexv2/latest/dg/images/conditional-choose.png)


每个条件分支均设有布尔表达式，并且必须在满足该布尔表达式的情况下，Amazon Lex V2 才能采用该分支。您可以使用比较运算符、布尔运算符、函数和量词运算符来处理您的条件。例如，如果 \$1age\$1 槽位小于 24，则以下条件返回 true。

```
{age} < 24
```

如果 \$1toppings\$1 多值槽位包含“pineapple”一词，则以下条件返回 true。

```
{toppings} CONTAINS "pineapple"
```

对于更复杂的条件，您可以将多个比较运算符与布尔运算符组合使用。例如，如果 \$1make\$1 槽位值为“Honda” 且 \$1model\$1 槽位值为“Civic”，则以下条件返回 true。使用圆括号设置评估顺序。

```
({make} = "Honda") AND ({model} = "Civic")
```

以下主题提供了关于条件分支运算符和函数的详细信息。

**注意**  
Amazon Lex V2 于 2022 年 8 月 17 日发布了对用户对话管理方式的更改。借助此更改，您可以更好地控制用户的对话路径。有关更多信息，请参阅 [Amazon Lex V2 中的对话流更改](understanding-new-flows.md)。2022 年 8 月 17 日之前创建的机器人不支持对话框代码挂钩消息、设置值、配置后续步骤和添加条件。

**Topics**
+ [比较运算符](#branching-comparison)
+ [布尔运算符](#branching-boolean)
+ [量词运算符](#branching-quentifier)
+ [函数](#branching-function)
+ [示例条件表达式](#sample-conditional-expressions)

## 比较运算符
<a name="branching-comparison"></a>

Amazon Lex V2 支持以下条件比较运算符：
+ 等于（=）
+ 不等于（\$1=）
+ 小于（<）
+ 小于等于（<=）
+ 大于（>）
+ 大于等于（>=）

使用比较运算符时，将遵循以下规则。
+ 左侧必须是引用值。例如，要引用槽位值，请使用 `{slotName}`。要引用会话属性值，请使用 `[attribute]`。对于输入模式和输入转录，请使用 `$.inputMode` 和 `$.inputTranscript`。
+ 右侧必须为常数，且类型必须与左侧相同。
+ 系统将任何引用尚未设置的属性的表达式视为无效，并且不会对其求值。
+ 比较多值槽位时，使用的值是所有解释值的逗号分隔列表。

该等比较是基于引用值的槽位类型进行的，按照以下方式进行解析：
+ **字符串**：根据字符串的 ASCII 表示进行比较。比较不区分大小写。
+ **数字**：将基于数字的槽位从字符串表示形式转换为数字，然后进行比较。
+ **日期/时间**：根据时间序列对基于时间的槽位进行比较。较早的日期或时间即视作较小。对于持续时间，较短的时间段即视为较小。

## 布尔运算符
<a name="branching-boolean"></a>

Amazon Lex V2 支持使用布尔运算符来组合比较运算符。利用布尔运算符可创建类似以下内容的语句：

```
({number} >= 5) AND ({number} <= 10)
```

您还可以使用以下布尔运算符：
+ AND（&&）
+ OR（\$1\$1）
+ NOT（\$1）

## 量词运算符
<a name="branching-quentifier"></a>

量词运算符评估序列中的元素并确定一个或多个元素是否满足条件。
+ **CONTAINS**：确定指定值是否被包含在多值槽位中，如果包含在多值槽位中，则返回 true。例如，如果用户要在订购的披萨上添加菠萝，则 `{toppings} CONTAINS "pineapple"` 将返回 true。

## 函数
<a name="branching-function"></a>

函数必须以字符串 `fn.` 为前缀。该函数的参数是对槽位、会话属性或请求属性的引用。Amazon Lex V2 提供了用于从槽位值中获取信息的两个函数，即 sessionAttribute, 或 requestAttribute。
+ **fn.COUNT（）**：计算多值槽位中的值数量。

  例如，如果槽位 `{toppings}` 包含值“pepperoni, pineapple”：

  `fn.COUNT({toppings}) = 2`
+ **fn.IS\$1SET（）**：如果在当前会话中设置了槽位、会话属性或请求属性，则该值为 true。

  基于上一示例：

  `fn.IS_SET({toppings})`
+ **fn.LENGTH（）**：该值是当前会话中设置的会话属性、槽位值或槽位属性的值长度。此函数不支持多值槽位或复合槽位。

  示例：

  如果槽位 `{credit-card-number}` 包含值“123456781234”：

  `fn.LENGTH({credit-card-number}) = 12`

## 示例条件表达式
<a name="sample-conditional-expressions"></a>

以下是一些示例条件表达式。注意：`$.`代表 Amazon Lex V2 JSON 响应的入口点。以下值`$.`将在 Amazon Lex V2 响应中进行解析以检索该值。只有支持 ASR 转录分数的相同区域才支持在 Amazon Lex V2 响应中使用转录块的 JSON 路径引用的条件表达式。


| 值类型 | 使用案例 | 条件表达式 | 
| --- | --- | --- | 
| 自定义槽位 | pizzaSize 槽位值等于“large” | \$1pizzaSize\$1 = "large" | 
| 自定义槽位 | pizzaSize 等于“large”或“medium” | \$1pizzaSize\$1 = "large" OR \$1pizzaSize\$1 = "medium"  | 
| 自定义槽位 | 带有() 和 AND/OR 的表达式 | \$1pizzaType\$1 = "pepperoni" OR \$1pizzaSize\$1 = "medium" OR \$1pizzaSize\$1 = "small"  | 
| 自定义槽位（多值槽位） | 检查其中的一种配料是否是“Onion”（洋葱） | \$1toppings\$1 CONTAINS "Onion" | 
| 自定义槽位（多值槽位） | 配料的数量超过 3 | fn.COUNT(\$1topping\$1) > 2 | 
| AMAZON.AlphaNumeric | bookingID是 ABC123 | \$1bookingID\$1 = "ABC123" | 
| AMAZON.Number | 年龄槽位值大于 30 | \$1age\$1 > 30 | 
| AMAZON.Number | 年龄槽位值等于 10 | \$1age\$1 = 10 | 
| AMAZON.Date | dateOfBirth 槽位值在 1990 年之前 | \$1dateOfBirth\$1 < "1990-10-01" | 
| AMAZON.State | destinationState 槽位值等于“Washington” | \$1destinationState\$1 = "washington" | 
| AMAZON.Country | destinationCountry 槽位值不是“United States” | \$1destinationCountry\$1 \$1= "united states" | 
| AMAZON.FirstName | firstName 槽位值是“John” | \$1firstName\$1 = "John" | 
| AMAZON.PhoneNumber | phoneNumber 槽位值是“716767891932” | \$1phoneNumer\$1 = 716767891932 | 
| AMAZON.Percentage | 检查百分比槽位值是否大于等于 78 | \$1percentage\$1 >= 78 | 
| AMAZON.EmailAddress | emailAddress 槽位值为“userA@hmail.com” | \$1emailAddress\$1 = "userA@hmail.com" | 
| AMAZON.LastName | lastName 槽位值是“Doe” | \$1lastName\$1 = "Doe" | 
| AMAZON.City | “City”槽位值等于“Seattle” | \$1city\$1 = "Seattle" | 
| AMAZON.Time | “Time”是晚上 8 点之后 | \$1time\$1 > "20:00" | 
| AMAZON.StreetName | streetName 槽位值是“Boren Avenue” | \$1streetName\$1 = "boren avenue" | 
| AMAZON.Duration | travelDuration 槽位值小于 2 小时 | \$1travelDuration\$1 < P2H | 
| 输入模式 | 输入模式为语音 | \$1.inputMode = "Speech" | 
| 输入转录 | 输入转录等于“I want a large pizza” | \$1.inputTranscript = "I want a large pizza" | 
| 会话属性 | 检查 customer\$1subscription\$1type 属性 | [customer\$1subcription\$1type] = "yearly" | 
| 请求属性 | 检查 retry\$1enabled 标志 | ((retry\$1enabled)) = "TRUE" | 
| Kendra 响应 | Kendra 响应包含常见问题 | fn.IS\$1SET(((x-amz-lex:kendra-search-response-question\$1answer-question-1))) | 
| 带转录的条件表达式 | 使用转录 JSON 路径的条件表达式 | \$1.transcriptions[0].transcriptionConfidence < 0.8 AND \$1.transcriptions[1].transcriptionConfidence > 0.5 | 
| 设置会话属性 | 使用转录 JSON 路径和槽位值设置会话属性 | [sessionAttribute] = "\$1.transcriptions..." AND [sessionAttribute] = "\$1<slotName>\$1" | 
| 设置槽位值 | 使用会话属性和转录 JSON 路径设置槽位值 | \$1slotName\$1 = [<sessionAttribute>] AND \$1slotName\$1 = "\$1.transcriptions..." | 

**注意**  
`slotName`指的是 Amazon Lex V2 机器人中插槽的名称。如果该槽位未解析（null），或者该槽位不存在，则运行时会忽略这些指定。`sessionAttribute` 指客户在构建时设置的会话属性的名称。