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

メッセージの管理 (プロンプトとステートメント)

ボットの作成時にボットから送信するメッセージを設定します。次の例を考えます。

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

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

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

     

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

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

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

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

メッセージのタイプ

メッセージは次のように分類できます。

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

  • ステートメント – ステートメントはレスポンスを期待しません。

設定するメッセージに動的コンポーネントを入れることができます。

  • メッセージでは、以下の構文を使用して、Amazon Lex で現在認識されているインテントのスロット値を参照できます。

    {SlotName}
  • メッセージでは、以下の構文を使用してセッション属性を参照できます。

    [AttributeName]

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

実行時に、Amazon Lex は、これらの参照を実際の値で置き換えます。たとえば、次のメッセージをボットの 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"

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

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

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

メッセージは、以下のコンテキストで追加できます。Amazon Lex コンソールまたは構築時 API を使用してボットを設定します。

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

     

    注記

    • インテントのコードフックとして Lambda 関数を設定している場合、その Lambda 関数が、ユーザーのインテントを引き出すように Amazon Lex に指示するレスポンスを返すことがあります。Lambda 関数でユーザーに伝えるメッセージが指定されていない場合、Amazon Lex は設定されている明確化プロンプトを使用します。

       

    • Amazon Lex は、ユーザーが最大許容試行回数以内にプロンプトに対して適切な回答を返さないと、中断ステートメントを使用します。これには、インテント引き出し、スロット引き出し、フォローアッププロンプト、インテント確認に対するレスポンスが含まれます。最大許容試行回数を設定するには、PutBot オペレーションを使用します。または、コンソールの [Error Handling] セクションで指定します。

       

  • インテントレベルのメッセージ – 確認プロンプト、キャンセルステートメント、終了メッセージ、Amazon Lex がスロット値を引き出すために使用できるプロンプトなど、次のスクリーンショットに示すようなインテントレベルのメッセージを設定できます。

     

    • 確認プロンプトとキャンセルステートメント – 必要なすべてのデータをユーザーが指定したら、Amazon Lex は指定されたメッセージを使用して、インテントを達成する前にユーザーに確認を求めます。ユーザーが確認プロンプトに「いいえ」と応答した場合、Amazon Lex はクライアントにキャンセルステートメントを返します。

       

    • 終了メッセージまたはフォローアッププロンプト – インテントを達成するためのコードフックとして Lambda 関数を追加する場合は、これらのメッセージのいずれかをバックアップメッセージとして設定できます。Lambda 関数が成功しても、ユーザーに送信するメッセージを指定していない場合、Amazon Lex は設定されているメッセージを送信します。

       

      • 終了メッセージの例を次に示します。この例では、アプリケーションが DeliveryTime セッション属性を保持するものとします。

        "I have placed your order for pizza. It will arrive in [DeliveryTime] minutes."
      • フォローアッププロンプトの例を次に示します。

        "I have placed your order for pizza. Do you want me to do anything else?".

        フォローアッププロンプトを設定する場合は、キャンセルステートメントも設定する必要があります。フォローアッププロンプトに対するユーザーの応答が「はい」である場合、Amazon Lex はユーザーの確認であると認識し、さらにユーザーのインテント (OrderDrink) を認識して適切な会話を続けます。(例:

        "Yes, I also want to order a drink."

        ユーザーが「いいえ」と応答した場合、Amazon Lex はキャンセルステートメントを送信します。(例:

        "Alright. Let me know if you need anything else."
    • スロット値を引き出すためのプロンプト – インテントの各必須スロットに対して 1 つ以上のプロンプトメッセージを指定する必要があります。実行時に、Amazon Lex はこれらのメッセージのいずれかを使用して、該当するスロットの値を指定することをユーザーに求めます。次は、cityName スロットに対する有効なプロンプトの例です。

      "Which city would you like to fly to?"

    注記

    インテントのコードフックとしての Lambda 関数では、構築時に設定したメッセージをどれでも上書きできます。

特定のコンテキストに対して複数のメッセージを設定できます。実行時に、Amazon Lex は置き換えが最も多いメッセージを選びます。たとえば、OrderPizza インテントでクラストタイプの値を引き出すために、以下に示すように、複数のメッセージを設定できます。

Hey [FirstName], what topping would you like for your {PizzaSize} pizza? Hey [FirstName], what topping would you like for your pizza? What topping would you like? Tell me the topping you would like on your pizza.

この場合、Amazon Lex は以下の順序で選択します。

  • FirstName セッション属性と PizzaSize スロット値の両方が使用可能である場合、Amazon Lex は最初のプロンプトを使用します。

  • FirstName セッション属性が使用可能で、PizzaSize スロット値が使用可能でない場合、Amazon Lex は 2 番目のプロンプトを使用します。

  • セッション属性とスロット値の両方が使用可能でない場合、Amazon Lex は 3 番目または 4 番目のプロンプトをランダムに選択します。

実行時に、Amazon Lex は、未解決のスロット値を参照しているメッセージを無視します。指定コンテキストのすべてのメッセージに未解決の参照がある場合、Amazon Lex は BadRequestException をスローします。参照がないメッセージを少なくても 1 つ持つことをお勧めします。

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

Amazon Lex では、プレーンテキスト形式および音声合成マークアップ言語 (SSML) 形式のメッセージをサポートしています。

出力モードがテキストである場合 (つまり、PostText API オペレーション、または Accept HTTP ヘッダーが text/plain; charset=utf-8 に設定されている PostContent API オペレーションを使用してクライアントがリクエストを送信する場合)、Amazon Lex はプレーンテキストのメッセージのみを選択します。SSML メッセージは無視されます。

注記

  • ボットに SSML メッセージのみを設定している場合、テキストのクライアントがボットと通信すると、Amazon Lex は BadRequestException を返します。コンテキストごとに少なくとも 1 つの PlainText メッセージを提供することをお勧めします。

  • 受信イベントの outputDialogMode がテキストである場合、AWS Lambda 関数から PlainText メッセージを返す必要があります。詳細については、「Lambda 関数の入力イベントとレスポンスの形式」を参照してください。

Amazon Lex は、SSML のオーディオの合成もサポートしています。詳細については、Amazon Polly 開発者ガイドの「SSML の使用」を参照してください。

レスポンスカード

レスポンスカードを使用すると、ユーザーとのやり取りが簡素化され、テキストのやり取りで入力ミスが減り、ボットの精度が向上します。レスポンスカードには一連の適切なレスポンスが含まれており、ユーザーはこれらから選んでプロンプトに応答できます。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」を参照してください。