メニュー
Amazon Lex
開発者ガイド

ステップ 5 (オプション): 情報フローの詳細を確認する (コンソール)

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

注記

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

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

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

    1. クライアント (コンソール) は以下の PostText リクエストを 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 関数は後でセッション属性を使用します。

    2. 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" } }

      詳細については、「入力イベントの形式」を参照してください。

      クライアントから送信された情報に加えて、Amazon Lex には以下の追加データも含まれます。

      • messageVersion – 現在 Amazon Lex でサポートしているのは 1.0 バージョンだけです。

      • invocationSource – Lambda 関数呼び出しの目的を示しています。この場合は、ユーザーデータの初期化および検証を行うことです。この時点で、Amazon Lex はインテントを達成するためのスロットデータの一部をユーザーがまだ指定していないことを知っています。

      • currentIntent の情報。すべてのスロット値は null に設定されています。

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

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

      レスポンスの形式については、「レスポンスの形式」を参照してください。

      次の点に注意してください。

      • dialogAction.type – この値を Delegate に設定することで、Lambda 関数は次の一連のアクションを決定する責任を Amazon Lex に委任します。

        注記

        Lambda 関数は、ユーザーデータの検証で何かを検出した場合に、次に何をするかを Amazon Lex に指示します。それについては以下のステップで説明します。

    4. dialogAction.type に従って、Amazon Lex は次の一連のアクションを決定します。どのスロットも入力されていないため、FlowerType スロットの値を引き出すことを決定します。インテント設定に従って、そのスロットの値を引き出すプロンプトの 1 つ (「どの花を注文なさいますか?」) を選択し、以下のレスポンスをクライアントに返します。

      
                                FlowerType スロットへのリクエストを含む JSON データ。

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

  2. ユーザー: 「バラ」

    1. クライアントは、以下の PostText リクエストを Amazon Lex に送信します。

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

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

    2. Amazon Lex はまず、現在のインテントのコンテキストで inputText を解釈します。サービスでは FlowerType スロットに関する情報をこのユーザーに求めていたことが記憶されています。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": "roses", "PickupDate": null }, "confirmationStatus": "None" } }

      次の点に注意してください。

      • invocationSourceDialogCodeHook のままです (ユーザーデータを検証しているだけです)。

      • currentIntent.slots – Amazon Lex は FlowerType スロットを「バラ」に更新しています。

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

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

      次の点に注意してください。

      • sessionAttributes – Lambda 関数は (バラの) Price をセッション属性として追加しています。

      • dialogAction.typeDelegate に設定されています。ユーザーデータは有効であるため、Lambda 関数は次の一連のアクションを選択するように Amazon Lex に指示します。

       

    4. dialogAction.type に従って、Amazon Lex は次の一連のアクションを選択します。Amazon Lex は、より多くのスロットデータが必要であることを知っているため、インテント設定に従って最も優先度が高い次の未指定スロット (PickupDate) を選択します。Amazon Lex は、インテント設定に従って、そのスロットの値を引き出すプロンプトメッセージのいずれか (「何日にバラをピックアップなさいますか?」) を選択し、以下のレスポンスをクライアントに返します。

      
                                PickupData
                                     スロットを求めるためにクライアントに送信された JSON データ。

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

  3. ユーザー: 「明日」

    1. クライアントは、以下の PostText リクエストを 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 でユーザー入力が提供され、クライアントはセッション属性をサービスに返します。

    2. Amazon Lex は、PickupDate スロットに対するデータを引き出していたというコンテキストを覚えています。このコンテキストでは、Amazon Lex は inputTextPickupDate スロットに対する値であることを知っています。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 は PickupDate の値を設定することで、currentIntent.slots を更新しています。また、サービスによって sessionAttributes がそのまま Lambda 関数に渡されています。

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

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

      次の点に注意してください。

      • sessionAttributes – 変更しません.

      • dialogAction.typeDelegate に設定されています。ユーザーデータは有効であるため、Lambda 関数は次の一連のアクションを選択するように Amazon Lex に指示します。

    4. dialogAction.type に従って、Amazon Lex は次の一連のアクションを選択します。Amazon Lex は、より多くのスロットデータが必要であることを知っているため、インテント設定に従って最も優先度が高い次の未指定スロット (PickupTime) を選択します。Amazon Lex は、インテント設定に従って、そのスロットの値を引き出すプロンプトのメッセージのいずれか (「2017 年 1 月 1 日の何時にバラを配達いたしましょうか?」) を選択し、以下のレスポンスをクライアントに送信します。

      
                                PickupTime スロットを要求する JSON データ。

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

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

    1. クライアントは、以下の PostText リクエストを 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 を渡します。

    2. Amazon Lex はコンテキストを理解しています。PickupTime スロットに対するデータを引き出していたというコンテキストを理解しています。このコンテキストでは、Amazon Lex は inputTextPickupTime スロットに対する値であることを知っています。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 は PickupTime の値を設定することで、currentIntent.slots を更新しています。

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

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

      次の点に注意してください。

      • sessionAttributes – セッション属性は変更されていません。

      • dialogAction.typeDelegate に設定されています。ユーザーデータは有効であるため、Lambda 関数は次の一連のアクションを選択するように Amazon Lex に指示します。

    4. この時点では、Amazon Lex はすべてのスロットデータがそろっていることを知っています。このインテントには確認プロンプトが設定されています。そのため、Amazon Lex は、インテントを達成する前にユーザーの確認を求める以下のレスポンスを送信します。

      
                                注文の確認を求める JSON データ。

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

  5. ユーザー: 「はい」

    1. クライアントは、以下の PostText リクエストを Amazon Lex に送信します。

      POST /bot/OrderFlowers/alias/$LATEST/user/ignw84y6seypre4xly5rimopuri2xwnd/text "Content-Type":"application/json" "Content-Encoding":"amz-1.0" { "inputText": "yes", "sessionAttributes": { "Price": "25" } }
    2. Amazon Lex は、現在のインテントの確認のコンテキストで inputText を解釈して、注文を進めることをユーザーが望んでいることを理解します。Amazon Lex は今回は、以下のイベントを送信することで、インテントを達成するために Lambda 関数を呼び出します。Lambda 関数に送信するイベントで invocationSourceFulfillmentCodeHook に設定しています。また、Amazon Lex は confirmationStatusConfirmed に設定しています。

      { "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 関数に指示しています。

      • confirmationStatusConfirmed に設定されています。

    3. 今回、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) が含まれています。

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

      Amazon Lex は以下のメッセージをクライアントに返しています。

      
                                確認プロンプトの JSON データ。

      以下の点に注意してください。

      • dialogState – Amazon Lex はこの値を fulfilledに設定しています。

      • message – Lambda 関数が提供したのと同じメッセージです。

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

  6. ここで、ボットをもう一度テストします。新しい (ユーザー) コンテキストを確立するには、テストウィンドウの [Clear] リンクを選択します。ここでは、OrderFlowers インテントに対して無効なスロットデータを指定します。Lambda 関数は今回は、データ検証を実行し、無効なスロットデータ値を null にリセットし、有効なデータをユーザーに求めるように Amazon Lex に依頼します。たとえば、以下のことを試してみます。

    • 花の種類として「Jasmine」 (サポートされている花の種類ではない)

    • 花をピックアップする日付として「昨日」

    • 注文した後で、注文の確認に対して「はい」と応答する代わりに、花の種類を入力します。それに対して、Lambda 関数は、花の注文の現在の合計はそのままにして、セッション属性内の Price を更新します。

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

次のステップ

ステップ 6: インテント設定を更新して発話を追加する (コンソール)