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



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

スロット値の収集、確認用のコードを単純化するには、ダイアログモデルを作成します。このモデルでは、必須のスロットと、スロット値を収集し確認するためのプロンプトを指定します。これらのプロンプトをユーザーとのダイアログで使用するには、受け取るIntentRequestに対して、Dialog.Delegateディレクティブで応答します。Alexaは、ダイアログの次の手順を判断し、適切なプロンプトを使用してユーザーに情報を求めます。

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

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

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

ダイアログのシナリオの詳細については、ユーザーとの会話の管理についてを参照してください。

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

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

プロンプトと発話を定義してこれらの値を収集します。ユーザーとのダイアログでこれらのプロンプトと発話を使用するには、Dialog.Delegateディレクティブを返します。

セクション 説明

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の音声プロンプトユーザーの発話セクションに入力します。

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

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

プロンプトのセットを定義して、この確認をユーザーから取得します。ユーザーとのダイアログでこれらのプロンプトを使用するには、Dialog.Delegateディレクティブを返します。

セクション 説明

Alexaの音声プロンプト

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

プロンプトのセットを定義して、この確認をユーザーから取得します。ユーザーとのダイアログでこれらのプロンプトを使用するには、Dialog.Delegateディレクティブを返します。

セクション 説明

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

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

Dialog.Delegateディレクティブを返すときに、Alexaはスロット順序を使用してダイアログの次の手順を決めます。

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

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

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

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

{
  "interactionModel": {
    "dialog": {
      "intents": [
        {
          "name": "PlanMyTrip",
          "confirmationRequired": true,
          "prompts": {
            "confirmation": "Confirm.Intent.1096343369896"
          },
          "slots": [
            {
              "name": "travelDate",
              "type": "AMAZON.DATE",
              "confirmationRequired": false,
              "elicitationRequired": true,
              "prompts": {
                "elicitation": "Elicit.Slot.924477721275.367201351270"
              }
            },
            {
              "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}から出発とおっしゃいましたか?"
          }
        ]
      }
    ]
  }
}