일반 참여 허브로의 핸드오프 구성

중요

Power Virtual Agents 기능 및 특징은 생성 AI에 대한 막대한 투자와 Microsoft Copilot 전반의 향상된 통합에 따라 이제 Microsoft Copilot Studio의 일부가 되었습니다.

문서 및 교육 콘텐츠를 업데이트하는 동안 일부 문서와 스크린샷에서는 Power Virtual Agents을 참조할 수 있습니다.

Copilot Studio에서 참여 허브를 통해 Copilot 대화를 휴먼 에이전트에게 완벽하고 상황에 맞게 전달할 수 있습니다.

일부 사용자 지정 개발을 통해 모든 참여 허브로 대화를 전달하도록 Copilot을 구성할 수 있습니다. 이 가이드는 이를 수행하는 방법을 설명합니다.

전제 조건

중요

이 섹션의 지침에는 사용자 또는 개발자의 소프트웨어 개발이 필요합니다. Copilot Studio와 타사 참여 허브를 통합하려는 개발자 도구, 유틸리티 및 통합 IDE에 대해 잘 알고 있는 IT 관리자나 개발자와 같은 숙련된 IT 전문가를 대상으로 합니다.

개요

일반 어댑터 데이터 흐름을 보여주는 그림.

참여 허브로의 전체 핸드오프는 다음 패턴을 따릅니다.

  1. 최종 사용자가 참여 허브의 채팅 캔버스와 상호 작용합니다.

  2. 참여 허브는 기본 제공 채팅 라우팅 기능을 통해 수신 채팅을 Copilot으로 라우팅합니다.

  3. 사용자 지정 어댑터는 수신 채팅 메시지를 참여 허브에서 Copilot Studio Copilot으로 릴레이합니다.

  4. 최종 사용자가 핸드오프를 트리거하면 Copilot Studio는 전체 대화 컨텍스트로 핸드오프를 시작합니다.

  5. 사용자 지정 어댑터는 핸드오프 메시지를 가로채고 전체 대화 컨텍스트를 구문 분석하며 에스컬레이션된 대화를 가용성에 따라 숙련된 휴먼 에이전트로 원활하게 라우팅합니다.

  6. 최종 사용자의 채팅은 대화를 재개할 수 있는 휴먼 에이전트에게 완벽하고 상황에 맞게 전달됩니다.

대화를 휴먼 에이전트에게 전달하려면 사용자 지정 핸드오프 어댑터를 빌드해야 합니다.

사용자 지정 핸드오프 어댑터 빌드

어댑터는 최종 사용자, Copilot 및 휴먼 에이전트 간에 메시지를 릴레이하고 변환하여 에이전트 참여 허브와 대화를 연결합니다.

가장 인기 있는 에이전트 참여 허브는 SDK를 제공하거나 API를 공개적으로 문서화하여 이러한 어댑터를 빌드할 수 있습니다.

사용자 지정 어댑터가 포함할 수 있는 내용을 다루는 것은 이 문서의 범위를 벗어나지만 라이브 에이전트 경험으로의 표준 핸드오프의 일부로 Copilot Studio가 생성하는 것에 따라 다음 샘플 핸드오프 메시지가 시작하는 데 도움이 될 수 있습니다.

이 코드 조각 및 샘플을 사용하면 대화에서 컨텍스트를 추출하여 Copilot 대화를 일반 참여 허브로 원활하고 상황에 맞게 전달할 수 있습니다.

샘플 핸드오프 메시지 페이로드

핸드오프는 현재 Direct Line을 통해서만 지원됩니다. Direct Line을 통해 Copilot과 상호 작용에 대해 자세히 알아보세요. 핸드오프 시 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>
    }
}