

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 会話パスの作成
<a name="building-paths"></a>

通常、Amazon Lex V2 は、ユーザーとの会話の流れを管理します。シンプルなボットの場合は、デフォルトのフローで十分なユーザーエクスペリエンスを提供できます。ただし、より複雑なボットの場合は、会話を制御して、フローをより複雑なパスに誘導したい場合があります。

たとえば、レンタカーを予約するボットでは、若いドライバーにはレンタルしないかもしれません。この場合、ドライバーが特定の年齢未満かどうかをチェックする条件を作成し、年齢が満たされていない場合は終了応答にジャンプできます。

![\[24 歳未満のドライバーにはレンタルを行わないレンタカーボットの会話フローを示すフローチャートです。\]](http://docs.aws.amazon.com/ja_jp/lexv2/latest/dg/images/conditional-flowchart.png)


このようなやりとりを設計するには、会話の各段階で次のステップを設定し、条件を評価し、値を設定し、コードフックを呼び出します。

条件付き分岐は、複雑なやり取りを通じてユーザーへのパスを作成するのに役立ちます。条件付きブランチはいつでも使用でき、会話の制御をボットに渡すことができます。たとえば、ボットが最初のスロット値を誘発される前に条件を作成したり、各スロット値を誘発するまでの間に条件を作成したり、ボットが会話を終了する前に条件を作成したりできます。条件を追加できる場所のリストについては、「[インテントの追加](add-intents.md)」を参照してください。

ボットを作成すると、Amazon Lex V2 は、スロットの優先順位に基づいて会話のデフォルトパスを作成します。会話のパスをカスタマイズするには、会話のどの時点でも次のステップを変更できます。詳細については、「[会話の次のステップを設定します。](paths-nextstep.md)」を参照してください。

条件に基づいて代替パスを作成するには、会話のどの時点でも条件分岐を使用できます。たとえば、ボットが最初のスロット値を誘発する前に条件を作成できます。各スロット値を誘発するまでの間に条件を作成することも、ボットが会話を終了する前に条件を作成することもできます。条件を追加できる場所のリストについては、「[ブランチ会話への条件の追加](paths-branching.md)」を参照してください。

スロット値、セッション属性、入力モードと入力文字起こし、または Amazon Kendra からのレスポンスに基づいて条件を設定できます。

会話中の各時点でのスロット値とセッション属性を設定します。詳細については、「[会話中に値を設定する](paths-setting-values.md)」を参照してください。

次のアクションをダイアログコードフックに設定して Lambda 関数を実行することもできます。詳細については、「[ダイアログコードフックを呼び出す](paths-code-hook.md)」を参照してください。

次の図は、コンソール内のスロットへのパスの作成を示しています。この例では、Amazon Lex V2 はスロット「年齢」を引き出します。スロットの値が 24 未満の場合、Amazon Lex V2 は終了レスポンスにジャンプします。それ以外の場合、Amazon Lex V2 はデフォルトのパスに従います。

![\[スロットの条件エディタを示す Amazon Lex V2 コンソール。\]](http://docs.aws.amazon.com/ja_jp/lexv2/latest/dg/images/conditional-slot.png)


**注記**  
2022 年 8 月 17 日、Amazon Lex V2 はユーザーとの会話の管理方法の変更をリリースしました。この変更により、ユーザーが会話の中でたどるパスをより細かく制御できるようになりました。詳細については、「[Amazon Lex V2 の会話フローの変更 V2](understanding-new-flows.md)」を参照してください。2022 年 8 月 17 日より前に作成されたボットは、ダイアログコードフックメッセージ、値の設定、次のステップの設定、条件の追加をサポートしていません。

# 会話の次のステップを設定します。
<a name="paths-nextstep"></a>

会話の各段階で次のステップを設定して、会話を設計できます。通常、Amazon Lex V2 は、次の順序に従って、会話の各段階のデフォルトの次のステップを自動的に設定します。

 初期応答 → スロット誘発 → 確認 (アクティブな場合) → フルフィルメント (アクティブな場合) → 終了応答 (アクティブな場合) → 会話の終了

デフォルトの次のステップを変更し、想定されるユーザーエクスペリエンスに基づいて会話を設計できます。下記の次のステップは、会話の各段階で設定できます。

**ジャンプ先**
+ **初回応答** — 会話はインテントの最初から再開されます。この次のステップを設定するときに、最初の応答をスキップすることもできます。
+ **スロットを引き出す** — インテント内の任意のスロットを誘発することができます。
+ **条件の評価** — 会話のどの段階でも条件や分岐会話を評価できます。
+ **ダイアログコードフックを呼び出す** — ビジネスロジックはいつでも呼び出すことができます。
+ **インテントを確認** — ユーザーはインテントを確認するよう求められます。
+ **インテントを果たす** — 次のステップとしてインテントのフルフィルメントが開始されます。
+ **終了応答** — 終了応答がユーザーに返されます。

**切り替え先**
+ **インテント** — 別のインテントに切り替えて、そのインテントに合わせて会話を続けることができます。移行中は、インテントの初期応答をスキップすることもできます。
+ **インテント: 特定のスロット** — 現在のインテントですでにいくつかのスロット値をキャプチャしている場合は、別のインテントの特定のスロットを直接誘発することができます。

**ユーザーの入力を待つ** — ボットは、新しいインテントを認識するための入力をユーザーが入力するのを待ちます。次のステップを設定する前に「他に何かお手伝いできることはありますか?」 などのプロンプトを設定できます。ボットは `ElicitIntent` ダイアログ状態になります。

**会話を終了** — ボットとの会話は終了します。

**注記**  
2022 年 8 月 17 日、Amazon Lex V2 はユーザーとの会話の管理方法の変更をリリースしました。この変更により、ユーザーが会話の中でたどるパスをより細かく制御できるようになりました。詳細については、「[Amazon Lex V2 の会話フローの変更 V2](understanding-new-flows.md)」を参照してください。2022 年 8 月 17 日より前に作成されたボットは、ダイアログコードフックメッセージ、値の設定、次のステップの設定、条件の追加をサポートしていません。

# 会話中に値を設定する
<a name="paths-setting-values"></a>

Amazon Lex V2 では、会話のすべてのステップでスロット値とセッション属性値を設定できます。その後、これらの値を会話中に使用して条件を評価したり、インテントフルフィルメントに使用したりできます。

現在のインテントのスロット値を設定できます。会話の次のステップが別のインテントを呼び出すことである場合は、新しいインテントのスロット値を設定できます。

割り当てられたスロットが埋まっていない場合、または JSON パスを解析できない場合、属性は `null` に設定されます。

スロット値とセッション属性を使用するときは、次の構文を使用してください。
+ **スロット値** — スロット名を中括弧 (「\$1\$1」) で囲みます。現在のインテントのスロット値には、スロット名のみを使用する必要があります。例えば、`{slot}`。次のインテントで値を設定する場合は、インテント名とスロット名の両方を使用してスロットを識別する必要があります。例えば、`{intent.slot}`。

  例:
  +  `{PhoneNumber} = "1234567890"` 
  +  `{CheckBalance.AccountNumber} = "99999999"` 
  +  `{BookingID} = "ABC123"` 
  +  `{FirstName} = "John"` 

  スロットの値には次のいずれかを指定できます。
  + 定数文字列
  + Amazon Lex レスポンス内の文字起こしブロックを参照する JSON パス (en-US および en-GB)
  + セッション属性

  例:
  +  `{username} = "john.doe" ` 
  +  `{username_confidence} = $.transcriptions[0].transcriptionConfidence ` 
  +  `{username_slot_value} = [username] ` 
**注記**  
スロット値を `null` に設定することもできます。埋まったスロット値を再誘発する必要がある場合は、顧客にスロット値の入力を再促進する前に、値を `null` に設定する必要があります。割り当てられたスロットが埋まっていない場合、または JSON パスを解析できない場合、属性は `null` に設定されます。
+ **セッション属性** — 属性名を角括弧 ("[ ]") で囲みます。例えば、`[sessionAttribute]`。

  例:
  +  ` [username] = "john.doe" ` 
  +  ` [username_confidence] = $.transcriptions[0].transcriptionConfidence ` 
  +  ` [username_slot_value] = {username} ` 

  セッション属性の値は、次のいずれかを指定できます。
  + 定数文字列
  + Amazon Lex レスポンス内の文字起こしブロックを参照する JSON パス (en-US および en-GB)
  + スロット値リファレンス
**注記**  
割り当てられたスロットが埋まっていない場合、または JSON パスを解析できない場合、属性は `null` に設定されます。

**注記**  
2022 年 8 月 17 日、Amazon Lex V2 はユーザーとの会話の管理方法の変更をリリースしました。この変更により、ユーザーが会話の中でたどるパスをより細かく制御できるようになりました。詳細については、「[Amazon Lex V2 の会話フローの変更 V2](understanding-new-flows.md)」を参照してください。2022 年 8 月 17 日より前に作成されたボットは、ダイアログコードフックメッセージ、値の設定、次のステップの設定、条件の追加をサポートしていません。

# ブランチ会話への条件の追加
<a name="paths-branching"></a>

*条件分岐*を使用すると、顧客がボットとの会話を進めるパスを制御できます。スロット値、セッション属性、入力モードの内容、入力文字起こしフィールド、または Amazon Kendra からの応答に基づいて会話を分岐できます。

最大で 4 つのブランチを定義できます。各ブランチには、Amazon Lex V2 がそのブランチに従うために満たさなければならない条件があります。どのブランチも条件が満たされない場合、デフォルトブランチが実行されます。

ブランチを定義するときは、そのブランチに対応する条件が true と評価された場合に Amazon Lex V2 が実行するアクションを定義します。次のいずれかを使用してアクションに定義できます。
+ ユーザーに送信された応答。
+ スロットに適用するスロット値。
+ 現在のセッションのセッション属性値。
+ 会話の次のステップ。詳細については、「[会話パスの作成](building-paths.md)」を参照してください。

![\[条件分岐にはさまざまなオプションを選択できます。\]](http://docs.aws.amazon.com/ja_jp/lexv2/latest/dg/images/conditional-choose.png)


各条件付きブランチには、Amazon Lex V2 がそのブランチに従うために満たさなければならないブール式があります。条件に使用できる比較演算子、ブール演算子、関数、および量指定演算子があります。たとえば、\$1age\$1 スロットが 24 未満の場合、次の条件は true を返します。

```
{age} < 24
```

\$1toppings\$1 複数値スロットに「パイナップル」という単語が含まれている場合、次の条件は true を返します。

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

複数の比較演算子を 1 つのブール演算子と組み合わせると、より複雑な条件を作成できます。たとえば、\$1make\$1 スロット値が「ホンダ」で \$1model\$1 スロット値が「シビック」の場合、次の条件は true を返します。括弧を使用して評価順序を設定します。

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

次のトピックでは、条件分岐演算子と関数について詳しく説明します。

**注記**  
2022 年 8 月 17 日、Amazon Lex V2 はユーザーとの会話の管理方法の変更をリリースしました。この変更により、ユーザーが会話の中でたどるパスをより細かく制御できるようになりました。詳細については、「[Amazon Lex V2 の会話フローの変更 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=)
+ 未満 (<)
+ 以下 (<=)
+ Greater than (>)
+ 以上 (>=)

比較演算子を使用するときには、以下のルールが使用されます。
+ 左側はリファレンスである必要があります。たとえば、スロット値を参照するには、`{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>

数量演算子はシーケンスの要素を評価し、1 つ以上の要素が条件を満たすかどうかを判断します。
+ **CONTAINS** — 指定された値が複数の値を持つスロットに含まれているかどうかを判断し、含まれている場合は true を返します。たとえば、ユーザーがピザにパイナップルのトッピングを注文した場合、`{toppings} CONTAINS "pineapple"` は true を返します。

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

関数には文字列 `fn.` をプレフィックスとして付ける必要があります。関数への引数は、スロット、セッション属性、またはリクエスト属性への参照です。Amazon Lex V2 は、スロットの値から情報を取得するための 2 つの関数、sessionAttribute と requestAttribute を提供します。
+ **fn.Count()** — 複数値を持つスロット内の値の数をカウントします。

  たとえば、スロット `{toppings}` に「ペパロニ、パイナップル」 という値が含まれている場合:

  `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 スロット値が「L サイズ」と等しい | \$1pizzaSize\$1 = "large" | 
| カスタムスロット | pizzaSize が「L サイズ」または「M サイズ」と等しい | \$1pizzaSize\$1 = "large" または \$1pizzaSize\$1 = "medium"  | 
| カスタムスロット | () と AND/OR を使った式 | \$1pizzaType\$1 = "pepperoni" または \$1pizzaSize\$1 = "medium" または \$1pizzaSize\$1 = "small"  | 
| カスタムスロット (複数値スロット) | トッピングにオニオンが入っているか確認する | \$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 スロット値がワシントンと等しい | \$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 スロット値がボレン通り | \$1streetName\$1 = "boren avenue" | 
| AMAZON.Duration | travelDuration スロット値が 2 時間未満 | \$1travelDuration\$1 < P2H | 
| 入力モード | 入力モードは音声 | \$1.inputMode = "Speech" | 
| 文字起こしを入力する | 入力文字起こしは「L サイズのピザが欲しい」と等しい | \$1.inputTranscript = "I want a large pizza" | 
| セッション属性 | check customer\$1subscription\$1type attribute | [customer\$1subcription\$1type] = "yearly" | 
| リクエスト属性 | check retry\$1enabled flag | ((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` は、構築時に顧客が設定したセッション属性の名前を指します。

# ダイアログコードフックを呼び出す
<a name="paths-code-hook"></a>

Amazon Lex V2 がユーザーにメッセージを送信するときの会話の各ステップで、会話の次のステップとして Lambda 関数を使用できます。この関数を使用して、会話の現在の状態に基づいてビジネスロジックを実装できます。

実行される Lambda 関数は、使用しているボットエイリアスに関連付けられています。インテント内のすべてのダイアログコードフックで Lambda 関数を呼び出すには、インテントの初期化と検証に **[Lambda 関数を使用する]** を選択する必要があります。Lambda 関数の選択の詳細については、「[Amazon Lex V2 ボットの AWS Lambda関数の作成](lambda-attach.md)」を参照してください。

Lambda 関数を使用するには 2 つのステップがあります。まず、会話のどの時点でもダイアログコードフックを有効にする必要があります。次に、会話の次のステップでダイアログコードフックを使用するように設定する必要があります。

次の図は、ダイアログコードフックがアクティブになっていることを示しています。

![\[条件付き応答コードフックがアクティブであることを示しています。\]](http://docs.aws.amazon.com/ja_jp/lexv2/latest/dg/images/code-hook-active.png)


次に、コードフックを会話ステップの次のアクションとして設定します。そのためには、会話の次のステップを「ダイアログコードフックを呼び出す」に設定してください。以下の画像は、会話のデフォルトパスの次のステップとしてダイアログコードフックを呼び出す条件分岐を示しています。

![\[会話の次のステップとなるコードフックを示す条件分岐です。\]](http://docs.aws.amazon.com/ja_jp/lexv2/latest/dg/images/code-hook-choose.png)


コードフックがアクティブになると、ユーザーに返すレスポンスを 3 つ設定できます。
+ **成功** — Lambda 関数が正常に完了したときに送信されます。
+ **失敗** — Lambda 関数の実行で問題が発生した場合、または Lambda 関数が `Failed` の `intent.state` 値を返した場合に送信されます。
+ **タイムアウト** — Lambda 関数が設定されたタイムアウト期間内に完了しなかった場合に送信されます。

![\[Lambda 関数の実行後にメッセージに使用できるオプションを示すフローチャート。\]](http://docs.aws.amazon.com/ja_jp/lexv2/latest/dg/images/conditional-code-hook.png)


**[Lambda ダイアログコードフック]** を選択し、**[詳細オプション]** を選択すると、Lambda 関数の呼び出しに対応するレスポンスの 3 つのオプションが表示されます。値を設定し、次のステップを設定し、各レスポンスに対応する条件を適用して会話フローを設計できます。条件がない場合や次のステップが明記されていない場合、Amazon Lex V2 は会話の現在の状態に基づいて次のステップを決定します。

**[詳細オプション]** ページでは、Lambda 関数の呼び出しを有効または無効にすることもできます。関数が有効になると、Lambda 呼び出しでダイアログコードフックが呼び出され、続いて Lambda 呼び出しの結果に基づいて成功、失敗、またはタイムアウトのメッセージが続きます。この関数を無効にすると、Amazon Lex V2 は Lambda 関数を実行せず、ダイアログコードフックが成功したかのように処理を進めます。

Lambda 関数をこのメッセージで呼び出したときにその関数に渡す呼び出しラベルを設定することもできます。これを使用すると、実行する Lambda 関数のセクションを特定しやすくなります。

**注記**  
2022 年 8 月 17 日、Amazon Lex V2 はユーザーとの会話の管理方法の変更をリリースしました。この変更により、ユーザーが会話の中でたどるパスをより細かく制御できるようになりました。詳細については、「[Amazon Lex V2 の会話フローの変更 V2](understanding-new-flows.md)」を参照してください。2022 年 8 月 17 日より前に作成されたボットは、ダイアログコードフックメッセージ、値の設定、次のステップの設定、条件の追加をサポートしていません。