

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 將條件新增至分支對話
<a name="paths-branching"></a>

您可以使用*條件式分支*來控制客戶在與機器人的對話中採取的路徑。您可以根據槽值、工作階段屬性、輸入模式和輸入文字記錄欄位的內容，或來自 Amazon Kendra 的回應來分支對話。

您最多可以定義四個分支。每個分支都有必須滿足的條件，Amazon Lex V2 才能遵循該分支。如果沒有分支滿足其條件，則會遵循預設分支。

當您定義分支時，您可以定義當對應於該分支的條件評估為 true 時，Amazon Lex V2 應採取的動作。您可以定義下列任何動作：
+ 傳送給使用者的回應。
+ 要套用至槽的槽值。
+ 目前工作階段的工作階段屬性值。
+ 對話的下一個步驟。如需詳細資訊，請參閱[建立對話路徑](building-paths.md)。

![\[您可以選擇不同的條件式分支選項。\]](http://docs.aws.amazon.com/zh_tw/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")
```

下列主題提供條件式分支運算子和函數的詳細資訊。

**注意**  
2022 年 8 月 17 日，Amazon Lex V2 發佈了與使用者管理對話方式的變更。此變更可讓您進一步控制使用者在對話中採取的路徑。如需詳細資訊，請參閱[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 支援下列條件比較運算子：
+ 等於 (=)
+ 不等於 (！=)
+ 小於 (<)
+ 小於或等於 (<=)
+ 大於 (>)
+ 大於或等於 (>=)

使用比較運算子時，會使用下列規則。
+ 左側必須是參考。例如，若要參考槽值，您可以使用 `{slotName}`。若要參考工作階段屬性值，請使用 `[attribute]`。對於輸入模式和輸入文字記錄，您可以使用 `$.inputMode`和 `$.inputTranscript`。
+ 右側必須是常數，且與左側相同類型。
+ 任何參考尚未設定的屬性的表達式都會視為無效，而且不會進行評估。
+ 當您比較多值插槽時，所使用的值是所有解譯值的逗號分隔清單。

比較是根據參考的槽類型。它們的解析方式如下：
+ **字串 ** – 根據字串的 ASCII 表示法進行比較。比較不區分大小寫。
+ **數字** – 數字型插槽會從字串表示法轉換為數字，然後進行比較。
+ **日期/時間** – 根據時間序列比較以時間為基礎的時段。較早的日期或時間會被視為較小。對於持續時間，較短的期間會被視為較小。

## 布林值運算子
<a name="branching-boolean"></a>

Amazon Lex V2 支援布林運算子結合比較運算子。它們可讓您建立類似下列的陳述式：

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

您可以使用下列布林值運算子：
+ AND (&&)
+ OR (\$1\$1)
+ NOT (！)

## 量化器運算子
<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 回應中剖析以擷取值。Amazon Lex V2 回應中使用 JSON 路徑參考轉錄區塊的條件式表達式僅支援支援 ASR 轉錄分數的相同區域。


| 值類型 | 使用案例 | 條件式表達式 | 
| --- | --- | --- | 
| 自訂插槽 | pizzaSize 槽值等於大型 | \$1pizzaSize\$1 = "large" | 
| 自訂插槽 | pizzaSize 等於大型或中型 | \$1pizzaSize\$1 = "large" OR \$1pizzaSize\$1 = "medium"  | 
| 自訂插槽 | 使用 ()和 的表達式 AND/OR | \$1pizzaType\$1 = "pepperoni" OR \$1pizzaSize\$1 = "medium" 或 \$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 槽值不是美國 | \$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 | 城市位置值等於西雅圖 | \$1city\$1 = "Seattle" | 
| AMAZON.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" | 
| 輸入文字記錄 | 輸入文字記錄等於「我想要大型比薩」 | \$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 機器人中槽的名稱。如果槽未解析 （空），或槽不存在，則會在執行時間忽略指派。 `sessionAttribute`是指客戶在建置時間設定的工作階段屬性名稱。