次の方法で共有


汎用エンゲージメント ハブへの引き渡しを設定する

Copilot Studio を使用すると、エンゲージメント ハブを介してエージェントの会話をシームレスかつコンテキスト的に人間のエージェントに渡します。

一部のカスタム開発では、会話を任意のエンゲージメント ハブに渡すようにエージェントを構成できます。

前提条件

重要

この記事では、いくつかのソフトウェア開発スキルが必要です。 この記事の手順は、開発者ツール、ユーティリティ、統合開発環境 (IDE) を十分に理解している経験豊富な IT プロフェッショナル向けです。

概要

エンゲージメント ハブへのハンドオフ用の汎用アダプター データフローのスクリーンショット。

エンゲージメントハブへの完全な引き継ぎは、次のパターンに従います。

  1. 顧客は、エンゲージメント ハブのチャット キャンバスを操作します。
  2. エンゲージメント ハブは、組み込みのチャット ルーティング機能を通じて受信チャットをエージェントにルーティングします。
  3. ユーザー定義アダプターは、エンゲージメント ハブからの受信チャット メッセージを Copilot Studio エージェントに渡します。
  4. 顧客がハンドオフをトリガーすると、Copilot Studio は完全な会話内容を保ったまま引き継ぐことを開始します。
  5. ユーザー定義のアダプターはハンドオフ メッセージを傍受したり、完全な会話コンテキストを解析したり、エスカレーションされた会話を、可用性に基づいて熟練した人間のエージェントにシームレスにルーティングします。
  6. 顧客のチャットは、シームレスかつ状況に応じて会話を再開できる人間のエージェントに渡されます。

会話を人間のエージェントに渡すには、ユーザー定義のハンドオフ アダプターを構築する必要があります。

ユーザー定義のハンドオフ アダプターを構築する

アダプターは、顧客、エージェント、人間のエージェント間でメッセージを中継したり変換することにより、エージェント エンゲージメント ハブとの間の会話を橋渡しします。

最も人気のあるエージェント エンゲージメント ハブは、ソフトウエア開発キット (SDK) を提供するか、API を公開してドキュメント化して、そのようなアダプターを構築できるようにします。

このドキュメントでは、カスタム アダプターに含めることができる内容については説明しません。 ただし、次のサンプルハンドオフメッセージは、Copilot Studioが< c0>ライブエージェントへの標準的なハンドオフの一環で生成する内容< /c0>に基づいており、開始する際に役立ちます。

これらのコード スニペットとサンプルを使用すると、エージェントの会話からコンテキストを抽出して、エージェントの会話をシームレスかつ状況に応じて汎用エンゲージメント ハブに渡すことができます。

ハンドオフ メッセージ ペイロードのサンプル

ハンドオフは現在、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>
    }
}