フルフィルメント

エージェントの会話のターンでは、エージェントはエンドユーザーに対し、質問への回答、情報に対するクエリ、セッションの終了のいずれかで応答する必要があります。また、動的レスポンスの生成や、ターンのアクションを実行するには、エージェントによるサービスへの問い合わせが必要な場合があります。フィルメントは、このすべてを行うために使用されます。

フルフィルメントには次のいずれかを含めることができます。

  • 静的レスポンス メッセージ。
  • 動的レスポンスやアクションの実行のための Webhook 呼び出し。
  • パラメータ値を設定またはオーバーライドするパラメータのプリセット。

エージェントのターンの間に、複数のフルフィルメントを呼び出して、それぞれがレスポンス メッセージを生成することが可能です(生成が必要な場合もあります)。Dialogflow は、こうしたレスポンスをレスポンス キューに保持します。エージェントのターンが終了すると、Dialogflow は順序付けされたレスポンスをエンドユーザーに送信します。

ES フルフィルメントは、Webhook サービスの接続に限定されます。フルフィルメントのスコープが CX 向けに拡張され、すべてのタイプのプロンプトとレスポンスが対象になりました。

フルフィルメントのユースケース

フルフィルメントは、レスポンス メッセージが必要なすべての場所で使用されます。

これらの各ユースケースで、コンソールによりフルフィルメント編集パネルが開かれます。

フルフィルメントのスクリーンショット

静的レスポンス メッセージ(ダイアログ オプション)

静的なレスポンス メッセージは、設計時に定義したエージェント レスポンスです。フルフィルメントの作成時に定義します。実行時に、これらのレスポンスはレスポンス キューに追加されます。

レスポンス メッセージにはいくつかの種類があります。これについては、以下のサブセクションで説明します。コンソールを使用する場合、フルフィルメント パネルには初期テキスト レスポンス メッセージ カードがありますが、[Add dialogue option] をクリックすると他のレスポンス メッセージの種類のカードをさらに追加できます。

テキスト

テキスト レスポンス メッセージは、エンドユーザーにテキスト ダイアログを送信します。インテント検出 API 呼び出しまたは統合呼び出しで音声合成が使用されている場合、このテキストを使用して音声コンテンツが生成されます。この場合、指定されたテキストで必要に応じて音声合成マークアップ言語(SSML)を使用できます。

複数のテキスト レスポンス カードと、各カード内の複数のテキスト レスポンスを定義できます。複数のカードを定義すると、実行時に 1 つのレスポンスに連結されます。1 つのカード内で複数のレスポンスを定義すると、カード内のメッセージのいずれかが実行時にランダムに選択されます。

このテキスト メッセージには、パラメータ参照とインラインのシステム関数を含めることができます。

カスタム ペイロード

一部の統合では、リッチ レスポンスを処理するカスタム ペイロード レスポンスがサポートされています。これらのカスタム ペイロードは、統合のドキュメントで定義されている JSON 形式で指定されます。例については、Dialogflow Messenger のカスタム ペイロード形式をご覧ください。

カスタム ペイロード JSON にはパラメータ参照を含めることができます。 これらは JSON 文字列値として扱われるため、二重引用符で囲みます。 次に例を示します。

{
  "someField": "$session.params.date"
}

開発した統合にカスタム ペイロードを送信することもできます。これは Dialogflow で処理されないので、独自のビジネス ロジックで処理する必要があります。

以下のカスタム ペイロード テンプレートもご覧ください。

人間のエージェントへの引き継ぎ

このレスポンスは、会話を人間のエージェントに引き渡す必要があることをインテント検出 API 呼び出し元に通知します。Dialogflow は、このシグナルのみを使用して、測定の目的で引き渡された会話を識別します。このセッション状態がなんらかの形で変更されることはありません。このシグナルを使用すると、システムまたは統合が、会話を引き渡すために必要なアクションを実行できます。Dialogflow ではこのデータに対して構造が適用されないため、システムに適した構造を選択できます。

会話の成功メタデータ

このレスポンスは、Dialogflow エージェントとの会話が成功したことをインテント検出 API 呼び出し元に通知します。Dialogflow はこのシグナルのみを使用して、測定の目的で成功した会話を識別します。このセッション状態がなんらかの形で変更されることはありません。システムまたは統合でこのシグナルを使用して、必要なアクションを実行できます。Dialogflow ではこのデータに対して構造が適用されないため、システムに適した構造を選択できます。

事前に録音した音声を再生する

このレスポンスは、この機能をサポートする統合の音声ファイルを再生します。

音声ファイルの形式の要件は、統合によって異なる場合があります。たとえば、Dialogflow CX Phone Gateway の要件をご覧ください。

パートナーのテレフォニー統合では、パートナーが音声ファイルの URL にアクセスできる必要があります。Cloud Storage の公開ファイルなど、一般公開されている URL にはパートナーが常にアクセスできます。パートナーは、音声ファイルへのアクセスを制限することもできます。詳しくは、パートナーのドキュメントをご覧ください。

出力音声テキスト

このレスポンスはテキスト レスポンスと似ていますが、音声合成にのみ適用されます。エージェントがテキスト セッションと音声セッションの両方を処理できる場合は、一意のテキスト レスポンスと出力音声テキストのレスポンスを使用して、テキストと音声にそれぞれ別のユーザー エクスペリエンスを作成できます。 音声セッションに出力音声テキストが指定されている場合、プレーン テキストのレスポンスは無視されます。

エージェントがテキスト セッションと音声セッションの両方を処理し、同じレスポンス メッセージが必要な場合は、テキスト セッションと音声セッションの両方にテキスト レスポンスを使用します。

出力音声テキストは、テキスト レスポンスと同様に連結されます。出力音声テキストのレスポンスがテキストと SSML の組み合わせである場合、連結された結果は SSML として扱われます。エージェントの設計者は、テキストまたは SSML を一貫して使用することをおすすめします。

条件付きレスポンス

このレスポンス タイプは、条件付きレスポンスに使用されます。一般的な形式を次に示します。

if [condition]
  [response]
elif [condition]
  [response]
elif [condition]
  [response]
else
  [response]
endif

ここで

  • [condition] は、ルート条件で使用される形式と同じ形式です。
  • [response] はテキスト レスポンスです。
  • elif ブロックと else ブロックは省略可能です。

次に例を示します。

if $session.params.user-age >= 21
  Ok, you may enter.
else
  Sorry, you cannot enter.
endif

[condition][response] はどちらも、インライン システム関数を使用して、会話中に動的な値を生成できます。詳細については、システム関数ルート条件のリファレンスをご覧ください。 [condition] は、フルフィルメント開始時のセッション状態に基づいて解決されます。[response] がセッション状態に依存している場合は、フルフィルメントの最後に更新されたセッション状態に基づいて解決されます。

多言語エージェントの場合、[condition] はすべての言語に共通ですが、[response] は言語に固有です。コンソールで 1 つの言語の [condition] を変更すると、この部分はすべてのエージェントの言語で更新され、新しい条件になるため、[response][condition] の更新時に選択した言語以外のすべての言語でクリアされます。

テレフォニー転送の呼び出し

一部のテレフォニー統合では、通話の転送先に米国の電話番号を指定できます。実行時に、Dialogflow 仮想エージェントが通話の転送を使用してフルフィルメントを呼び出すと、呼び出しは指定された番号に転送され、仮想エージェントの処理は停止します。

チャンネル固有のレスポンス メッセージ

フルフィルメントを定義する際に、チャネル固有のレスポンス メッセージを作成して、テキスト チャット、音声、SMS、チャネルをサポートする特定の統合を対象としたターゲット レスポンスなどを作成できます。チャネルに固有ではないレスポンス メッセージは、デフォルトのレスポンス メッセージと呼ばれます。

実行時に、Dialogflow はインテント検出リクエストでチャネルが指定されている場合、デフォルトのレスポンス メッセージかチャネル固有のレスポンス メッセージを選択します。ベスト プラクティスとして、チャネル固有のレスポンス メッセージを使用している場合でも、デフォルトのレスポンス メッセージを定義することをおすすめします。デフォルト レスポンス メッセージは、システムが有効なチャネルを提供できなかったときのフォールバックとして機能します。

チャネル名は、任意のテキストに設定できるカスタム フィールドです。ランタイム呼び出しに Dialogflow API を直接使用している場合は、任意のチャネル名を使用できます。既存の統合を使用している場合は、統合が認識するチャネル名を使用する必要があります。

設計時にチャネル固有のレスポンス メッセージを設定する

コンソールを使用して、フルフィルメントにチャネル固有のレスポンス メッセージを表示するには:

  • デフォルトのレスポンス メッセージを追加したら、[チャネルを追加] をクリックします。ユーザー インターフェースを使用して、チャネル固有のレスポンス メッセージを追加できます。別のチャンネルを追加するには、[チャンネルを追加] をもう一度クリックします。

API を使用してフルフィルメントにチャネル固有のレスポンス メッセージを提供するには:

  • 各レスポンス メッセージの Fulfillment.messages[i].channel フィールドを目的のチャネルに設定します。このフィールドが設定されていない場合、レスポンスはデフォルトのレスポンス メッセージになります。

実行時にチャネル固有のレスポンス メッセージを利用する

チャネル固有のレスポンス メッセージを受信するには、インテント検出リクエスト メッセージでチャネルを指定する必要があります。Sessions 型の detectIntent メソッドの queryParams.channel フィールドをご覧ください。

セッション リファレンスのプロトコルとバージョンを選択:

プロトコル V3 V3beta1
REST セッション リソース セッション リソース
RPC セッション インターフェース セッション インターフェース
C++ SessionsClient 利用できません
C# SessionsClient 利用できません
Go SessionsClient 利用できません
Java SessionsClient SessionsClient
Node.js SessionsClient SessionsClient
PHP 提供なし 利用できません
Python SessionsClient SessionsClient
Ruby 提供なし 利用できません

リクエストにチャネルが定義されていない場合や、フルフィルメントで一致するチャネルが見つからない場合、Dialogflow によってデフォルトのレスポンス メッセージが返されます。

カスタム ペイロード テンプレート

カスタム ペイロードを頻繁に使用する場合は、カスタム ペイロード テンプレートを使用する必要があります。カスタム ペイロードは大規模で複雑な場合があるため、テンプレートを使用するとエージェント作成プロセスが容易になります。

これらのテンプレートは、エージェント設定で提供できます。これにより、エージェントのフルフィルメントを作成するたびにテンプレートを選択できます。

たとえば、「はい」と「いいえ」のボタンの JSON ペイロードは、カスタム ペイロード テンプレートとして定義できます。これらのボタンを必要とするフルフィルメントを作成する場合は、フルフィルメントの作成時にテンプレートを選択するだけで済みます。

フルフィルメントのカスタム ペイロード用のテンプレートを選択すると、テンプレートのコンテンツがペイロードに挿入されます。ペイロードは必要に応じて編集できます。

テンプレートを変更しても、その変更が参照されているすべてのフルフィルメント ペイロードに自動的に反映されません。

カスタム ペイロード テンプレートを作成するには、エージェントの全般設定をご覧ください。

フルフィルメントの作成時にカスタム ペイロード テンプレートを選択するには、フルフィルメント カスタム ペイロードの作成時に [テンプレートを選択] をクリックします。

Webhook の呼び出し

Webhook があるフルフィルメントが呼び出される場合、エージェントは Webhook にリクエストを送信します。Webhook は、サービス内で必要なアクションをすべて実行し、動的レスポンス メッセージを提供し、パラメータ値をオーバーライドして、現在のページを変更できます。

フルフィルメントの Webhook 設定は次のとおりです。

期間 定義
Webhook を有効にする これにより、フルフィルメントの Webhook が有効になります。
Webhook Webhook リソースを選択します。
タグ ここで指定するテキストタグは、Webhook サービスに送信される Webhook リクエストの WebhookRequest.fulfillmentInfo.tag フィールドに入力されます。これを使用して、フルフィルメント固有の方法で Webhook の動作を制御できます。

パラメータのプリセット

フルフィルメントを使用して、現在のパラメータ値を設定またはオーバーライドするプリセットを指定できます。これらのプリセットは、静的レスポンス メッセージを解決する前、または Webhook を呼び出す前に適用されます。

システム関数を使用して、動的に生成される値へのパラメータにプリセットすることもできます。

次にその例を紹介します。

  • パラメータ now を現在の時刻に設定します。

    パラメータ
    now $sys.func.NOW()
  • 既存のパラメータ counter を 1 増やします。

    パラメータ
    counter $sys.func.ADD($session.params.counter, 1)
  • 完全な複合オブジェクト値を維持しながら、パラメータ new-costother-cost パラメータ値に設定します。

    パラメータ
    new-cost $sys.func.IDENTITY($session.params.other-cost)

音声の詳細設定

これらの音声設定は、必要に応じて同じページの音声設定フローの音声設定エージェントの音声設定をオーバーライドできます。

レスポンス キュー

エージェントのターンの間に、複数のフルフィルメントを呼び出して、それぞれがレスポンス メッセージを生成することが可能です(生成が必要な場合もあります)。Dialoflowは、こうしたレスポンスをレスポンス キューに保持します。

ストリーミング API に対する部分レスポンス

デフォルトでは、Dialogflow はエージェントのターンが終了したときにのみ、順序付けされたレスポンスをエンドユーザーに送信します。Streaming API を使用する場合に、現在キューに入っているレスポンスを部分レスポンスとして返すには、フルフィルメントで部分レスポンスを返すオプションを有効にします。 詳しくは、ページのライフサイクルをご覧ください。

たとえば、Webhook が長時間実行される可能性がある場合に、フルフィルメントに静的レスポンスを追加して部分的なレスポンスを有効にできます。これにより、Dialogflow はレスポンス キューをフラッシュし、Webhook を呼び出す前にすべてのメッセージを部分的なレスポンスとして送信します。

以下の場合、部分的なレスポンスは現在サポート対象外ですが、今後サポートされる予定です。

シミュレータでこの機能をテストするには、部分的なレスポンスをオンにする必要があります。

シミュレータの部分レスポンスのスクリーンショット

次の例では、Webhook が完了するまでに 5 秒かかり、部分レスポンスは有効にしないものとします。Dialogflow エージェントの会話のターンは、Webhook が完了するまで終了しません。この 5 秒間のターンでは、Webhook を待機している間にレスポンスがキューに格納され、ターンが完了するまでエンドユーザーに返されません。これにより、ユーザー エクスペリエンスが低下します。

部分的なレスポンスを使用しない場合。

最初のフルフィルメントで部分レスポンスを有効にすると、Dialogflow は直ちに最初のフルフィルメント メッセージを返して Webhook を呼び出します。Webhook が完了すると、Dialogflow から最終レスポンスが返されます。このシナリオでは、エンドユーザーがしばらく待つように指示されるため、エンドユーザー エクスペリエンスが向上します。また、Webhook 呼び出しはエンドユーザーに送信されるレスポンスと同時に実行されます。

部分的なレスポンスを使用します。

音声合成マークアップ言語(SSML)

テキスト合成マークアップ言語(SSML)をテキストや出力音声テキスト フルフィルメント フィールドで使用できます。これにより、一時停止の詳細や頭字語、日付、時刻、略語、検査すべきテキストのオーディオ形式を指定することで、音声応答をカスタマイズできます。

構文の詳細については、Text-to-Speech SSML のドキュメントをご覧ください。