Amazon Lex V2 を使用している場合は、代わりに Amazon Lex V2 ガイドを参照してください。
Amazon Lex V1 を使用している場合は、ボットを Amazon Lex V2 にアップグレードすることをお勧めします。V1 には新機能を追加されませんので、すべての新しいボットには 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
では、これがPostText
API リクエストである (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: インテント設定を更新して発話を追加する (コンソール)