

サポート終了通知: 2025 年 9 月 15 日、 AWS は Amazon Lex V1 のサポートを終了します。 V1 2025 年 9 月 15 日を過ぎると、Amazon Lex V1 コンソールまたは Amazon Lex V1 リソースにはアクセスできなくなります。Amazon Lex V2 を使用している場合は、代わりに [Amazon Lex V2 ガイド](https://docs.aws.amazon.com/lexv2/latest/dg/what-is.html)を参照してください。

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

# 演習 1: 設計図を使用して Amazon Lex ボットを作成する (コンソール)
<a name="gs-bp"></a>

この演習では、以下のことを行います。
+ 最初の Amazon Lex ボットを作成して Amazon Lex コンソールでテストします。

  この演習では **OrderFlowers** 設計図を使用します。設計図については、「[Amazon Lex と AWS Lambda ブループリント](lex-lambda-blueprints.md)」を参照してください。

   
+  AWS Lambda 関数を作成し、Lambda コンソールでテストします。リクエストの処理中に、この Lambda 関数をボットから呼び出します。この演習では、 AWS Lambda コンソールで提供されている Lambda ブループリント (**lex-order-flowers-python**) を使用して Lambda 関数を作成します。設計図コードは、同じ Lambda 関数を使用して初期化と検証を行う方法、および `OrderFlowers` インテントを達成する方法を示しています。

   
+ ボットを更新し、インテントを達成するためのコードフックとして Lambda 関数を追加します。エンドツーエンドエクスペリエンスをテストします。

以下のセクションでは設計図の機能について説明します。

## Amazon Lex ボット: 設計図の概要
<a name="gs-bp-summary-bot"></a>

**OrderFlowers** 設計図を使用して Amazon Lex ボットを作成します。ボットの構造の詳細については、「[Amazon Lex: 仕組み](how-it-works.md)」を参照してください。このボットは次のように事前設定されています。
+ **インテント** – OrderFlowers
+ **スロットタイプ** – 1 つのカスタムスロットタイプ (`FlowerTypes`) と列挙値 (`roses`、`lilies`、`tulips`)。
+ **スロット** – ボットでインテントを達成する前に、インテントには以下の情報 (つまり、スロット) が必要です。
  + `PickupTime` (AMAZON.TIME 組み込みタイプ)
  + `FlowerType` (FlowerTypes カスタムタイプ)
  + `PickupDate` (AMAZON.DATE 組み込みタイプ)
+ **発話** – 以下のサンプル発話はユーザーのインテントを示しています。
  + 「花をピックアップしたい」
  + 「花を注文したい」
+ **プロンプト** – ボットは、インテントを識別した後で、以下のプロンプトを使用してスロットを満たします。
  + `FlowerType` スロットのプロンプト – 「どの花を注文なさいますか?」
  + `PickupDate` スロットのプロンプト – 「何日に \$1FlowerType\$1 をピックアップなさいますか?」
  + `PickupTime` スロットのプロンプト – 「何時に \$1FlowerType\$1 をピックアップなさいますか?」
  + 確認ステートメント – 「了解いたしました。お客様の \$1FlowerType\$1 は \$1PickupDate\$1 の \$1PickupTime\$1 までにご用意させていただきます。それでよろしいでしょうか?」 



## AWS Lambda 関数: 設計図の概要
<a name="gs-bp-summary-lambda"></a>

この演習の Lambda 関数では、初期化と検証、およびフルフィルメントの両方のタスクを実行します。したがって、Lambda 関数を作成した後に、初期化/検証とフルフィルメントタスクの両方を処理するコードフックとして同じ Lambda 関数を指定することで、インテント設定を更新します。
+ 初期化および検証のコードフックとして、Lambda 関数は基本的な検証を実行します。例えば、ユーザーが指定したピックアップの時間が通常の営業時間外である場合、Lambda 関数は時間を指定し直すことをユーザーに再度プロンプトするように Amazon Lex に指示します。
+ フルフィルメントコードフックの一環として、Lambda 関数は花の注文が確定した (つまり、インテントが達成された) ことを示す概要メッセージを返します。

**次のステップ**  
[ステップ 1: Amazon Lex ボット (コンソール) を作成する](gs-bp-create-bot.md)

# ステップ 1: Amazon Lex ボット (コンソール) を作成する
<a name="gs-bp-create-bot"></a>

この演習では、花を注文するボットとして OrderFlowersBot を作成します。

Amazon Lex ボット (コンソール) を作成するには

1. にサインイン AWS マネジメントコンソール し、[https://console.aws.amazon.com/lex/](https://console.aws.amazon.com/lex/) で Amazon Lex コンソールを開きます。

1. 初めてのボットの場合には [**Get Started**] (ご利用開始にあたって)、それ以外の場合は [**ボット**] ページを選択し、続いて [**作成**] を選択します。

1. [**Create your Lex bot**] ページで、以下の情報を指定して [**Create**] を選択します。
   + [**OrderFlowers**] 設計図を選択します。
   + ボット名 (OrderFlowers) はデフォルトのままにしておきます。
   + [**COPPA**] で [**No**] を選択します。
   + **ユーザーの発話ストレージ**で、適切なレスポンスを選択します。

1. **[作成]** を選択します。コンソールは Amazon Lex に対して必要なリクエストを行い、設定を保存します。次に、コンソールはボットエディタウィンドウを表示します。

1. ボットが作成されたことが確認されるまで待機します。

1. ボットをテストします。
**注記**  
ボットをテストするには、テストウィンドウにテキストを入力するか、テストウィンドウにあるマイクボタンを選択して話しかけます (対応しているブラウザの場合)。

   次のサンプルテキストを使用してボットと会話し、花を注文します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lex/latest/dg/images/OrderFlowers-NoLambda.png)

   この入力により、ボットは `OrderFlowers` インテントを推測し、スロットデータのプロンプトを表示します。すべての必要なスロットデータを提供すると、ボットはすべての情報をクライアントアプリケーション (この例ではコンソール) に返すことで、インテント (`OrderFlowers`) を達成します。コンソールは、テストウィンドウに情報を表示します。

   具体的には次のとおりです。
   + 「何日にバラをピックアップなさいますか?」の文で「バラ」という単語が使用されているのは、`pickupDate` スロットのプロンプトが `{FlowerType}` を置き換えるように設定されているためです。これはコンソールで確認できます。
   + 「了解いたしました。お客様のバラは ...」という文は、確認プロンプトとして設定したものです。
   + 最後の文 (「`FlowerType:roses...`」) は、クライアント (この例ではテストウィンドウ) に単純に返されるスロットデータです。次の演習では、Lambda 関数を使用してインテントを達成します。インテントが達成されると、注文が確定されたことを示すメッセージが表示されます。

**次のステップ**  
[ステップ 2 (オプション): 情報フローの詳細を確認する (コンソール)](gs-bp-details-two-runtime-apis.md)

# ステップ 2 (オプション): 情報フローの詳細を確認する (コンソール)
<a name="gs-bp-details-two-runtime-apis"></a>

このセクションでは、クライアントと Amazon Lex 間の情報フローについて、サンプル会話のユーザー入力別に説明します。

この例では、ボットとの会話にコンソールテストウィンドウを使用します。

**Amazon Lex のテストウィンドウを開くには**

1. にサインイン AWS マネジメントコンソール し、[https://console.aws.amazon.com/lex/](https://console.aws.amazon.com/lex/) で Amazon Lex コンソールを開きます。

1. テストするボットを選択します。

1. コンソールの右側で、**[Test chatbot]** (chatbot のテスト) を選択します。

次のいずれかのトピックを選択し、音声または入力による情報フローを確認してください。

**Topics**
+ [ステップ 2a (オプション): 音声による情報フローの詳細を確認する (コンソール)](gs-bp-details-postcontent-flow.md)
+ [ステップ 2b (オプション): 入力による情報フローの詳細を確認する (コンソール)](gs-bp-details-part1.md)

# ステップ 2a (オプション): 音声による情報フローの詳細を確認する (コンソール)
<a name="gs-bp-details-postcontent-flow"></a>

このセクションでは、クライアントが音声を使用してリクエストを送信した場合の、クライアントと Amazon Lex 間の情報フローについて説明します。詳細については、「[PostContent](API_runtime_PostContent.md)」を参照してください。

1. ユーザーの発話: 花を注文したい。

   1. クライアント (コンソール) は以下の [PostContent](API_runtime_PostContent.md) リクエストを Amazon Lex に送信します。

      ```
      POST /bot/OrderFlowers/alias/$LATEST/user/4o9wwdhx6nlheferh6a73fujd3118f5w/content HTTP/1.1
      x-amz-lex-session-attributes: "e30=" 
      Content-Type: "audio/x-l16; sample-rate=16000; channel-count=1"
      Accept: "audio/mpeg"
      
      
      Request body
      input stream
      ```

      リクエストの URI と本文の両方で Amazon Lex に情報が提供されています。
      + リクエスト URI ボット名 (`OrderFlowers`)、ボットエイリアス (`$LATEST`)、ユーザー名 (ユーザーを識別するランダムな文字列)。`content` はこれが `PostContent` API リクエストである (`PostText` リクエストではない) と示します。
      + リクエストヘッダー
        + `x-amz-lex-session-attributes` –「\$1\$1」を表す base64 エンコード値。クライアントが最初のリクエストを行うときにはセッション属性はありません。
        + `Content-Type` – オーディオ形式が反映されています。
      + リクエストボディ – ユーザー入力のオーディオストリーム (「花を注文したい」)。
**注記**  
話すのではなく `PostContent` API にテキスト (「花を注文したい」) を送信することをユーザーが選択した場合、リクエストボディはユーザー入力です。それに応じて `Content-Type` ヘッダーが設定されています。  

      ```
      POST /bot/OrderFlowers/alias/$LATEST/user/4o9wwdhx6nlheferh6a73fujd3118f5w/content HTTP/1.1
      x-amz-lex-session-attributes: "e30="
      Content-Type: "text/plain; charset=utf-8"
      Accept: accept
      
      Request body
      input stream
      ```

   1. 入力ストリームから、Amazon Lex はインテント (`OrderFlowers`) を検出します。次に、そのインテントのスロットのいずれか (この場合は `FlowerType`)、およびその値を引き出すプロンプトの 1 つ を選択し、以下のヘッダーを付けてレスポンスを送信します。

      ```
      x-amz-lex-dialog-state:ElicitSlot
      x-amz-lex-input-transcript:I would like to order some flowers.
      x-amz-lex-intent-name:OrderFlowers
      x-amz-lex-message:What type of flowers would you like to order?
      x-amz-lex-session-attributes:e30=
      x-amz-lex-slot-to-elicit:FlowerType
      x-amz-lex-slots:eyJQaWNrdXBUaW1lIjpudWxsLCJGbG93ZXJUeXBlIjpudWxsLCJQaWNrdXBEYXRlIjpudWxsfQ==
      ```

      ヘッダー値では以下の情報が指定されています。
      + `x-amz-lex-input-transcript` – リクエスト内の音声 (ユーザー入力) のトランスクリプト
      + `x-amz-lex-message` – Amazon Lex がレスポンスで返した音声のトランスクリプト
      + `x-amz-lex-slots` – スロットと値のペアを表す次の文字列を base64 でエンコードした値

        ```
        {"PickupTime":null,"FlowerType":null,"PickupDate":null}
        ```
      + `x-amz-lex-session-attributes` – セッション属性を表す文字列 (\$1\$1) を base64 でエンコードした値

      クライアントはレスポンス本文内の音声を再生します。

1. ユーザーの発声: バラ

   1. クライアント (コンソール) は以下の [PostContent](API_runtime_PostContent.md) リクエストを Amazon Lex に送信します。

      ```
      POST /bot/OrderFlowers/alias/$LATEST/user/4o9wwdhx6nlheferh6a73fujd3118f5w/content HTTP/1.1
      x-amz-lex-session-attributes: "e30="
      Content-Type: "audio/x-l16; sample-rate=16000; channel-count=1" 
      Accept: "audio/mpeg"
      
      
      Request body
      input stream ("roses")
      ```

      リクエストボディはユーザー入力の音声ストリーム (「バラ」) です。`sessionAttributes` は空のままです。

   1. Amazon Lex は現在のインテントのコンテキストで入力ストリームを解釈します (`FlowerType` スロットに関する情報をこのユーザーに求めていたことを覚えています)。Amazon Lex はまず現在のインテントのスロット値を更新します。次に、別のスロット (`PickupDate`) をそのプロンプトメッセージの 1 つ (いつバラをピックアップなさいますか?) と共に選択し、以下のヘッダーを付けてレスポンスを返します。

      ```
      x-amz-lex-dialog-state:ElicitSlot
      x-amz-lex-input-transcript:roses
      x-amz-lex-intent-name:OrderFlowers
      x-amz-lex-message:When do you want to pick up the roses?
      x-amz-lex-session-attributes:e30=
      x-amz-lex-slot-to-elicit:PickupDate
      x-amz-lex-slots:eyJQaWNrdXBUaW1lIjpudWxsLCJGbG93ZXJUeXBlIjoicm9zaSdzIiwiUGlja3VwRGF0ZSI6bnVsbH0=
      ```

      ヘッダー値では以下の情報が指定されています。
      + `x-amz-lex-slots` – スロットと値のペアを表す次の文字列を base64 でエンコードした値

        ```
        {"PickupTime":null,"FlowerType":"roses","PickupDate":null}
        ```
      + `x-amz-lex-session-attributes` – セッション属性を表す文字列 (\$1\$1) を base64 でエンコードした値

      クライアントはレスポンス本文内の音声を再生します。

1. ユーザーの発声: 明日

   1. クライアント (コンソール) は以下の [PostContent](API_runtime_PostContent.md) リクエストを Amazon Lex に送信します。

      ```
      POST /bot/OrderFlowers/alias/$LATEST/user/4o9wwdhx6nlheferh6a73fujd3118f5w/content HTTP/1.1
      x-amz-lex-session-attributes: "e30="
      Content-Type: "audio/x-l16; sample-rate=16000; channel-count=1"
      Accept: "audio/mpeg"
      
      
      Request body
      input stream ("tomorrow")
      ```

      リクエストボディはユーザー入力の音声ストリーム (「明日」) です。`sessionAttributes` は空のままです。

   1. Amazon Lex は現在のインテントのコンテキストで入力ストリームを解釈します (`PickupDate` スロットに関する情報をこのユーザーに求めていたことを覚えています)。Amazon Lex は現在のインテントのスロット (`PickupDate`) の値を更新します。次に、値を引き出す別のスロット (`PickupTime`)、およびその値を引き出すいずれかのプロンプト (「2017 年 3 月 18 日の何時にバラをピックアップなさいますか」) を選択し、以下のヘッダーを付けてレスポンスを返します。

      ```
      x-amz-lex-dialog-state:ElicitSlot
      x-amz-lex-input-transcript:tomorrow
      x-amz-lex-intent-name:OrderFlowers
      x-amz-lex-message:When do you want to pick up the roses on 2017-03-18?
      x-amz-lex-session-attributes:e30=
      x-amz-lex-slot-to-elicit:PickupTime
      x-amz-lex-slots:eyJQaWNrdXBUaW1lIjpudWxsLCJGbG93ZXJUeXBlIjoicm9zaSdzIiwiUGlja3VwRGF0ZSI6IjIwMTctMDMtMTgifQ==
      x-amzn-RequestId:3a205b70-0b69-11e7-b447-eb69face3e6f
      ```

      ヘッダー値では以下の情報が指定されています。
      + `x-amz-lex-slots` – スロットと値のペアを表す次の文字列を base64 でエンコードした値

        ```
        {"PickupTime":null,"FlowerType":"roses","PickupDate":"2017-03-18"}
        ```
      + `x-amz-lex-session-attributes` – セッション属性を表す文字列 (\$1\$1) を base64 でエンコードした値

      クライアントはレスポンス本文内の音声を再生します。

1. ユーザーの発声: 午後 6 時

   1. クライアント (コンソール) は以下の [PostContent](API_runtime_PostContent.md) リクエストを Amazon Lex に送信します。

      ```
      POST /bot/OrderFlowers/alias/$LATEST/user/4o9wwdhx6nlheferh6a73fujd3118f5w/content HTTP/1.1
      x-amz-lex-session-attributes: "e30="
      Content-Type: "text/plain; charset=utf-8"
      Accept: "audio/mpeg"
      
      
      Request body
      input stream ("6 pm")
      ```

      リクエストボディはユーザー入力の音声ストリーム (「午後 6 時」) です。`sessionAttributes` は空のままです。

   1. Amazon Lex は現在のインテントのコンテキストで入力ストリームを解釈します (`PickupTime` スロットに関する情報をこのユーザーに求めていたことを覚えています)。まず現在のインテントのスロット値を更新します。

      ここで、Amazon Lex はすべてのスロットのデータがそろっていることを検出します。ただし、`OrderFlowers` インテントには確認メッセージが設定されています。そのため、Amazon Lex はインテントの達成に進む前に、ユーザーからの明示的な確認を必要とします。花を注文する前に確認を要求する以下のヘッダーを付けてレスポンスを送信します。

      ```
      x-amz-lex-dialog-state:ConfirmIntent
      x-amz-lex-input-transcript:six p. m.
      x-amz-lex-intent-name:OrderFlowers
      x-amz-lex-message:Okay, your roses will be ready for pickup by 18:00 on 2017-03-18.  Does this sound okay?
      x-amz-lex-session-attributes:e30=
      x-amz-lex-slots:eyJQaWNrdXBUaW1lIjoiMTg6MDAiLCJGbG93ZXJUeXBlIjoicm9zaSdzIiwiUGlja3VwRGF0ZSI6IjIwMTctMDMtMTgifQ==
      x-amzn-RequestId:083ca360-0b6a-11e7-b447-eb69face3e6f
      ```

      ヘッダー値では以下の情報が指定されています。
      + `x-amz-lex-slots` – スロットと値のペアを表す次の文字列を base64 でエンコードした値

        ```
        {"PickupTime":"18:00","FlowerType":"roses","PickupDate":"2017-03-18"}
        ```
      + `x-amz-lex-session-attributes` – セッション属性を表す文字列 (\$1\$1) を base64 でエンコードした値

      クライアントはレスポンス本文内の音声を再生します。

1. ユーザーの発声: はい

   1. クライアント (コンソール) は以下の [PostContent](API_runtime_PostContent.md) リクエストを Amazon Lex に送信します。

      ```
      POST /bot/OrderFlowers/alias/$LATEST/user/4o9wwdhx6nlheferh6a73fujd3118f5w/content HTTP/1.1
      x-amz-lex-session-attributes: "e30="
      Content-Type: "audio/x-l16; sample-rate=16000; channel-count=1"
      Accept: "audio/mpeg"
      
      
      Request body
      input stream ("Yes")
      ```

      リクエストボディはユーザー入力の音声ストリーム (「はい」) です。`sessionAttributes` は空のままです。

   1. Amazon Lex は入力ストリームを解釈し、注文を進めることをユーザーが望んでいることを理解します。`OrderFlowers` インテントには、フルフィルメントアクティビティとして `ReturnIntent` が設定されています。これにより、Amazon Lex からすべてのインテントデータがクライアントに返されます。Amazon Lex は以下の内容でレスポンスを返します。

      

      ```
      x-amz-lex-dialog-state:ReadyForFulfillment
      x-amz-lex-input-transcript:yes
      x-amz-lex-intent-name:OrderFlowers
      x-amz-lex-session-attributes:e30=
      x-amz-lex-slots:eyJQaWNrdXBUaW1lIjoiMTg6MDAiLCJGbG93ZXJUeXBlIjoicm9zaSdzIiwiUGlja3VwRGF0ZSI6IjIwMTctMDMtMTgifQ==
      ```

      `x-amz-lex-dialog-state` レスポンスヘッダーは `ReadyForFulfillment` に設定されています。これで、クライアントはインテントを達成できます。

1. ここで、ボットを再テストします。新しい (ユーザー) コンテキストを確立するには、コンソールで [**Clear**] リンクを選択します。`OrderFlowers` インテントに指定するデータに、以下のような無効なデータを含めます。例: 
   + 花の種類として「Jasmine」 (サポートされている花の種類ではない)
   + 花をピックアップする日付として「昨日」

   ボットではこれらの値が受け付けられることがわかります。これは、ユーザーデータを初期化および検証するコードがないためです。次のセクションでは、その処理を行う Lambda 関数を追加します。Lambda 関数について、以下の点に注意してください。
   + ユーザー入力のたびにスロットデータを検証します。インテントは最後に達成されます。つまり、ボットはスロットデータをクライアントに返すだけではなく、花の注文を処理してユーザーにメッセージを返します。詳細については、「[Lambda 関数を使用する](using-lambda.md)」を参照してください。
   + セッション属性も設定します。セッション属性の詳細については、「[PostText](API_runtime_PostText.md)」を参照してください。

      ご利用開始のセクションを完了したら、その他の演習 ([その他の例: Amazon Lex ボットの作成](additional-exercises.md)) を行うことができます。[旅行を予約する](ex-book-trip.md) は、セッション属性を使用してクロスインテント情報を共有し、ユーザーと動的に会話します。

**次のステップ**  
[ステップ 3: Lambda 関数を作成する (コンソール)](gs-bp-create-lambda-function.md)

# ステップ 2b (オプション): 入力による情報フローの詳細を確認する (コンソール)
<a name="gs-bp-details-part1"></a>

このセクションでは、クライアントが `PostText` API を使用してリクエストを送信する場合の、クライアントと Amazon Lex の間の情報のフローについて説明します。詳細については、「[PostText](API_runtime_PostText.md)」を参照してください。

1. ユーザーの入力: 「花を注文したい」

   1. クライアント (コンソール) は以下の [PostText](API_runtime_PostText.md) リクエストを Amazon Lex に送信します。

      ```
      POST /bot/OrderFlowers/alias/$LATEST/user/4o9wwdhx6nlheferh6a73fujd3118f5w/text
      "Content-Type":"application/json"
      "Content-Encoding":"amz-1.0"
      
      {
          "inputText": "I would like to order some flowers",
          "sessionAttributes": {}
      }
      ```

      リクエストの URI と本文の両方で Amazon Lex に情報が提供されています。
      + リクエスト URI – ボット名 (`OrderFlowers`)、ボットのエイリアス (`$LATEST`)、およびユーザー名 (ユーザーを識別するランダムな文字列) を提供します。末尾の `text` では、これが `PostText` API リクエストである (`PostContent` ではない) ことが示されています。

         
      + リクエストボディ – ユーザー入力 (`inputText`) と空の `sessionAttributes` が含まれています。クライアントが最初のリクエストを行うときにはセッション属性はありません。Lambda 関数は後でセッション属性を使用します。

   1. `inputText` から、Amazon Lex はインテント (`OrderFlowers`) を検出します。このインテントには、ユーザー入力の初期化と検証、あるいはフルフィルメントを行うためのコードフック (Lambda 関数) がありません。

      Amazon Lex は、値を引き出すインテントのスロットのいずれか (この場合は `FlowerType`) を選択します。また、そのスロットの値を引き出すプロンプトの 1 つ (すべてインテント設定の一部) を選択し、以下のレスポンスをクライアントに返します。コンソールに、ユーザーへのレスポンスのメッセージが表示されます。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lex/latest/dg/images/gs-1-details-10.png)

      クライアントはレスポンス内のメッセージを表示しています。

1. ユーザーの入力: 「バラ」

   1. クライアント (コンソール) は以下の [PostText](API_runtime_PostText.md) リクエストを Amazon Lex に送信します。

      ```
      POST /bot/OrderFlowers/alias/$LATEST/user/4o9wwdhx6nlheferh6a73fujd3118f5w/text
      "Content-Type":"application/json"
      "Content-Encoding":"amz-1.0"
      
      {
          "inputText": "roses",
          "sessionAttributes": {}
      }
      ```

      リクエストボディの `inputText` は、ユーザー入力を示します。`sessionAttributes` は空のままです。

   1. Amazon Lex はまず、現在のインテントのコンテキストの `inputText` を解釈します (このサービスでは `FlowerType` スロットに関する情報を特定のユーザーに求めていたことが記憶されています)。Amazon Lex は現在のインテントのスロット値を更新し、別のスロット (`PickupDate`) をそのスロットのプロンプトメッセージの 1 つ (「何日にバラをピックアップなさいますか?」) `` と共に選択します。

      次に、Amazon Lex は以下のレスポンスを返します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lex/latest/dg/images/gs-1-details-20.png)

      クライアントはレスポンス内のメッセージを表示しています。

1. ユーザーの入力: 「明日」

   1. クライアント (コンソール) は以下の [PostText](API_runtime_PostText.md) リクエストを Amazon Lex に送信します。

      ```
      POST /bot/OrderFlowers/alias/$LATEST/user/4o9wwdhx6nlheferh6a73fujd3118f5w/text
      "Content-Type":"application/json"
      "Content-Encoding":"amz-1.0"
      
      {
          "inputText": "tomorrow",
          "sessionAttributes": {}
      }
      ```

      リクエストボディの `inputText` は、ユーザー入力を示します。`sessionAttributes` は空のままです。

   1. Amazon Lex はまず、現在のインテントのコンテキストの `inputText` を解釈します (このサービスでは `PickupDate` スロットに関する情報を特定のユーザーに求めていたことが記憶されています)。Amazon Lex は現在のインテントのスロット (`PickupDate`) の値を更新します。値を引き出す別のスロット (`PickupTime`) を選択します。値を引き出すプロンプトの 1 つ (2017 年 1 月 5 日の何時にバラを配達しますか? ) ``がクライアントに返されます。

      次に、Amazon Lex は以下のレスポンスを返します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lex/latest/dg/images/gs-1-details-30.png)

      クライアントはレスポンス内のメッセージを表示しています。

1. ユーザーの入力: 「午後 6 時」

   1. クライアント (コンソール) は以下の [PostText](API_runtime_PostText.md) リクエストを Amazon Lex に送信します。

      ```
      POST /bot/OrderFlowers/alias/$LATEST/user/4o9wwdhx6nlheferh6a73fujd3118f5w/text
      "Content-Type":"application/json"
      "Content-Encoding":"amz-1.0"
      
      {
          "inputText": "6 pm",
          "sessionAttributes": {}
      }
      ```

      リクエストボディの `inputText` は、ユーザー入力を示します。`sessionAttributes` は空のままです。

   1. Amazon Lex はまず、現在のインテントのコンテキストの `inputText` を解釈します (このサービスでは `PickupTime` スロットに関する情報を特定のユーザーに求めていたことが記憶されています)。Amazon Lex はまず現在のインテントのスロット値を更新します。ここで、Amazon Lex はすべてのスロットのデータがそろっていることを検出します。

      `OrderFlowers` インテントには確認メッセージが設定されています。そのため、Amazon Lex はインテントの達成に進む前に、ユーザーからの明示的な確認を必要とします。Amazon Lex は、花を注文する前に確認を要求する以下のメッセージをクライアントに送信します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lex/latest/dg/images/gs-1-details-40.png)

      クライアントはレスポンス内のメッセージを表示しています。

1. ユーザーの入力: 「はい」

   1. クライアント (コンソール) は以下の [PostText](API_runtime_PostText.md) リクエストを Amazon Lex に送信します。

      ```
      POST /bot/OrderFlowers/alias/$LATEST/user/4o9wwdhx6nlheferh6a73fujd3118f5w/text
      "Content-Type":"application/json"
      "Content-Encoding":"amz-1.0"
      
      {
          "inputText": "Yes",
          "sessionAttributes": {}
      }
      ```

      リクエストボディの `inputText` は、ユーザー入力を示します。`sessionAttributes` は空のままです。

   1. Amazon Lex は、現在のインテントの確認のコンテキストで `inputText` を解釈して、注文を進めることをユーザーが望んでいることを理解します。`OrderFlowers` インテントには、フルフィルメントアクティビティとして `ReturnIntent` が設定されています (インテントを達成するための Lambda 関数はありません)。したがって、Amazon Lex は次のスロットデータをクライアントに返します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lex/latest/dg/images/gs-1-details-50.png)

      Amazon Lex は `dialogState` を `ReadyForFulfillment` に設定します。これで、クライアントはインテントを達成できます。

1. ここで、ボットをもう一度テストします。そのためには、コンソールで [**Clear**] リンクを選択して、新しい (ユーザー) コンテキストを確立する必要があります。ここで、花の注文のデータを提供するときに、無効なデータを指定してみます。例: 
   + 花の種類として「Jasmine」 (サポートされている花の種類ではない)
   + 花をピックアップする日付として「昨日」

   ボットではこれらの値が受け付けられることがわかります。これは、ユーザーデータを初期化/検証するコードがないためです。次のセクションでは、その処理を行う Lambda 関数を追加します。Lambda 関数について、以下の点に注意してください。
   + Lambda 関数はユーザー入力のたびにスロットデータを検証します。インテントは最後に達成されます。つまり、ボットはスロットデータをクライアントに返すだけではなく、花の注文を処理してユーザーにメッセージを返します。詳細については、「[Lambda 関数を使用する](using-lambda.md)」を参照してください。
   + Lambda 関数はセッション属性も設定します。セッション属性の詳細については、「[PostText](API_runtime_PostText.md)」を参照してください。

      ご利用開始のセクションを完了したら、その他の演習 ([その他の例: Amazon Lex ボットの作成](additional-exercises.md)) を行うことができます。[旅行を予約する](ex-book-trip.md) は、セッション属性を使用してクロスインテント情報を共有し、ユーザーと動的に会話します。

**次のステップ**  
[ステップ 3: Lambda 関数を作成する (コンソール)](gs-bp-create-lambda-function.md)

# ステップ 3: Lambda 関数を作成する (コンソール)
<a name="gs-bp-create-lambda-function"></a>

Lambda 関数を作成し (**lex-order-flowers-python** 設計図を使用)、 AWS Lambda コンソールでサンプルのイベントデータを使用して呼び出しのテストを行います。

Amazon Lex コンソールに戻り、前のセクションで作成した `OrderFlowersBot` の `OrderFlowers` インテントを達成するコードフックとして Lambda 関数を追加します。

**Lambda 関数を作成するには (コンソール)**

1. にサインイン AWS マネジメントコンソール し、[https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) で AWS Lambda コンソールを開きます。

1. [**Create function**] を選択します。

1. [**Create function**] (関数の作成) ページで、[**Blueprints**] (設計図) を選択します。フィルタテキストボックスに「**lex-**」と入力し、`Enter` キーを押して設計図を見つけ、[`lex-order-flowers-python` 設計図] を選択します。

   Lambda 関数の設計図は Node.js と Python の両方で提供されています。この演習では Python ベースの設計図を使用します。

1. [**基本的な情報**] ページでは、以下を実行します。
   + Lambda 関数の名前 (`OrderFlowersCodeHook`) を入力します。
   + 実行ロールについては、**[Create a new role with basic Lambda permissions]** (基本的な Lambda アクセス権限で新しいロールを作成) を選択します。
   + 他はデフォルト値のままにしておきます。

1. [**関数の作成**] を選択してください。

1. 英語 (US) (en-US) 以外のロケールを使用している場合は、[特定のロケールの設計図の更新](lex-lambda-blueprints.md#blueprint-update-locale) の説明に従ってインテント名を更新します。

1. Lambda 関数をテストします。

   1. [**テストイベントの選択**]、[**テストイベント設定**] の順に選択します。

   1. **[Event template]** (イベントテンプレート) リストから **[Amazon Lex-Order Flowers]** (Amazon Lex - お花の注文) を選択します。このサンプルイベントは Amazon Lex のリクエスト/レスポンスモデル (「[Lambda 関数を使用する](using-lambda.md)」を参照) と一致します。テストイベント名 (`LexOrderFlowersTest`) を指定します。

   1. **[作成]** を選択します。

   1. [**テスト**] を選択してコードフックをテストします。

   1. Lambda 関数が正常に実行されたことを確認します。この例のレスポンスは、Amazon Lex レスポンスモデルと一致します。

**次のステップ**  
[ステップ 4: Lambda 関数をコードフックとして追加する (コンソール)](gs-bp-create-integrate.md)

# ステップ 4: Lambda 関数をコードフックとして追加する (コンソール)
<a name="gs-bp-create-integrate"></a>

このセクションでは、次のように Lambda 関数を使用するように OrderFlowers インテントの設定を更新します。
+ 最初に `OrderFlowers` インテントを達成するためのコードフックとして Lambda 関数を使用します。ボットをテストして、Lambda 関数からフルフィルメントメッセージを受信していることを確認します。Amazon Lex は、花の注文に必要なすべてのスロットのデータが提供された後にのみ、Lambda 関数を呼び出します。
+ 初期化と検証を行うために同じ Lambda 関数をコードフックとして設定します。Lambda 関数が、(スロットデータが提供されたときに) 検証を行っていることをテストして確認します。

**Lambda 関数をコードフックとして追加するには (コンソール)**

1. Amazon Lex コンソールで、**[OrderFlowers]** ボットを選択します。コンソールに [**OrderFlowers**] インテントが表示されます。インテントのバージョンが `$LATEST` に設定されていることを確認します。変更できるのはこのバージョンだけです。

1. Lambda 関数をフルフィルメントのコードフックとして追加してテストします。

   

   1. エディタで、**[AWS Lambda function]** (関数) を **[Fulfillment]** (フルフィルメント) として選択し、前のステップで作成した Lambda 関数を選択します (`OrderFlowersCodeHook`)。[**OK**] を選択して、Lambda 関数を呼び出すアクセス権限を Amazon Lex に付与します。

      この Lambda 関数は、インテントを達成するためのコードフックとして設定しています。この関数を Amazon Lex が呼び出すのは、インテントを達成するために必要なすべてのスロットデータをユーザーから取得した後のみです。

   1. [**Goodbye message**] を指定します。

   1. [**Build**] を選択します。

   1. 前の会話を使用してボットをテストします。

   最後の文章である「ありがとうございました。お客様のバラは ...」は、コードフックとして設定した Lambda 関数からのレスポンスです。前のセクションでは、Lambda 関数はありませんでした。ここでは、Lambda 関数を使用して実際に `OrderFlowers` インテントを達成します。

1. Lambda 関数を初期化および検証のコードフックとして追加してテストします。

   Lambda 関数のサンプルコードを使用して、ユーザー入力の検証とフルフィルメントの両方を行うことができます。Lambda 関数が受け取る入力イベントには、どのコード部分を実行するかをコードで判断するためのフィールド (`invocationSource`) があります。詳細については、「[Lambda 関数の入力イベントとレスポンスの形式](lambda-input-response-format.md)」を参照してください。

   1. `OrderFlowers` の \$1LATEST バージョンを選択します。これは更新できる唯一のバージョンです。

   1. エディタで、[**オプション**] の [**Initialization and validation**] (初期化と検証) を選択します。

   1. ここでも、同じ Lambda 関数を選択します。

   1. [**Build**] を選択します。

   1. ボットをテストします。

      次の画像ように Amazon Lex と対話する準備が整いました。検証部分をテストするには、時間として 6 PM を選択します。Lambda 関数からレスポンス (「当社の営業時間は午前 10 時から午後 5 時までとなっております」) が返され、選択し直すことを求められます。すべての有効なスロットデータを提供すると、Lambda 関数によって注文が確定されます。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lex/latest/dg/images/OrderFlowers-FullLambda.png)

**次のステップ**  
[ステップ 5 (オプション): 情報フローの詳細を確認する (コンソール)](gs-bp-details-after-lambda.md)

# ステップ 5 (オプション): 情報フローの詳細を確認する (コンソール)
<a name="gs-bp-details-after-lambda"></a>

このセクションでは、各ユーザー入力に対する、クライアントと Amazon Lex の間の情報のフローについて、Lambda 関数の統合も含めて説明します。

**注記**  
このセクションでは、クライアントが `PostText` ランタイム API を使用して Amazon Lex にリクエストを送信することを前提としていて、それに応じてリクエストとレスポンスの詳細を示しています。クライアントが `PostContent` API を使用する場合の、クライアントと Amazon Lex の間の情報フローの例については、「[ステップ 2a (オプション): 音声による情報フローの詳細を確認する (コンソール)](gs-bp-details-postcontent-flow.md)」を参照してください。

`PostText` ランタイム API、および以下のステップで示しているリクエストとレスポンスに関するその他の詳細については、「[PostText](API_runtime_PostText.md)」を参照してください。

1. ユーザー: 「花を注文したい」

   1. クライアント (コンソール) は以下の [PostText](API_runtime_PostText.md) リクエストを Amazon Lex に送信します。

      ```
      POST /bot/OrderFlowers/alias/$LATEST/user/ignw84y6seypre4xly5rimopuri2xwnd/text
      "Content-Type":"application/json"
      "Content-Encoding":"amz-1.0"
      
      {
          "inputText": "I would like to order some flowers",
          "sessionAttributes": {}
      }
      ```

      リクエストの URI と本文の両方で Amazon Lex に情報が提供されています。
      + リクエスト URI – ボット名 (`OrderFlowers`)、ボットのエイリアス (`$LATEST`)、およびユーザー名 (ユーザーを識別するランダムな文字列) を提供します。末尾の `text` では、これが `PostText` API リクエストである (`PostContent` ではない) ことが示されています。
      + リクエストボディ – ユーザー入力 (`inputText`) と空の `sessionAttributes` が含まれています。クライアントが最初のリクエストを行うときにはセッション属性はありません。Lambda 関数は後でセッション属性を使用します。

   1. `inputText` から、Amazon Lex はインテント (`OrderFlowers`) を検出します。このインテントには、ユーザーデータの初期化/検証を行うためのコードフックとして Lambda 関数が設定されています。そのため、Amazon Lex は以下の情報をイベントデータとして渡すことで、その Lambda 関数を呼び出します。

      ```
      {
          "messageVersion": "1.0",
          "invocationSource": "DialogCodeHook",
          "userId": "ignw84y6seypre4xly5rimopuri2xwnd",
          "sessionAttributes": {},
          "bot": {
              "name": "OrderFlowers",
              "alias": null,
              "version": "$LATEST"
          },
          "outputDialogMode": "Text",
          "currentIntent": {
              "name": "OrderFlowers",
              "slots": {
                  "PickupTime": null,
                  "FlowerType": null,
                  "PickupDate": null
              },
              "confirmationStatus": "None"
          }
      }
      ```

      詳細については、「[入力イベントの形式](lambda-input-response-format.md#using-lambda-input-event-format)」を参照してください。

      クライアントが送信する情報に加えて、Amazon Lex はまた、以下の追加データを含めます。
      + `messageVersion` – 現在 Amazon Lex でサポートしているのは 1.0 バージョンだけです。
      + `invocationSource` – Lambda 関数呼び出しの目的を示しています。この場合は、ユーザーデータの初期化および検証を行うことです。この時点で、Amazon Lex はインテントを達成するためのスロットデータの一部をユーザーがまだ指定していないことを知っています。
      + `currentIntent` の情報。すべてのスロット値は null に設定されています。

   1. この時点では、すべてのスロット値は null です。Lambda 関数が検証する対象はありません。Lambda 関数は以下のレスポンスを Amazon Lex に返します。

      ```
      {
          "sessionAttributes": {},
          "dialogAction": {
              "type": "Delegate",
              "slots": {
                  "PickupTime": null,
                  "FlowerType": null,
                  "PickupDate": null
              }
          }
      }
      ```

      レスポンスの形式については、「[レスポンスの形式](lambda-input-response-format.md#using-lambda-response-format)」を参照してください。

      次の点に注意してください。
      + `dialogAction.type` – この値を `Delegate` に設定することで、Lambda 関数は次の一連のアクションを決定する責任を Amazon Lex に委任します。
**注記**  
Lambda 関数は、ユーザーデータの検証で何かを検出した場合に、次に何をするかを Amazon Lex に指示します。それについては以下のステップで説明します。

   1. `dialogAction.type` に従って、Amazon Lex は次の一連のアクションを決定します。どのスロットも入力されていないため、`FlowerType` スロットの値を引き出すことを決定します。値を引き出すプロンプトの 1 つ (「どの種類の花を注文しますか?」) をこのスロットに選択し、以下のレスポンスをクライアントに返します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lex/latest/dg/images/gs-1-details-10.png)

      クライアントはレスポンス内のメッセージを表示しています。

1. ユーザー: 「バラ」

   1. クライアント は以下の [PostText](API_runtime_PostText.md) リクエストを Amazon Lex に送信します。

      ```
      POST /bot/OrderFlowers/alias/$LATEST/user/ignw84y6seypre4xly5rimopuri2xwnd/text
      "Content-Type":"application/json"
      "Content-Encoding":"amz-1.0"
      
      {
          "inputText": "roses",
          "sessionAttributes": {}
      }
      ```

      リクエストボディの `inputText` でユーザー入力が提供されています。`sessionAttributes` は空のままです。

   1. Amazon Lex はまず現在のインテントのコンテキストで `inputText` を解釈します。サービスでは `FlowerType` スロットに関する情報をこのユーザーに求めていたことが記憶されています。現在のインテントのスロット値を更新し、以下のイベントデータを使用して Lambda 関数を呼び出します。

      ```
      {
          "messageVersion": "1.0",
          "invocationSource": "DialogCodeHook",
          "userId": "ignw84y6seypre4xly5rimopuri2xwnd",
          "sessionAttributes": {},
          "bot": {
              "name": "OrderFlowers",
              "alias": null,
              "version": "$LATEST"
          },
          "outputDialogMode": "Text",
          "currentIntent": {
              "name": "OrderFlowers",
              "slots": {
                  "PickupTime": null,
                  "FlowerType": "roses",
                  "PickupDate": null
              },
              "confirmationStatus": "None"
          }
      }
      ```

      次の点に注意してください。
      + `invocationSource` – `DialogCodeHook` のままです (ユーザーデータを検証しているだけです)。
      + `currentIntent.slots` – Amazon Lex は `FlowerType` スロットを「バラ」に更新しています。

   1. `invocationSource` の `DialogCodeHook` の値に従って、Lambda 関数はユーザーデータの検証を実行します。この関数は `roses` を有効なスロット値として認識し (また、`Price` をセッション属性として設定して)、以下のレスポンスを Amazon Lex に返します。

      ```
      {
          "sessionAttributes": {
              "Price": 25
          },
          "dialogAction": {
              "type": "Delegate",
              "slots": {
                  "PickupTime": null,
                  "FlowerType": "roses",
                  "PickupDate": null
              }
          }
      }
      ```

      次の点に注意してください。
      + `sessionAttributes` – Lambda 関数は (バラの) `Price` をセッション属性として追加しています。
      + `dialogAction.type` – `Delegate` に設定されます。ユーザーデータは有効であるため、Lambda 関数は次の一連のアクションを選択するように Amazon Lex に指示します。

       

   1. `dialogAction.type` に従って、Amazon Lex は次の一連のアクションを選択します。Amazon Lex は、より多くのスロットデータが必要であることを知っているため、インテント設定に従って最も優先度が高い次の未指定スロット (`PickupDate`) を選択します。Amazon Lex は、このスロットにプロンプトメッセージの 1 つ (「何日にバラを受け取りたいですか?」) をインテント設定に応じて選択し、クライアントに次のレスポンスを返答として送信します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lex/latest/dg/images/gs-1-details-20.png)

      クライアントには、レスポンスのメッセージ (「何日にバラをピックアップなさいますか?」) だけが表示されます。

1. ユーザー: 「明日」

   1. クライアント は以下の [PostText](API_runtime_PostText.md) リクエストを Amazon Lex に送信します。

      ```
      POST /bot/OrderFlowers/alias/$LATEST/user/ignw84y6seypre4xly5rimopuri2xwnd/text
      "Content-Type":"application/json"
      "Content-Encoding":"amz-1.0"
      
      {
          "inputText": "tomorrow",
          "sessionAttributes": {
              "Price": "25"
          }
      }
      ```

      リクエストボディの `inputText` でユーザー入力が提供され、クライアントはセッション属性をサービスに返します。

   1. Amazon Lex は、これが `PickupDate` スロットに対して引き出されているデータであるというコンテキストを覚えています。このコンテキストでは、`inputText` が `PickupDate` スロットに対する値であることを知っています。Amazon Lex は以下のイベントを送信することで Lambda 関数を呼び出します。

      ```
      {
          "messageVersion": "1.0",
          "invocationSource": "DialogCodeHook",
          "userId": "ignw84y6seypre4xly5rimopuri2xwnd",
          "sessionAttributes": {
              "Price": "25"
          },
          "bot": {
              "name": "OrderFlowersCustomWithRespCard",
              "alias": null,
              "version": "$LATEST"
          },
          "outputDialogMode": "Text",
          "currentIntent": {
              "name": "OrderFlowers",
              "slots": {
                  "PickupTime": null,
                  "FlowerType": "roses",
                  "PickupDate": "2017-01-05"
              },
              "confirmationStatus": "None"
          }
      }
      ```

      Amazon Lex は `currentIntent.slots` の値を設定することで、`PickupDate` を更新しています。また、サービスによって `sessionAttributes` がそのまま Lambda 関数に渡されています。

   1. `invocationSource` の `DialogCodeHook` の値に従って、Lambda 関数はユーザーデータの検証を行います。この関数は `PickupDate` のスロット値が有効であることを認識し、以下のレスポンスを Amazon Lex に返します。

      ```
      {
          "sessionAttributes": {
              "Price": 25
          },
          "dialogAction": {
              "type": "Delegate",
              "slots": {
                  "PickupTime": null,
                  "FlowerType": "roses",
                  "PickupDate": "2017-01-05"
              }
          }
      }
      ```

      次の点に注意してください。
      + `sessionAttributes` – 変更しません。
      + `dialogAction.type` – `Delegate` に設定されます。ユーザーデータは有効であるため、Lambda 関数は次の一連のアクションを選択するように Amazon Lex に指示します。

   1. `dialogAction.type` に従って、Amazon Lex は次の一連のアクションを選択します。Amazon Lex は、より多くのスロットデータが必要であることを知っているため、インテント設定に従って最も優先度が高い次の未指定スロット (`PickupTime`) を選択します。Amazon Lex はプロンプトのメッセージ (「2017 年 1 月 5 日の何時にバラを配達いたしましょうか?」) のいずれかを選択し、 以下のレスポンスをクライアントに送信します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lex/latest/dg/images/gs-1-details-30.png)

      クライアントはレスポンス内のメッセージ (「2017 年 1 月 5 日の何時にバラを配達いたしましょうか?」) を表示します。

1. ユーザー: 「午後 4 時」

   1. クライアント は以下の [PostText](API_runtime_PostText.md) リクエストを Amazon Lex に送信します。

      ```
      POST /bot/OrderFlowers/alias/$LATEST/user/ignw84y6seypre4xly5rimopuri2xwnd/text
      "Content-Type":"application/json"
      "Content-Encoding":"amz-1.0"
      
      {
          "inputText": "4 pm",
          "sessionAttributes": {
              "Price": "25"
          }
      }
      ```

      リクエストボディの `inputText` でユーザー入力が提供されています。クライアントはそのリクエストで `sessionAttributes` を渡します。

   1. Amazon Lex はコンテキストを理解しています。`PickupTime` スロットに対するデータを引き出していたというコンテキストを理解しています。このコンテキストでは、`inputText` が `PickupTime` スロットに対する値であることを知っています。Amazon Lex は以下のイベントを送信することで Lambda 関数を呼び出します。

      ```
      {
          "messageVersion": "1.0",
          "invocationSource": "DialogCodeHook",
          "userId": "ignw84y6seypre4xly5rimopuri2xwnd",
          "sessionAttributes": {
              "Price": "25"
          },
          "bot": {
              "name": "OrderFlowersCustomWithRespCard",
              "alias": null,
              "version": "$LATEST"
          },
          "outputDialogMode": "Text",
          "currentIntent": {
              "name": "OrderFlowers",
              "slots": {
                  "PickupTime": "16:00",
                  "FlowerType": "roses",
                  "PickupDate": "2017-01-05"
              },
              "confirmationStatus": "None"
          }
      }
      ```

      Amazon Lex は `currentIntent.slots` の値を設定することで、`PickupTime` を更新しています。

   1. `invocationSource` の `DialogCodeHook` の値に従って、Lambda 関数はユーザーデータの検証を実行します。この関数は `PickupDate` のスロット値が有効であることを認識し、以下のレスポンスを Amazon Lex に返します。

      ```
      {
          "sessionAttributes": {
              "Price": 25
          },
          "dialogAction": {
              "type": "Delegate",
              "slots": {
                  "PickupTime": "16:00",
                  "FlowerType": "roses",
                  "PickupDate": "2017-01-05"
              }
          }
      }
      ```

      次の点に注意してください。
      + `sessionAttributes` – セッション属性は変更されていません。
      + `dialogAction.type` - `Delegate` に設定されます。ユーザーデータは有効であるため、Lambda 関数は次の一連のアクションを選択するように Amazon Lex に指示します。

   1. この時点で、Amazon Lex はすべてのスロットデータがそろっていることを知っています。このインテントには確認プロンプトが設定されています。そのため、Amazon Lex は、インテントを達成する前にユーザーの確認を求める以下のレスポンスを送信します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lex/latest/dg/images/gs-1-details-45.png)

      クライアントはレスポンス内のメッセージをそのまま表示し、ユーザーの応答を待ちます。

1. ユーザー: 「はい」

   1. クライアント は以下の [PostText](API_runtime_PostText.md) リクエストを Amazon Lex に送信します。

      ```
      POST /bot/OrderFlowers/alias/$LATEST/user/ignw84y6seypre4xly5rimopuri2xwnd/text
      "Content-Type":"application/json"
      "Content-Encoding":"amz-1.0"
      
      {
          "inputText": "yes",
          "sessionAttributes": {
              "Price": "25"
          }
      }
      ```

   1. Amazon Lex は、現在のインテントの確認のコンテキストで `inputText` を解釈して、Amazon Lexは、注文を進めることをユーザーが望んでいることを理解します。Amazon Lex は今回は、以下のイベントを送信することで、インテントを達成するために Lambda 関数を呼び出します。Lambda 関数に送信するイベントで `invocationSource` を `FulfillmentCodeHook` に設定しています。Amazon Lex はまた、`confirmationStatus` から `Confirmed` に設定します。

      ```
      {
          "messageVersion": "1.0",
          "invocationSource": "FulfillmentCodeHook",
          "userId": "ignw84y6seypre4xly5rimopuri2xwnd",
          "sessionAttributes": {
              "Price": "25"
          },
          "bot": {
              "name": "OrderFlowersCustomWithRespCard",
              "alias": null,
              "version": "$LATEST"
          },
          "outputDialogMode": "Text",
          "currentIntent": {
              "name": "OrderFlowers",
              "slots": {
                  "PickupTime": "16:00",
                  "FlowerType": "roses",
                  "PickupDate": "2017-01-05"
              },
              "confirmationStatus": "Confirmed"
          }
      }
      ```

      次の点に注意してください。
      + `invocationSource` – Amazon Lex は今回は、この値を `FulfillmentCodeHook` に設定して、インテントを達成するように Lambda 関数に指示しています。
      + `confirmationStatus` – `Confirmed` に設定されます。

   1. 今回、Lambda 関数は `OrderFlowers` インテントを達成し、次のレスポンスを返します。

      ```
      {
          "sessionAttributes": {
              "Price": "25"
          },
          "dialogAction": {
              "type": "Close",
              "fulfillmentState": "Fulfilled",
              "message": {
                  "contentType": "PlainText",
                  "content": "Thanks, your order for roses has been placed and will be ready for pickup by 16:00 on 2017-01-05"
              }
          }
      }
      ```

      次の点に注意してください。
      + `dialogAction.type` を設定する – Lambda 関数はこの値を `Close` に設定し、ユーザーの応答を想定しないことを Amazon Lex に指示しています。
      + `dialogAction.fulfillmentState` – Fulfilled に設定されていて、ユーザーに伝える適切なメッセージ (`message`) が含まれています。

   1. Amazon Lex は `fulfillmentState` を確認し、以下のレスポンスをクライアントに返します。

      Amazon Lex は以下のメッセージをクライアントに返しています。  
![\[\]](http://docs.aws.amazon.com/ja_jp/lex/latest/dg/images/gs-1-details-48.png)

      以下の点に注意してください。
      + `dialogState` – Amazon Lex はこの値を `fulfilled` に設定しています。
      + `message` – Lambda 関数が提供したのと同じメッセージです。

      クライアントはそのメッセージを表示します。

1. ここで、ボットをもう一度テストします。新しい (ユーザー) コンテキストを確立するには、テストウィンドウの [**Clear**] リンクを選択します。ここでは、`OrderFlowers` インテントに対して無効なスロットデータを指定します。Lambda 関数は今回は、データ検証を実行し、無効なスロットデータ値を null にリセットし、有効なデータをユーザーに求めるように Amazon Lex に依頼します。例えば、以下のことを試してみます。
   + 花の種類として「Jasmine」 (サポートされている花の種類ではない)
   + 花をピックアップする日付として「昨日」
   + 注文した後で、注文の確認に対して「はい」と応答する代わりに、花の種類を入力します。それに対して、Lambda 関数は、花の注文の現在の合計はそのままにして、セッション属性内の `Price` を更新します。

   Lambda 関数はフルフィルメントアクティビティも実行します。

**次のステップ**  
[ステップ 6: インテント設定を更新して発話を追加する (コンソール)](gs-bp-utterance.md)

# ステップ 6: インテント設定を更新して発話を追加する (コンソール)
<a name="gs-bp-utterance"></a>

 `OrderFlowers` ボットには、2 つの発話のみが設定されています。これは、機械学習モデルを構築して、ユーザーのインテントを認識し応答するための制限された情報を Amazon Lex に提供します。次のテストウィンドウに「I want to order flowers」と入力してみてください。Amazon Lex は、このテキストを認識しないため、「I didn't understand you, what would you like to do?」と応答します。発話を追加することで、機械学習モデルを改善できます。

![\[認識されなかった発話を示すテストウィンドウ\]](http://docs.aws.amazon.com/ja_jp/lex/latest/dg/images/gs1-120.png)


発話を追加するたびに Amazon Lex でユーザーに応答する方法に関する情報が増えます。正確な発話を追加する必要はありません。Amazon Lex は、提供されたサンプルから一般化を行い、正確な一致および類似する入力の両方を認識します。

**発話を追加するには (コンソール)**

1. 次の画像のように、インテントエディタの **[サンプル発話]** セクションに「I want flowers」と入力して発話をインテントに追加し、この新しい発話の横にあるプラスアイコンをクリックします。  
![\[新しい発話を示すインテントエディタ。\]](http://docs.aws.amazon.com/ja_jp/lex/latest/dg/images/gs1-130.png)

1.  ボットを構築して変更を反映します。[**Build**] を選択し、再度 [**Build**] を選択します。

1. ボットをテストし、新しい発話が認識されたことを確認します。次の画像のように、テストウィンドウに「I want to order flowers」と入力します。Amazon Lex は、この句を認識し、「What type of flowers would you like to order?」と応答します。  
![\[新しい発話を認識するインテントエディタ。\]](http://docs.aws.amazon.com/ja_jp/lex/latest/dg/images/gs1-140.png)

**次のステップ**  
[ステップ 7 (オプション): クリーンアップする (コンソール)](gs-bp-cleaning-up.md)

# ステップ 7 (オプション): クリーンアップする (コンソール)
<a name="gs-bp-cleaning-up"></a>

次に、作成したリソースを削除し、アカウントをクリーンアップします。

削除できるのは、使用中ではないリソースだけです。通常は、以下の順序でリソースを削除する必要があります。
+ ボットを削除して、インテントのリソースを解放します。
+ インテントを削除して、スロットタイプのリソースを解放します。
+ 最後にスロットタイプを削除します。

**アカウントをクリーンアップするには (コンソール)**

1. にサインイン AWS マネジメントコンソール し、[https://console.aws.amazon.com/lex/](https://console.aws.amazon.com/lex/) で Amazon Lex コンソールを開きます。

1. ボットのリストで、[**OrderFlowers**] の横にあるチェックボックスをオンにし ます。

1. ボットを削除するには、[**Delete**] を選択し、確認ダイアログボックスで [**Continue**] を選択します。

1. 左のペインで [**Intents**] を選択します。

1. インテントのリストで、[**OrderFlowersIntent**] を選択します。

1. インテントを削除するには、[**Delete**] を選択し、確認ダイアログボックスで [**Continue**] を選択します。

1. 左のペインで、[**Slot types**] を選択します。

1. スロットタイプのリストで、[**Flowers**] を選択します。

1. スロットタイプを削除するには、[**Delete**] を選択し、確認ダイアログボックスで [**Continue**] を選択します。

これで、作成したすべてのAmazon Lex リソースが削除され、アカウントがクリーンアップされました。必要に応じて、[Lambda コンソール](https://console.aws.amazon.com/lambda)を使用して、この演習で使用した Lambda 関数を削除します。