あなたのAlexaダッシュボード 設定

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

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

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

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

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

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

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

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

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

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

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

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

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

同義語と固有IDは、任意のカスタムスロットタイプ、または拡張可能な標準スロットタイプに対して定義することができます。同義語とIDを作成するには、スキルビルダー(ベータ版)を使用する必要があります。

スキルビルダー(ベータ版)では、タイプを編集するときに、各スロット値にIDと同義語を定義することができます。別の方法として、コードエディターを使用して、JSONに含まれるこれらの値を表示して編集することもできます。

スキルビルダー(ベータ版)でスロットタイプの値とIDを編集する

  1. スキルビルダーで、カスタムスロットタイプを追加または編集します。左側のナビゲーションの「スロットタイプ(Slot Types)」領域からタイプを選択します。
  2. 通常通り、スロット値を追加します。
  3. 値の「ID」列をクリックし、そのIDを編集します。
  4. 値の「Synonyms」列をクリックして同義語を入力し、正符号をクリックするか、Enterを押して保存します。

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

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

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

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

コードエディターで変更を加えた場合は、必ず「変更を適用(Apply Changes)」をクリックして、開発中のモデルを更新してください。その後、テストする前に保存してビルドします。

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

実例については、後述するスロットタイプの定義と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": "song",
                    "id": "曲"
                  }
                }
              ]
            }
          ]
        }
      }
    }
  }
}

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

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

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

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

標準スロットタイプのエンティティ解決

Alexa Skills Kitは、標準スロットタイプの大規模なライブラリを提供しています。標準タイプを使用すると、サンプル値を自分で作成する必要がないため、モデルを簡略化できます。

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

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

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

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

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

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

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

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

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

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

{
  "toCity": {
    "name": "toCity",
    "value": "シカゴ",
    "resolutions": {
      "resolutionsPerAuthority": [
        {
          "authority": "amzn1.er-authority.echo-sdk.<skill-id>.AMAZON.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のサンプル

次の例では、2つのカスタムスロットタイプを定義するJSONを紹介します。 MEDIA_TYPEMEDIA_TITLEです。

[
  {
    "name": "MEDIA_TYPE",
    "version": 2,
    "values": [
      {
        "id": "ALBUM",
        "name": {
          "value": "アルバム",
          "synonyms": ["シーディー","エルピー","レコード"]
        }
      },
      {
        "id": "SONG",
        "name": {
          "value": "曲",
          "synonyms": ["トラック","シングル","チューン"]
        }
      },
      {
        "id": "VIDEO",
        "name": {
          "value": &ミュージックビデオ",
          "synonyms": ["ビデオ"]
        }
      }
    ]
  },
  {
    "name": "MEDIA_TITLE",
    "version": 2,
    "values": [
      {
        "id": "song_id_123",
        "name": {
          "value": "レイ オブ ライト",
          "synonyms": ["レイ オブ ライ","レイ オブ ライツ","レイ"]
        }
      },
      {
        "id": "song_id_456",
        "name": {
          "value": "ローリング イン ザ ディープ",
          "synonyms": ["ローリング ディープ","イン ザ ディープ"]
        }
      }
    ]
  }
]

上のスロット定義を使用すると、次のようなインテントスキーマを定義することができます。

{
  "intents": [
    {
      "intent": "GetMediaIntent",
      "slots": [
        {
          "name": "MediaType",
          "type": "MEDIA_TYPE"
        },
        {
          "name": "MediaTitle",
          "type": "MEDIA_TITLE"
        }
      ]
    }
  ]
}

このインテントに対するサンプル発話には、通常通り次のようなスロット名を含めます。

GetMediaIntent  {MediaTitle}という{MediaType}をかけて
GetMediaIntent  {MediaTitle}の{MediaType}について教えて
(many more)

ユーザーは、次のようにしてこのスキルと対話します。

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

この発話には、両方のスロット(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"
              }
            }
          ]
        }
      ]
    }
  }
}