Compartir a través de


Configurar agentes de Azure para ampliar y terminar las conversaciones

Nota

El bot pasa de Copilot Studio a llamarse agente de Copilot (agente o agente de IA). El agente humano ahora pasa a llamarse representante del servicio al cliente (representante de servicio o representante). Es posible que encuentre referencias a los términos antiguos y nuevos mientras actualizamos la interfaz de usuario, la documentación y el contenido de formación del producto.

En este artículo se explica cómo puede programar un agente de IA (agente) en Azure para enrutar una conversación a un representante de servicio al cliente (representante de servicio o representante) en Dynamics 365 Contact Center. También describe cómo programar el agente para finalizar la conversación.

Importante

  • Los agentes pueden recibir conversaciones a agentes solo si se agregan a secuencias de trabajo basadas en inserción.
  • Los agentes de IA no están soportados en modo consulta.

Requisitos previos

  • Debe tener un agente en Azure configurado e integrado con Dynamics 365 Contact Center. Más información en Integrar un agente de Azure
  • El enrutamiento basado en aptitudes se debe habilitar.

Ampliar una conversación a un representante

En Dynamics 365 Contact Center, un agente puede escalar la conversación actual a un representante. El enrutamiento de la conversación depende de la regla de enrutamiento que esté configurada para la secuencia de trabajo.

Cuando el representante acepta la solicitud de escalada y la conversación se transfiere desde el agente de IA, los detalles del cliente y del caso se identifican automáticamente. El agente enruta las conversaciones utilizando las variables de contexto del Centro de Contacto de Dynamics 365 asociadas a la conversación. El agente puede enviar una lista de variables de contexto y valores asociados al Centro de Contacto de Dynamics 365, junto con la solicitud de escalación. El agente también puede establecer elementos contextuales que los modelos de búsqueda de habilidades pueden usar para identificar nuevas habilidades y añadirlas a la lista de habilidades existentes para la conversación. Dynamics 365 Contact Center actualiza entonces las variables de contexto con los valores especificados y ejecuta de nuevo el motor de enrutamiento. El sistema se asegura de que la conversación escalada se encamine a la cola correcta. Aprende más sobre los elementos contextuales y los nombres de variables en las conversaciones de Link, cliente y caso cuando el agente escala o termina las conversaciones.

Una vez que el representante acepte la solicitud de escalación, la transcripción del chat de la conversación del agente con el cliente visible en el widget de conversación del representante. A continuación, el representante puede continuar la conversación con el cliente.

Nota

El resumen de la conversación no es visible para el cliente.

Finalizar una conversación

El agente de Azure puede decidir terminar la conversación si determina que las preguntas del cliente han sido respondidas, o si el cliente ya no responde. El agente puede enviar una EndConversation solicitud al Centro de Contacto de Dynamics 365.

Código de ejemplo

Esta sección incluye ejemplos de código que puede usar para configurar un bot de Azure para escalar y finalizar conversaciones.

  1. Implemente una clase de comando para modelar tareas relacionadas con la intensificación y finalización de conversaciones.

  2. Implementa una clase cliente Omnichannel para establecer el contexto de comandos.

    El código de ejemplo es el siguiente.

    /// <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. En la clase ActivityHandler del bot, llame al método del cliente correspondiente.

  4. Cambiar los criterios de los comandos Escalate y EndConversation basados en sus requisitos.

  5. Añade la instrucción OmnichannelBotClient.BridgeBotMessage(turnContext.Activity); de código en tu código de bot para enviar mensajes al Centro de Contacto de Dynamics 365. Este método tiene que llamarse para cada mensaje de la actividad que se envía al cliente.

    El código de ejemplo es el siguiente.

    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);
    }
    

    El diccionario contextVars contiene todos los pares de nombres de variables de contexto que quieres actualizar como parte de la solicitud de escalada. Aquí BotHandoffTopic es el nombre de variable de contexto y CreditCard es el valor de variable de contexto. Si hay una cola representativa con la regla BotHandoffTopic igual a CreditCar, entonces este chat escalado se enruta a esa cola.

    El nombre de la variable de contexto es del tipo Cadena. El valor de la variable de contexto debe ser de tipo Entero o Cadena y debe pasarse como Diccionario <string, object> durante la escalada. El código de ejemplo es el siguiente.

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

El agente también puede enviar un resumen de escalada que solo será visible para el representante después de que acepte la solicitud de chat escalada. Para enviar el resumen, establece el texto de actividad en el mensaje de escalada.

Integrar un agente de Azure
Agregar variables de contexto
Azure Bot Service
Conecta un agente a canales
Integración de su propio canal personalizado mediante Direct Line
Procedimientos recomendados para configurar agentes de Azure y Copilot Studio