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

Amazon Lex V2 を使用している場合は、代わりに Amazon Lex V2 ガイドを参照してください。

 

Amazon Lex V1 を使用している場合は、ボットを Amazon Lex V2 にアップグレードすることをお勧めします。V1 には新機能を追加されませんので、すべての新しいボットには V2 を使用することを強くお勧めします。

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

ステップ 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 スロットに関する情報をこのユーザーに求めていたことが記憶されています。現在のインテントのスロット値を更新し、以下のイベントデータを使用して 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. invocationSourceDialogCodeHook の値に従って、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 は、このスロットにプロンプトメッセージの 1 つ (「何日にバラを受け取りたいですか?」) をインテント設定に応じて選択し、クライアントに次のレスポンスを返答として送信します。

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

    3. invocationSourceDialogCodeHook の値に従って、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 月 5 日の何時にバラを配達いたしましょうか?」) のいずれかを選択し、 以下のレスポンスをクライアントに送信します。

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

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

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

    3. invocationSourceDialogCodeHook の値に従って、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 に指示します。

    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は、注文を進めることをユーザーが望んでいることを理解します。Amazon Lex は今回は、以下のイベントを送信することで、インテントを達成するために Lambda 関数を呼び出します。Lambda 関数に送信するイベントで invocationSourceFulfillmentCodeHook に設定しています。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 関数に指示しています。

      • 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: インテント設定を更新して発話を追加する (コンソール)