スロットタイプ値の同義語とIDを定義する(エンティティ解決)



スロットタイプ値の同義語とIDを定義する(エンティティ解決)

エンティティ解決は、開発者が対話モデルで定義したスロットに一致する可能性のあるスロット値を、Alexaがユーザーの発話から検索する方法を改善します。IDと同義語を固定し、カスタムスロットタイプの値をエンティティとして定義することができます。このようにすると、ユーザーがスキルにリクエストを出した場合に、Alexaは、開発者が定義したエンティティの中から発話と一致する可能性のあるスロット値を検索し、その値と同義語を特定します。一致が見つかると、スキルは、エンティティに対して定義された標準値、ユーザーが話した実際の値、および固有IDを取得します。

エンティティ解決は自動的に実行されますが、この機能を十分に活用するには、スロット値の同義語とIDを定義する必要があります。

スロット値の同義語、固有ID、およびエンティティ解決

多くの場合、ユーザーは同じことを言うためにさまざまな語句を使用します。たとえば、特定のメディアタイプを収集するMEDIA_TYPEスロットでは、ユーザーは「楽曲」、「トラック」、または「シングル」と話しかけることができます。多くの場合、この3つの異なる値を同じ方法で処理するようにコードを書くことになります。

これを簡略化するために、スロットタイプの値をエンティティとして定義することができます。エンティティは次のもので構成されます。

  • 可能なスロット値(「曲」など)。これは標準スロット値です。
  • 同義語のオプションリスト(「トラック」や「シングル」など)。同義語は、標準スロット値に結び付けられます。
  • 固有ID(SONGなど)。

Alexaは、これらのエンティティを使用してユーザーの発話を解決します。スキルに送信されるIntentRequestには、スロット値の追加情報が含まれています。

  • ユーザーが話した実際の値。これは、標準値であったり、同義語の1つであったり、一致する別の値であったりします。
  • 一致したエンティティに対して定義されている標準値。
  • 一致したエンティティの固有ID。

コードの中では固有IDを直接使用することができ、そのスロットに対応するものとしてユーザーが話した特定の語句を考慮に入れる必要はありません。たとえば、MEDIA_TYPEスロットタイプの場合、スロット値「曲」はID SONGを持ち、同義語の「トラック」と「シングル」もそうです。 このスロットに対応するものとしてユーザーが「トラック」と話すと、スキルは次のものを受け取ります。

  • 値「トラック」
  • 標準値「曲」
  • ID SONG

また、IntentRequestには、1つのスロットに対して、1つだけではなく、複数の一致が含まれる可能性があることにも注意してください。

カスタムスロットタイプ値の同義語と固有IDの作成

同義語と固有IDは、任意のカスタムスロットタイプ、または拡張可能なビルトインスロットタイプに対して定義することができます。

開発者コンソールで、タイプを編集するときに、各スロット値にIDと同義語を定義することができます。別の方法として、JSONエディターを使用して、JSONに含まれるこれらの値を表示して編集することもできます。

スロットタイプの値とIDを編集する

  1. 開発者コンソールで、カスタムスロットタイプを追加または編集します。左側のナビゲーションのスロットタイプ領域からタイプを選択します。
  2. 通常通り、スロット値を追加します。
  3. ID列をクリックして、値のIDを編集します。
  4. 同義語列をクリックして値に同義語を入力し、「+」記号をクリックするかEnterを押して保存します。

JSONエディターでスロットタイプの値を表示または編集する

JSONエディターを使用して、JSON内のスロットタイプ値のIDと同義語を編集することもできます。たとえば、次のJSONでは、MEDIA_TYPEという名前のカスタムスロットタイプを、2つの値で定義しています。それぞれの値(「アルバム」と「」)には、IDと3つの同義語があります。

{
  "types": [
    {
      "name": "MEDIA_TYPE",
      "values": [
        {
          "id": "SONG",
          "name": {
            "value": "曲",
            "synonyms": ["チューン","シングル","トラック"]
          }
        },
        {
          "id": "ALBUM",
          "name": {
            "value": "アルバム",
            "synonyms": ["レコード","エルピー","シーディー"]
          }
        }
      ]
    }
  ]
}

これらのJSONプロパティの定義については、後述するJSON構文を参照してください。

JSONエディターで変更を加えた場合は、必ずモデルを保存をクリックしてください。その後、モデルをビルドしてからテストします。

カスタムスロットタイプのJSONリファレンス

カスタムスロットタイプ用のJSON形式では、typesプロパティをオブジェクトの配列として指定します。それぞれのオブジェクトはカスタムスロットタイプを表していて、1つのnameと、valuesの配列を含みます。それぞれの値は、次のもので構成されます。

  • 固有ID(id)。
  • 文字列値(name.value)。
  • この値の同義語の配列(name.synonyms[])(任意)。

ユーザーの発話が、値または同義語の1つに対応するものである場合、Alexaはその発話を値に解決し、スキルに送信するIntentRequestにその値を含めます。

スロットタイプ定義の構文:

{
  "types": [
    {
      "name": "string",
      "values": [
        {
          "id": "string",
          "name": {
            "value": "string",
            "synonyms": [
              "string",
              "string"
            ]
          }
        }
      ]
    }
  ]
}

パラメーター 説明 必須
name スロットタイプの名前。英字のみを指定できます。使用できる特殊文字は、アンダースコア(「_」)のみです。 文字列
values スロットタイプの値を定義するオブジェクトの配列。 配列
values[].id スロット値のID。Alexaは、ユーザーの発話の中にスロット値または同義語を認識した場合に、このIDをIntentRequestに含めます。IDにスペースを含めることはできません。 文字列
values[].name この値の名前を表すオブジェクト。このオブジェクトでは、エンティティのテキスト値と同義語を定義します。 オブジェクト
values[].name.synonyms この値の同義語を表す文字列の配列。Alexaは、ユーザーの発話がこれらの同義語の1つであると認識すると、その発話をこの値に解決し、その値の情報をIntentRequestに含めます。 配列
values[].name.value このスロットタイプ値に関連付けられた標準値を含む文字列。たとえば、MEDIA_TYPEスロットタイプの場合であれば、値の1つは「アルバム」となる可能性があります。 文字列

実例については、後述するスロットタイプの定義とIntentRequestのサンプルを参照してください。

IntentRequest内でのスロット値の解決

スキルに送信されるIntentRequestには、スロット値の追加情報が含まれています。追加のプロパティはすべて、intentslotsオブジェクトに含まれます。

先ほどのMEDIA_TYPEスロットタイプの例を続けると、MediaTypeスロットにこのタイプを使用したインテントでは、次のようなIntentRequestが生成されます。

{
  "type": "IntentRequest",
  "intent": {
    "name": "GetMediaIntent",
    "slots": {
      "MediaType": {
        "name": "MediaType",
        "value": "トラック",
        "resolutions": {
          "resolutionsPerAuthority": [
            {
              "authority": "amzn1.er-authority.echo-sdk.<skill_id>.MEDIA_TYPE",
              "status": {
                "code": "ER_SUCCESS_MATCH"
              },
              "values": [
                {
                  "value": {
                    "name": "曲",
                    "id": "SONG"
                  }
                }
              ]
            }
          ]
        }
      }
    }
  }
}

このリクエストに関する説明:

  • slotオブジェクト(MediaType)のvalueプロパティは、ユーザーが話した値を反映しています。上の例では、ユーザーは、SONG値に対して定義された同義語の1つを話しました。
  • resolutionsプロパティには、エンティティ解決の結果が含まれています。これらの結果は、情報源ごとに整理されます。 情報源は、そのスロットに提供されるデータのソースを表しています。カスタムスロットタイプの場合、情報源は、開発者が定義したスロットタイプです。
  • resolutionsPerAuthority内のvalues配列には、一致する可能性のあるスロット値が含まれています。これには、一致する可能性のある各値の標準値(resolutionsPerAuthority[].values[].value.name)と固有ID(resolutionsPerAuthority[].values[].value.id)が含まれます。

IntentRequestプロパティの詳細については、標準IntentRequest定義を参照してください。

実例については、後述するスロットタイプの定義とIntentRequestのサンプルを参照してください。

ビルトインスロットタイプのエンティティ解決

ビルトインスロットタイプをそのまま使用する場合、エンティティ解決は実行されません。ユーザーが話したスロットタイプ値は、namevalue、およびconfirmationStatusプロパティだけを伴ってスキルに送信されます。たとえば、この例のtoCityスロットでは、ビルトインタイプ[AMAZON.US_CITY][us_city]を使用しています(簡潔にするため、ここで紹介するJSONサンプルでは、IntentRequest内の関係するスロットのみを示します)。

ユーザー: アレクサ、トリッププランに私がシカゴに行くことを伝えて

{
  "toCity": {
    "name": "toCity",
    "value": "シカゴ",
    "confirmationStatus": "NONE"
  }
}

ビルトインスロットタイプのサブセットをカスタム値で拡張することができます。スロットタイプを拡張した場合は、エンティティ解決が実行され、スロットのすべての値にresolutionsプロパティが含められます。値には、同義語とカスタムIDを追加できます。

この例では、[AMAZON.US_CITY][us_city]というスロットタイプが拡張されました。「シカゴ」という値を追加し、同義語として「ウィンディシティ(the windy city)」、IDとしてORDを指定しました。

ユーザー: アレクサ、トリッププランに私がウィンディシティに行くことを伝えて

{
  "toCity": {
    "name": "toCity",
    "value": "ウィンディシティ",
    "resolutions": {
      "resolutionsPerAuthority": [
        {
          "authority": "amzn1.er-authority.echo-sdk.<skill_id>.AMAZON.US_CITY",
          "status": {
            "code": "ER_SUCCESS_MATCH"
          },
          "values": [
            {
              "value": {
                "name": "シカゴ",
                "id": "ORD"
              }
            }
          ]
        }
      ]
    },
    "confirmationStatus": "NONE"
  }
}

ここで注目すべきことは、すでにビルトインスロットタイプのデータセットに組み込まれていた値を追加し、独自のIDと同義語を割り当てることができる点です。上の例では、「シカゴ」という値はすでに[AMAZON.US_CITY][us_city]スロットタイプの値に含まれていました。カスタム値として開発者が追加するバージョンは、元の値をオーバーライドするので、resolutionsプロパティにはこの発話に対応するカスタムIDが含まれています。

また、すでに標準タイプのデータセットに含まれている値を、独自の値に対する同義語として追加することもできます。これもまた、元の値をオーバーライドします。たとえば、「ウィンディシティ」というカスタム値を[AMAZON.US_CITY][us_city]に追加し、その値に「シカゴ」という同義語を設定することができます。この場合、「シカゴ」というユーザーの発話について、ユーザーの話した値(「シカゴ」)とカスタム標準値「ウィンディシティ」がスキルに送信されます。

ユーザー: アレクサ、トリッププランに私がシカゴに行くことを伝えて

{
  "toCity": {
    "name": "toCity",
    "value": "シカゴ",
    "resolutions": {
      "resolutionsPerAuthority": [
        {
          "authority": "amzn1.er-authority.echo-sdk.<skill-id>.AMAZON.US_CITY",
          "status": {
            "code": "ER_SUCCESS_MATCH"
          },
          "values": [
            {
              "value": {
                "name": "ウィンディシティ",
                "id": "ORD"
              }
            }
          ]
        }
      ]
    },
    "confirmationStatus": "NONE"
  }
}

ここで、拡張されたビルトインスロットタイプのステータスコード(resolutions.resolutionsPerAuthority[].status.code)の意味は、次の通りです。

  • ユーザーの値がカスタム値または同義語の1つに一致した場合、ステータスコードはER_SUCCESS_MATCHになります。
  • ユーザーの値がそれ以外の値(そのタイプのビルトインデータなど)に一致した場合、ステータスコードはER_SUCCESS_NO_MATCHになります。

ビルトインスロットタイプを拡張する方法の詳細については、ビルトインスロットタイプを拡張して値を追加するを参照してください。拡張可能なタイプのリストについては、拡張可能なスロットタイプを参照してください。

スロットタイプの定義とIntentRequestのサンプル

次の例ではGetMediaIntentインテントと、IDと同義語を含む2つのカスタムスロットタイプ(MEDIA_TYPEMEDIA_TITLE)を表すJSONを紹介します。

{
  "interactionModel": {
    "languageModel": {
      "invocationName": "サンプルスキル",
      "intents": [
        {
          "name": "GetMediaIntent",
          "slots": [
            {
              "name": "MediaType",
              "type": "MEDIA_TYPE"
            },
            {
              "name": "MediaTitle",
              "type": "MEDIA_TITLE"
            }
          ],
          "samples": [
            "{MediaType} {MediaTitle}"について教えて,
            "{MediaTitle}" という {MediaType} をかけて,
            "{MediaType} {MediaTitle}" をかけて,
            "その他のサンプル発話"
          ]
        }
      ],
      "types": [
        {
          "name": "MEDIA_TYPE",
          "values": [
            {
              "id": "VIDEO",
              "name": {
                "value": "ビデオ",
                "synonyms": [
                  "ミュージックビデオ"
                ]
              }
            },
            {
              "id": "SONG",
              "name": {
                "value": "曲",
                "synonyms": [
                  "チューン",
                  "シングル",
                  "トラック"
                ]
              }
            },
            {
              "id": "ALBUM",
              "name": {
                "value": "アルバム",
                "synonyms": [
                  "レコード",
                  "エルピー",
                  "シーディー"
                ]
              }
            }
          ]
        },
        {
          "name": "MEDIA_TITLE",
          "values": [
            {
              "id": "song_id_456",
              "name": {
                "value": "ローリング イン ザ ディープ",
                "synonyms": [
                  "イン ザ ディープ",
                  "ローリング ディープ"
                ]
              }
            },
            {
              "id": "song_id_123",
              "name": {
                "value": "レイ オブ ライト",
                "synonyms": [
                  "レイ",
                  "レイ オブ ライツ",
                  "レイ オブ ライ"
                ]
              }
            }
          ]
        }
      ]
    }
  }
}

ユーザーはたとえば次のようにスキルと対話します。

ユーザー: アレクサ、サンプルスキルを使ってローリングインザディープという曲をかけて

この発話には、両方のスロット(MediaTypeMediaTitle)の値が含まれています。Alexaは、これらの発話を、カスタムスロットタイプで提供されたデータを使用して解決し、次のようなIntentRequestをスキルに送信します。

{
  "type": "IntentRequest",
  "intent": {
    "name": "GetMediaIntent",
    "slots": {
      "MediaType": {
        "name": "MediaType",
        "value": "曲",
        "resolutions": {
          "resolutionsPerAuthority": [
            {
              "authority": "amzn1.er-authority.echo-sdk.<skill_id>.MEDIA_TYPE",
              "status": {
                "code": "ER_SUCCESS_MATCH"
              },
              "values": [
                {
                  "value": {
                    "name": "曲",
                    "id": "SONG"
                  }
                }
              ]
            }
          ]
        }
      },
      "MediaTitle": {
        "name": "MediaTitle",
        "value": "ローリング イン ザ ディープ",
        "resolutions": {
          "resolutionsPerAuthority": [
            {
              "authority": "amzn1.er-authority.echo-sdk.<skill_id>.MEDIA_TITLE",
              "status": {
                "code": "ER_SUCCESS_MATCH"
              },
              "values": [
                {
                  "value": {
                    "name": "ローリング イン ザ ディープ",
                    "id": "song_id_456"
                  }
                }
              ]
            }
          ]
        }
      }
    }
  }
}

エンティティ定義には同義語が含まれているため、ユーザーが少し違った言い回しを使用しても、スキルは類似した結果を受け取ります。

ユーザー: アレクサ、サンプルスキルを使ってローリングインザディープというトラックをかけて

トラックはの同義語として定義されているため、Alexaはこの値を解決して同じIDを提供します(簡潔にするため、この例ではMediaTypeスロットのJSONだけを紹介します)。

{
  "MediaType": {
    "name": "MediaType",
    "value": "トラック",
    "resolutions": {
      "resolutionsPerAuthority": [
        {
          "authority": "amzn1.er-authority.echo-sdk.<skill_id>.MEDIA_TYPE",
          "status": {
            "code": "ER_SUCCESS_MATCH"
          },
          "values": [
            {
              "value": {
                "name": "曲",
                "id": "SONG"
              }
            }
          ]
        }
      ]
    }
  }
}