カスタムスロットタイプのエンティティ解決


カスタムスロットタイプのエンティティ解決

Alexaは、エンティティ解決を使ってユーザー発話のスロット値を1つの既知のエンティティに解決します。カスタムスロットタイプの場合、これらのエンティティ、その識別子、エンティティに解決する同義語を定義します。

エンティティ解決の詳細については、エンティティ解決を参照してください。

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

カスタムスロットタイプの場合、IDと同義語を固定し、カスタムスロットタイプの値をエンティティとして定義することができます。ユーザーがスキルにリクエストを出すと、Alexaは発話内のスロット値を定義されたエンティティに解決しようとします。エンティティ解決が成功すると、スキルはユーザーの言った実際の値と考えられる既知のエンティティの配列を受け取ります。配列内の考えられるエンティティにはそれぞれ、エンティティの標準名と固有の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",
  "requestId": "amzn1.echo-api.request.1",
  "locale": "ja-JP",
  "timestamp": "2021-01-15T21:25:48Z",
  "intent": {
    "name": "GetMediaIntent",
    "confirmationStatus": "NONE",
    "slots": {
      "MediaType": {
        "name": "MediaType",
        "value": "トラック",
        "resolutions": {
          "resolutionsPerAuthority": [
            {
              "authority": "amzn1.er-authority.echo-sdk.amzn1.ask.skill.1.MEDIA_TYPE",
              "status": {
                "code": "ER_SUCCESS_MATCH"
              },
              "values": [
                {
                  "value": {
                    "name": "曲",
                    "id": "SONG"
                  }
                }
              ]
            }
          ]
        },
        "confirmationStatus": "NONE",
        "source": "USER",
        "slotValue": {
          "type": "Simple",
          "value": "トラック",
          "resolutions": {
            "resolutionsPerAuthority": [
              {
                "authority": "amzn1.er-authority.echo-sdk.amzn1.ask.skill.1.MEDIA_TYPE",
                "status": {
                  "code": "ER_SUCCESS_MATCH"
                },
                "values": [
                  {
                    "value": {
                      "name": "曲",
                      "id": "SONG"
                    }
                  }
                ]
              }
            ]
          }
        }
      }
    }
  },
  "dialogState": "STARTED"
}

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

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

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

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

スロットタイプの定義と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": [
            "{MediaTitle} の {MediaType} について教えて",
            "{MediaTitle} という {MediaType} をかけて",
            "{MediaTitle} の {MediaType} をかけて",
            "その他のサンプル発話"
          ]
        }
      ],
      "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"
                  }
                }
              ]
            }
          ]
        },
        "slotValue": {
          "type": "Simple",
          "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"
                  }
                }
              ]
            }
          ]
        },
        "slotValue": {
          "type": "Simple",
          "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"
              }
            }
          ]
        }
      ]
    },
    "slotValue": {
      "type": "Simple",
      "value": "トラック",
      "resolutions": {
        "resolutionsPerAuthority": [
          {
            "authority": "amzn1.er-authority.echo-sdk.<skill_id>.MEDIA_TYPE",
            "status": {
              "code": "ER_SUCCESS_MATCH"
            },
            "values": [
              {
                "value": {
                  "name": "曲",
                  "id": "SONG"
                }
              }
            ]
          }
        ]
      }
    }
  }
}


このページは役に立ちましたか?

最終更新日: 2021 年 08 月 31 日