会話モデルを構築する

会話モデルでは、ユーザーがアクションに対して何を言うことができるかと、アクションがユーザーにどのように応答するかを定義します。会話モデルの主な構成要素は、インテントタイプシーンプロンプトです。アクションの 1 つが呼び出されると、Google アシスタントがそのアクションにユーザーを引き継ぎ、このアクションは、会話モデルに基づいてユーザーとの会話を開始します。これは、次の要素で構成されます。

  • 有効なユーザー リクエスト - アクションに対してユーザーが発話できる内容を定義するには、アシスタント NLU を拡張するインテントのコレクションを作成し、アクションに固有のリクエストを理解できるようにします。各インテントでは、インテントに一致するユーザーの発話を説明するトレーニング フレーズを定義します。アシスタント NLU は、これらのトレーニング フレーズを拡張して類似したフレーズを含めます。これらのフレーズの集計は、インテントの言語モデルに反映されます。

  • アクション ロジックとレスポンス - インテントを処理し、必要なロジックを実行して、ユーザーに返すプロンプトを生成します。

図 1. 会話モデルは、ユーザー エクスペリエンスを定義するインテント、タイプ、シーン、プロンプトで構成されます。呼び出し可能なインテントは、会話内のマッチングでも有効です。

有効なユーザー リクエストを定義する

ユーザーがアクションに話しかけることができる内容を定義するには、インテントとタイプを組み合わせて使用します。ユーザー インテントとユーザータイプを使用すると、独自の言語モデルでアシスタント NLU を拡張できます。システム インテントとシステム タイプを使用すると、組み込みの言語モデルとイベント検出を利用できます。たとえば、ユーザーがアクションを終了させたい場合や、アシスタントが入力をまったく検出しない場合などです。

ユーザー インテントを作成する

ユーザー インテントを使用すると、ユーザーがアクションに話しかける可能性のあるフレーズを、独自のトレーニング フレーズとして定義できます。アシスタント NLU はこれらのフレーズを使用して、ユーザーが発話する内容を理解するようにトレーニングします。ユーザーのインテントの言語モデルと一致する言葉が発話があると、アシスタントはインテントを照合してアクションに通知します。これにより、ロジックを実行してユーザーに応答できます。

図 1. ユーザーのインテントの例

ユーザー インテントを作成するには:

  1. [Develop] タブで、[Userintent] > [⊕ (New intent)] をクリックして名前を指定し、Enter キーを押してインテントを作成します。
  2. 左側のメニューで、新しく作成したインテントをクリックします。インテント エディタが表示されます。
  3. インテントにトレーニング フレーズを追加します。アシスタント NLU をトレーニングするには、できるだけ多くのトレーニング フレーズを追加する必要があります。
  4. 省略可: トレーニング フレーズにアノテーションを付けて、指定した型に一致する型付きパラメータを解析して抽出するようにアシスタント NLU に指示します。
    1. [新しいパラメータを追加] フィールドにパラメータの名前を入力します。
    2. プルダウン メニューからシステムタイプを選択するか、カスタムタイプを作成します。
    3. パラメータがリストの場合に指定します。これにより、パラメータは同じタイプの複数の値を収集できます。
    4. [トレーニング フレーズの追加] セクションで、タイプを適用するテキストをハイライト表示します。これにより、ハイライト表示されたテキストをパラメータとして扱うよう、アシスタント NLU に指示します。ユーザーが型と一致する言葉を言うと、NLU はその値をパラメータとして抽出します。

システム インテントを作成する

システム インテントを使用すると、ユーザーがアクションを終了したいときや、ユーザー入力がタイムアウトしたときなどの一般的なイベントに対して、事前定義済みの言語モデルでインテントを利用できます。システム インテントを作成するには:

  1. [Develop] タブで [Systemintent] をクリックします。利用可能なシステム インテントのセット(NO_MATCHNO_INPUTCANCEL など)を使用できます。
  2. 各システム インテントには独自のハンドラが含まれています。このハンドラは、システム インテントのタイプごとにカスタマイズできます。たとえば、システム インテントを使用すると、Webhook イベントをトリガーし、そのイベントが発生したときに静的プロンプトを送信できます。

カスタムタイプを作成する

カスタム型を使用すると、独自の型仕様を作成して、単一のキーにマッピングする必要がある一連の値を理解するように NLU をトレーニングできます。

図 2. カスタムタイプの例

カスタムタイプを作成するには:

  1. [Develop] タブで、[Types] > [⊕ (New type)] をクリックします。
  2. [What kind of values with this type support?] セクションで、型値を指定する方法を選択します。

    • 単語と類義語を使用すると、複数の値を 1 つのキー(エントリ)にマッピングできます。タイプには 1 つ以上のエントリを含めることができます。このオプションを選択した場合は、次の NLU 設定を有効にすることもできます。
      • ファジー一致を有効にする - 単語が異なる順序で話されている場合でも、複数の単語を含むエントリを照合できます。
      • 不明な値を受け入れる - 指定可能な値をすべて指定できない場合は、周囲の入力やインテント トレーニング データに基づいて不明な単語やフレーズ(食料品リストに追加されるアイテムなど)を受け入れます。
    • 正規表現を使用すると、Google の RE2 標準に基づく正規表現パターンで型を照合できます。
    • 自由形式のテキスト: ユーザーの入力内容にマッチする形式を使用できます。
  3. [エントリを追加] セクションでタイプの値を指定します。[自由形式のテキスト] を選択した場合、タイプは任意のテキストと一致するため、エントリを指定する必要はありません。

アクション ロジックとレスポンスを作成する

アシスタント NLU は、ユーザー リクエストをインテントと照合して、アクションがシーンで処理できるようにします。シーンは、会話中にイベントを処理できる強力なロジック エグゼキュータです。

図 3. カスタムシーンの例

シーンを作成する

以下のセクションでは、シーンを作成し、各シーンのライフサイクル ステージの機能を定義する方法について説明します。

シーンを作成するには:

  1. [Develop] タブで、Scenes > ⊕ (New scene) をクリックして名前を指定し、Enter キーを押してシーンを作成します。
  2. 左側のメニューで、新しく作成したシーンをクリックします。Scene Editor が表示されます。

1 回限りの設定を定義する

シーンが初めてアクティブになったときは、開始時のステージで 1 回限りのタスクを実行できます。On Enter ステージは 1 回だけ実行され、シーンの実行ループ内で実行されない唯一のステージです。

  1. シーン内の [Onenter] ステージをクリックして、機能を指定します。この段階では、次の機能を指定できます。

    • Webhook を呼び出す - Webhook をトリガーします。Webhook の詳細については、Webhook のドキュメントをご覧ください。
    • プロンプトを送信する - ユーザーが会話の続行方法を把握できるように、ユーザーに静的プロンプトを指定します。プロンプトの指定について詳しくは、プロンプトのドキュメントをご覧ください。
    図 4. 開始ステージでのシーンの例

条件を確認する

条件を使用すると、スロットフィル、セッション ストレージ、ユーザー ストレージ、ホーム ストレージのパラメータを確認して、シーン実行フローを制御できます。

  1. シーン内で、[Condition] ステージの [+] アイコンをクリックします。右側に条件エディタが表示されます。この段階では、次の機能を指定できます。

    • Condition - ロジックのベースとなる実際の条件文を指定します。構文については、conditionsのドキュメントをご覧ください。
    • Webhook を呼び出す - Webhook をトリガーします。Webhook の詳細については、Webhook のドキュメントをご覧ください。
    • プロンプトを送信する - ユーザーに会話の続行方法を伝える静的プロンプトを指定します。プロンプトの指定について詳しくは、プロンプトのドキュメントをご覧ください。
    • Transition - 条件文が true の場合に遷移するシーンを指定します。
図 5. シーンの条件ステージの例

スロットフィルを定義する

スロットを使用すると、ユーザー入力から型付きパラメータを抽出できます。

シーンエディタで、[Slot Filling](スロットフィル)ステージの [+] アイコンをクリックします。右側にスロットのエディタが表示されます。スロットには次のプロパティを指定できます。

  • スロット名: スロットの名前を指定します。スロット値のマッピングを利用する場合は、対応するインテント パラメータと同じ名前を使用します。
  • スロットタイプ: スロットのタイプをシステムタイプまたはカスタムタイプで指定します。
  • このスロットは必須です: このスロットを必須としてマークします。有効にすると、このスロットが埋められるまでスロットフィルは完了しません。
  • このスロットにデフォルト値を割り当てる: 指定したセッション パラメータから読み取られるスロットのデフォルト値を指定します。
  • スロット値のライトバックのカスタマイズ: スロット充填が完了した後にスロットの値を保持するセッション パラメータを指定します。
  • スロットの検証: スロットが埋まったときに Webhook をトリガーします。この設定はすべてのスロットに適用されます。
  • Webhook を呼び出す(スロットが必要な場合に有効): Webhook をトリガーします。Webhook について詳しくは、Webhook のドキュメントをご覧ください。
  • プロンプトを送信する(スロットが必要な場合に有効): ユーザーが会話の続行方法を把握できるように、静的プロンプトを指定してユーザーに送信します。プロンプトの指定について詳しくは、プロンプトのドキュメントをご覧ください。

特定のスロットタイプ(トランザクションやユーザー エンゲージメントに関連するものなど)については、スロットを設定できる追加セクションが表示されます。スロット構成では、指定したプロパティに基づいてユーザーの会話エクスペリエンスを変更できます。

スロットを構成するには、フルフィルメント(セッション パラメータとして参照)またはインライン JSON エディタのいずれかで、JSON オブジェクトにプロパティを指定します。各スロットタイプで使用可能なプロパティについては、Actions Builder の JSON リファレンスをご覧ください。たとえば、actions.type.DeliveryAddressValue スロットタイプは DeliveryAddressValue スロットの参照コンテンツに対応しています。

図 6. シーンのスロットフィル設定の例

スロット値のマッピング

多くの場合、以前のインテントの一致には、対応するシーンのスロット値を部分的または完全に埋めるパラメータが含まれることがあります。この場合、スロット名がインテント パラメータ名と一致する場合、インテント パラメータによって埋められたすべてのスロットがシーンのスロットフィルにマッピングされます。

たとえば、ユーザーが「ラージ バニラ コーヒーを注文したい」と話しかけて飲み物を注文するインテントに一致した場合、シーンが同じスロットを定義していれば、サイズ、フレーバー、飲料タイプの既存のスロットが、対応するシーンに埋まっていると見なされます。

入力を処理する

この段階では、アシスタント NLU にユーザー入力とインテントをマッチングさせることができます。目的のインテントをシーンに追加することで、インテント マッチングのスコープを特定のシーンに設定できます。これにより、特定のシーンがアクティブなときに特定のインテントを一致させるようにアシスタントに指示することで、会話フローを制御できます。

  1. シーン内で、[User intentHandling] または [System intentHandling] ステージの [+] アイコンをクリックします。インテント ハンドラのエディタが右側に表示されます。インテント ハンドラの次の機能を指定できます。

    • Intent - このシーン内で一致させるインテントを指定します。
    • Webhook を呼び出す - Webhook をトリガーします。Webhook リクエストの処理方法について詳しくは、Webhook のドキュメントをご覧ください。
    • プロンプトを送信する - ユーザーに静的プロンプトを指定して、ユーザーが応答できるようにします。プロンプトの指定について詳しくは、プロンプトのドキュメントをご覧ください。
    • Transition(該当する場合) - 指定したインテントが一致した場合に遷移するシーンを指定します。
図 7. シーンのユーザー インテント ハンドラの例
図 8. シーンのシステム インテント ハンドラの例