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 スロットに関する情報をこのユーザーに求めていたことが記憶されています。現在のインテントのスロット値を更新し、以下のイベントデータを使用して 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 関数はユーザーデータの検証を実行します。この関数は 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 に指示します。

       

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

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

    4. dialogAction.type に従って、Amazon Lex は次の一連のアクションを選択します。Amazon Lex はさらなるスロットデータが必要なことを知っているため、インテントの設定に応じて最も優先度の高い次の未指定スロット (PickupTime) を選択します。Amazon Lex は、インテントの設定に応じて、プロンプトメッセージの 1 つ「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 スロットに対するデータを引き出していたというコンテキストを理解しています。このコンテキストでは、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 は PickupTime の値を設定することで、currentIntent.slots を更新しています。

    3. DialogCodeHookinvocationSource の値に従って、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 は 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 関数に指示しています。

      • confirmationStatus – は、Confirmed に設定されます。

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