必要な情報を収集、確認するためにダイアログを定義する



必要な情報を収集、確認するためにダイアログを定義する

ダイアログモデルは、プロンプト、およびスロット値とインテントを修正、検証、確認するユーザーの発話を識別します。ダイアログモデルを使用して、Alexaが会話の中で次の手順を決め、さらに詳しい情報をユーザーに求めることができるようにします。ダイアログをDialog.ElicitSlotなどのDialogディレクティブを使用して手動で管理する場合、ダイアログモデルも精度を向上させます。

ダイアログモデルのコンポーネント

ダイアログモデルには4つのコンポーネントがあります。

  • 必須のスロットとプロンプト: 必須のスロットとは、ユーザーのリクエストを実行するためにスキルに必須の情報のことです。たとえば、PlanMyTripインテントが旅の詳細をリストに保存するためには、少なくとも出発地(fromCity)、目的地(toCity)、日付(travelDate)が必要です。Alexaがスロット値を求める順序を制御することができます。
  • スロットの確認プロンプト: 任意で、必須のスロットを要確認として指定することもできます。これは、次に進む前にユーザーが「はい」または「いいえ」の回答でスロット値を確認する必要があるということです。頻繁に確認を求められるとユーザーは煩わしく感じるかもしれないため、このプロンプトは慎重に使用してください
  • インテントの確認プロンプト: インテント全体で確認を必須と指定することができます。商品を注文したり、予約を行ったりするスキルでよく使われます。このプロンプトは通常、事前に入力されたすべての情報をユーザーに何度も返して、確認できるようにします。このプロンプトもユーザーを煩わせないよう、 慎重に使用する必要があります
  • スロット検証ルールとプロンプト: ユーザーが提供したスロット値が有効であるとして合格する必要のある検証ルール一式を設定できます。値が検証に通らなかった場合は、Alexaはユーザーの作成したプロンプトを使用して、訂正値を求めます。必須のスロットと必須ではないスロットのどちらにもスロット検証ルールを使用できます。

ダイアログモデルには、 ダイアログをAlexaにオートデリゲートするかどうかを示すフラグも含まれています。これにより、Alexaはこれらのプロンプトを使用して、スキルにリクエストを送信する前に、必要なすべての情報をユーザーから収集します。

必須のスロットとプロンプトを指定する

スロットが必須な場合、ユーザーのリクエストを完了する前に、スキルに有効な値を用意しておく必要があります。

プロンプトと発話を定義してこれらの必要なスロット値を収集します。これらのプロンプトと発話を使用して、ユーザーからスロット値を収集するには、ダイアログをAlexaにデリゲートします。

セクション 説明

Alexaの音声プロンプト

Alexaがユーザーにスロット値をたずねる質問です。

  • プロンプトは、この1つのスロットの収集に特化したものとする必要があります。
  • 複数のプロンプトを提供すると、Alexaはランダムに1つを選択します。こうすると人間の会話に近くなります。
  • 会話スタイルを使用してプロンプトを作成します。
  • プロンプトの記述についての一般的なヒントは、 Alexaの話す言葉を参照してください。
  • SSMLを含める場合、プロンプト全体を<speak></speak>タグで囲みます。

fromCityスロットでは、プロンプトは次のようになる可能性があります。

出発地はどこですか?

どこから旅行に出発しますか?

どこから旅行を始めようとお考えですか?

ユーザーの発話

プロンプトで提供される質問に回答するためにユーザーが話す可能性のある発話。

  • Alexaがユーザーにスロットの内容をたずねるとき、サービスはここに指定された応答の発話を聞き取ろうとして音声モデルにバイアスをかけます。これは、Dialog.DelegateDialog.ElicitSlotのいずれかを返すときに発生します。
  • 発話の内容は、質問に対する答え方としてユーザーが最も選びそうなものにしてください。
  • スロット名を識別するには、通常の波括弧({ })のスロット表記を使用します。
  • 周りのテキストを含まない、スロット値だけの発話を組み込むことができます。この場合も、波括弧表記を使用します。

fromCityスロットでは、発話は次のようになると考えられます。

{fromCity}

{fromCity}から出発します

{fromCity}から飛行機で出発します

{fromCity}から旅行に出かけます

{fromCity}から旅行を始めます

上記の例では、fromCityスロットを使用すると次のような会話になります。

ユーザー: アレクサ、トリッププランで、金曜日の旅行を計画したい(この発話には、1つの必須のスロット(travelDate)の値が含まれていますが、fromCitytoCityがありません。)
トリッププラン: 出発地はどこですか?fromCityに対して定義されているAlexaプロンプトの1つ。)
ユーザー: 神戸から出発します

必須のスロットのプロンプトと発話を編集するには、次のようにします。

  1. 左側のナビゲーションで、インテントとそのスロットのリストを見つけ、スロット名をクリックします。

    特定のインテントの詳細ページから開始する場合、サンプル発話の下のインテントスロットを見つけて、ダイアログを編集リンクをクリックします。

  2. スロット入力の下の、このインテントを完了させるために、このスロットは必須ですか?オプションを有効化します。
  3. Alexaの音声プロンプトユーザーの発話セクションに入力します。

スロットの確認を有効にする

スロットの確認が必要な場合、スキルはユーザーが「はい」または「いいえ」でスロット値を確認するよう求める必要があります。

プロンプトのセットを定義して、この確認をユーザーから取得します。ユーザーとのダイアログでこれらのプロンプトを使用するには、ダイアログをAlexaにデリゲートします。

セクション 説明

Alexaの音声プロンプト

Alexaがユーザーにスロット値を確認するための質問です。

  • プロンプトは、この1つのスロットの確認に特化したものとする必要があります。インテント全体の最終確認を行う必要がある場合は、インテントの確認を参照してください。
  • プロンプトはユーザーが「はい」か「いいえ」で回答できるたずね方にする必要があります。
  • 複数のプロンプトを提供すると、Alexaはランダムに1つを選択します。こうすると人間の会話に近くなります。
  • プロンプトのスロット名を波括弧({ })に入れます。プロンプトを話すとき、Alexaはこのトークンを、ユーザーがあらかじめ指定した値で置き換えます。
  • SSMLを含める場合、プロンプト全体を<speak></speak>タグで囲みます。

fromCityスロットでは、確認プロンプトは次のようになる可能性があります。

{fromCity}から出発でよろしいですか?

{fromCity}からの出発と聞こえましたが合っていますか?

{fromCity}から出発とおっしゃいましたか?

旅行は{fromCity}から出発でよろしいでしょうか?

上記の例では、fromCityスロットを使用すると次のような会話になります。

ユーザー: アレクサ、トリッププランで金曜日に神戸から京都への旅行を計画したい(この発話にはすべての必須のスロット(fromCitytoCitytravelDate)が含まれています。)
トリッププラン: 出発地は神戸ですね?fromCityスロット値の確認プロンプトです。)
ユーザー: はい。
対話は続きます…

必須のスロットの確認を有効にするには、次のようにします。

  1. 左側のナビゲーションで、インテントとそのスロットのリストを見つけ、スロット名をクリックします。

    特定のインテントの詳細ページから開始する場合、サンプル発話の下のインテントスロットを見つけて、ダイアログを編集リンクをクリックします。

  2. スロットの確認の下のこのスロットには確認が必要ですか?オプションを有効化します。

  3. Alexaの音声プロンプトセクションにプロンプトを入力します。

インテントの確認を有効にする

インテント全体で確認が必要な場合、スキルはインテントのアクションを「はい」か「いいえ」で確認するようユーザーに求める必要があります。

プロンプトのセットを定義して、この確認をユーザーから取得します。ユーザーとのダイアログでこれらのプロンプトを使用するには、ダイアログをAlexaにデリゲートします。

セクション 説明

Alexaの音声プロンプト

Alexaがユーザーにインテント全体を確認するための質問。

  • プロンプトは、インテント全体の確認に特化したものとする必要があります。
  • プロンプトはユーザーが「はい」か「いいえ」で回答できるたずね方にする必要があります。
  • 複数のプロンプトを提供すると、Alexaはランダムに1つを選択します。こうすると人間の会話に近くなります。
  • すべての必須のスロットを波括弧( { })に入れて、プロンプトに含めます。プロンプトを話すとき、Alexaはこれらのトークンをあらかじめ指定されたスロット値で置き換えます。
  • SSMLを含める場合、プロンプト全体を<speak></speak>タグで囲みます。

PlanMyTripインテントでは、確認プロンプトは次のようになります。

{travelDate}の{fromCity}から{toCity}への旅行を保存します。よろしいですか?

{travelDate}に{fromCity}から{toCity}への旅行でよろしいでしょうか?

{travelDate}の{fromCity}から{toCity}への旅行を保存しますがよろしいでしょうか?

上記の例を使用したPlanMyTripインテントでは、次のような会話になります。

…インテントを呼び出し、ユーザーにfromCitytoCitytravelDateをたずねるやり取りを行いました。

トリッププラン: 4月21日の神戸から京都への旅行を保存します。よろしいでしょうか? (インテントの確認プロンプト)
ユーザー: はい。

インテントの確認を有効にするには、次のようにします。

  1. 左側のナビゲーションでインテントをクリックして、インテントの詳細ページを開きます。
  2. インテントの確認の下で、このインテントには確認が必須ですか?を有効にします。
  3. インテントのAlexaの音声プロンプトに入力します。

検証ルールを定義する

スロット検証では、スロット値の検証ルールを作成できます。Alexaはそれらのルールに違反するユーザー応答をチェックし、入力不可の値が入力された場合は、プロンプトを表示します。

さまざまなタイプのスロットに適応できるルールがいくつかあります。すべてのルールやスロット検証の動作について詳しくは、 スロット値の検証を参照してください。

ユーザーとのダイアログでこれらの検証ルールとプロンプトを使用するには、ダイアログをAlexaにデリゲートします。

検証ルールを作成するには:

  1. 左側のナビゲーションで、インテントとそのスロットのリストを見つけ、スロット名をクリックします。

    または、特定のインテントのページから、サンプル発話の下のインテントスロットセクションでスロットを見つけて、ダイアログを編集リンクをクリックします。

  2. スロットタイプフィールドの下で検証を選択します。
  3. 検証ルールを作成で、使用するルールを選択して「+」記号をクリックします。
    • リストにはスロットのタイプに関連する検証ルールだけが表示されます。
    • ルールの詳細については、検証ルールを参照してください。
  4. 比較対象の値など、ルールに固有の追加フィールドを入力します。これはルールによって異なります。検証ルールを参照してください。
  5. ルールの下に、ユーザーに新しい値を要求するためにAlexaが表示するプロンプトを少なくとも1つ入力します。

    波括弧({ })にスロット名を含めることができます。これにより、Alexaは検証に失敗した値を繰り返して聞き直すことができます。

  6. 対話モデルは必ず保存してビルドしてください。

スキルとインテントのオートデリゲートを有効または無効にする

デリゲートの動作やサンプルについて詳しくは、 Alexaにダイアログをデリゲートするを参照してください。

すべてのスキルには、スキルレベルのオートデリゲート設定があります。このオプションは有効または無効にできます。オートデリゲートは、新しいスキルではデフォルトで有効になっています。

ダイアログモデルのある各インテントには、ダイアログデリゲートのルール設定があります。これは次の3つのオプションのうちいずれかに設定できます:

  • オートデリゲートを有効化:スキル全体のデリゲートルールに関係なく、このインテントにオートデリゲートを使用します。
  • オートデリゲートを無効化:全体のデリゲートルールに関係なく、このインテントにオートデリゲートを使用しません。
  • スキル設定にフォールバック:スキル全体にオートデリゲートを使用します。最初にダイアログモデルをインテントに追加すると、これはそのインテントのデフォルトになります。

インテントのダイアログデリゲートのルール設定は、常にスキルレベルのオートデリゲート設定より優先されます。たとえば、オートデリゲートがスキルで有効になっているが、ダイアログデリゲートのルールが特定のインテントで無効になっている場合は、そのインテントではデリゲートは使用されません。

スキル全体のオートデリゲートオプションを設定する

スキルレベルのオートデリゲートオプションを、使用を予定しているほとんどのインテントに適用する場合は、必要に応じて、インテントレベルでオプションを上書きします。

  1. 開発者コンソールで、ビルド>カスタム>インターフェースに移動します。
  2. オートデリゲートオプションを有効または無効にし、インターフェースをクリックします。必ずモデルをビルドをクリックして対話モデルを再ビルドしてください。

ユーザーの対話モデルのJSONのオートデリゲートオプションを設定することもできます。

スキルレベルのオートデリゲート設定は、ダイアログモデルのないインテントでは無視されます。

インテントに使用するスキルのオートデリゲートルールを上書きする

ダイアログデリゲートのルールオプションは、ダイアログモデルのないインテントでは無効になります。

  1. 左側のナビゲーションでインテントをクリックして、インテントの詳細ページを開きます。
  2. ダイアログデリゲートのルールで、このインテントに使用するルールを選択します。

インテントのユーザーの対話モデルのJSONのオートデリゲートオプションを設定することもできます。

インテントスロットの順序を設定する

Alexaが各必須のスロット値を求める順序を制御することができます。この順序は、インテントの詳細ページのインテントスロットセクションに表示されます。

  1. 左側のナビゲーションで、インテントとそのスロットのリストを見つけ、スロット名をクリックします。
  2. インテントスロットで、スロットの順序を確認します。スロットをドラッグして順序を変更します。

ダイアログをAlexaにデリゲートするときに、Alexaはスロット順序を使用してダイアログの次の手順を決めます。

ダイアログモデルのJSON(対話モデルのスキーマ)

JSONエディタでダイアログモデルのJSON表現の確認や編集ができます。interactionModel.dialog.intentsプロパティには、ダイアログモデルで各インテントのダイアログ設定を表すオブジェクトの配列が含まれます。interactionModel.promptsプロパティには、指定されたプロンプトを表すオブジェクトの配列が含まれます。スロットのユーザーの発話はこの構造には含まれません。発話は、interactionModel.languageModel.intentsの一部として定義されます。

この例では、いくつかの必須スロットのあるPlanMyTripインテントのダイアログとプロンプトを示しています。fromCityスロットもスロットの確認を使用し、インテント全体がインテントの確認を使用します。

簡潔に表現するため、languageModelプロパティは示していません。対話モデルJSONの詳細については、対話モデルのスキーマを参照してください。

{
  "interactionModel": {
    "dialog": {
      "delegationStrategy": "SKILL_RESPONSE",      
      "intents": [
        {
          "name": "PlanMyTrip",
          "delegationStrategy": "ALWAYS",          
          "confirmationRequired": true,
          "prompts": {
            "confirmation": "Confirm.Intent.1096343369896"
          },
          "slots": [
            {
              "name": "travelDate",
              "type": "AMAZON.DATE",
              "confirmationRequired": false,
              "elicitationRequired": true,
              "prompts": {
                "elicitation": "Elicit.Slot.924477721275.367201351270"
              },
              "validations": [
                {
                  "type": "isInDuration",
                  "prompt": "Slot.Validation.792776084863.1060909439418.1047786686510",
                  "start": "P1D",
                  "end": ""
                }
              ]
            },
            {
              "name": "toCity",
              "type": "AMAZON.CITY",
              "confirmationRequired": false,
              "elicitationRequired": true,
              "prompts": {
                "elicitation": "Elicit.Slot.924477721275.885841590425"
              }
            },
            {
              "name": "fromCity",
              "type": "AMAZON.CITY",
              "confirmationRequired": true,
              "elicitationRequired": true,
              "prompts": {
                "confirmation": "Confirm.Slot.186469474087.1029396093044",
                "elicitation": "Elicit.Slot.924477721275.191955839720"
              }
            },
            {
              "name": "travelMode",
              "type": "LIST_OF_TRAVEL_MODES",
              "confirmationRequired": false,
              "elicitationRequired": true,
              "prompts": {
                "elicitation": "Elicit.Slot.924477721275.266137038000"
              }
            },
            {
              "name": "activity",
              "type": "LIST_OF_ACTIVITIES",
              "confirmationRequired": false,
              "elicitationRequired": true,
              "prompts": {
                "elicitation": "Elicit.Slot.924477721275.1297414747229"
              }
            }
          ]
        }
      ]
    },
    "prompts": [
      {
        "id": "Elicit.Slot.924477721275.367201351270",
        "variations": [
          {
            "type": "PlainText",
            "value": "この旅行はいつですか?"
          },
          {
            "type": "PlainText",
            "value": "いつ旅行に行きますか?"
          },
          {
            "type": "PlainText",
            "value": "何日に旅行に行きますか?"
          }
        ]
      },
      {
        "id": "Elicit.Slot.924477721275.885841590425",
        "variations": [
          {
            "type": "PlainText",
            "value": "旅行の行き先を教えてください。"
          },
          {
            "type": "PlainText",
            "value": "旅行先はどちらですか?"
          },
          {
            "type": "PlainText",
            "value": "どちらにお出かけですか?"
          }
        ]
      },
      {
        "id": "Elicit.Slot.924477721275.191955839720",
        "variations": [
          {
            "type": "SSML",
            "value": "<speak><emphasis level='strong'>どこから</emphasis>旅行に出発したいと考えていましたか</speak>"
          },
          {
            "type": "PlainText",
            "value": "どこから旅行に出発しますか?"
          },
          {
            "type": "PlainText",
            "value": "出発地はどこですか?"
          }
        ]
      },
      {
        "id": "Elicit.Slot.924477721275.266137038000",
        "variations": [
          {
            "type": "PlainText",
            "value": "どうやって{toCity}に行きますか?"
          }
        ]
      },
      {
        "id": "Elicit.Slot.924477721275.1297414747229",
        "variations": [
          {
            "type": "PlainText",
            "value": "この旅行ではどんなアクティビティを計画していますか?"
          },
          {
            "type": "PlainText",
            "value": "{toCity}ではどんなことをする予定ですか?"
          }
        ]
      },
      {
        "id": "Confirm.Intent.1096343369896",
        "variations": [
          {
            "type": "PlainText",
            "value": "{travelDate}の{fromCity}から{toCity}への旅行を保存しますがよろしいでしょうか?"
          },
          {
            "type": "PlainText",
            "value": "{travelDate}に{fromCity}から{toCity}への旅行でよろしいでしょうか?"
          },
          {
            "type": "PlainText",
            "value": "{travelDate}の{fromCity}から{toCity}への旅行を保存します。よろしいですか?"
          }
        ]
      },
      {
        "id": "Confirm.Slot.186469474087.1029396093044",
        "variations": [
          {
            "type": "PlainText",
            "value": "旅行は{fromCity}から出発でよろしいでしょうか?"
          },
          {
            "type": "PlainText",
            "value": "{fromCity}からの出発と聞こえましたが合っていますか?"
          },
          {
            "type": "PlainText",
            "value": "{fromCity}から出発でよろしいですか?"
          },
          {
            "type": "PlainText",
            "value": "{fromCity}から出発とおっしゃいましたか?"
          }
        ]
      },
      {
        "id": "Slot.Validation.792776084863.1060909439418.1047786686510",
        "variations": [
          {
            "type": "PlainText",
            "value": "過去の日付の旅行は計画できません。未来の日付を教えてください"
          },
          {
            "type": "PlainText",
            "value": "未来の日付を教えてください"
          }
        ]
      }
    ]
  }
}