Delen via


Azure-agents configureren om gesprekken te escaleren en te beëindigen

Opmerking

Copilot Studio-bot is hernoemd naar Copilot-agent (agent of AI-agent). De naam van menselijke agent is nu gewijzigd in klantenservicemedewerker (servicemedewerker of medewerker). U kunt verwijzingen naar de oude en nieuwe termen tegenkomen terwijl we de product-UI, documentatie en trainingsinhoud bijwerken.

In dit artikel wordt uitgelegd hoe u een AI-agent (agent) in Azure kunt programmeren om een gesprek door te sturen naar een klantenservicemedewerker (servicevertegenwoordiger of vertegenwoordiger) in Dynamics 365 Contact Center. Het beschrijft ook hoe de agent moet worden geprogrammeerd om het gesprek te beëindigen.

Belangrijk

  • Agenten kunnen alleen gesprekken ontvangen als ze zijn toegevoegd aan op push gebaseerde workstreams.
  • AI-agenten worden niet ondersteund in consult-modus.

Vereiste voorwaarden

  • U moet een agent in Azure hebben die is geconfigureerd en geïntegreerd met Dynamics 365 Contact Center. Meer informatie in Een Azure-agent integreren
  • Routing op basis van vaardigheden moet zijn ingeschakeld.

Een gesprek escaleren naar een vertegenwoordiger

In Dynamics 365 Contact Center kan een agent het huidige gesprek escaleren naar een vertegenwoordiger. De routering van het gesprek is afhankelijk van de routeringsregel die is geconfigureerd voor de werkstroom.

Wanneer de medewerker het escalatieverzoek accepteert en het gesprek wordt doorgegeven van de AI-agent, worden de klant- en zaakgegevens automatisch geïdentificeerd. De agent stuurt gesprekken door gebruik te maken van de Dynamics 365 Contact Center-contextvariabelen die aan het gesprek zijn gekoppeld. De agent kan een lijst met contextvariabelen en bijbehorende waarden naar Dynamics 365 Contact Center sturen, samen met het escalatieverzoek. De agent kan ook contextitems instellen die door skillfinder-modellen kunnen worden gebruikt om nieuwe vaardigheden te identificeren en deze toe te voegen aan de bestaande vaardigheidslijst voor het gesprek. Dynamics 365 Contact Center werkt vervolgens de contextvariabelen bij met de opgegeven waarden en draait de routeringsengine opnieuw. Het systeem zorgt ervoor dat het geëscaleerde gesprek naar de juiste wachtrij wordt gestuurd. Lees meer over de contextitems en variabelenamen in Koppel klant- en casusgesprekken wanneer de agent gesprekken escaleert of beëindigt.

Nadat de vertegenwoordiger het escalatieverzoek heeft geaccepteerd, is het transcript van het gesprek van de agent met de klant zichtbaar in de gesprekswidget van de vertegenwoordiger. De vertegenwoordiger kan dan het gesprek met de klant voortzetten.

Opmerking

De samenvatting van het gesprek is niet zichtbaar voor de klant.

Een gesprek beëindigen

De Azure-agent kan ervoor kiezen het gesprek te beëindigen als hij vaststelt dat de vragen van de klant zijn beantwoord, of als de klant niet meer reageert. De agent kan een EndConversation verzoek sturen naar Dynamics 365 Contact Center.

Voorbeeldcode

Deze sectie bevat codevoorbeelden die u kunt gebruiken om een Azure-bot te configureren om gesprekken te escaleren en te beëindigen.

  1. Implementeer een opdrachtklasse om taken te modelleren die verband houden met het escaleren en beëindigen van gesprekken.

  2. Implementeer een Omnichannel-clientklasse om de commandocontext in te stellen.

    De voorbeeldcode is als volgt.

    /// <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. Roep de juiste clientmethode aan in de klasse Bot ActivityHandler.

  4. Wijzig de Escalate en EndConversation opdrachtcriteria op basis van uw vereisten.

  5. Voeg de code-instructie OmnichannelBotClient.BridgeBotMessage(turnContext.Activity); toe aan je botcode om berichten naar Dynamics 365 Contact Center te sturen. Deze methode moet worden aangeroepen voor elk activiteitsbericht dat naar de klant wordt verzonden.

    De voorbeeldcode is als volgt.

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

    Het woordenboek contextVars bevat alle contextvariabele-naamparen die je wilt bijwerken als onderdeel van het escalatieverzoek. Hier BotHandoffTopic is de naam van de contextvariabele en CreditCard is de waarde van de contextvariabele. Als er een representatieve wachtrij is met de regel BotHandoffTopic gelijk aan CreditCar, wordt deze geëscaleerde chat naar die wachtrij doorgestuurd.

    De naam van de contextvariabele is van het type String. De waarde van de contextvariabele moet van het type Integer of String zijn en moet tijdens de escalatie worden doorgegeven als Dictionary<string, object> . De voorbeeldcode is als volgt.

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

De medewerker kan ook een escalatiesamenvatting sturen die pas zichtbaar is voor de medewerker nadat hij het geëscaleerde chatverzoek heeft geaccepteerd. Om de samenvatting te verzenden, stel je de activiteitstekst in in het escalatiebericht.

Een Azure-agent integreren
Contextvariabelen toevoegen
Azure Bot-service
Verbind een agent met kanalen
Uw eigen aangepaste kanaal integreren met Direct Line
Best practices voor het configureren van Azure- en Copilot Studio-agents