エージェントの会話のターンでは、エージェントはエンドユーザーに対し、質問への回答、情報に対するクエリ、セッションの終了のいずれかで応答する必要があります。また、動的レスポンスの生成や、ターンのアクションを実行するには、エージェントによるサービスへの問い合わせが必要な場合があります。フルフィルメントは、このすべてを行うために使用されます。
フルフィルメントには次のいずれかを含めることができます。
- 静的レスポンス メッセージ。
- 動的レスポンスやアクションの実行のための Webhook 呼び出し。
- パラメータ値を設定またはオーバーライドするパラメータのプリセット。
エージェントのターンの間に、複数のフルフィルメントを呼び出して、それぞれがレスポンス メッセージを生成することが可能です(生成が必要な場合もあります)。Dialogflow CX は、こうしたレスポンスをレスポンス キューに保持します。エージェントのターンが終了すると、Dialogflow CX は順序付けされたレスポンスをエンドユーザーに送信します。
フルフィルメントのユースケース
フルフィルメントは、レスポンス メッセージが必要なすべての場所で使用されます。
これらの各ユースケースで、コンソールによりフルフィルメント編集パネルが開かれます。
静的レスポンス メッセージ(ダイアログ オプション)
静的なレスポンス メッセージは、設計時に定義したエージェント レスポンスです。フルフィルメントの作成時に定義します。実行時に、これらのレスポンスはレスポンス キューに追加されます。
レスポンス メッセージにはいくつかの種類があります。これについては、以下のサブセクションで説明します。コンソールを使用する場合、フルフィルメント パネルには初期テキスト レスポンス メッセージ カードがありますが、[Add dialogue option] をクリックすると他のレスポンス メッセージの種類のカードをさらに追加できます。
テキスト
テキスト レスポンス メッセージは、エンドユーザーにテキスト ダイアログを送信します。インテント検出 API 呼び出しまたは統合呼び出しで音声合成が使用されている場合、このテキストを使用して音声コンテンツが生成されます。この場合、指定されたテキストで必要に応じて音声合成マークアップ言語(SSML)を使用できます。
複数のテキスト レスポンス カードと、各カード内の複数のテキスト レスポンスを定義できます。複数のカードを定義すると、実行時に 1 つのレスポンスに連結されます。1 つのカード内で複数のレスポンスを定義すると、カード内のメッセージのいずれかが実行時にランダムに選択されます。
このテキスト メッセージには、パラメータ参照とインラインのシステム関数を含めることができます。
カスタム ペイロード
一部の統合では、リッチ レスポンスを処理するカスタム ペイロード レスポンスがサポートされています。これらのカスタム ペイロードは、統合のドキュメントで定義されている JSON 形式で指定されます。例については、Dialogflow CX Messenger のカスタム ペイロード形式をご覧ください。
カスタム ペイロード JSON にはパラメータ参照を含めることができます。 これらは JSON 文字列値として扱われるため、二重引用符で囲みます。 次に例を示します。
{ "someField": "$session.params.date" }
開発した統合にカスタム ペイロードを送信することもできます。これは Dialogflow CX で処理されないので、独自のビジネス ロジックで処理する必要があります。
以下のカスタム ペイロード テンプレート セクションもご覧ください。
人間のエージェントへの引き継ぎ
このレスポンスは、会話を人間のエージェントに引き渡す必要があることをインテント検出 API 呼び出し元に通知します。Dialogflow CX は、このシグナルのみを使用して、測定の目的で引き渡された会話を識別します。このセッション状態がなんらかの形で変更されることはありません。このシグナルを使用すると、システムまたは統合が、会話を引き渡すために必要なアクションを実行できます。Dialogflow CX ではこのデータに対して構造が適用されないため、システムに適した構造を選択できます。
会話の成功メタデータ
このレスポンスは、Dialogflow CX エージェントとの会話が成功したことをインテント検出 API 呼び出し元に通知します。Dialogflow CX はこのシグナルのみを使用して、測定の目的で成功した会話を識別します。このセッション状態がなんらかの形で変更されることはありません。システムまたは統合でこのシグナルを使用して、必要なアクションを実行できます。Dialogflow CX ではこのデータに対して構造が適用されないため、システムに適した構造を選択できます。
事前に録音した音声を再生する
このレスポンスは、この機能をサポートする統合の音声ファイルを再生します。
音声ファイル形式の要件は、統合によって異なる場合があります。たとえば、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 CX 仮想エージェントが通話の転送を使用してフルフィルメントを呼び出すと、呼び出しは指定された番号に転送され、仮想エージェントの処理は一時停止します。
チャネル固有のレスポンス メッセージ
フルフィルメントを定義する際に、チャネル固有のレスポンス メッセージを作成して、テキスト チャット、音声、SMS、チャネルをサポートする特定の統合を対象としたターゲット レスポンスなどを作成できます。チャネルに固有ではないレスポンス メッセージは、デフォルトのレスポンス メッセージと呼ばれます。
実行時に、インテント検出リクエストでチャネルが指定されている場合は、Dialogflow CX はデフォルトのレスポンス メッセージまたはチャネル固有のレスポンス メッセージを選択します。チャネル固有のレスポンス メッセージを使用している場合でも、デフォルトのレスポンス メッセージを定義することをおすすめします。デフォルトのレスポンス メッセージは、システムが有効なチャネルを提供できない場合のフォールバックとして機能します。
チャンネル名は、任意のテキストに設定できるカスタム フィールドです。ランタイム呼び出しに Dialogflow CX 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 CX からデフォルトのレスポンス メッセージが返されます。
カスタム ペイロード テンプレート
カスタム ペイロードを頻繁に使用する場合は、カスタム ペイロード テンプレートを使用する必要があります。カスタム ペイロードは大規模で複雑な場合があるため、テンプレートを使用するとエージェントの作成プロセスが容易になります。
これらのテンプレートはエージェントの設定で指定できます。これにより、エージェントのフルフィルメントを作成するときに選択できるようになります。
たとえば、「はい」ボタンと「いいえ」ボタンの JSON ペイロードは、カスタム ペイロード テンプレートとして定義できます。これらのボタンを必要とするフルフィルメントを作成する場合は、フルフィルメントの作成時にテンプレートを選択するだけで済みます。
フルフィルメント カスタム ペイロードのテンプレートを選択すると、テンプレートの内容がペイロードに挿入されます。その後、必要に応じてペイロードを編集できます。
テンプレートを変更しても、そのテンプレートが参照されているすべてのフルフィルメント ペイロードに変更が自動的に反映されるわけではありません。
カスタム ペイロード テンプレートを作成するには、エージェントの全般設定をご覧ください。
フルフィルメントの作成時にカスタム ペイロード テンプレートを選択するには、フルフィルメントのカスタム ペイロードを作成するときに [テンプレートの選択] をクリックします。
Webhook の呼び出し
Webhook があるフルフィルメントが呼び出される場合、エージェントは Webhook にリクエストを送信します。Webhook は、サービス内で必要なアクションをすべて実行し、動的レスポンス メッセージを提供し、パラメータ値をオーバーライドして、現在のページを変更できます。
フルフィルメントの Webhook 設定は次のとおりです。
用語 | 定義 |
---|---|
Webhook を有効にする | これにより、フルフィルメントの Webhook が有効になります。 |
Webhook | Webhook リソースを選択します。 |
タグ | ここで指定したテキストタグは、Webhook サービスに送信される Webhook リクエストの WebhookRequest.fulfillmentInfo.tag フィールドに入力されます。これにより、フルフィルメント固有の方法で Webhook の動作を制御できます。 |
部分的なレスポンスを返す | 部分的なレスポンスの再生をキャンセルできるようにします。詳しくは、音声の詳細設定をご覧ください。 |
パラメータのプリセット
フルフィルメントを使用して、現在のパラメータ値を設定またはオーバーライドするプリセットを指定できます。これらのプリセットは、静的レスポンス メッセージを解決する前、または Webhook を呼び出す前に適用されます。
システム関数を使用して、動的に生成される値へのパラメータにプリセットすることもできます。
次にその例を紹介します。
パラメータ
now
を現在の時刻に設定します。パラメータ 値 now $sys.func.NOW() 既存のパラメータ
counter
を 1 増やします。パラメータ 値 カウンタ $sys.func.ADD($session.params.counter, 1) 完全な複合オブジェクト値を維持しながら、パラメータ
new-cost
をother-cost
パラメータ値に設定します。パラメータ 値 new-cost $sys.func.IDENTITY($session.params.other-cost)
音声の詳細設定
これらの音声の詳細設定は、必要に応じて同じページの音声設定、フローの音声設定、エージェントの音声設定をオーバーライドできます。
レスポンス キュー
エージェントのターンの間に、複数のフルフィルメントを呼び出して、それぞれがレスポンス メッセージを生成することが可能です(生成が必要な場合もあります)。Dialogflow CX は、こうしたレスポンスをレスポンス キューに保持します。
ストリーミング API に対する部分レスポンス
デフォルトでは、Dialogflow CX はエージェントのターンが終了したときにのみ、順序付けされたレスポンスをエンドユーザーに送信します。Streaming API を使用する場合に、現在キューに入っているレスポンスを部分レスポンスとして返すには、フルフィルメントで部分レスポンスを返すオプションを有効にします。 詳しくは、ページのライフサイクルをご覧ください。
たとえば、Webhook が長時間実行される可能性がある場合に、フルフィルメントに静的レスポンスを追加して部分的なレスポンスを有効にできます。これにより、Dialogflow CX はレスポンス キューをフラッシュし、Webhook を呼び出す前にすべてのメッセージを部分的なレスポンスとして送信します。
以下の場合、部分的なレスポンスは現在サポート対象外ですが、今後サポートされる予定です。
- シミュレータでの音声入力
- パートナーのテレフォニー統合では、現在のところ部分的なレスポンスがサポートされている場合とサポートされていない場合があります。パートナーのドキュメントを参照してご確認ください。
シミュレータでこの機能をテストするには、部分的なレスポンスをオンにする必要があります。
次の例では、Webhook が完了するまでに 5 秒かかり、部分レスポンスは有効にしないものとします。Dialogflow CX エージェントの会話のターンは、Webhook が完了するまで終了しません。この 5 秒間のターンでは、Webhook を待機している間にレスポンスがキューに格納され、ターンが完了するまでエンドユーザーに返されません。これにより、ユーザー エクスペリエンスが低下します。
最初のフルフィルメントで部分レスポンスを有効にすると、Dialogflow CX は直ちに最初のフルフィルメント メッセージを返して Webhook を呼び出します。Webhook が完了すると、Dialogflow CX から最終レスポンスが返されます。このシナリオでは、エンドユーザーがしばらく待つように指示されるため、エンドユーザー エクスペリエンスが向上します。また、Webhook 呼び出しはエンドユーザーに送信されるレスポンスと同時に実行されます。
音声合成マークアップ言語(SSML)
テキストまたは出力音声テキストのフルフィルメント フィールドでは、音声合成マークアップ言語(SSML)を使用できます。これにより、一時停止の詳細や頭字語、日付、時刻、略語、検査すべきテキストのオーディオ形式を指定することで、音声応答をカスタマイズできます。
構文の詳細については、テキスト読み上げの SSML のドキュメントをご覧ください。