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

情報フローの詳細

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

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

     

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

    注記

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

     

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

注記

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

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

  1. ユーザー: 「予約します」と入力する。

    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) では、ユーザーが予約タイプを選択できるレスポンスカードが次のように表示されます。

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

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

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

    • レスポンスカードが表示されている場合は、[root canal (60 min)] を選択するか、「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 は currentIntent.slots スロットの AppointmentType フィールドを 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) では、ユーザーが予約日付を選択できるレスポンスカードが表示されます。

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

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

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

      クライアントに、[When would you like to schedule your 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 は currentIntent.slots スロットの Date フィールドを 2017-02-16 に設定します。

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

    3. Lambda 関数はユーザー入力を検証します。今回は、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 関数のレスポンスからの情報を含むレスポンスをクライアントに返します。

      クライアントに、[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 は Date スロットを 2017-02-15 に設定することで currentIntent.slots を更新します。

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

      • sessionAttributes – Lambda 関数は bookingMap セッション属性を設定し、その値を予約日付とその日の予約可能な時間に設定します。この例では、予約時間は 30 分間です。1 時間かかる root canal の場合、予約できるのは 午後 4 時だけです。

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

      クライアントに、What time on 2017-02-15 works for you? 4:00 p.m. is our only availability, does that work for you?] というメッセージが表示されます。

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

    Amazon Lex は以下のイベントデータを使用して Lambda 関数を呼び出します。ユーザーが「yes」と応答しているため、Amazon Lex は confirmationStatusConfirmed に設定し、currentIntent.slots Time フィールドを 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 に設定されていて、インテントの達成が完了したことを示しています。

    クライアントに、[Okay, I have booked your appointment. We will see you at 4:00 p.m. on 2017-02-15] というメッセージが表示されます。