汎用エンゲージメント ハブへのハンドオフを構成する
Copilot Studio では、エンゲージメント ハブを通じて、エージェントの会話をシームレスかつ状況に応じて人間のエージェントに引き渡すことができます。
一部のカスタム開発では、会話を任意のエンゲージメント ハブに渡すようにエージェントを構成できます。 このガイドでは、この実行方法について説明します。
前提条件
- Copilot Studio を使用して構築されたエージェントが必要です。
- API または SDK を使用してプログラムで対話できるエンゲージメント ハブが必要です。
重要
このセクションの一部の手順では、ユーザーまたは開発者によるソフトウェア開発が必要です。 サードパーティのエンゲージメント ハブと Copilot Studio の統合を検討している開発者ツール、ユーティリティ、および IDE を十分に理解している IT 管理者または開発者などの経験豊富な IT プロフェッショナルを対象としています。
概要
エンゲージメント ハブへの完全なハンドオフは、次のパターンに従います:
顧客は、エンゲージメント ハブのチャット キャンバスを操作します。
エンゲージメント ハブは、組み込みのチャット ルーティング機能を通じて受信チャットをエージェントにルーティングします。
ユーザー定義アダプターは、エンゲージメント ハブからの受信チャット メッセージを Copilot Studio エージェントに渡します。
顧客がハンドオフをトリガーすると、Copilot Studio は完全な会話コンテキストでハンドオフを開始します。
ユーザー定義のアダプターはハンドオフ メッセージを傍受したり、完全な会話コンテキストを解析したり、エスカレーションされた会話を、可用性に基づいて熟練した人間のエージェントにシームレスにルーティングします。
顧客のチャットは、シームレスかつ状況に応じて会話を再開できる人間のエージェントに渡されます。
会話を人間のエージェントに渡すには、ユーザー定義のハンドオフ アダプターを構築する必要があります。
ユーザー定義のハンドオフ アダプターを構築する
アダプターは、顧客、エージェント、人間のエージェント間でメッセージを中継したり変換することにより、エージェント エンゲージメント ハブとの間の会話を橋渡しします。
最も人気のあるエージェント エンゲージメント ハブは、ソフトウエア開発キット (SDK) を提供するか、API を公開してドキュメント化して、そのようなアダプターを構築できるようにします。
カスタム アダプタの内容については、このドキュメントの範囲外です。 ただし、次のサンプル ハンドオフ メッセージは、Copilot Studio は ライブ チャット オペレーターへの標準的なハンドオフ の一部として生成される内容に基づいており、開始する際に役立ちます。
これらのコード スニペットとサンプルを使用すると、エージェントの会話からコンテキストを抽出して、エージェントの会話をシームレスかつ状況に応じて汎用エンゲージメント ハブに渡すことができます。
ハンドオフ メッセージ ペイロードのサンプル
ハンドオフは現在、Direct Line でのみサポートされています。 詳細については、Direct Line 上でのエージェントとのやり取りをご参照ください。 ハンドオフで handoff.initiate
というイベント活動が発生し、アダプターに送信されます。
GitHub サイトでのハンドオフ メッセージ活動の完全なサンプル を確認できます。
ハンドオフ メッセージからコンテキストを抽出する
会話コンテキストを使用するには、handoff.initiate
イベント活動を解析する必要があります。
次のコードのスニペットは、handoff.initiate
イベント活動を解析し、会話コンテキストを抽出します。 GitHub の完全なサンプル コードを参照してください。
public void InitiateHandoff(string botresponseJson)
{
BotResponse response = JsonConvert.DeserializeObject<BotResponse>(botresponseJson);
// Look for Handoff Initiate Activity. This indicates that conversation needs to be handed off to agent
Activity handoffInitiateActivity = response.Activities.ToList().FirstOrDefault(
item => string.Equals(item.Type, ActivityTypes.Event, System.StringComparison.Ordinal)
&& string.Equals(item.Name, HandoffInitiateActivityName, System.StringComparison.Ordinal));
if (handoffInitiateActivity != null)
{
// Read transcript from attachment
if (handoffInitiateActivity.Attachments?.Any() == true)
{
Attachment transcriptAttachment = handoffInitiateActivity.Attachments.FirstOrDefault(a => string.Equals(a.Name.ToLowerInvariant(), TranscriptAttachmentName, System.StringComparison.Ordinal));
if (transcriptAttachment != null)
{
Transcript transcript = JsonConvert.DeserializeObject<Transcript>(transcriptAttachment.Content.ToString());
}
}
// Read handoff context
HandoffContext context = JsonConvert.DeserializeObject<HandoffContext>(handoffInitiateActivity.Value.ToString());
// Connect to Agent Hub
// <YOUR CUSTOM ADAPTER CODE GOES HERE>
}
}