共用方式為


設定 Azure 代理程式以呈報和結束交談

備註

Copilot Studio 機器人已重新命名為 Copilot 代理程式 (代理程式或 AI 代理程式)。 真人專員現已重新命名為客戶服務代表 (服務代表或代表)。 在我們更新產品 UI、文件和訓練內容時,您可能會發現我們不時提及舊的和新的詞彙。

本文說明如何在 Azure 中對 AI 代理程式 (代理程式) 進行程式設計,以將交談路由傳送至 Dynamics 365 Contact Center 中的客戶服務代表 (服務代表或代表)。 它還描述如何對代理程式進行程式設計以結束交談。

這很重要

  • 代理程式只有在其已新增至推送型工作流時,才能收到交談。
  • AI 客服人員在諮詢模式下不支援。

先決條件

  • 您必須在 Azure 中擁有已設定並與 Dynamics 365 Contact Center 整合的客服專員。 深入瞭解整合 Azure 代理程式
  • 應啟用技能型路由。

將對話呈報給代表

在 Dynamics 365 Contact Center 中,客服專員可以將目前的交談呈報給代表。 交談的路由取決於為工作流設定的路由規則。

當客服接受升級請求並將對話從 AI 客服轉接時,客戶與案件細節會 自動被識別。 客服人員會利用與對話相關的 Dynamics 365 聯絡中心情境變數來導引對話。 客服人員可以將上下文變數及相關值清單連同升級請求一併傳送至 Dynamics 365 聯絡中心。 代理也能設定情境項目,供技能尋找模型識別新技能,並將其附加到對話中的現有技能清單中。 接著 Dynamics 365 聯絡中心會更新指定的情境變數,並再次執行路由引擎。 系統會確保升級的對話被導向正確的佇列。 在客服升級或結束對話時,請進一步了解 「連結客戶與案件」中的上下文項目與變數名稱。

代表接受呈報請求後,客服專員與客戶的對話記錄將顯示在代表的對話小工具上。 然後,代表可以繼續與客戶交談。

備註

對話摘要對客戶來說是看不到的。

結束對話

Azure 代理可以選擇在判斷客戶問題已回答或客戶不再回應時結束對話。 客服人員可以向 Dynamics 365 聯絡中心發送 EndConversation 請求。

範例程式碼

本節包含程式碼範例,可用來設定 Azure Bot 以呈報和結束交談。

  1. 實作命令類別來建立與升級和結束交談相關的工作模型。

  2. 實作一個全通道客戶端類別來設定指令上下文。

    範例程式碼如下。

    /// <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. 呼叫 Bot ActivityHandler 類別中的適當用戶端方法。

  4. Escalate根據您的需求變更 和 EndConversation 命令準則。

  5. 在你的機器人程式碼中加入程式碼陳述 OmnichannelBotClient.BridgeBotMessage(turnContext.Activity); ,以便將訊息傳送到 Dynamics 365 聯絡中心。 必須針對傳送給客戶的每個活動訊息呼叫此方法。

    範例程式碼如下。

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

    字典 contextVars 包含所有你想在升級請求中更新的上下文變數名稱對。 以下是 BotHandoffTopic 內容變數名稱, 而 CreditCard 是內容變數值。 如果有一個代表性佇列,規則 BotHandoffTopic 等於 CreditCar,那麼這個升級的聊天就會被導向該佇列。

    環境定義變數名稱的類型為 String。 內容變數值必須是 Integer 或 String 類型,而且應該在呈報期間以字典<字串、物件> 的形式傳遞。 範例程式碼如下。

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

客服人員也可以發送升級摘要,只有在客服接受升級聊天請求後才會看到。 要傳送摘要,請在升級訊息中設定活動文字。

整合 Azure Agent
新增內容變數
Azure Bot 服務
將代理連接到通道
使用 Direct Line 整合您自己的自訂管道
配置 Azure 與 Copilot Studio agents 的最佳實踐