Partilhar via


Configurar agentes do Azure para escalar e encerrar conversas

Observação

O bot do Copilot Studio é renomeado como agente do Copilot (agente ou agente de IA). O agente humano agora é renomeado como representante de suporte ao cliente (representante de suporte ou representante). Poderá deparar-se com referências aos termos antigos e novos enquanto atualizamos a IU do produto, a documentação e o conteúdo de preparação.

Este artigo explica como você pode programar um agente(agente) de IA no Azure para rotear uma conversa para um representante de atendimento ao cliente (representante ou representante de serviço) no Dynamics 365 Contact Center. Ele também descreve como programar o agente para terminar a conversa.

Importante

  • Os agentes só podem receber conversas se forem adicionados a fluxos de trabalho baseados em emissão.
  • Os agentes de IA não são suportados no modo de consulta.

Pré-requisitos

  • Tem de ter um agente no Azure configurado e integrado com o Dynamics 365 Contact Center. Saiba mais em Integrar um agente do Azure
  • O roteamento baseado em habilidades deve ser habilitado.

Encaminhar uma conversa para um representante

No Dynamics 365 Contact Center, um agente pode escalar a conversa atual para um representante. O roteamento da conversa depende da regra de roteamento configurada para o fluxo de trabalho.

Quando o representante aceita o pedido de escalonamento e a conversa é transferida do agente de IA, os detalhes do cliente e do caso são automaticamente identificados. O agente encaminha as conversas utilizando as variáveis de contexto do Contact Center do Dynamics 365 associadas à conversa. O agente pode enviar uma lista de variáveis de contexto e valores associados para o Centro de Contacto Dynamics 365, juntamente com o pedido de escalonamento. O agente também pode definir itens de contexto que podem ser usados por modelos de busca de habilidades para identificar novas competências e adicioná-las à lista de competências existentes para a conversa. O Dynamics 365 Contact Center atualiza então as variáveis de contexto com os valores especificados e executa novamente o motor de roteamento. O sistema garante que a conversa escalada é encaminhada para a fila correta. Saiba mais sobre os itens de contexto e os nomes das variáveis em Link Customer e Cases to Conversations quando o agente escala ou termina conversas.

Depois que o representante aceita a solicitação de escalonamento, a transcrição da conversa do agente com o cliente fica visível no widget de conversa do representante. O representante pode então continuar a conversa com o cliente.

Observação

O resumo da conversa não é visível para o cliente.

Terminar uma conversa

O agente Azure pode optar por terminar a conversa se determinar que as perguntas do cliente foram respondidas, ou se o cliente já não estiver a responder. O agente pode enviar um EndConversation pedido para o Centro de Contacto Dynamics 365.

Código de exemplo

Esta seção inclui exemplos de código que você pode usar para configurar um bot do Azure para escalar e encerrar conversas.

  1. Implemente uma classe de comando para modelar tarefas relacionadas a escalar e encerrar conversas.

  2. Implemente uma classe cliente Omnichannel para definir o contexto de comandos.

    O código de exemplo é o seguinte.

    /// <summary>
    /// Send end of conversation context to user and agent.
    /// </summary>
    public static async Task EndConversationAsync(ITurnContext turnContext, CancellationToken cancellationToken)
    {
        IActivity customerFacingActivity = Activity.CreateMessageActivity();
        customerFacingActivity.Text = "Thanks for talking with me. Have a good day. Bye.";
        BridgeBotMessage(customerFacingActivity);
    
        IActivity agentFacingActivity = Activity.CreateMessageActivity();
        agentFacingActivity.Text = "Ending the conversation as per customer request.";
        AddContext(CommandType.EndConversation, agentFacingActivity);
    
        List<IActivity> messageActivities = new List<IActivity>
        {
            customerFacingActivity,
            agentFacingActivity
        };
    
        await turnContext.SendActivitiesAsync(messageActivities.ToArray(), cancellationToken);
    }
    
    /// <summary>
    /// Send escalation context to user and agent.
    /// </summary>
    public static async Task EscalateConversationAsync(ITurnContext turnContext, IContextManager contextManager, CancellationToken cancellationToken)
    {
        IActivity customerFacingActivity = Activity.CreateMessageActivity();
        customerFacingActivity.Text = "Perfect I’ll transfer you now";
        BridgeBotMessage(customerFacingActivity);
    
        IActivity agentFacingActivity = Activity.CreateMessageActivity();
        agentFacingActivity.Text = GetEscalationSummary(turnContext, contextManager);
        AddContext(CommandType.Escalate, agentFacingActivity, contextManager.GetContext(turnContext.Activity.Conversation.Id));
    
        List<IActivity> messageActivities = new List<IActivity>
        {
            customerFacingActivity,
            agentFacingActivity
        };
    
        await turnContext.SendActivitiesAsync(messageActivities.ToArray(), cancellationToken);
    }
    
  3. Chame o método de cliente apropriado na classe Bot ActivityHandler.

  4. Altere os critérios e Escalate de EndConversation comando com base nos seus requisitos.

  5. Adicione a instrução OmnichannelBotClient.BridgeBotMessage(turnContext.Activity); do código no seu código do bot para enviar mensagens ao Centro de Contacto do Dynamics 365. Esse método deve ser chamado para cada mensagem de atividade enviada ao cliente.

    O código de exemplo é o seguinte.

    protected async Task OnMessageActivityAsync(ITurnContext turnContext, ITurnState turnState, CancellationToken cancellationToken)
    {
        ArgumentNullException.ThrowIfNull(turnContext);
        var text = turnContext.Activity.Text?.ToLower(CultureInfo.InvariantCulture);
        var responseActivity = Activity.CreateMessageActivity();
        Responses.BuildCustomerFileAttachmentResponse(turnContext, responseActivity);
    
        if (string.IsNullOrEmpty(text))
        {
            if (turnContext.Activity.Value is JsonElement jsonElement)
            {
                var activityResponseValue = turnContext.Activity.Value;
                responseActivity.Text = $"You replied with value: {Environment.NewLine}{activityResponseValue}";
            }
        }
        else if (text.StartsWith("echo:", StringComparison.OrdinalIgnoreCase))
        {
            responseActivity.Text = text.Replace("echo:", "", StringComparison.OrdinalIgnoreCase);
        }
        else if (text.Contains("ac ", StringComparison.OrdinalIgnoreCase))
        {
            Responses.BuildAdaptiveCardResponse(responseActivity, text);
        }
        else
        {
            switch (text)
            {
                case Commands.Agent:
                    await OmnichannelAgentClient.EscalateConversationAsync(turnContext, _contextManager, cancellationToken);
                    return;
                case Commands.AnimationCard:
                case Commands.AudioCard:
                case Commands.FaultySigninCard:
                case Commands.HeroCard:
                case Commands.HeroCardIMBack:
                case Commands.HtmlList:
                case Commands.Markdown:
                case Commands.ReceiptCard:
                case Commands.SigninCard:
                case Commands.ThumbnailCard:
                case Commands.VideoCard:
                    Responses.BuildStructuredCardResponse(responseActivity, text);
                    break;
                case Commands.AttachmentFromC2:
                    responseActivity.Text = $"Attachment type has been identified";
                    break;
                case Commands.Debug:
                    Responses.BuildDebugContextResponseText(_contextManager, turnContext, responseActivity);
                    break;
                case Commands.EndChat:
                    await OmnichannelAgentClient.EndConversationAsync(turnContext, cancellationToken);
                    break;
    
                case Commands.Help:
                    Responses.BuildHelpResponse(responseActivity);
                    break;
                default:
                    Responses.BuildDidNotUnderstandResponse(responseActivity, text);
                    break;
            }
        }
        await OmnichannelAgentClient.BridgeAndSendActivityAsync(turnContext, responseActivity, cancellationToken);
    }
    

    O dicionário contextVars contém todos os pares de nomes-valor das variáveis de contexto que pretende atualizar como parte do pedido de escalonamento. Aqui BotHandoffTopic está o nome da variável de contexto e CreditCard é o valor da variável de contexto. Se houver uma fila representativa com a regra BotHandoffTopic igual a CreditCar, então esse chat escalonado é encaminhado para essa fila.

    O nome da variável de contexto é do tipo String. O valor da variável de contexto deve ser do tipo Integer ou String, e deve ser passado como Dictionary<string, objeto> durante o escalonamento. O código de exemplo é o seguinte.

    Dictionary<string, Object> keyValues = new Dictionary<string, object>()
    {
        { "BotHandoffTopic", "CreditCard" },
        { "IDNumber", 101}
    }
    

O agente também pode enviar um resumo de escalada que só fica visível para o representante depois de aceitar o pedido de chat escalado. Para enviar o resumo, defina o texto da atividade na mensagem de escalonamento.

Integrar um agente do Azure
Adicionar variáveis de contexto
Serviço de Bot do Azure
Ligue um agente a canais
Integre seu próprio canal personalizado usando Direct Line
Boas práticas para configurar agentes Azure e Copilot Studio