情報フローの詳細 - Amazon Lex V1

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

 

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

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

情報フローの詳細

ScheduleAppointment ボットの設計図では、動的に生成されたレスポンスカードの使用を主に示しています。この演習の Lambda 関数は、Amazon Lex へのレスポンスにレスポンスカードを含めています。Amazon Lex はそのレスポンスカードをクライアントへの応答に含めています。このセクションでは以下の両方について説明します。

  • クライアントと Amazon Lex の間のデータフロー。

     

    このセクションでは、クライアントが PostText ランタイム API を使用して Amazon Lex にリクエストを送信することを前提としていて、それに応じたリクエスト/レスポンスの詳細を示しています。PostText ランタイム API の詳細については、「PostText」を参照してください。

    注記

    クライアントが PostContent API を使用する場合の、クライアントと Amazon Lex の間の情報フローの例については、「ステップ 2a (オプション): 音声による情報フローの詳細を確認する (コンソール) 」を参照してください。

     

  • Amazon Lex と Lambda 関数の間のデータフロー。詳細については、「Lambda 関数の入力イベントとレスポンスの形式」を参照してください。

注記

この例では、Facebook Messenger クライアントを使用していることを前提としています。このクライアントは Amazon Lex へのリクエストでセッション属性を渡しません。したがって、このセクションで示しているリクエストの例では sessionAttributes は空です。Amazon Lex コンソールで提供されているクライアントを使用してボットをテストする場合、そのクライアントはセッション属性を含めます。

このセクションでは、各ユーザー入力の後に何が起こるかを説明します。

  1. ユーザー: タイプ Book an appointment

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

      POST /bot/ScheduleAppointment/alias/$LATEST/user/bijt6rovckwecnzesbthrr1d7lv3ja3n/text "Content-Type":"application/json" "Content-Encoding":"amz-1.0" { "inputText":"book appointment", "sessionAttributes":{} }

      リクエストの URI と本文の両方で Amazon Lex に情報が提供されています。

      • リクエスト URI – ボット名 (ScheduleAppointment)、ボットのエイリアス ($LATEST)、およびユーザー名 ID。末尾の text は、このリクエストが PostText API リクエストである (PostContent API リクエストではない) ことを示しています。

      • リクエストボディ – ユーザー入力 (inputText) と空の sessionAttributes が含まれています。

    2. inputText から、Amazon Lex はインテント (MakeAppointment) を検出します。サービスによって、コードフックとして設定されている Lambda 関数が呼び出され、以下のイベントが渡されることで初期化および検証が実行されます。詳細については、「入力イベントの形式」を参照してください。

      { "currentIntent": { "slots": { "AppointmentType": null, "Date": null, "Time": null }, "name": "MakeAppointment", "confirmationStatus": "None" }, "bot": { "alias": null, "version": "$LATEST", "name": "ScheduleAppointment" }, "userId": "bijt6rovckwecnzesbthrr1d7lv3ja3n", "invocationSource": "DialogCodeHook", "outputDialogMode": "Text", "messageVersion": "1.0", "sessionAttributes": {} }

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

      • currentIntent – 現在のインテントの情報を提供しています。

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

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

    3. この時点では、すべてのスロット値は null です (検証する対象はありません)。Lambda 関数は、以下のレスポンスを Amazon Lex に返して、AppointmentType スロットの情報を引き出すようにサービスに指示します。レスポンスの形式については、「レスポンスの形式」を参照してください。

      { "dialogAction": { "slotToElicit": "AppointmentType", "intentName": "MakeAppointment", "responseCard": { "genericAttachments": [ { "buttons": [ { "text": "cleaning (30 min)", "value": "cleaning" }, { "text": "root canal (60 min)", "value": "root canal" }, { "text": "whitening (30 min)", "value": "whitening" } ], "subTitle": "What type of appointment would you like to schedule?", "title": "Specify Appointment Type" } ], "version": 1, "contentType": "application/vnd.amazonaws.card.generic" }, "slots": { "AppointmentType": null, "Date": null, "Time": null }, "type": "ElicitSlot", "message": { "content": "What type of appointment would you like to schedule?", "contentType": "PlainText" } }, "sessionAttributes": {} }

      このレスポンスには、dialogAction フィールドと sessionAttributes フィールドが含まれています。特に、dialogAction フィールドでは以下のフィールドが返されています。

      • type – このフィールドを ElicitSlot に設定することで、Lambda 関数は、slotToElicit フィールドで指定しているスロットの値を引き出すように Amazon Lex に指示しています。Lambda 関数は、ユーザーに伝えるメッセージである message も提供しています。

      • responseCardAppointmentType スロットで使用可能な値のリストを特定しています。レスポンスカードをサポートしているクライアント (例えば、Facebook Messenger) では、ユーザーが予約タイプを選択できるレスポンスカードが次の画像のように表示されます。

        
                                            スケジュールの予約の種類と、クリーニング (30 分)、根管 (60 分)、ホワイトニング (30 分) の 3 つの選択肢を尋ねるレスポンスカード。
    4. Lambda 関数からのレスポンス内の dialogAction.type で示されているように、Amazon Lex は以下のレスポンスをクライアントに返します。

      
                                    予約を行うインテントと引き出す予約タイプスロットに関する情報を含む JSON レスポンス。

      クライアントはレスポンスを読み取り、「どのタイプを予約なさいますか?」のメッセージと レスポンスカード (クライアントでサポートされている場合) を表示します。

  2. ユーザー: ユーザーにはクライアントに応じて 2 つの選択肢があります。

    • レスポンスカードが表示されている場合は、[root canal (60 分)] あるいはタイプ root canal を選択します。

    • クライアントでレスポンスカードがサポートされていない場合は、「root canal」と入力します。

    1. クライアントは以下の PostText リクエスト (読みやすいように改行が追加されています) を Amazon Lex に送信します。

      POST /bot/BookTrip/alias/$LATEST/user/bijt6rovckwecnzesbthrr1d7lv3ja3n/text "Content-Type":"application/json" "Content-Encoding":"amz-1.0" { "inputText": "root canal", "sessionAttributes": {} }
    2. Amazon Lex は以下のイベントをパラメータとして送信することで、ユーザーデータの検証のために Lambda 関数を呼び出します。

      { "currentIntent": { "slots": { "AppointmentType": "root canal", "Date": null, "Time": null }, "name": "MakeAppointment", "confirmationStatus": "None" }, "bot": { "alias": null, "version": "$LATEST", "name": "ScheduleAppointment" }, "userId": "bijt6rovckwecnzesbthrr1d7lv3ja3n", "invocationSource": "DialogCodeHook", "outputDialogMode": "Text", "messageVersion": "1.0", "sessionAttributes": {} }

      イベントデータで次の点に注意してください。

      • invocationSourceDialogCodeHook のままです。このステップではユーザーデータを検証しているだけです。

      • Amazon Lex は AppointmentType スロットの currentIntent.slots フィールドを root canal に設定します。

      • Amazon Lex はクライアントと Lambda 関数の間で sessionAttributes フィールドを渡すだけです。

    3. Lambda 関数はユーザー入力を検証し、予約日付の値を引き出すようにサービスに指示する、以下のレスポンスを Amazon Lex に返します。

      { "dialogAction": { "slotToElicit": "Date", "intentName": "MakeAppointment", "responseCard": { "genericAttachments": [ { "buttons": [ { "text": "2-15 (Wed)", "value": "Wednesday, February 15, 2017" }, { "text": "2-16 (Thu)", "value": "Thursday, February 16, 2017" }, { "text": "2-17 (Fri)", "value": "Friday, February 17, 2017" }, { "text": "2-20 (Mon)", "value": "Monday, February 20, 2017" }, { "text": "2-21 (Tue)", "value": "Tuesday, February 21, 2017" } ], "subTitle": "When would you like to schedule your root canal?", "title": "Specify Date" } ], "version": 1, "contentType": "application/vnd.amazonaws.card.generic" }, "slots": { "AppointmentType": "root canal", "Date": null, "Time": null }, "type": "ElicitSlot", "message": { "content": "When would you like to schedule your root canal?", "contentType": "PlainText" } }, "sessionAttributes": {} }

      ここでも、レスポンスに dialogAction フィールドと sessionAttributes フィールドが含まれています。特に、dialogAction フィールドでは以下のフィールドが返されています。

      • type – このフィールドを ElicitSlot に設定することで、Lambda 関数は、slotToElicit フィールドで指定しているスロットの値を引き出すように Amazon Lex に指示しています。Lambda 関数は、ユーザーに伝えるメッセージである message も提供しています。

      • responseCardDate スロットで使用可能な値のリストを特定しています。レスポンスカードをサポートしているクライアント (例えば、Facebook Messenger) では、次の画像のように、ユーザーが予約日付を選択できるレスポンスカードが表示されます。

        
                                            根管と 3 つの選択肢: 2-15、2-16、2-17 をスケジュールする日付を示すレスポンスカード。

        Lambda 関数は 5 つの日付を返していますが、このクライアント (Facebook Messenger) ではレスポンスカードのボタンが 3 つまでに制限されています。そのため、スクリーンショットでは最初の 3 つの値だけが表示されています。

        これらの日付は Lambda 関数でハードコードされています。本稼働アプリケーションでは、カレンダーを使用して、予約可能な日付をリアルタイムで取得できます。日付は動的であるため、Lambda 関数でレスポンスカードを動的に生成する必要があります。

    4. Amazon Lex は dialogAction.type に気づき、Lambda 関数のレスポンスからの情報を含む次のレスポンスをクライアントに返します。

      
                                    予約のインテント、入力された予定の種類、および予約日を示すメッセージを含む JSON レスポンス。

      クライアントには、「When would you like to schedule your root canal?」(root canal をいつ予約しますか ?) というメッセージ とレスポンスカード (クライアントでレスポンスカードがサポートされている場合) が表示されます。

  3. ユーザー: タイプ Thursday

    1. クライアントは以下の PostText リクエスト (読みやすいように改行が追加されています) を Amazon Lex に送信します。

      POST /bot/BookTrip/alias/$LATEST/user/bijt6rovckwecnzesbthrr1d7lv3ja3n/text "Content-Type":"application/json" "Content-Encoding":"amz-1.0" { "inputText": "Thursday", "sessionAttributes": {} }
    2. Amazon Lex は以下のイベントでパラメータとして送信して、ユーザーデータの検証のために Lambda 関数を呼び出します。

      { "currentIntent": { "slots": { "AppointmentType": "root canal", "Date": "2017-02-16", "Time": null }, "name": "MakeAppointment", "confirmationStatus": "None" }, "bot": { "alias": null, "version": "$LATEST", "name": "ScheduleAppointment" }, "userId": "u3fpr9gghj02zts7y5tpq5mm4din2xqy", "invocationSource": "DialogCodeHook", "outputDialogMode": "Text", "messageVersion": "1.0", "sessionAttributes": {} }

      イベントデータで次の点に注意してください。

      • invocationSourceDialogCodeHook のままです。このステップではユーザーデータを検証しているだけです。

      • Amazon Lex は Date スロットの currentIntent.slots フィールドを 2017-02-16 に設定します。

      • Amazon Lex はクライアントと Lambda 関数の間で sessionAttributes を渡すだけです。

    3. Lambda 関数はユーザー入力を検証します。今回は、Lambda 関数は指定された日付に予約可能な時間がないと判断します。この関数は、予約日付の値を再度引き出すようにサービスに指示する、以下のレスポンスを Amazon Lex に返します。

      { "dialogAction": { "slotToElicit": "Date", "intentName": "MakeAppointment", "responseCard": { "genericAttachments": [ { "buttons": [ { "text": "2-15 (Wed)", "value": "Wednesday, February 15, 2017" }, { "text": "2-17 (Fri)", "value": "Friday, February 17, 2017" }, { "text": "2-20 (Mon)", "value": "Monday, February 20, 2017" }, { "text": "2-21 (Tue)", "value": "Tuesday, February 21, 2017" } ], "subTitle": "When would you like to schedule your root canal?", "title": "Specify Date" } ], "version": 1, "contentType": "application/vnd.amazonaws.card.generic" }, "slots": { "AppointmentType": "root canal", "Date": null, "Time": null }, "type": "ElicitSlot", "message": { "content": "We do not have any availability on that date, is there another day which works for you?", "contentType": "PlainText" } }, "sessionAttributes": { "bookingMap": "{\"2017-02-16\": []}" } }

      ここでも、レスポンスに dialogAction フィールドと sessionAttributes フィールドが含まれています。特に、dialogAction では以下のフィールドが返されています。

      • dialogAction field:

        • type – Lambda 関数はこの値を ElicitSlot に設定し、slotToElicit フィールドを Date にリセットします。Lambda 関数は、ユーザーに伝える適切なメッセージである message も提供しています。

        • responseCardDate スロットの値のリストを返します。

      • sessionAttributes – 今回は、Lambda 関数は bookingMap セッション属性を含めています。その値は、要求された予約日付と予約可能な時間です (オブジェクトが空の場合は、予約可能な時間がないことを表します)。

    4. Amazon Lex は dialogAction.type に気づき、Lambda 関数のレスポンスからの情報を含む次のレスポンスをクライアントに返します。

      
                                    予約をするインテントを示す JSON レスポンスと、カスタマーが希望した日に空きがないことを明確にするメッセージ。

      クライアントは「We do not have any availability on that date, is there another day which works for you?」(その日付では空きがありません。ご都合がよい別の日はありますか ?)のメッセージとレスポンスカード (クライアントでレスポンスカードがサポートされている場合) が表示されます。

  4. ユーザー: ユーザーにはクライアントに応じて 2 つの選択肢があります。

    • レスポンスカードが表示されている場合は、[2-15 (Wed)] を選択するか、「Wednesday」と入力します。

    • クライアントでレスポンスカードがサポートされていない場合は、「Wednesday」と入力します。

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

      POST /bot/BookTrip/alias/$LATEST/user/bijt6rovckwecnzesbthrr1d7lv3ja3n/text "Content-Type":"application/json" "Content-Encoding":"amz-1.0" { "inputText": "Wednesday", "sessionAttributes": { } }

      注記

      Facebook Messenger クライアントではセッション属性は設定されません。リクエスト間のセッションステータスを保持する場合は、Lambda 関数内でこれを実行する必要があります。実際のアプリケーションでは、これらのセッション属性をバックエンドデータベースで保持する必要があります。

    2. Amazon Lex は以下のイベントをパラメータとして送信することで、ユーザーデータの検証のために Lambda 関数を呼び出します。

      { "currentIntent": { "slots": { "AppointmentType": "root canal", "Date": "2017-02-15", "Time": null }, "name": "MakeAppointment", "confirmationStatus": "None" }, "bot": { "alias": null, "version": "$LATEST", "name": "ScheduleAppointment" }, "userId": "u3fpr9gghj02zts7y5tpq5mm4din2xqy", "invocationSource": "DialogCodeHook", "outputDialogMode": "Text", "messageVersion": "1.0", "sessionAttributes": { } }

      Amazon Lex は currentIntent.slots スロットを Date に設定することで 2017-02-15 を更新します。

    3. Lambda 関数はユーザー入力を検証し、予約時刻の値を引き出すように指示する、以下のレスポンスを Amazon Lex に返します。

      { "dialogAction": { "slots": { "AppointmentType": "root canal", "Date": "2017-02-15", "Time": "16:00" }, "message": { "content": "What time on 2017-02-15 works for you? 4:00 p.m. is our only availability, does that work for you?", "contentType": "PlainText" }, "type": "ConfirmIntent", "intentName": "MakeAppointment", "responseCard": { "genericAttachments": [ { "buttons": [ { "text": "yes", "value": "yes" }, { "text": "no", "value": "no" } ], "subTitle": "Is 4:00 p.m. on 2017-02-15 okay?", "title": "Confirm Appointment" } ], "version": 1, "contentType": "application/vnd.amazonaws.card.generic" } }, "sessionAttributes": { "bookingMap": "{\"2017-02-15\": [\"10:00\", \"16:00\", \"16:30\"]}" } }

      ここでも、レスポンスに dialogAction フィールドと sessionAttributes フィールドが含まれています。特に、dialogAction では以下のフィールドが返されています。

      • dialogAction field:

        • typeLambda 関数はこの値を ConfirmIntent に設定して、message で提示している予約時刻をユーザーに確認するように Amazon Lex に指示します。

        • responseCard – ユーザーが選択できる「はい/いいえ」の値のリストを返します。クライアントでレスポンスカードがサポートされている場合、クライアントはそのレスポンスカードを以下の例のように表示します。

          
                                                    予約の確認と 2 つのオプション (「はい」と「いいえ」) が記載されたレスポンスカード。
      • sessionAttributes - Lambda 関数は bookingMap セッション属性を設定し、その値を予約日付とその日の予約可能な時間に設定します。この例では、予約時間は 30 分間です。1 時間かかる root canal の場合、予約できるのは 午後 4 時だけです。

    4. Lambda 関数のレスポンス内の dialogAction.type で示されているように、Amazon Lex は以下のレスポンスをクライアントに返します。

      
                                    予約のインテントが示され、すべての枠が埋まっていることを示す JSON レスポンス。

      クライアントは次のメッセージを表示します。2017 年 2 月 15 日は何時が都合がよろしいでしょうか?午後 4 時しか空いていませんがよろしいですか?

  5. ユーザー : [yes] を選択し ます。

    Amazon Lex は以下のイベントデータを使用して Lambda 関数を呼び出します。ユーザーが「yes」と応答しているため、confirmationStatusConfirmedTime に設定し、Amazon Lex の currentIntent.slots フィールドを 4 p.m に設定します。

    { "currentIntent": { "slots": { "AppointmentType": "root canal", "Date": "2017-02-15", "Time": "16:00" }, "name": "MakeAppointment", "confirmationStatus": "Confirmed" }, "bot": { "alias": null, "version": "$LATEST", "name": "ScheduleAppointment" }, "userId": "u3fpr9gghj02zts7y5tpq5mm4din2xqy", "invocationSource": "FulfillmentCodeHook", "outputDialogMode": "Text", "messageVersion": "1.0", "sessionAttributes": { } }

    confirmationStatus が確認済みであるため、Lambda 関数はインテント (歯科予約) を処理し、以下のレスポンスを Amazon Lex に返します。

    { "dialogAction": { "message": { "content": "Okay, I have booked your appointment. We will see you at 4:00 p.m. on 2017-02-15", "contentType": "PlainText" }, "type": "Close", "fulfillmentState": "Fulfilled" }, "sessionAttributes": { "formattedTime": "4:00 p.m.", "bookingMap": "{\"2017-02-15\": [\"10:00\"]}" } }

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

    • Lambda 関数が sessionAttributes を更新しています。

    • dialogAction.typeClose に設定されていて、ユーザーの応答を想定しないことを Amazon Lex に指示しています。

    • dialogAction.fulfillmentStateFulfilled に設定されていて、インテントの達成が完了したことを示しています。

    クライアントに次のメッセージを表示します。あなたの予約が完了しました。2017 年 2 月 15 日の午後 4 時にお待ちしています。