阿里云上的Salesforce:微信客服自动回复操作说明

更新时间:
复制 MD 格式

一、概述

本用例实现 C 端智能机器人在线回复功能。当客户通过微信等渠道发起聊天时,系统基于CXG AI 能力,自动分析聊天上下文并生成智能回复给客户,该用例适用于客服未接入回话场景下的实时对话,提升响应效率。

核心能力

  • 实时监听新聊天记录(Conversation Entry)创建事件

  • 自动拼接当前会话内多轮对话上下文

  • 调用提示模板生成自然语言回复

  • 根据回复内容智能判断是否需要转人工客服

  • 非转人工,则根据回复内容自动回复客户

免责声明与责任边界

本文档及其包含的代码、配置示例和提示模板仅作为技术参考与最佳实践展示,旨在演示CXG AI 在客服场景的典型应用方式。本文档内容不构成对产品功能、性能指标或业务效果的任何明示或暗示的承诺与保证。

在实际使用过程中,您需要注意以下事项:

  • 自行评估风险:AI 生成的回复可能存在理解偏差、信息不准确或不符合特定业务规范的情况。建议您建立人工复核机制或自动化校验流程,确保对外发送的内容符合您的品牌标准及安全合规要求。

  • 独立承担责任:由 AI 自动回复功能产生的沟通内容、业务影响及相关后果,需自行承担。阿里云不对因使用本文档中的示例代码、配置或建议而导致的任何直接或间接损失负责。

  • 充分测试验证:建议您先在沙盒环境中进行充分测试,根据实际业务场景调整提示模板、Flow 逻辑及异常处理策略,确认满足需求后再部署至生产环境。

  • 持续监控优化:鉴于 AI 模型输出具有不确定性,建议您建立持续的监控与反馈机制,定期优化提示模板以提升效果。

二、流程示意图

page_02_img_01

三、配置流程

3.1创建 提示模板 PROMPT TEMPLATE

操作步骤
  1. 登录阿里云上的Salesforce,前往 设置,导航栏搜索 提示生成器

  2. 新建提示模板:Flex 类型

  3. 自定义输入提示模板信息

    1. 名称:微信客服自动回复

    2. API 名称: wechat_auto_reply (注意: 这里应与下文需要手动创建Apex 内的触发提示模板的 API Name保持一致)

  4. 新增输入数据源

    1. 名称:ChatRecord

    2. API 名称:ChatRecord

    3. 源类型:自由文本

    4. 模板运行时需要:勾选

  5. 点击下一步,在 详细信息 设置里选择

    1. 模型: 自行选择适合业务的模型,推荐回复速度更快的 Flash 模型

    2. 响应: 允许的语言必须要选择并包含中文(简体)

  6. 复制并粘贴以下提示词到提示输入框中,您可以根据实际业务需要优化提示词。

## 角色
你是客服助理,负责根据客户与客服的聊天记录,为客服代表生成合适的推荐回复。

## 输入
{!$Input:ChatRecord}

其中包含对话时间(EntryTime__c) 、发送者类型(ActorType__c)和消息内容(Message__c)的完整对话历史
- ActorType__c = EndUser:客户发送的消息
- ActorType__c = Agent:客服代表发送的消息
- ActorType__c = System:系统或自动回复发送的消息
- EntryTime__c:消息发送时间

格式示例:
2026-01-28 10:29:50 [System]:欢迎进入在线客服,请问有什么可以帮您?
2026-01-28 10:30:00 [EndUser]: 你好,我想咨询一下订单状态
2026-01-28 10:30:15 [Agent]: 您好,请问您的订单号是多少?

## 任务
分析最新客户问题及对话上下文,生成一条自然、简洁、友好的推荐回复。

## 回复规则
1. 结合上下文:基于客户最新问题和客服最近的回复内容,提供连贯的推荐回复。
2. 过滤不当内容:不重复客户言论中不道德或不恰当的内容。
3. 保护隐私:回复中不得包含组织的具体信息或敏感数据。
4. 自然融入:回复须符合对话的上下文逻辑和语气。
5. 简洁友好:语言简洁、态度友好,且不得重复客服已发送过的内容。
6. 转人工判断:仅当客户(ActorType__c = EndUser)发送的最新一条消息包含转人工意图时触发。触发关键词

## 输出要求
仅输出推荐回复内容,无需解释、前缀或格式标记。
  1. 保存,并激活。

提示模板 示例图

page_04_img_01

3.2 创建 FLOW

操作步骤
  • 登录阿里云上的Salesforce,前往 设置,导航栏搜索 流

  • 新建 流:记录触发流(Record-Triggered ) 类型

  • 自定义输入 Flow 名称,API 名称,描述,例如 微信客服机器人自动回复

3.2.1 开始节点(触发器)

开始节点的触发器进行以下配置:

  1. 触发对象:Conversation Entry

  2. 触发时机:记录已创建

  3. 触发条件:满足所有条件 (AND):(Actor Type 等于 EndUser) AND (Entry Type 等于 Text)

  4. 优化流程: 操作和相关记录

如下图所示:

page_05_img_01

3.2.2 获取 Messaging Session 数据节点

在触发器后的节点上新增一个 获取记录 类型的元素,进行以下配置:

  1. 类型:获取记录

  2. 标签: 获取 Messaging Session 数据

  3. API 名称: get_message_session_by_entry_id

  4. 描述:通过conversationEntryId 获取聊天记录中的 messageSession 数据

  5. 获取此对象的记录

    1. 对象:Messaging Session

  6. 筛选 Messaging Session 记录:

    1. 条件要求 :满足自定义条件逻辑

    2. 条件逻辑: 1 AND (2 OR 3) AND 4

      1. 条件1:

        1. 字段:记录 ID

        2. 运算符:等于

        3. 值:触发 ConversationEntry_c > Conversation Identifier

      2. 条件2:

        1. 字段: Channel Type

        2. 运算符:等于

        3. 值:WeChat OA

      3. 条件3:

        1. 字段: Channel Type

        2. 运算符:等于

        3. 值:WeChat MP

      4. 条件4:

        1. 字段: Status

        2. 运算符:等于

        3. 值:Waiting

  7. 排序 Messaging Session 记录:

    1. 选择:未排序

  8. 存储的记录数量:

    1. 选择:仅限第一个记录

  9. 如何存储记录数据:

    1. 选择:自动存储所有字段

如下图所示:

page_06_img_01

3.2.3 判断 Messaging Session 是否存在

在 获取 Messaging Session 数据 节点后面新增一个 决策 类型的元素,进行以下配置:

  1. 类型:决策

  2. 标签:判断 Messaging Session 是否存在

  3. API名称:if_messaging_session_exists

  4. 描述:判断 Messaging Session 是否存在

  5. 分支 1:

    1. 结果标签:Messaging Session 存在

    2. 结果 API 名称:Messaging_Session_exists

    3. 执行结果的条件要求:满足所有条件(AND)

      1. 资源: 来自获取 Messaging Session 数据的Messaging Session > 记录 ID

      2. 运算符:为空

      3. 值:假

  6. 分支 2:

    1. 标签:Messaging Session 不存在

    2. 在分支2 添加 End 组件

如下图所示:

page_07_img_01

3.2.4 分析聊天记录并生成回复节点

在 判断 Messaging Session 是否存在 节点的分支1下新增一个 操作 类型的元素,进行以下配置:

  1. 类型:操作

  2. 搜索并选择 Apex:AIChatResponseGenerator(需要您先创建这个Apex,源码在下方)

    1. 标签:分析聊天记录并生成回复

    2. API 名称:  analyze_chat_records_generate_response

    3. 设置输入值:Messaging Session ID(必需):来自获取Messaging Session 数据的Messaging Session > 记录 ID

  3. 其他选项保持默认即可

注意:不建议直接在正式的生产环境组织中创建apex,可以通过以下文档使用其他方式创建。

  1. Deploying Apex | Apex Developer Guide | Salesforce Developers

  2. Unable to create, edit, or delete Apex triggers or classes in Salesforce

AIChatResponseGenerator flow apex类源码:

/**
* @description AI 聊 天 回 复生成 器 - 根 据 聊 天记 录调用 Einstein 提示 模板 生成 智 能 回 复 建 议
*/
global with sharing class AIChatResponseGenerator {
private static final String DEFAULT_ERROR_REPLY = '未能生成回复,请稍后
重试';

// Category最好是放到你们自己的分类中
    @InvocableMethod(Label = 'AI Chat Response Generator' Description = '根据聊天记录生成
    global static List<AIChatResponse> generate(List<AIChatResponseGeneratorReq> reque
        List<AIChatResponse> results = new List<AIChatResponse>();
        for (AIChatResponseGeneratorReq request : requests) {
            if (String.isBlank(request.messagingSessionId)) {
                results.add(new AIChatResponse(DEFAULT_ERROR_REPLY));
                continue;
            }
            String chatHistory = buildChatHistory(request.messagingSessionId);
            // 这里可以使用不同的提示模板,每个提示模板都有APIName
            String reply = callPromptTemplate(chatHistory, 'wechat_auto_reply');
            results.add(new AIChatResponse(reply));
        }
        return results;
    }

  // 聊天记录拼接格式示例:2026-01-28 10:30:00 EndUser:你好,我想咨询一下订单状态 2026-01-28
    private static String buildChatHistory(String conversationId) {

// 聊天记录拼接格式示例:2026-01-28 10:30:00 EndUser:你好,我想咨询一下订单状态 2026-01-28
    private static String buildChatHistory(String conversationId) {
        // TODO ConversationEntry__c需要加上生产环境的命名空间
        List<ConversationEntry__c> entries = [
            SELECT ActorType__c, Message__c, EntryTime__c
            FROM ConversationEntry__c
            WHERE ConversationId__c = :conversationId
            WITH USER_MODE
            ORDER BY EntryTime__c ASC
        ];
        List<String> lines = new List<String>();
        for (ConversationEntry__c entry : entries) {
            if (String.isNotBlank(entry.ActorType__c)
                && String.isNotBlank(entry.Message__c)
                && entry.EntryTime__c != null) {
                lines.add(entry.EntryTime__c.format('yyyy-MM-dd HH:mm:ss') + ' ['
    + entry.ActorType__c + ']: ' + entry.Message__c);
            }
        }
        return String.join(lines, '\n');
    }
    private static String callPromptTemplate(String chatHistory, String templateApiNam
        ConnectApi.WrappedValue inputValue = new ConnectApi.WrappedValue();
        inputValue.value = chatHistory;
        ConnectApi.EinsteinPromptTemplateGenerationsInput request = new ConnectApi.Ein
        request.additionalConfig = new ConnectApi.EinsteinLlmAdditionalConfigInput();
        // 应用名称
        request.additionalConfig.applicationName = 'PromptBuilderPreview';
        // 非预览模式,正式调用
        request.isPreview = false;
        // 提示模板声明的占位符
        request.inputParams = new Map<String, ConnectApi.WrappedValue>{ 'Input:ChatRec
        // 输出语言为简体中文,必须是prompt template支持的响应语言
        request.outputLanguage = 'zh_CN';
        try {
            ConnectApi.EinsteinPromptTemplateGenerationsRepresentation response =
                ConnectApi.EinsteinLLM.generateMessagesForPromptTemplate(templateApiNa
            if (!response.generations.isEmpty()) {
                return response.generations[0].text;
            }
            if (!response.generationErrors.isEmpty()) {
                System.debug(LoggingLevel.ERROR, 'LLM 生成错误: ' + response.generation
            }
        } catch (Exception e) {
            System.debug(LoggingLevel.ERROR, '提示模板调用异常: ' + e.getMessage());
        }
        return DEFAULT_ERROR_REPLY;
    }
    global class AIChatResponseGeneratorReq {
        @InvocableVariable(Label = 'Messaging Session ID' Description = '当前聊天的 Mess
        global String messagingSessionId;
    }
    global class AIChatResponse {
        @InvocableVariable
        global String replyResponse;
        public AIChatResponse(String reply) {
            this.replyResponse = reply;
        }
    }
}

如下图所示:

page_10_img_01

3.2.5 检查是否需要转人工客服节点

在分析聊天记录并生成回复节点后面新增一个决策类型的元素,进行以下配置:

  1. 类型:决策

  2. 标签:检查是否需要转人工客服

  3. API名称:check_if_transfer_to_human_agent

  4. 描述:检查 AI 的推荐回复中是否提示需要转人工客服。

  5. 分支 1(转人工客服):

    1. 结果标签:转人工客服

    2. 结果 API 名称:transfer_to_human_agent

    3. 执行结果的条件要求

      1. 满足任意条件 (OR)

        1. 条件1:

          a. 资源:来自分析聊天记录并生成回复的输出 > replyResponse

          b. 运算符:起始字符

          c. 值:Transferring to a human agent

    4. 条件2:

      a. Resource来自分析聊天记录并生成回复的输出 > replyResponse

      b. 运算符:起始字符

      c. 值:转人工客服中

注意:以上的转人工条件值是在提示模板提示词里面已经规定好的,如果您自定义了提示词中对于转人工客服相关的回复,需要相应修改条件中的值。

  1. 分支 2 (发送 AI 推荐回复)

    1. 标签:发送 AI 推荐回复

如下图所示:

page_11_img_01

3.2.6 发送转人工回复节点

在检查是否需要转人工客服节点的分支 1(转人工客服)下新增一个操作类型的元素,进行以下配置:

  1. 类型:操作

  2. 搜索并选择 Apex:Send WeChat Service Message (安装 CXG Package 以获取该 Apex)

    1. 标签: 发送转人工回复

    2. API 名称:send_transfer_to_agent_message

    3. 设置输入值

      1. Content: 来自分析聊天记录并生成回复的输出 > replyResponse

      2. Message Type: 1 (直接输入 1 即可)

      3. Messaging Session ID:来自获取 Messaging Session 数据的Messaging Session > 记录 ID

如下图所示:

page_12_img_02

3.2.7 执行转人工客服节点

在发送转人工回复节点后,根据是否开通 Omni-channel Routing 有两种情形。

第一种情形

已开通 Omni-channel,并且已经根据 CXG 文档完成 Omni-channel 配置,则可以执行以下步骤:

  1. 你需要新增一个 Omni-channel Flow,在转人工时,让 Omni-channel 自动帮您分配 human agent 来服务客户,参考文档:Omni-Channel 配置 - 帮助中心,请根据手动配置 - Flow 配置 - Omni-Channel Routing Flow 章节做配置,配置好后如下图所示page_12_img_01

  2. Omni-channel Flow 配置好后,在发送转人工回复节点后新增一个子流类型的元素。

    1. 类型:子流

    2. 搜索并选择 Flow:Omni-channel-to-queue-or-agent

    3. 标签:转给 Queue

    4. API 名称:chat_to_queue

    5. 设置输入值

      1. recordId:包括,填入来自获取 Messaging Session 数据的Messaging Session > 记录 ID

      2. routingToQueue:包括,填入 真

      3. userId:不需要勾选包括

注意:

  • 如果要交给 queue 处理,则 routingToQueue 设置为 True

    • 交给 queue 处理后,Omni-channel 会自动根据已有的规则把会话分配给 agent

  • 如果要转交给具体的 agent,则 routingToQueue 设置为 False,并且 userId 为必填

    • userId 是具体的 agent,您可以在这个子流节点前新增一个节点来按您的规则获取 userId,例如通过 user 的某些备注过滤获取 userId,或者从你已有的 queue 里面获取 userId

如下图所示:

page_13_img_01

第二种情形

未开通omni-channel,则可以执行以下步骤:

  1. CXG Package 中提供了一个可以在 Flow 中被执行的 Apex,名称为 Accept chat action,用于直接让 agent accept 会话。

  2. 在发送转人工回复节点后新增一个操作类型的元素。

    1. 类型:操作

    2. 搜索并选择 Apex:Accept chat action (安装 CXG Package 以获取该 Apex)

      1. 标签: 人工客服接受会话

      2. API 名称:accept_chat_by_human_agent

      3. 设置输入值

        1. Session ID: 来自获取 Messaging Session 数据的Messaging Session > 记录 ID

        2. User ID: userId是具体的agent,您可以在这个accept chat action节点前新增一个节点来按您的规则获取userId

如下图所示:

page_14_img_01

3.2.8 发送 AI 推荐回复节点

在检查是否需要转人工客服节点的分支 2(发送 AI 推荐回复)下新增一个操作类型的元素,进行以下配置:

  1. 类型:操作

  2. 搜索并选择 Apex:Send WeChat Service Message (安装 CXG Package 以获取该 Apex)

    1. 标签: 发送 AI 推荐回复

    2. API 名称:send_ai_reply_message

    3. 设置输入值

      1. Content:来自分析聊天记录并生成回复的输出 > replyResponse

      2. Message Type: 1 (直接输入 1 即可)

      3. Messaging Session ID:来自获取 Messaging Session 数据的Messaging Session > 记录 ID

  3. 在发送 AI 推荐回复节点后添加 End 组件

    如下图所示:page_15_img_01

    根据文档配置完成后,可以在微信客服会话测试 AI 的自动回复。

四、实现效果

以下示例基于 Omni-Channel 配置。

终端用户在微信发起聊天后,先由 AI 客服进行回复。当要求转接人工时,会收到提示词中预先定义好的回答,如:转人工客服中,请稍等。

IMG_7580

人工客服在服务控制台通过 Omni-channel 接入会话。

截屏2026-07-01 14