サポート終了通知: 2025 年 9 月 15 日、 AWS は Amazon Lex V1 のサポートを終了します。 V1 2025 年 9 月 15 日以降、Amazon Lex V1 コンソールまたは Amazon Lex V1 リソースにアクセスできなくなります。Amazon Lex V2 を使用している場合は、代わりに Amazon Lex V2 ガイドを参照してください。
翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
この演習では、Amazon Lex コンソールで提供されているテストウィンドウクライアントを使用して、Amazon Lex の BookTrip ボットと会話しました。このセクションでは次の項目について説明します。
-
クライアントと Amazon Lex の間のデータフロー。
このセクションでは、クライアントが
PostText
ランタイム API を使用して Amazon Lex にリクエストを送信することを前提としていて、それに応じてリクエストとレスポンスの詳細を示しています。PostText
ランタイム API の詳細については、「PostText」を参照してください。注記
クライアントが
PostContent
API を使用する場合の、クライアントと Amazon Lex の間の情報フローの例については、「ステップ 2a (オプション): 音声による情報フローの詳細を確認する (コンソール) 」を参照してください。 -
Amazon Lex と Lambda 関数の間のデータフロー。詳細については、「Lambda 関数の入力イベントとレスポンスの形式」を参照してください。
データフロー: BookHotel インテント
このセクションでは、各ユーザー入力の後に何が起こるかを説明します。
-
ユーザー:「ホテルの予約」
-
クライアント (コンソール) は以下の PostText リクエストを Amazon Lex に送信します。
POST /bot/
BookTrip
/alias/$LATEST
/user/wch89kjqcpkds8seny7dly5x3otq68j3
/text "Content-Type":"application/json" "Content-Encoding":"amz-1.0" { "inputText":"book a hotel", "sessionAttributes":{} }リクエストの URI と本文の両方で Amazon Lex に情報が提供されています。
-
リクエスト URI – ボット名 (BookTrip)、ボットのエイリアス ($LATEST)、およびユーザー名が提供されています。末尾の
text
では、これがPostText
API リクエストである (PostContent
ではない) ことが示されています。 -
リクエストボディ – ユーザー入力 (
inputText
) と空のsessionAttributes
が含まれています。これは最初は空のオブジェクトであり、Lambda 関数によって最初にセッション属性が設定されます。
-
-
Amazon Lex は
inputText
からインテント (BookHotel) を検出します。このインテントには、ユーザーデータの初期化/検証を行うためのコードフックとして Lambda 関数が設定されています。したがって、Amazon Lex は以下の情報をイベントパラメータ (「入力イベントの形式」を参照) として渡して Lambda 関数を呼び出します。{ "messageVersion":"1.0", "invocationSource":"DialogCodeHook", "userId":"wch89kjqcpkds8seny7dly5x3otq68j3", "sessionAttributes":{ }, "bot":{ "name":"BookTrip", "alias":null, "version":"$LATEST" }, "outputDialogMode":"Text", "currentIntent":{ "name":"BookHotel", "slots":{ "RoomType":null, "CheckInDate":null, "Nights":null, "Location":null }, "confirmationStatus":"None" } }
クライアントによって送信された情報に加えて、Amazon Lex はまた、以下の追加データも含めます。
-
messageVersion
– 現在 Amazon Lex でサポートしているのは 1.0 バージョンだけです。 -
invocationSource
– Lambda 関数呼び出しの目的を示しています。この場合は、ユーザーデータの初期化および検証を実行することが目的です (この時点で、Amazon Lex はインテントを達成するためのスロットデータの一部をユーザーが指定していないことを知っています)。 -
currentIntent
– すべてのスロット値は null に設定されています。
-
-
この時点では、すべてのスロット値は null です。Lambda 関数が検証する対象はありません。Lambda 関数は以下のレスポンスを Amazon Lex に返します。レスポンスの形式については、「レスポンスの形式」を参照してください。
{ "sessionAttributes":{ "currentReservation":"{\"ReservationType\":\"Hotel\",\"Location\":null,\"RoomType\":null,\"CheckInDate\":null,\"Nights\":null}" }, "dialogAction":{ "type":"Delegate", "slots":{ "RoomType":null, "CheckInDate":null, "Nights":null, "Location":null } } }
注記
-
currentReservation
– Lambda 関数はこのセッション属性を含めます。この値は、現在のスロット情報と予約タイプのコピーです。これらのセッション属性を更新できるのは Lambda 関数とクライアントだけであり、Amazon Lex はこれらの値を渡すだけです。
-
dialogAction.type
– この値をDelegate
に設定すると、Lambda 関数は次の一連のアクションの責任を Amazon Lex に委任します。Lambda 関数は、ユーザーデータの検証で何かを検出すると、次に何をするかを Amazon Lex に指示します。
-
-
Amazon Lex は
dialogAction.type
に従って次の一連のアクションを判断します。つまり、ユーザーからLocation
スロットに対するデータを引き出します。このスロットにプロンプトメッセージの 1 つ (「どの都市に滞在しますか?」) をインテント設定に応じて選択し、ユーザーに次のレスポンスを送信します。セッション属性がクライアントに渡されます。
クライアントはレスポンスを読み取り、そのメッセージ (「どの都市に滞在されますか?」) を表示します。
-
-
ユーザー:「モスクワ」
-
クライアントは以下の
PostText
リクエスト (読みやすいように改行が追加されています) を Amazon Lex に送信します。POST /bot/
BookTrip
/alias/$LATEST
/user/wch89kjqcpkds8seny7dly5x3otq68j3
/text "Content-Type":"application/json" "Content-Encoding":"amz-1.0" { "inputText":"Moscow", "sessionAttributes":{ "currentReservation":"{\"ReservationType\":\"Hotel\", \"Location\":null, \"RoomType\":null, \"CheckInDate\":null, \"Nights\":null}" } }クライアントは、
inputText
に加えて、受信したのと同じcurrentReservation
セッション属性を含めます。 -
Amazon Lex はまず、現在のインテントのコンテキストの
inputText
を解釈します (このサービスではLocation
スロットに関する情報を特定のユーザーに求めていたことが記憶されています)。現在のインテントのスロット値を更新し、以下のイベントを使用して Lambda 関数を呼び出します。{ "messageVersion": "1.0", "invocationSource": "DialogCodeHook", "userId": "wch89kjqcpkds8seny7dly5x3otq68j3", "sessionAttributes": { "currentReservation": "{\"ReservationType\":\"Hotel\",\"Location\":null,\"RoomType\":null,\"CheckInDate\":null,\"Nights\":null}" }, "bot": { "name": "BookTrip", "alias": null, "version": "$LATEST" }, "outputDialogMode": "Text", "currentIntent": { "name": "BookHotel", "slots": { "RoomType": null, "CheckInDate": null, "Nights": null, "Location": "Moscow" }, "confirmationStatus": "None" } }
注記
-
invocationSource
はDialogCodeHook
のままです。このステップではユーザーデータを検証しているだけです。 -
Amazon Lex はセッション属性を Lambda 関数に渡すだけです。
-
currentIntent.slots
については、Amazon Lex はLocation
スロットをMoscow
に更新しています。
-
-
Lambda 関数は、ユーザーデータの検証を実行し、
Moscow
は無効な場所であると判断します。注記
この演習の Lambda 関数には、有効な都市の単純なリストがあり、
Moscow
はそのリストに存在しません。本稼働アプリケーションでは、この情報の取得にバックエンドデータベースを使用できます。この関数は、スロット値を null にリセットし、以下のレスポンスを送信して、ユーザーに別の場所を指定し直すように求めることを Amazon Lex に指示します。
{ "sessionAttributes": { "currentReservation": "{\"ReservationType\":\"Hotel\",\"Location\":\"Moscow\",\"RoomType\":null,\"CheckInDate\":null,\"Nights\":null}" }, "dialogAction": { "type": "ElicitSlot", "intentName": "BookHotel", "slots": { "RoomType": null, "CheckInDate": null, "Nights": null, "Location": null }, "slotToElicit": "Location", "message": { "contentType": "PlainText", "content": "We currently do not support Moscow as a valid destination. Can you try a different city?" } } }
注記
-
currentIntent.slots.Location
は null にリセットされています。 -
dialogAction.type
はElicitSlot
に設定されています。これにより、以下を指定してユーザーに再入力を求めるように Amazon Lex に指示しています。-
dialogAction.slotToElicit
– ユーザーからデータを引き出すスロット。 -
dialogAction.message
– ユーザーに伝えるメッセージ (message
)。
-
-
-
Amazon Lex は
dialogAction.type
に気づき、以下のレスポンスでその情報をクライアントに渡します。クライアントは、「当社では現在、モスクワは有効な目的地ではありません。別の都市を指定いただけますか?」というメッセージを表示するだけです。
-
-
ユーザー:「シカゴ」
-
クライアント は以下の
PostText
リクエストを Amazon Lex に送信します。POST /bot/
BookTrip
/alias/$LATEST
/user/wch89kjqcpkds8seny7dly5x3otq68j3
/text "Content-Type":"application/json" "Content-Encoding":"amz-1.0" { "inputText":"Chicago", "sessionAttributes":{ "currentReservation":"{\"ReservationType\":\"Hotel\", \"Location\":\"Moscow\", \"RoomType\":null, \"CheckInDate\":null, \"Nights\":null}" } } -
Amazon Lex は、これが
Location
スロットに対して引き出されているデータであるというコンテキストを知っています。このコンテキストでは、inputText
がLocation
スロットに対する値であることを知っています。Amazon Lex は以下のイベントを送信することで Lambda 関数を呼び出します。{ "messageVersion": "1.0", "invocationSource": "DialogCodeHook", "userId": "wch89kjqcpkds8seny7dly5x3otq68j3", "sessionAttributes": { "currentReservation": "{\"ReservationType\":\"Hotel\",\"Location\":Moscow,\"RoomType\":null,\"CheckInDate\":null,\"Nights\":null}" }, "bot": { "name": "BookTrip", "alias": null, "version": "$LATEST" }, "outputDialogMode": "Text", "currentIntent": { "name": "BookHotel", "slots": { "RoomType": null, "CheckInDate": null, "Nights": null, "Location": "Chicago" }, "confirmationStatus": "None" } }
Amazon Lex は
Location
スロットをChicago
に設定して、currentIntent.slots
を更新します。 -
invocationSource
のDialogCodeHook
の値に従って、Lambda 関数はユーザーデータの検証を実行します。この関数は、Chicago
を有効なスロット値として認識し、これに応じてセッション属性を更新して、以下のレスポンスを Amazon Lex に返します。{ "sessionAttributes": { "currentReservation": "{\"ReservationType\":\"Hotel\",\"Location\":\"Chicago\",\"RoomType\":null,\"CheckInDate\":null,\"Nights\":null}" }, "dialogAction": { "type": "Delegate", "slots": { "RoomType": null, "CheckInDate": null, "Nights": null, "Location": "Chicago" } } }
注記
-
currentReservation
– Lambda 関数はLocation
をChicago
に設定して、このセッション属性を更新します。 -
dialogAction.type
-Delegate
に設定されます。ユーザーデータは有効であり、Lambda 関数は、次の一連のアクションを選択するように Amazon Lex に指示します。
-
-
Amazon Lex は
dialogAction.type
に従って次の一連のアクションを選択します。Amazon Lex は、より多くのスロットデータが必要であることを知っているため、インテント設定に従って最も優先度が高い次の未指定スロット (CheckInDate
) を選択します。このスロットにプロンプトメッセージの 1 つ (「何日にチェックインしますか?」) をインテント設定に応じて選択し、クライアントに次のレスポンスを返答として送信します。クライアントは「何日にチェックインされますか?」のメッセージを表示します。
-
-
ユーザーの操作が続行され、ユーザーがデータを提供し、Lambda 関数がデータを検証して次の一連のアクションを Amazon Lex に委任します。最終的に、ユーザーはすべてのスロットデータを提供し、Lambda 関数はすべてのユーザー入力を検証し、Amazon Lex はすべてのスロットデータがそろっていることを認識します。
注記
この演習では、ユーザーがすべてのスロットデータを提供すると、Lambda 関数はホテル予約の価格を計算し、それを別のセッション属性 (
currentReservationPrice
) として返します。この時点で、このインテントが達成される準備ができていますが、BookHotel インテントでは、Amazon Lex がインテントを達成する前にユーザーの確認を必要とする確認プロンプトが設定されています。したがって、Amazon Lex は、ホテルを予約する前に確認をリクエストする以下のメッセージをクライアントに送信します。
クライアントは「かしこまりました。シカゴでの 2016 年 12 月 18 日から 5 泊の滞在を承りました」のメッセージを表示します。この内容で予約いたしましょうか?」
-
ユーザー:「はい」
-
クライアント は以下の
PostText
リクエストを Amazon Lex に送信します。POST /bot/
BookTrip
/alias/$LATEST
/user/wch89kjqcpkds8seny7dly5x3otq68j3
/text "Content-Type":"application/json" "Content-Encoding":"amz-1.0" { "inputText":"Yes", "sessionAttributes":{ "currentReservation":"{\"ReservationType\":\"Hotel\", \"Location\":\"Chicago\", \"RoomType\":\"queen\", \"CheckInDate\":\"2016-12-18\", \"Nights\":\"5\"}", "currentReservationPrice":"1195" } } -
Amazon Lex は、現在のインテントの確認のコンテキストで
inputText
を解釈して、Amazon Lex はユーザーが予約を進めることを望んでいることを理解しています。Amazon Lex は今回は、以下のイベントを送信して Lambda 関数を呼び出し、インテントを達成します。このイベントでinvocationSource
をFulfillmentCodeHook
に設定することで、Amazon Lex は Lambda 関数に送信します。Amazon Lex はまた、confirmationStatus
からConfirmed
に設定します。{ "messageVersion": "1.0", "invocationSource": "FulfillmentCodeHook", "userId": "wch89kjqcpkds8seny7dly5x3otq68j3", "sessionAttributes": { "currentReservation": "{\"ReservationType\":\"Hotel\",\"Location\":\"Chicago\",\"RoomType\":\"queen\",\"CheckInDate\":\"2016-12-18\",\"Nights\":\"5\"}", "currentReservationPrice": "956" }, "bot": { "name": "BookTrip", "alias": null, "version": "$LATEST" }, "outputDialogMode": "Text", "currentIntent": { "name": "BookHotel", "slots": { "RoomType": "queen", "CheckInDate": "2016-12-18", "Nights": "5", "Location": "Chicago" }, "confirmationStatus": "Confirmed" } }
注記
-
invocationSource
– Amazon Lex は今回はこの値をFulfillmentCodeHook
に設定して、インテントを達成するように Lambda 関数に指示しています。 -
confirmationStatus
-Confirmed
に設定されます。
-
-
Lambda 関数は今回は BookHotel インテントを達成し、Amazon Lex は予約を完了して、次のレスポンスを返します。
{ "sessionAttributes": { "lastConfirmedReservation": "{\"ReservationType\":\"Hotel\",\"Location\":\"Chicago\",\"RoomType\":\"queen\",\"CheckInDate\":\"2016-12-18\",\"Nights\":\"5\"}" }, "dialogAction": { "type": "Close", "fulfillmentState": "Fulfilled", "message": { "contentType": "PlainText", "content": "Thanks, I have placed your reservation. Please let me know if you would like to book a car rental, or another hotel." } } }
注記
-
lastConfirmedReservation
– Lambda 関数が追加した新しいセッション属性です (currentReservation
やcurrentReservationPrice
ではない)。 -
dialogAction.type
– Lambda 関数はこの値をClose
に設定して、ユーザーの応答を想定しないことを Amazon Lex に示しています。 -
dialogAction.fulfillmentState
–Fulfilled
に設定されていて、ユーザーに伝える適切なメッセージ (message
) が含まれています。
-
-
Amazon Lex は
fulfillmentState
を確認し、以下のレスポンスをクライアントに送信します。注記
-
dialogState
– Amazon Lex はこの値をFulfilled
に設定しています。 -
message
– Lambda 関数が提供したのと同じメッセージです。
クライアントはそのメッセージを表示します。
-
-
データフロー: BookCar インテント
この演習の BookTrip ボットでは 2 つのインテント (BookHotel と BookCar) がサポートされています。ホテルを予約した後に、ユーザーは会話を続行して車を予約できます。セッションがタイムアウトしない限り、それ以降の各リクエストで、クライアントはセッション属性 (この例では、lastConfirmedReservation
) を送信し続けます。Lambda 関数はこの情報を使用して BookCar インテントのスロットデータを初期化できます。この例では、クロスインテント情報共有でのセッション属性の使用方法を示しています。
具体的には、ユーザーが BookCar インテントを選択すると、Lambda 関数ではセッション属性にある関連情報を使用して、BookCar インテントのスロットデータ (PickUpDate、ReturnDate、および PickUpCity) が事前に設定されます。
注記
Amazon Lex コンソールでは、[Clear] (クリア) リンクを使用して以前のセッション属性をクリアできます。
この手順の以下のステップに従って会話を続行します。
-
ユーザー:「車も予約します」
-
クライアント は以下の
PostText
リクエストを Amazon Lex に送信します。POST /bot/
BookTrip
/alias/$LATEST
/user/wch89kjqcpkds8seny7dly5x3otq68j3
/text "Content-Type":"application/json" "Content-Encoding":"amz-1.0" { "inputText":"also book a car", "sessionAttributes":{ "lastConfirmedReservation":""{\"ReservationType\":\"Hotel\", \"Location\":\"Chicago\", \"RoomType\":\"queen\", \"CheckInDate\":\"2016-12-18\", \"Nights\":\"5\"}" } }クライアントは
lastConfirmedReservation
セッション属性を含めます。 -
Amazon Lex は
inputText
からインテント (BookCar) を検出します。このインテントも、Lambda 関数を呼び出して、初期化とユーザーデータの検証を実行するように設定されています。Amazon Lex は以下のイベントを使用して Lambda 関数を呼び出します。{ "messageVersion": "1.0", "invocationSource": "DialogCodeHook", "userId": "wch89kjqcpkds8seny7dly5x3otq68j3", "sessionAttributes": { "lastConfirmedReservation": "{\"ReservationType\":\"Hotel\",\"Location\":\"Chicago\",\"RoomType\":\"queen\",\"CheckInDate\":\"2016-12-18\",\"Nights\":\"5\"}" }, "bot": { "name": "BookTrip", "alias": null, "version": "$LATEST" }, "outputDialogMode": "Text", "currentIntent": { "name": "BookCar", "slots": { "PickUpDate": null, "ReturnDate": null, "DriverAge": null, "CarType": null, "PickUpCity": null }, "confirmationStatus": "None" } }
注記
-
messageVersion
– 現在 Amazon Lex でサポートされているのは 1.0 バージョンだけです。 -
invocationSource
– 呼び出しの目的が初期化とユーザーデータの検証の実行であることを示しています。 -
currentIntent
– インテント名とスロットが含まれています。この時点では、すべてのスロット値は null です。
-
-
Lambda 関数は、すべてのスロット値が null であり、検証する対象がないことに気づきます。ただし、この関数は、セッション属性を使用して一部のスロットデータ (
PickUpDate
、ReturnDate
、およびPickUpCity
) を初期化し、以下のレスポンスを返します。{ "sessionAttributes": { "lastConfirmedReservation": "{\"ReservationType\":\"Hotel\",\"Location\":\"Chicago\",\"RoomType\":\"queen\",\"CheckInDate\":\"2016-12-18\",\"Nights\":\"5\"}", "currentReservation": "{\"ReservationType\":\"Car\",\"PickUpCity\":null,\"PickUpDate\":null,\"ReturnDate\":null,\"CarType\":null}", "confirmationContext": "AutoPopulate" }, "dialogAction": { "type": "ConfirmIntent", "intentName": "BookCar", "slots": { "PickUpCity": "Chicago", "PickUpDate": "2016-12-18", "ReturnDate": "2016-12-22", "CarType": null, "DriverAge": null }, "message": { "contentType": "PlainText", "content": "Is this car rental for your 5 night stay in Chicago on 2016-12-18?" } } }
注記
-
Lambda 関数は、
lastConfirmedReservation
に加えて、より多くのセッション属性 (currentReservation
およびconfirmationContext
) を含めています。 -
ユーザーから「はい/いいえ」の応答が想定されていることを Amazon Lex に通知するために、
dialogAction.type
がConfirmIntent
に設定されています。confirmationContext が AutoPopulate に設定されているため、「はい/いいえ」のユーザー応答が、 関数で実行された初期化 (自動入力されたスロットデータ) に対するユーザーの確認を得るためであることを Lambda 関数はわかっています。また、Lambda 関数は、Amazon Lex がクライアントに返す
dialogAction.message
の情報メッセージをレスポンスに含めています。注記
ConfirmIntent
(dialogAction.type
の値) という用語は、ボットのインテントとは関係ありません。この例では、ユーザーから「はい/いいえ」の応答を得るように Amazon Lex に指示するために、Lambda 関数でこの用語が使用されています。
-
-
dialogAction.type
に従って、Amazon Lex は以下のレスポンスをクライアントに返します。クライアントは「このレンタカーはシカゴでの 2016 年 12 月 18 日から 5 泊の滞在で使用されますか?」のメッセージを表示します。
-
-
ユーザー:「はい」
-
クライアント は以下の
PostText
リクエストを Amazon Lex に送信します。POST /bot/
BookTrip
/alias/$LATEST
/user/wch89kjqcpkds8seny7dly5x3otq68j3
/text "Content-Type":"application/json" "Content-Encoding":"amz-1.0" { "inputText":"yes", "sessionAttributes":{ "confirmationContext":"AutoPopulate", "currentReservation":"{\"ReservationType\":\"Car\", \"PickUpCity\":null, \"PickUpDate\":null, \"ReturnDate\":null, \"CarType\":null}", "lastConfirmedReservation":"{\"ReservationType\":\"Hotel\", \"Location\":\"Chicago\", \"RoomType\":\"queen\", \"CheckInDate\":\"2016-12-18\", \"Nights\":\"5\"}" } } -
Amazon Lex は
inputText
を読み取り、そのコンテキスト (自動入力の確認をユーザーに求めた) を知っています。Amazon Lex は以下のイベントを送信して Lambda 関数を呼び出します。{ "messageVersion": "1.0", "invocationSource": "DialogCodeHook", "userId": "wch89kjqcpkds8seny7dly5x3otq68j3", "sessionAttributes": { "confirmationContext": "AutoPopulate", "currentReservation": "{\"ReservationType\":\"Car\",\"PickUpCity\":null,\"PickUpDate\":null,\"ReturnDate\":null,\"CarType\":null}", "lastConfirmedReservation": "{\"ReservationType\":\"Hotel\",\"Location\":\"Chicago\",\"RoomType\":\"queen\",\"CheckInDate\":\"2016-12-18\",\"Nights\":\"5\"}" }, "bot": { "name": "BookTrip", "alias": null, "version": "$LATEST" }, "outputDialogMode": "Text", "currentIntent": { "name": "BookCar", "slots": { "PickUpDate": "2016-12-18", "ReturnDate": "2016-12-22", "DriverAge": null, "CarType": null, "PickUpCity": "Chicago" }, "confirmationStatus": "Confirmed" } }
ユーザーが「はい」と応答しているため、Amazon Lex は
confirmationStatus
をConfirmed
に設定します。 -
confirmationStatus
によって、Lambda 関数は事前入力された値が正しいことを知っています。Lambda 関数は以下を実行します。-
currentReservation
セッション属性を、事前入力されていたスロット値に更新します。 -
dialogAction.type
をElicitSlot
に設定します。 -
slotToElicit
の値をDriverAge
に設定します。
以下の応答が送信されます。
{ "sessionAttributes": { "currentReservation": "{\"ReservationType\":\"Car\",\"PickUpCity\":\"Chicago\",\"PickUpDate\":\"2016-12-18\",\"ReturnDate\":\"2016-12-22\",\"CarType\":null}", "lastConfirmedReservation": "{\"ReservationType\":\"Hotel\",\"Location\":\"Chicago\",\"RoomType\":\"queen\",\"CheckInDate\":\"2016-12-18\",\"Nights\":\"5\"}" }, "dialogAction": { "type": "ElicitSlot", "intentName": "BookCar", "slots": { "PickUpDate": "2016-12-18", "ReturnDate": "2016-12-22", "DriverAge": null, "CarType": null, "PickUpCity": "Chicago" }, "slotToElicit": "DriverAge", "message": { "contentType": "PlainText", "content": "How old is the driver of this car rental?" } } }
-
-
Amazon Lex は以下のレスポンスを返します。
クライアントは「このレンタカーを運転される方の年齢を教えていただけますか?」のメッセージを表示します。会話が続行されます。
-