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

メッセージの管理

ボットを作成する際に、クライアントに送信したい明確メッセージや情報メッセージを設定できます。次の例を考えます。

  • 次の明確化プロンプトをボットに設定できます。

    I don't understand. What would you like to do?

    Amazon Lex は、ユーザーのインテントを理解できない場合に、このメッセージをクライアントに送信します。

     

  • OrderPizza というインテントをサポートするボットを作成するとします。ピザの注文では、ピザのサイズ、トッピング、クラストタイプなどの情報を指定するようにユーザーに求めます。以下のプロンプトを設定することもできます。

    What size pizza do you want? What toppings do you want? Do you want thick or thin crust?

    Amazon Lex はユーザーのインテントがピザの注文であると判断すると、これらのメッセージをクライアントに送信してユーザーから情報を取得します。

このセクションでは、ボットの設定でユーザーのやり取りをデザインする方法について説明します。

メッセージのタイプ

メッセージはプロンプトまたはステートメントにすることができます。

  • 通常、プロンプトは質問でユーザーからのレスポンスを期待します。

  • ステートメントは情報を表示します。これはレスポンスを期待しません。

メッセージにはスロットとセッション属性の参照を含むことができます。実行時に、Amazon Lex は、これらの参照を実際の値で置き換えます。

設定されたスロット値を参照するには、次の構文を使用します。

{SlotName}

セッション属性を参照するには、次の構文を使用します。

[AttributeName]

メッセージにはスロット値とセッション属性の両方を含めることができます。

たとえば、次のメッセージをボットの OrderPizza インテントに設定したとします。

"Hey [FirstName], your {PizzaTopping} pizza will arrive in [DeliveryTime] minutes."

このメッセージでは、スロット (PizzaTopping) とセッション属性 (FirstNameDeliveryTime) の両方が参照されています。実行時に、Amazon Lex はこれらのプレースホルダを値に置き換えて、次のメッセージをクライアントに返します。

"Hey John, your cheese pizza will arrive in 30 minutes."

メッセージに角括弧 ([]) または中括弧 ({}) を入れるには、バックスラッシュ (\) のエスケープ文字を使用します。たとえば、次のメッセージには中括弧と角括弧が含まれています。

\{Text\} \[Text\]

クライアントアプリケーションに返されたテキストは次のようになります。

{Text} [Text]

セッション属性の詳細については、ランタイム API オペレーションの PostText および PostContent を参照してください。例については、「ボットの例: BookTrip」を参照してください。

Lambda 関数は、メッセージを生成して Amazon Lex に返し、ユーザーに送信することもできます。インテントの設定時に Lambda 関数を追加すると、メッセージを動的に作成できます。ボットの設定時にメッセージを指定すると、Lambda 関数でプロンプトを構築する必要がなくなります。

メッセージの設定のコンテキスト

ボットを作成する場合、ボットの明確化プロンプト、スロット値のプロンプト、インテントからのメッセージなど、異なるコンテキストでメッセージを作成することができます。Amazon Lex は各コンテキストで適切なメッセージを選択してユーザーに戻します。各コンテキストにメッセージのグループを指定することができます。その場合は、Amazon Lex がグループから 1 つのメッセージをランダムに選択します。メッセージの形式を指定したり、メッセージをグループにまとめることもできます。詳細については、「サポートされているメッセージ形式」を参照してください。

インテントと関連付けている Lambda 関数がある場合は、構築時に設定したメッセージをどれでも上書きできます。ただし、こうしたメッセージを使用する上で Lambda 関数は必須ではありません。

ボットメッセージ

ボットに明確化プロンプトおよび中断メッセージを設定できます。実行時にユーザーのインテントを理解できない場合、Amazon Lex は明確化プロンプトを使用します。中断メッセージを提示して中断する前に、Amazon Lex が明確化をリクエストする回数を設定することができます。次のように、Amazon Lex コンソールの [Error Handling] セクションでボットレベルのメッセージを設定できます。

API で clarificationPromptabortStatement フィールドを設定してメッセージを設定します。このフィールドは PutBot オペレーションにあります。

インテントで Lambda 関数を使用する場合は、Lambda 関数がユーザーのインテントを尋ねるために Amazon Lex に向けたレスポンスを戻す場合があります。Lambda 関数がそうしたメッセージを提供しない場合は、Amazon Lex が明確化プロンプトを使用します。

スロットプロンプト

インテントの必須スロットのそれぞれに少なくとも 1 つのプロンプトメッセージを指定する必要があります。実行時に、Amazon Lex はこれらのメッセージのいずれかを使用して、スロットの値を指定することをユーザーに求めます。次は、cityName スロットに対する有効なプロンプトの例です。

Which city would you like to fly to?

コンソールを使用して各スロットの 1 つまたは複数のプロンプトを設定できます。プロンプトのグループは、PutIntent オペレーションを使用して作成することもできます。詳細については、「メッセージグループ」を参照してください。

レスポンス

コンソールで [Responses] セクションを使用し、ボットに動的で柔軟性の高い会話を構築することができます。レスポンスに 1 つ以上のメッセージグループを作成することができます。実行時に Amazon Lex は各メッセージグループからメッセージを 1 つ選ぶことでレスポンスを構築します。メッセージグループの詳細については、メッセージグループ を参照してください。

たとえば、最初のメッセージグループに「初めまして」、「こんにちは」、「ようこそ」といったように異なる応答メッセージを含めることができます。2 番目のメッセージグループには「私は予約ボットです」や「これは予約ボットです」といった異なる紹介メッセージを含めることもできます。3 番目のメッセージグループでは「レンタカーとホテルの予約をお手伝いします」、「レンタカーやホテルを予約することができます」、「レンタカーやホテルの予約をお手伝いできます」といったボットの通信機能を利用することができます。

Lex は各メッセージグループのメッセージを使用して、会話のレスポンスを動的に構築します。たとえば、次の例をご覧ください。

別の例をご覧ください。

どちらの場合も、ユーザーは BookCarBookHotel などで新しいインテントを使用して応答することができます。

レスポンスでフォローアップの質問をするようにボットをセットアップできます。たとえば、前述のインタラクションでは「レンタカーやホテルの予約をお手伝いしましょうか?」、「今すぐ予約を入れますか?」、「他にお手伝いできることはありますか?」といった質問を追加して 4 番目のメッセージを作成することもできます。レスポンスとして「いいえ」が含まれるメッセージには、フォローアップのプロンプトを作成できます。以下に例を示します。

フォローアップのプロンプトを作成するには [Wait for user reply] を選択します。次に、メッセージを入力またはユーザーが「いいえ」と回答した場合に送信する複数のメッセージを入力します。フォローアップのプロンプトとして使用するレスポンスを作成する場合は、回答が「いいえ」だった場合に適切なステートメントを特定する必要があります。以下に例を示します。

API を使用してインテントに応答を追加するには、PutIntent オペレーションを使用します。レスポンスを特定するには [conclusionStatement] フィールドを PutIntent リクエストで設定します。フォローアップのプロンプトを設定するには、[followUpPrompt] フィールドを設定します。これにはユーザーが「いいえ」と回答した場合に送信するステートメントを含めてください。[conclusionStatement] フィールドと [followUpPrompt] フィールドの両方を同じインテントで設定することはできません。

サポートされているメッセージ形式

PostText オペレーションを使用する場合、または PostContent オペレーションを使用する場合に Accept ヘッダーを text/plain;charset=utf8 に設定している場合、Amazon Lex は次の形式でメッセージをサポートします。

  • PlainText—メッセージには UTF-8 形式テキストが含まれています。

  • SSML— メッセージには音声出力のテキスト形式が含まれています。

  • CustomPayload— メッセージにはクライアント用に作成したカスタム形式が含まれています。アプリケーションのニーズを満たすようにペイロードを定義することができます。

  • Composite— メッセージは各メッセージグループから 1 つずつ取り出したメッセージを集約したものです。メッセージグループの詳細については、メッセージグループ を参照してください。

デフォルトでは、Amazon Lex が特定のプロンプトに定義されているメッセージのうち 1 つを返します。たとえば、スロット値を引き出すために 5 つのメッセージを定義した場合、Amazon Lex はランダムにいずれかのメッセージを選びクライアントに返します。

Amazon Lex がランタイムリクエストでクライアントに指定のメッセージタイプを返すには、x-amzn-lex:accept-content-typesリクエストパラメーターを設定します。レスポンスはリクエストされたタイプに制限されます。指定したタイプのメッセージが複数ある場合は、Amazon Lex がランダムに 1 つ返します。x-amz-lex:accept-content-types ヘッダーの詳細については「レスポンスタイプの設定」を参照してください。

メッセージグループ

メッセージグループは特定のプロンプトに対する一連の適切なレスポンスです。ボットに会話のレスポンスを動的に構築させるにはメッセージグループを使用します。Amazon Lex がクライアントアプリケーションにレスポンスを返すと、各グループからメッセージを 1 つランダムに選択します。各レスポンスで最大 5 件のメッセージを作成できます。各グループには最大 5 件のメッセージを含めることができます。コンソールでメッセージグループを作成する例については「レスポンス」を参照してください。

メッセージグループを作成するには、コンソール、PutBotPutIntent または PutSlotType オペレーションを使用してメッセージにグループ数を割り当てることができます。メッセージグループを作成しない場合やメッセージグループを 1 つだけ作成した場合、Amazon Lex は [Message] フィールドでメッセージを 1 件送信します。コンソールでメッセージグループを複数作成した場合、または PutIntent オペレーションを使用してインテントを作成または更新したメッセージグループを複数作成した場合に限り、クライアントアプリケーションはレスポンスで複数のメッセージを受け取ります。

Amazon Lex がグループからメッセージを送信すると、レスポンスの [Message] フィールドにはメッセージを含むエスケープした JSON オブジェクトがあります。次の例は複数のメッセージを含む [Message] フィールドのコンテンツを示しています。

注記

このファイルは、読みやすいようにフォーマットされています。レスポンスに改行 (CR) は含まれていません。

{\"messages\":[ {\"type\":\"PlainText\",\"group\":0,\"value\":\"Plain text\"}, {\"type\":\"SSML\",\"group\":1,\"value\":\"SSML text\"}, {\"type\":\"CustomPayload\",\"group\":2,\"value\":\"Custom payload\"} ]}

メッセージの形式を設定できます。形式は次のいずれかになります。

  • プレーンテキスト—UTF-8 形式テキストのメッセージです。

  • SSML—音声合成マークアップ言語 (SSML) のメッセージです。

  • CustomPayload—指定したカスタム警視のメッセージです。

PostContentPostText オペレーションが [Message] フィールドで返すメッセージの形式を管理するには、x-amz-lex:accept-content-types リクエストの属性を設定します。たとえば次のようにヘッダーを設定すると、レスポンスでプレーンテキストと SSML メッセージのみを受信するようになります。

x-amz-lex:accept-content-types: PlainText,SSML

特定のメッセージ形式をリクエストし、メッセージグループにその形式のメッセージが含まれていない場合は NoUsableMessageException 例外を受信します。メッセージグループを使用してタイプ別にメッセージをグループ化する場合は、x-amz-lex:accept-content-types ヘッダーを使用しないでください。

x-amz-lex:accept-content-types ヘッダーの詳細については「レスポンスタイプの設定」を参照してください。

レスポンスカード

レスポンスカードにはプロンプトに対する適切なレスポンスの一連が含まれています。レスポンスカードを使用すると、ユーザーとのやり取りが簡素化され、テキストのやり取りで入力ミスが減り、ボットの精度が向上します。Amazon Lex からクライアントアプリケーションに送信される各プロンプトに対して、レスポンスカードを送信できます。レスポンスカードは、Facebook Messenger、Slack、Twilio、および独自のクライアントアプリケーションで使用できます。

たとえば、タクシーアプリケーションで、レスポンスカードに「自宅」のオプションを設定し、その値としてユーザーの自宅の住所を設定できます。このオプションをユーザーが選択すると、Amazon Lex では入力テキストとして住所全体を受け取ります。

 レスポンスカードの例。

レスポンスカードは以下のプロンプトに対して定義できます。

  • 結論ステートメント

  • 確認プロンプト

  • フォローアッププロンプト

  • 拒否ステートメント

  • スロットタイプ発話

プロンプトごとに 1 つレスポンスカードのみ定義できます。

レスポンスカードは、インテントを作成するときに設定します。コンソールまたは PutIntent オペレーションを使用して静的レスポンスカードを構築時に定義できます。または、Lambda 関数でランタイムに動的レスポンスを定義できます。静的レスポンスカードと動的レスポンスカードの両方を定義すると、動的レスポンスカードが優先されます。

Amazon Lex は、クライアントが理解する形式でレスポンスカードを送信します。レスポンスカードは、Facebook Messenger、Slack、Twilio に応じて変換されます。その他のクライアントの場合、Amazon Lex は PostText レスポンスで JSON 構造を送信します。たとえば、クライアントが Facebook Messenger である場合、Amazon Lex はレスポンスカードを一般テンプレートに変換します。Facebook Messenger の一般テンプレートの詳細については、Facebook ウェブサイトの「一般テンプレート」を参照してください。JSON 構造の例については、「レスポンスカードの動的な生成」を参照してください。

レスポンスカードは、PostText オペレーションでのみ使用できます。レスポンスカードを PostContent オペレーションで使用することはできません。

静的レスポンスカードの定義

静的レスポンスカードは、インテントの作成時に PutBot オペレーションまたは Amazon Lex コンソールで定義します。静的レスポンスカードはインテントと同時に定義されます。静的レスポンスカードはレスポンスが固定されているときに使用します。たとえば、風味のスロットがあるインテントのボットを作成するとします。風味のスロットを定義する場合、次のコンソールのスクリーンショットに示すようなプロンプトを指定します。

 コンソールのインテントエディタ。

プロンプトを定義する場合は、必要に応じてレスポンスカードを関連付け、PutBot オペレーションまたは Amazon Lex コンソール (次の例を参照) で詳細を定義できます。

 レスポンスカードエディタを示すコンソール。

ここで、ボットを Facebook Messenger と統合したとします。ユーザーは、次の図に示すように、ボタンをクリックして風味を選択できます。

 Facebook Messenger でのレスポンスカード。

レスポンスカードのコンテンツをカスタマイズするには、セッション属性を参照できます。実行時に、Amazon Lex は、これらの参照をセッション属性の該当する値に置き換えます。詳細については、「セッション属性の設定」を参照してください。例については、「例: レスポンスカードの使用」を参照してください。

レスポンスカードの動的な生成

レスポンスカードをランタイムに動的に生成するには、インテントで初期化および検証の Lambda 関数を使用します。動的レスポンスカードは、Lambda 関数でレスポンスがランタイムに確定される場合に使用します。Lambda 関数は、ユーザー入力に応答してレスポンスカードを生成し、それをレスポンスの「dialogAction」セクションで返します。詳細については、「レスポンスの形式」を参照してください。

Lambda 関数内の responseCard エレメントを示す部分は以下のとおりです。これにより、前のセクションで示したようなユーザーエクスペリエンスが生成されます。

responseCard: { "version": 1, "contentType": "application/vnd.amazonaws.card.generic", "genericAttachments": [ { "title": "What Flavor?", "subtitle": "What flavor do you want?", "imageUrl": "Link to image", "attachmentLinkUrl": "Link to attachment", "buttons": [ { "text": "Lemon", "value": "lemon" }, { "text": "Raspberry", "value": "raspberry" }, { "text": "Plain", "value": "plain" } ] } ] }

例については、「ボットの例: ScheduleAppointment」を参照してください。