サポート終了通知: 2025 年 9 月 15 日、 AWS は Amazon Lex V1 のサポートを終了します。 V1 2025 年 9 月 15 日以降、Amazon Lex V1 コンソールまたは Amazon Lex V1 リソースにアクセスできなくなります。Amazon Lex V2 を使用している場合は、代わりに Amazon Lex V2 ガイドを参照してください。
翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
ステップ 5 (オプション): 情報フローの詳細を確認する (コンソール)
このセクションでは、各ユーザー入力に対する、クライアントと Amazon Lex の間の情報のフローについて、Lambda 関数の統合も含めて説明します。
注記
このセクションでは、クライアントが PostText ランタイム API を使用して Amazon Lex にリクエストを送信することを前提としていて、それに応じてリクエストとレスポンスの詳細を示しています。クライアントが PostContent API を使用する場合の、クライアントと Amazon Lex の間の情報フローの例については、「ステップ 2a (オプション): 音声による情報フローの詳細を確認する (コンソール) 」を参照してください。
PostText ランタイム API、および以下のステップで示しているリクエストとレスポンスに関するその他の詳細については、「PostText」を参照してください。
-
ユーザー: 「花を注文したい」
-
クライアント (コンソール) は以下の 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では、これがPostTextAPI リクエストである (PostContentではない) ことが示されています。 -
リクエストボディ – ユーザー入力 (
inputText) と空のsessionAttributesが含まれています。クライアントが最初のリクエストを行うときにはセッション属性はありません。Lambda 関数は後でセッション属性を使用します。
-
-
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 に設定されています。
-
-
この時点では、すべてのスロット値は 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 に指示します。それについては以下のステップで説明します。
-
-
dialogAction.typeに従って、Amazon Lex は次の一連のアクションを決定します。どのスロットも入力されていないため、FlowerTypeスロットの値を引き出すことを決定します。値を引き出すプロンプトの 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は空のままです。 -
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" } }次の点に注意してください:
-
invocationSource–DialogCodeHookのままです (ユーザーデータを検証しているだけです)。 -
currentIntent.slots– Amazon Lex はFlowerTypeスロットを「バラ」に更新しています。
-
-
invocationSourceのDialogCodeHookの値に従って、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 に指示します。
-
-
dialogAction.typeに従って、Amazon Lex は次の一連のアクションを選択します。Amazon Lex は、より多くのスロットデータが必要であることを知っているため、インテント設定に従って最も優先度が高い次の未指定スロット (PickupDate) を選択します。Amazon Lex は、このスロットにプロンプトメッセージの 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でユーザー入力が提供され、クライアントはセッション属性をサービスに返します。 -
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 は
currentIntent.slotsの値を設定することで、PickupDateを更新しています。また、サービスによってsessionAttributesがそのまま Lambda 関数に渡されています。 -
invocationSourceのDialogCodeHookの値に従って、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 に指示します。
-
-
dialogAction.typeに従って、Amazon Lex は次の一連のアクションを選択します。Amazon Lex は、より多くのスロットデータが必要であることを知っているため、インテント設定に従って最も優先度が高い次の未指定スロット (PickupTime) を選択します。Amazon Lex はプロンプトのメッセージ (「2017 年 1 月 5 日の何時にバラを配達いたしましょうか?」) のいずれかを選択し、 以下のレスポンスをクライアントに送信します。
クライアントはレスポンス内のメッセージ (「2017 年 1 月 5 日の何時にバラを配達いたしましょうか?」) を表示します。
-
-
ユーザー: 「午後 4 時」
-
クライアント は以下の 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を渡します。 -
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 は
currentIntent.slotsの値を設定することで、PickupTimeを更新しています。 -
invocationSourceのDialogCodeHookの値に従って、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 に指示します。
-
-
この時点で、Amazon Lex はすべてのスロットデータがそろっていることを知っています。このインテントには確認プロンプトが設定されています。そのため、Amazon Lex は、インテントを達成する前にユーザーの確認を求める以下のレスポンスを送信します。
クライアントはレスポンス内のメッセージをそのまま表示し、ユーザーの応答を待ちます。
-
-
ユーザー: 「はい」
-
クライアント は以下の 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" } } -
Amazon Lex は、現在のインテントの確認のコンテキストで
inputTextを解釈して、Amazon Lexは、注文を進めることをユーザーが望んでいることを理解します。Amazon Lex は今回は、以下のイベントを送信することで、インテントを達成するために Lambda 関数を呼び出します。Lambda 関数に送信するイベントでinvocationSourceをFulfillmentCodeHookに設定しています。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 関数に指示しています。 -
confirmationStatus–Confirmedに設定されます。
-
-
今回、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) が含まれています。
-
-
Amazon Lex は
fulfillmentStateを確認し、以下のレスポンスをクライアントに返します。Amazon Lex は以下のメッセージをクライアントに返しています。
以下の点に注意してください。
-
dialogState– Amazon Lex はこの値をfulfilledに設定しています。 -
message– Lambda 関数が提供したのと同じメッセージです。
クライアントはそのメッセージを表示します。
-
-
-
ここで、ボットをもう一度テストします。新しい (ユーザー) コンテキストを確立するには、テストウィンドウの [Clear] リンクを選択します。ここでは、
OrderFlowersインテントに対して無効なスロットデータを指定します。Lambda 関数は今回は、データ検証を実行し、無効なスロットデータ値を null にリセットし、有効なデータをユーザーに求めるように Amazon Lex に依頼します。例えば、以下のことを試してみます。-
花の種類として「Jasmine」 (サポートされている花の種類ではない)
-
花をピックアップする日付として「昨日」
-
注文した後で、注文の確認に対して「はい」と応答する代わりに、花の種類を入力します。それに対して、Lambda 関数は、花の注文の現在の合計はそのままにして、セッション属性内の
Priceを更新します。
Lambda 関数はフルフィルメントアクティビティも実行します。
-
次のステップ
ステップ 6: インテント設定を更新して発話を追加する (コンソール)