スロット値の検証



スロット値の検証

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

スロット検証とは

スロット検証はダイアログモデルの追加コンポーネントで、スキルとユーザーとの会話を管理がしやすくするためのものです。スロット用検証ルールのセットと、スロット値の検証に失敗した場合に使用するプロンプトを設定することができます。

ユーザーの発話がスロットに入力され、ユーザーがダイアログをAlexaにデリゲートしたときに、Alexaはその値がルールに違反していないかどうか確認します。値が検証に通らなかった場合は、Alexaはユーザーの作成したプロンプトを使用して、訂正値を求めます。

たとえば、次のダイアログでは、太陽系の惑星の名前に一致する値だけを受け入れるようカスタマイズされたPlanetスロットに入力しようとしています。

ユーザー: 太陽の天気はどうですか?太陽という値はPlanetスロットでは許可されません。そのため、Alexaは新しい値を要求するプロンプトを出します。)
Alexa: 太陽は太陽系の惑星ではありません。惑星の名前を言ってください。
ユーザー: 了解。火星。火星という値はPlanetスロットで許可された値です)
Alexa: 火星の最高気温は摂氏21度、最低気温は摂氏マイナス126度です。晴れですが、午後ところにより砂嵐となるでしょう。

スロット検証を使用するには、

  1. 必要なスロットについて検証ルールとプロンプトを定義します。これはスキルのダイアログモデルの一部になります。さまざまなタイプのスロットに適応できるルールがいくつかあります。次の項目を参照してください。
  2. スキルをダイアログをAlexaにデリゲートするよう設定します。

検証ルールでスロットを設定する

開発者コンソールで検証ルールとプロンプトを定義できます。または、JSONの対話モデルのスキーマでルールとプロンプトを指定することもできます。

検証ルールを定義するには、

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

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

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

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

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

1つのスロットに複数の検証ルールを使用する

1つのスロットに複数の検証ルールを作成できます。ルールは、開発者コンソールに示された順序、またはJSONでリストされた順序でチェックされます。値がルールに従っていない場合、Alexaは確認を止めて、値を訂正するよう求めるプロンプトを含んだ応答を返します。複数のルールからなるセットでは、先のルールにすべて合格した場合にのみ、後のルールが検証されます。

すなわち、ユーザーのミスに応じて適切な応答をするようにルールを定義できます。たとえば、スキルが惑星の豆知識を提供し、太陽系の惑星でカスタムスロットタイプを使用するとします。単一の検証を使用(スロットタイプの値と同義語のみを受け付ける)し、惑星の名前のみを受け入れるようにして、「{Planet}は惑星ではありません。太陽系の惑星を言ってください」というような一般的なプロンプトを表示することもできます。

しかし、太陽系にある惑星以外の他の天体について質問する場合もあるかもしれません。この一般的なプロンプトを返す代わりに、追加の検証を設定し、一般的な検証を適用する前に特定のプロンプトを使用して、これらの特定の値を拒否(1セットの値のみを拒否)することもできます。たとえば、次のようなルールをPlanetスロットに定義できます。

  • 「太陽」「おひさま」「私たちの太陽」という値からなる1セットの値のみを拒否する。プロンプトは次のようになります。
    • 「太陽は私たちの太陽系の一部ですが、惑星についてのご質問にだけお答えできます。惑星の名前を言ってください」
    • 「太陽に天気はありません。代わりに惑星の名前を言ってください」
    • (Alexaが与えられた値を理解していることを示す同様のプロンプト)
  • スロットタイプの値と同義語のみを受け付ける。プロンプトは次のようになります。
    • {Planet}は惑星ではありません。太陽系の惑星を言ってください。
    • (誤った値を言って聞き直す同様の一般的なプロンプト)

検証プロンプトを使用するようにダイアログをAlexaにデリゲートする

ユーザーがダイアログをデリゲートした場合、Alexaはスロット検証ルールを使用します。Alexaにデリゲートするには、2つの方法があります:

  • 自動的にデリゲートします。この場合、Alexaはスロット値を自動的に確認し、必要に応じてダイアログモデルで定義されたプロンプトを使用します。ダイアログが完成すると、Alexaは単一のIntentRequestを送信します。
  • 手動でデリゲートします。この場合、Alexaは会話ごとにスキルに IntentRequest を送信します。ダイアログが完了していない場合は、Dialog.Delegateディレクティブを返します。これにより、ダイアログの次の手順に進むようAlexaに指示します。

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

必須のスロットと必須ではないスロットのどちらにもスロット検証を使用できます。これにより、オプションの値が与えられた場合はこれを検証できます。ただし、このスロットに入力することをユーザーに強制することはできません。

  • ユーザーが必須でないスロットに値を入力せずにインテントを呼び出した場合、Alexaは空のスロット値を受け入れ、検証も引き出しも行いません。
  • ユーザーがスロット値を提供しなかった場合、Alexaはスロット検証ルールに従って検証を行い、必要に応じてユーザーにプロンプトを出します。
  • 必要なスロットに対しては、Alexaは必要に応じてスロットを引き出し、その後のステップで検証を行います。

ダイアログモデルがある場合に会話を管理する方法についての詳細は、Dialogインターフェースのリファレンス: ユーザーとの会話の管理についてを参照してください。

Dialog.ElicitSlotなどのその他のDialogディレクティブは、ダイアログモデルで定義されたスロット検証ルールを使用しません。ルールを使用するには、オートデリゲートか、Dialog.Delegateのいずれかを使用してダイアログをデリゲートする必要があります。

検証ルール

以下のセクションでは、使用可能なすべての検証ルールとそれを使用できるスロットタイプについて詳細を説明しています。

カスタムスロットタイプ用に定義された値および同義語と比較する

このルールによって、カスタムスロットタイプに明示的に定義されている値のみを許可できるようになります。このルールは値と同義語の両方をチェックします。この検証は、カスタムスロットタイプを使用するスロットのみに使用できます。

検証 説明 タイプ パラメーター

スロットタイプの値と同義語のみを受け付ける

カスタムスロットタイプの値と、同義語のリストで定義されている値を受け入れます。定義されたこれらの値のいずれにも一致しない値が提供された場合、その値の検証は失敗し、Alexaは新しい値を要求するプロンプトを出します。これは、そのスロットのスロットオブジェクトresolutions.resolutionsPerAuthority[].status.code)用のエンティティ解決ステータスコードをチェックし、コードER_SUCCESS_MATCHである値のみを受け入れることと同じです。

hasEntityResolutionMatch

なし

固定値と比較する

これらのルールにより、値セットを受け入れたり拒否したりできます。これらのルールは、次のスロットタイプで使用できます。

検証 説明 タイプ パラメーター

値セットのみを受け付ける

指定した所定の値セットに一致する値を受け入れます。このリストのいずれの項目にも一致しない値が提供された場合、その値の検証は失敗します。

isInSet

受け入れられるのリストです。

値セットのみを拒否する

指定した所定の値セットに一致する値を拒否します。このリストのいずれかの項目に一致する値が提供された場合、その値の検証は失敗します。

isNotInSet

拒否されるのリストです。

受け付けるまたは拒否するセットのリストは、以下のスロットタイプに適合する必要があります。

  • AMAZON.FOUR_DIGIT_NUMBER: 四桁の数値のリストを提供します。
  • AMAZON.NUMBER: 数値のリストを提供します。
  • AMAZON.Ordinal: 受け付ける順序を示す値に対応する数値のリストを提供します。たとえば、「一番目」「二番目」「三番目」などの語を受け入れたり拒否したりするには、123の数値を提供します。
  • AMAZON.PhoneNumber: 電話番号のリストを提供します。数値だけを含め、ハイフンなどの記号は省略します。例: 「2065551234」
  • すべてのビルトインのリストタイプ:文字列のスロット値のリストを提供します。
  • 任意のカスタムスロットタイプ:文字列のスロット値のリストを提供します。

特定の値と比較する(大小関係を比較)

これらのルールにより、指定した値より大きい、または小さいユーザー提供のスロット値を受け付けることができます。これらのルールは、次のスロットタイプで使用できます。

検証 説明 タイプ パラメーター

次の値を超えれば受け付ける

指定値より大きい値を受け入れます。ユーザーの値が基準値以下の場合、値の検証結果は失敗となります。

isGreaterThan

スロット値と比較するです。

次の値以上であれば受け付ける

指定値以上の値を受け入れます。ユーザーの値が基準値未満の場合、値の検証結果は失敗となります。

isGreaterThanOrEqualTo

スロット値と比較するです。

値未満であれば受け付ける

指定値未満の値を受け入れます。ユーザーの値が基準値以上の場合、値の検証結果は失敗となります。

isLessThan

スロット値と比較するです。

次の値以下であれば受け付ける

指定値以下の値を受け入れます。ユーザーの値が基準値より大きい場合、値の検証結果は失敗となります。

isLessThanOrEqualTo

スロット値と比較するです。

ユーザーのスロット値と比較する値は、次のスロットタイプに適合する必要があります。

検証ルールを日付と時刻の比較に使用する場合(AMAZON.DATEスロットタイプとAMAZON.TIMEスロットタイプ)、次の事項に注意してください。

  • 「より大きい」はその日付または時刻より後を意味します。
  • 「より小さい」はその日付または時刻より前を意味します。

たとえば、AMAZON.DATEスロットでisGreaterThanを使用して値を2018-01-01に設定した場合、スロットは2018年1月1日より後の日付を受け入れます。2017年12月31日も2018年1月1日も検証に失敗します。1月1日を有効な日付に含めるにはisGreaterThanOrEqualToを使用します。

指定の時間範囲で日付や時刻を比較する

これらのルールにより、特定の時間範囲内の日付や時刻を受け付けたり拒否したりできます。これらのルールは、AMAZON.DATEスロットとAMAZON.TIMEスロットで使用できます。

検証 説明 タイプ パラメーター

期間内であれば受け付ける

指定した時間範囲内の日付や時刻の値を受け付けます。ユーザーの値が指定の時間範囲より前または後の場合、値の検証結果は失敗となります。

isInDuration

時間範囲の開始日時終了日時です。詳細については、以下を参照してください。

期間内であれば拒否

指定した時間範囲内の日付や時刻の値を拒否します。ユーザーの値が指定の時間範囲内の場合、値の検証結果は失敗となります。

isNotInDuration

時間範囲の開始日時終了日時です。詳細については、以下を参照してください。

相対日時と絶対日時を使用して、時間範囲の開始日時終了日時を指定できます。

  • AMAZON.DATE: 次のいずれかで開始日時終了日時を提供します。
    • ISO-8601の日付形式で指定された日付です。
    • ISO-8601の期間形式PnD)で指定された日にちの期間です。たとえば、P10Dは10日間を表します。なお、この検証は、月や年などの他の単位を含む期間には対応していないことに注意してください。
  • AMAZON.TIME: 次のいずれかで開始日時終了日時を提供します。
    • ISO-8601の時刻形式で指定された時刻です。
    • ISO-8601の期間PTnHnM)で指定された時間単位や分単位で表した期間です。たとえば、PT10Hは10時間、PT5H30Mは5時間30分を表します。

時間範囲の開始日時終了日時は、ユーザーがスキルにリクエストした時間を基準とし、ユーザーの設定したタイムゾーンに基づきます。ユーザーのデバイスにタイムゾーンが設定されていない場合、GMTが検証に使用されます。開始日時終了日時より前であることが必要です。

継続時間を日単位または時間単位で使用する場合、現在時刻より前の時刻を指定するのにマイナス符号(-)を使用することができます。たとえば、-P3Dは本日より3日前を意味します。ただし、これはISO-8601規格にはありません。

同じ検証内で絶対日付と相対継続時間を組み合わせることができます。たとえば、開始日時2018-07-04終了日時P3Dに設定すると、2018年7月4日から3日以内の日にちが受け入れられます。

開始日時または終了日時を空白にして無期限の時間範囲を作成することもできます。たとえば、開始日時P0D(本日)とし、終了日時を空白にすると、今日以降の日にちが受け入れられ、過去の日にちは拒否されます。

日付の例:

シナリオ 開始 終了
今日から30日以内の日付

P0D

P30D

今日から7日~21日の間の日付

P7D

P21D

未来の日付のみ

P0D

指定の日から3日以内の日付

2018-07-04

P3D

過去の日付のみ

-P1D

今日から15日以内の日付(過去15日と今後15日)

-P15D

P15D

過去60日の日付

-P60D

P0D

昨日から過去30日以内の日付(今日は含めない)

-P30D

-P1D

時刻の例:

シナリオ 開始 終了
次の2.5時間

PT0H

PT2H30M

今から3~6時間の時刻

PT3H

PT6H

未来の時刻のみ(現在より後の時刻)

PT0H

午後6時とその後3時間の間の時刻

18:00

PT3H

過去の時刻のみ(現在より前の時刻)

PT0H

過去3時間と今後3時間の間の時刻(3時間前から3時間後の間)

-PT3H

PT3H

3時間前と6時間後の間の時刻

-PT6H

-PT3H

過去5時間以内の時刻

-PT5H

PT0H

検証ルール向けJSON

JSONエディターでダイアログモデル内のスロット検証のJSON表現を確認し編集することができます。スロットの検証は、interactionModel.dialog.intents[].slots[].validationsvalidations配列で定義されます。対応するプロンプトはpromptsにあります。

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

{
  "interactionModel": {
    "dialog": {
      "delegationStrategy": "SKILL_RESPONSE",      
      "intents": [
        {
          "name": "GetPlanetWeather",
          "delegationStrategy": "ALWAYS",
          "confirmationRequired": false,
          "prompts": {},
          "slots": [
            {
              "name": "planet",
              "type": "Planet",
              "confirmationRequired": false,
              "elicitationRequired": true,
              "prompts": {
                "elicitation": "Elicit.Slot.27936398519.1404759397895"
              },
              "validations": [
                {
                  "type": "isNotInSet",
                  "prompt": "Slot.Validation.154616755422.1503388152026.257948657476",
                  "values": [
                    "sol",
                    "太陽",
                    "われわれの太陽",
                    "われわれの星",
                    "おひさま"
                  ]
                },
                {
                  "type": "hasEntityResolutionMatch",
                  "prompt": "Slot.Validation.154616755422.1503388152026.1155325818232"
                }
              ]
            }
          ]
        }
      ],
    },
    "prompts": [
      {
        "id": "Elicit.Slot.27936398519.1404759397895",
        "variations": [
          {
            "type": "PlainText",
            "value": "惑星の名を教えてくだされば、その星の天気をお知らせします。"
          },
          {
            "type": "PlainText",
            "value": "For what planet?"
          },
          {
            "type": "PlainText",
            "value": "太陽系の惑星を言ってください"
          },
          {
            "type": "PlainText",
            "value": "どの惑星について知りたいですか?"
          }
        ]
      },
      {
        "id": "Slot.Validation.154616755422.1503388152026.257948657476",
        "variations": [
          {
            "type": "PlainText",
            "value": "太陽は太陽系の中心に位置しますが、惑星ではありません。惑星の名前を言ってください。"
          },
          {
            "type": "PlainText",
            "value": "天気があるのは惑星だけです。惑星の名前を言ってください"
          },
          {
            "type": "PlainText",
            "value": "太陽に天気はありません。代わりに惑星の名前を言ってください。"
          },
          {
            "type": "PlainText",
            "value": "太陽は私たちの太陽系の一部ですが、惑星についてのご質問にだけお答えできます。惑星の名前を言ってください。"
          }
        ]
      },
      {
        "id": "Slot.Validation.154616755422.1503388152026.1155325818232",
        "variations": [
          {
            "type": "PlainText",
            "value": "地球、火星、木星などの惑星を言ってください。つまり、太陽系の9つの惑星のうちの1つです。"
          },
          {
            "type": "PlainText",
            "value": "{planet}は惑星ではありません。太陽系の9つの惑星のうち1つを言ってください。"
          },
          {
            "type": "PlainText",
            "value": "{PlanetSlot}を太陽系の惑星の1つと認識していません。有効な惑星の名前を言ってください。"
          },
          {
            "type": "PlainText",
            "value": "太陽系にある惑星を言ってください。"
          }
        ]
      }
    ]
  }
}