ダイアログモデルを使用してあいまい応答を管理する



ダイアログモデルを使用してあいまい応答を管理する

ダイアログモデルを使うと、スロット値を収集するコードがシンプルになるだけでなく、ユーザーが今対話全体のどこにいるのかをAlexaが理解しやすくなります。Alexaはダイアログのどこにユーザーがいるかを常に把握し、このコンテキスト情報を使って、ユーザーのあいまいな応答をどう処理すればよいかを判断できます。

このドキュメントでは、ダイアログモデルを使ったあいまい応答の処理のしくみと、このしくみをスキルに実装する例をいくつか紹介します。

ダイアログモデルの作成には、開発者コンソールを使用できます。

このドキュメントの対象は、対話モデル(インテント、スロット、サンプル発話)やダイアログモデル(必須スロット、プロンプト、Dialogディレクティブ)関連の概念に詳しい開発者を想定しています。これらのトピックの詳細については、以下を参照してください。

ダイアログとあいまい応答について

ダイアログを開始するには、ユーザーが必須のスロットを使って設定されたインテントを呼び出します。ユーザーがスキルと対話して必要なスロット値を提供する間、Alexaはユーザーがそのダイアログフローのどこにいるかを把握し、この情報を使ってユーザーの応答をどこにルーティングするかを適切に判断することができます。

このしくみは、ユーザーが「はい」や「いいえ」などの単語を使う対話のデザインに特に有効です。こうした単語は、会話の中で頻繁に使われ、意味があいまいなため、コンテキストを正しく判断する必要があります。たとえば、「はい」と応答した場合、スキルのダイアログではいくつかの意味に解釈できます。

  1. スロット値についての確認プロンプトへの応答
  2. インテント全体についての確認プロンプトへの応答
  3. ブール値に準ずるカスタムスロットタイプのスロット値
  4. ビルトインのAMAZON.YesIntentを呼び出すためにダイアログ外で聞かれた質問への応答

Alexaは、ユーザーがダイアログのどこにいるかを把握し、これらの各シナリオを処理します。たとえば、ユーザーがダイアログを使用中で、そのダイアログが現在「スロットの確認を行う」ステップ(Dialog.ConfirmSlot)にあるとします。その場合、「はい」と応答するとスロットの確認にルーティングされます。ユーザーが完全にダイアログ外にいる場合、「はい」の応答は別のAMAZON.YesIntentインテントと推測されます。

このドキュメントの以降のセクションでは、スキルがこのしくみを活用できるシナリオを紹介します。

ダイアログモデルを使用してスキルでビルトインのはい/いいえインテントを使う

ダイアログモデルでは、単一の具体的なインテントを満たすのに必要な情報を収集するステップを識別します。スキルでは、ダイアログ外のはい/いいえの対話に、ビルトインインテントであるAMAZON.YesIntentAMAZON.NoIntentを使用する場合もあります。Alexaは、ユーザーがダイアログを使用中でない場合、「はい」や「いいえ」の応答をこれらのインテントにルーティングします。

たとえば、PlanMyTripインテントにダイアログモデルを使用して旅行の計画を行うスキルを考えてみましょう。このダイアログでは、出発地(fromCity)、目的地(toCity)、日付(travelDate)などの変数のスロット値を収集します。ダイアログでは、fromCityスロットでスロットの確認が必須であると設定されています。

このスキルで完全にダイアログ外のはい/いいえ応答を取得する場合に、AMAZON.YesIntentAMAZON.NoIntentを含めることもできます。

ユーザー: トリッププランに、神戸からの新しい旅行を始めると言って。PlanMyTripインテントが呼び出され、fromCityスロットに値「神戸」が入ります。)

Alexa: 出発地は神戸ですね?fromCityスロットの確認プロンプトです。)

ユーザー: はい。 (ユーザーは現在スロットの確認をリクエストするダイアログを使用中なので、この「はい」という応答はfromCityスロット値を確認するために使われます。)

...(PlanMyTripインテントの残りのスロット値を収集して確認するために、ダイアログで追加のステップがやり取りされます。ダイアログが完了すると、スキルはPlanMyTripに最終的な応答を送信し、ユーザーのリクエストを実行します。)

Alexa: 旅行を保存しました。別の旅行も計画しますか? (前のダイアログは完了しているため、この質問へのユーザーの応答はダイアログ外であり、PlanMyTripインテントとは関連付けられません。)

ユーザー: はい。 (この時点でユーザーはダイアログ外にいるため、この応答はAMAZON.YesIntentを呼び出します。)

スキルはAMAZON.YesIntentを適切に処理します...

ブール値を収集するカスタムのはい/いいえスロットを使う

一部のシナリオでは、ダイアログ中にブール値に準ずる値を収集するために、ユーザーから「はい」または「いいえ」の値を取得する必要がある場合があります。ダイアログモデルは特定のインテントに紐づけられており、インテントを変更することはできないため、ビルトインインテントであるAMAZON.YesIntentインテントとAMAZON.NoIntentインテントはこのシナリオには適しません。

この場合、関連する値(「はい」、「いいよ」、「オッケー」、「もちろん」など)のカスタムスロットタイプを定義して、スロットにはい/いいえの値を収集できます。ダイアログでこのスロットを使うと、Alexaはダイアログのさまざまなステップ(スロットの要求、スロットの確認、インテントの確認)を区別して、「はい」または「いいえ」の回答を適切にルーティングすることができます。

ユーザーが言う可能性のあるさまざまな語句に対応するには、スロットタイプ定義に同義語を含めます。

{
  "types": [
    {
      "name": "YES_NO_SLOT",
      "values": [
        {
          "id": "TRUE",
          "name": {
            "value": "はい",
            "synonyms": [
              "うん",
              "いいよ",
              "そう",
              "おねがい",
              "そのとおり"
            ]
          }
        },
        {
          "id": "FALSE",
          "name": {
            "value": "いいえ",
            "synonyms": [
              "ううん",
              "いや",
              "結構です"
            ]
          }
        }
      ]
    }
  ]
}

上記のタイプ定義のサンプルでは、「うん」などの肯定的な応答がすべてスキルに送信されます。

  • ユーザーが言った値:"うん"
  • 標準的な値:"はい"
  • 定義されたID: "TRUE"

同義語の定義とスロット値に解決する方法の詳細については、スロットタイプ値の同義語とIDを定義する(エンティティ解決)を参照してください。スキル内のスロットデータをJSON形式でどう表記するかの詳細については、Slotオブジェクトを参照してください。

ユーザーとの会話中、Alexaはダイアログ内のステップを常に把握し、「はい」と「いいえ」の値を適切にルーティングします。

…対話を開始してfromCityスロットに「神戸」を取得するステップです。

Alexa: 出発地は神戸ですね?fromCityスロットの確認プロンプトです。)

ユーザー: はい。 (ユーザーは現在スロットの確認をリクエストするダイアログを使用中なので、この「はい」という応答はfromCityスロット値を確認するために使われます。)

Alexa: この旅行用に旅行保険に加入されますか? (カスタムのYES_NO_SLOTタイプを使って定義したブール値に準ずるbuyInsuranceスロットの要求です。)

ユーザー: いいえ。 (ユーザーの応答がbuyInsuranceスロットに入ります。)

スキルの対話が続きます...

インテントの単一スロットの発話

多くのスキルでは、他のフレーズがない単一のスロット値のみを言ってインテントを呼び出すのが、ユーザーにとって非常に自然な場合があります。この場合、Alexaはユーザーがダイアログのどこにいるかに応じて発話をルーティングできます。

たとえば、PlanMyTripインテントが以下のような発話で設定されたとします。

{toCity}
{toCity}に行きたい
{toCity}への旅行を計画して
...(など)

この場合、ユーザーは以下のようにスキルを呼び出すことができます。

ユーザー: トリッププラン、札幌

ユーザーはまだダイアログを使用していないため、Alexaは発話の「札幌」をtoCityスロットの値として解決し、toCityに値を入れてPlanMyTripインテントを呼び出します。ダイアログはそこから始まります。

逆に、ユーザーが既にダイアログ内のスロットの要求ステップにいる場合、同じ単一スロットの発話でも値がそのスロットに入るだけでインテントが呼び出されることはありません。

ユーザー: トリッププラン、札幌(スキルが起動し、toCityに「札幌」が入れられてPlanMyTripインテントが呼び出されます。)

Alexa: どこから旅行に出発しますか?fromCityスロットの要求プロンプトです。)

ユーザー: 神戸(このあいまいな発話はPlanMyTripインテントの発話、fromCityスロットの発話、toCityスロットの発話に一致します。)ユーザーは現在fromCityスロットの要求ステップにいるため、Alexaはこの値をfromCityに使用します。)