十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

电商AI客服系统从多平台接入到高并发稳定的工程实践

电商AI客服系统从多平台接入到高并发稳定的工程实践 AI客服软件在电商场景的落地实践从多平台接入到每天上万条消息的稳定性设计做电商客服系统的朋友应该都有同感大促期间咨询量暴涨人工客服根本接不过来哪怕把客服团队扩到十几个人还是会有消息漏回、回复慢、话术不统一的问题。之前我们团队在调研客服方案时反复被“按条数计费”这个点卡住——咨询量稍微上来一点费用就完全失控一天几万条消息根本不敢想。后面我们做了一套自己的 AI 客服软件方案把意图识别、知识库检索、多平台消息网关和并发处理链路完整串了起来。整体实现下来单机撑住一天上万条消息是可行的而且方案可以横向扩展。这篇内容我按工程落地的思路来写包含整体架构、核心技术模块、多电商平台接入方式、代码示例、常见报错和最佳实践不管你是想自己做客服系统还是准备给现有系统接入 AI 客服都可以直接参考。1. 为什么电商客服需要 AI 客服软件先说一个很多人容易误解的地方AI 客服并不是简单地把 ChatGPT 之类的模型接到店铺后台然后让模型自动回复。它本质是一套“能理解问题、能匹配知识、能返回可读答案、能对接平台消息通道”的完整业务系统。1.1 电商客服的典型痛点电商场景下的客服消息有几个特点消息量大且集中大促、直播带货、新品上架期间咨询量可能是平时的几十倍。问题高度重复什么时候发货、有没有货、怎么退换、优惠券怎么用、尺码怎么选这些问题占了总咨询量的八成以上。响应时间要求高平台对客服回复时效有考核用户等待时间过长流失率和差评率都会上升。话术一致性要求高同一个问题不同客服回答得不一样容易引发客诉。跨平台消息分散很多商家同时开拼多多、淘宝、抖音、京东多个店铺客服需要在不同后台来回切换消息漏回是常态。这些问题叠加在一起靠“多招人”不是好办法因为成本高、培训周期长而且大促结束后人力又过剩。AI 客服软件解决的核心问题是用自动化的方式承接高频重复咨询让人工客服只处理售后纠纷、异常订单等高难度会话。1.2 “无限量消息”在技术层面意味着什么市面上不少 AI 客服产品按消息条数计费比如一个套餐只能回 5000 条超出之后要么停服要么按条加钱。对商家来说这种模式最怕的是“咨询量越涨费用越失控”。从技术层面看所谓“无限量消息”不是说不用调用模型而是指系统设计要以高吞吐、低失败率为指标把单条消息的边际成本压到很低同时保证集群能够横向扩容。核心不是某个神秘模型而是四件事通过 prompt 缓存和相似问复用减少重复计算。通过意图识别先分流只有复杂问题才调用大模型生成答案。通过消息队列削峰让系统在瞬时高并发下不会被打垮。通过横向扩容让处理能力可以随时加机器扩展。后续章节我会围绕这四个方面展开。2. 整体架构设计下面是我们最终落地采用的架构按功能边界拆成五个部分。这里先给一个简化的架构图示意客户端拼多多/淘宝/抖音/京东等平台消息 │ ▼ ┌─────────────────────────┐ │ 多平台消息接入网关 │ │ 平台鉴权 / 消息收发 / │ │ 会话保持 / 事件回调 │ └─────────────────────────┘ │ ▼ ┌─────────────────────────┐ │ 消息队列Kafka/RocketMQ│ └─────────────────────────┘ │ ▼ ┌─────────────────────────┐ │ 智能路由与意图识别服务 │ │ 相似问匹配 / 关键词分流 / │ │ 工单分类 │ └─────────────────────────┘ │ ▼ ┌─────────────────────────┐ │ 对话管理 知识库检索 │ │ 业务知识库 / RAG 检索 / │ │ 大模型生成 / 兜底策略 │ └─────────────────────────┘ │ ▼ ┌─────────────────────────┐ │ 回复发送服务 │ │ 审核规则 / 发送限流 / │ │ 日志记录 / 人工接管 │ └─────────────────────────┘各模块职责如下模块职责关键点消息接入网关统一接收各平台回调消息屏蔽平台差异回调验签、消息幂等、会话上下文关联消息队列缓冲流量峰值解耦消息接入与处理分区有序、消费失败重试、堆积监控意图识别服务判断用户问题的类型做路由分流相似问检索、意图置信度阈值对话服务生成答案或者从知识库检索出答案知识库结构、RAG 检索、兜底策略回复发送服务把答案发送到平台并记录处理日志平台发送频率限制、答非所问拦截这里要强调一个原则不要让消息接入服务直接调用大模型。如果用户消息一到就同步调模型遇到大促流量尖峰模型服务响应变慢甚至超时消息就会大量积压最后反而是最简单的“没回复”问题压垮系统。中间加一层消息队列才能做到削峰填谷。3. 环境准备与版本选型这里没有唯一的答案每个项目现状不同我按我们实际使用的环境来说明参考版本大家要看自己项目情况调整。3.1 技术栈清单后端语言Java 17 Spring Boot 3.2.x消息队列Apache Kafka 3.6.x或 RocketMQ 5.x数据库MySQL 8.0存储会话、消息记录、知识库配置向量数据库Milvus 2.4.x用于知识库文本向量检索如果数据量不大也可以用 Redis 扩展模块或 Elasticsearch 8.x缓存Redis 7.xAI 模型服务通过 HTTP 接口调用大模型 API或内部部署开源模型服务比如基于 vLLM 部署的 Qwen 系列模型中间件Nacos 或 Apollo 用于配置管理Nginx 用于网关入口对象存储MinIO 或云 OSS用来存储用户上传的图片、知识库附件3.2 项目结构建议ai-cs-platform/ ├── ai-gateway # 多平台接入网关模块 ├── ai-common # 公共工具、统一返回、异常处理 ├── ai-mq # 消息队列生产/消费封装 ├── ai-intent # 意图识别与路由模块 ├── ai-chat # 对话管理模块对接大模型与知识库 ├── ai-knowledge # 知识库管理与检索模块 ├── ai-admin # 运营后台配置知识库、查看会话 └── ai-job # 定时任务如会话超时检测、数据归档如果你只是做内部工具不需要拆这么细但把“平台消息接入”和“对话处理”拆开是值得的后面接新平台时会轻松很多。3.3 版本兼容提示Spring Boot 3.x 要求 Java 17 及以上如果你的团队还在用 Java 8建议先统一升级 JDK或者选择 Spring Boot 2.7.x 的兼容方案。Kafka 客户端版本要和服务端版本匹配否则会出现序列化异常。大模型 API 的模型名称、接口路径、鉴权方式不同厂商差异很大项目里最好有一个模型服务适配层不要把某个厂商的 SDK 直接散落在业务代码里。4. 多电商平台接入设计与实现“全面适配电商全平台”是标题里的核心宣传点也是技术上最容易被低估的部分。很多人以为平台接入就是调几个 API实际上每个平台的协议、鉴权方式、消息格式、调用频率限制全都不一样。4.1 平台差异点分析以国内主流电商平台为例消息接入大体分几类拼多多/抖音电商商家后台有开放平台 API支持通过 Webhook 或消息推送接口接收用户消息然后调用 API 回复。淘宝/天猫通过千牛开放平台接入需要应用审核使用消息服务或机器人插件。京东京东宙斯开放平台提供消息能力也需要应用审核且类目不同能力有差异。这些平台的共同点是都要求回调地址验签防止伪造消息。都要求消息幂等处理因为回调可能重复推送。都对回复频率有限制同一店铺同一时间段内发送条数不能超过阈值。都要求在会话有效期内回复否则会提示“会话已关闭”或“需要客服介入”。4.2 统一消息模型不要为每个平台设计一套消息结构否则业务层会写大量 if-else。更好的做法是在网关层定义统一的消息模型// 文件路径ai-common/src/main/java/com/aics/platform/common/model/PlatformMessage.java public class PlatformMessage { private String platform; // 平台编码pdd/douyin/taobao/jd private String shopId; // 店铺ID private String conversationId; // 会话ID平台侧会话标识 private String userId; // 用户ID private String userNick; // 用户昵称 private String messageId; // 平台消息ID用于幂等 private String content; // 文本消息内容 private Long timestamp; // 消息时间戳 private Integer msgType; // 消息类型1文本 2图片 3商品卡片 4订单卡片 // getter/setter 略 }有了统一消息模型所有下游模块只需要依赖PlatformMessage完全不用关心消息来自哪个平台。4.3 回调验签与异步推送以服务端接收拼多多消息回调为例核心流程是接收平台 POST 请求。校验签名验证请求真实性。解析消息内容转换为统一消息模型。写入消息队列。立即返回成功响应避免平台重复推送。下面是验签和入队的核心代码片段思路// 文件路径ai-gateway/src/main/java/com/aics/platform/gateway/listener/PddCallbackController.java RestController RequestMapping(/api/callback/pdd) public class PddCallbackController { PostMapping(/message) public ResultVoid receiveMessage(HttpServletRequest request, RequestBody String body) { // 1. 验签 boolean valid PddSignUtil.verify(request, body); if (!valid) { log.warn(pdd callback sign invalid); return Result.error(sign invalid); } // 2. 转换为统一消息 ListPlatformMessage messageList PddMessageConverter.convert(body); // 3. 写入消息队列使用 platform conversationId 作为分区键 for (PlatformMessage msg : messageList) { mqTemplate.send(ai-cs-message-in, msg.getPlatform() : msg.getConversationId(), msg); } // 4. 返回成功平台收到后停止重推 return Result.success(); } }要点说明PddSignUtil.verify负责根据平台文档对请求头参数和 body 做 HMAC-SHA256 签名校验具体算法以平台最新文档为准。PddMessageConverter.convert负责把平台 JSON 转换为自定义PlatformMessage。消息队列的分区键选platform conversationId保证同一个会话的消息按顺序被同一个消费者处理。4.4 幂等设计平台回调很有可能会重复推送同一条消息所以消费端必须做幂等。推荐做法是把messageId写入 Redis 进行去重// 文件路径ai-mq/src/main/java/com/aics/platform/mq/consumer/MessageInConsumer.java Component public class MessageInConsumer { Autowired private StringRedisTemplate redisTemplate; private static final String IDEMPOTENT_KEY_PREFIX im:dedup:; public void onMessage(PlatformMessage msg) { String key IDEMPOTENT_KEY_PREFIX msg.getPlatform() : msg.getMessageId(); // setIfAbsent 成功说明是第一次处理 Boolean first redisTemplate.opsForValue().setIfAbsent(key, 1, Duration.ofMinutes(10)); if (Boolean.FALSE.equals(first)) { log.info(duplicate message ignored, messageId{}, msg.getMessageId()); return; } // 继续后续处理 processMessage(msg); } }这样相同messageId的消息在 10 分钟内不会重复处理即使平台推送了两次也不会给用户发两条一样的回复。5. 核心对话处理链路消息从队列被消费之后就进入核心对话链路。整个流程我拆成三步意图识别与分流。知识库检索。答案生成与兜底。5.1 意图识别与相似问匹配先想一个问题用户问“什么时候发货”和“订单多久能发出”表达不同但意图相同。如果每次都调用大模型成本很高且响应不稳定。更好的办法是先用相似问检索命中常见问题只有检索不到时才调用大模型。实际项目中可以使用向量检索匹配相似问题用户问题 - 文本向量化 - 在知识库中检索 Top5 相似问题 - 计算相似度得分 - 得分高于阈值直接返回知识库配置的答案 - 得分低于阈值进入大模型生成链路相似度阈值一般设置为 0.82 到 0.9 之间具体值要根据测试集调优。阈值设置太高很多问题会漏到模型侧设置太低会返回不相关内容。5.2 RAG 式知识库检索所谓 RAGRetrieval-Augmented Generation检索增强生成就是先检索知识库中与用户问题相关的内容再把检索结果作为上下文一起发给大模型让模型基于这些资料回答。这样做的好处是回答来源可控不容易凭空编造。更新知识不需要重新训练模型改知识库文档即可。能很大程度上降低大模型幻觉。知识库的存储结构可以按“商品维度和售后维度”拆分-- 知识库表 CREATE TABLE kb_document ( id bigint NOT NULL AUTO_INCREMENT, shop_id varchar(64) NOT NULL COMMENT 店铺ID, category varchar(32) NOT NULL COMMENT 分类product/after_sale/logistics, title varchar(255) NOT NULL COMMENT 标题, content text NOT NULL COMMENT 知识内容, status tinyint NOT NULL DEFAULT 1 COMMENT 状态1启用 0停用, create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_shop_category (shop_id, category) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT客服知识库;检索阶段核心代码如下1. 将用户问题通过 Embedding 模型转换为向量 2. 从向量数据库中召回 TopK 条相似片段 3. 同时用 MySQL 关键词匹配召回一部分 4. 合并结果按相关度排序取前 N 条 5. 拼装 prompt发送给大模型这里有一个工程细节向量检索适合语义相似度匹配但像“订单号 20241115 查询”“查一下快递单号”这类包含具体实体的查询纯向量检索效果不一定好需要结合规则抽取和数据库精确查询。所以知识库检索不要只用向量建议做“多路召回”向量召回和关键词/规则召回一起上效果更稳定。5.3 Prompt 设计Prompt 是决定回复质量的关键不能简单粗暴地写“你是客服”。建议把角色、任务、知识约束、平台要求都放进 System Prompt。下面是一个可参考的 Prompt 模板你是{店铺名称}的电商客服助手熟悉店铺商品、物流、售后退换规则。 你可以参考以下知识内容回答用户问题 知识内容 {检索到的知识片段} /知识内容 如果知识内容中无法找到答案请明确告知用户“需要转接人工客服处理” 不要编造物流时间、退款金额、库存数量等敏感信息。 回复语言风格要专业、简短、口语化不要输出 Markdown 格式。 当前平台为{平台名称}不要使用其他平台的话术。这个模板里有几个关键点知识内容放在一个明确的标签内模型更容易区分哪些是参考资料。明确要求不能编造敏感信息这是客服场景最容易出问题的地方。指定平台名称避免不同平台话术混用。5.4 兜底策略不管处理链路设计得多么完善都会有模型无法回答的情况。此时必须有兜底策略而不是让模型强行编一个答案。我们项目里的策略分三级级别触发条件处理方式L1意图识别置信度低回复“请问您是想咨询发货时间、退换货还是订单问题呢”L2知识库无结果生成内容为空回复“这个问题我需要核实一下已为您转接人工客服”L3用户情绪负面识别到投诉类关键词直接进入人工客服队列并打上紧急标签兜底策略要写在代码逻辑里不要把希望全部寄托在模型“自己知道不知道”上。6. 高并发与高可用设计回到标题里的“一天回复上万条消息”这不是一个不能实现的目标但必须保证系统在高流量下依然稳定。下面是我们验证过的几个关键设计。6.1 消息队列削峰一天上万条消息平均每秒也就 0.1 条听起来很低。但真正的难点是瞬时尖峰。大促开始前几分钟可能几十个店铺同时涌入几千条消息每秒峰值达到几十甚至上百条。解决方式是让网关只负责接收和校验不处理业务逻辑把消息全部抛到 Kafka 或 RocketMQ。消费端根据实际处理能力去拉取消息处理不了的先积压在队列中等尖峰过去再慢慢消化。6.2 消费并发与顺序性同一个会话的消息必须按顺序处理否则会出现“用户问 A客服先回复了 B”的错乱。所以消费端做并发扩展时不能简单地开 100 个线程。推荐做法# Kafka 消费者配置 spring: kafka: consumer: group-id: ai-cs-message-group auto-offset-reset: earliest enable-auto-commit: false listener: concurrency: 8concurrency: 8表示开启 8 个消费者线程每个线程负责不同分区的消息。只要生产端严格按conversationId选择分区同一个会话的消息就会进入同一个分区被同一个消费者线程按顺序处理。6.3 大模型调用限流与熔断外部模型服务有 QPS 限制如果没有限流一个店铺突然来大量消息时可能把模型服务打挂。项目里建议使用 Resilience4j 或 Sentinel 做熔断限流。// 配置思路Sentinel 规则可以通过 Nacos 动态下发 // 下面给出限流规则的核心参数说明限流维度建议按店铺限流防止某个大店把整个集群的资源耗尽。按整体 QPS 限流确保模型服务不超载。按接口响应时间慢调用超过阈值时直接熔断走兜底策略。6.4 回复发送频率控制平台对回复频率也有限制。举个例子某个平台限制单店铺 5 秒最多发送 3 条消息。如果系统生成回复后立刻调用发送接口很容易触发平台风控导致封禁或禁言。解决思路是使用 Redis 做一个滑动窗口计数器发送前检查 key: send:limit:{shopId} 统计当前 5 秒内已发送条数 如果小于阈值允许发送并计数 如果达到阈值延迟 1-2 秒再重试或进入等待队列这个逻辑不能省否则即使系统内部处理再快最终也会被平台封控。6.5 监控与告警没有监控的高并发系统等于盲开车。至少要监控以下几个指标指标说明预警条件消息队列积压数量当前未消费消息数量超过 10000 且持续 5 分钟消息消费延迟从消息入队到消费的间隔超过 60 秒大模型调用成功率模型服务调用成功占比低于 95%人工接管率需要人工处理的会话占比高于 30% 时检查知识库覆盖情况平台发送失败率调用平台 API 失败占比高于 5%7. 常见问题与排查思路下面整理开发接入过程中最常遇到的几个问题。问题现象常见原因解决思路平台回调一直报验签失败签名算法不对、密钥配置错误、时间戳偏移超过平台要求对照平台文档检查签名拼接顺序使用平台提供的调试工具生成签名比对消息重复回复平台重复推送且消费端没有做幂等在消费入口加 Redis messageId 去重同一会话消息顺序错乱生产端没有按 conversationId 选择分区或者消费并发数超过分区数修改生产端分区键调整消费并发配置大促时消息大量积压队列积压消费速度跟不上生产速度先扩容消费者实例再查看模型调用耗时是否过高必要时做限流降级用户问常见问题但回答很差知识库未覆盖该问题或者向量检索阈值过低检查知识库命中结果补充相似问法调整相似度阈值回复内容出现平台外话术Prompt 没有指定平台或知识库混合了多个店铺内容在 Prompt 中明确平台信息知识库字段增加 shop_id 隔离回复被平台风控拦截发送频率过高或内容包含敏感词增加发送频率控制检查回复内容是否包含违禁词排查建议遇到问题时不要直接看代码先看链路日志。最好是每个消息都有唯一的traceId从回调开始一路带到发送结束这样就能在日志平台中快速定位消息在哪一步出了问题。8. 最佳实践与工程建议最后整理一些从项目里沉淀下来的经验没有排序但每一条都在实际中出现过。8.1 不要把账号密码硬编码在配置里平台 API 密钥、店铺访问令牌都是敏感信息。建议统一放到 Apollo 或 Nacos 配置中心并用命名空间区分环境。上线前至少做一次密钥轮换。8.2 平台接入层做成可插拔每个平台的接入逻辑尽量封装成独立模块通过配置中心动态启用。例如# 平台接入开关 platform.pdd.enabledtrue platform.douyin.enabledtrue platform.taobao.enabledfalse这样新接入一个平台时不影响线上正在运行的其他平台。8.3 知识库更新要走审核流程客服知识直接决定了回复质量不能让人随便改。后台更新知识库时建议增加“草稿 - 审核 - 发布”的流程并记录每次修改的操作人。发布后观察人工接管率如果某个知识点发布后客诉明显上升要及时回滚。8.4 每一次模型调用都要记录日志模型生成的回复内容必须落库并且和用户消息、知识库命中片段关联起来。一方面是为了事后审计另一方面也是积累数据用来评估哪些问题回答得好、哪些问题需要人工干预。8.5 人工接管必须始终存在AI 客服做得再好也不能完全取代人工。系统里应该有随时切换人工接管的机制比如用户发送“转人工”“投诉”“退款”等关键词时直接将会话置为人工优先而不是继续让模型回复。另外一旦用户情绪激烈也必须能够快速转入人工。8.6 关注模型评测而不是只看单条回复上线 AI 客服前建议准备评测集至少包含 200 到 500 条有代表性的用户问题覆盖发货、物流、退换货、价格、库存、发票等常见场景。每次调整 Prompt、更换模型、修改知识库后用同一套评测集跑一遍对比人工打分的通过率。通过率不低于 85% 再发布上线。9. 总结与下一步这篇文章从多平台消息接入、统一消息模型、意图识别、知识库检索、大模型生成、消息队列削峰到平台发送限流完整走了一遍电商 AI 客服系统的核心链路。无论你是在调研方案还是已经进入开发阶段建议先把“消息接入 - 知识库检索 - 答案生成 - 回复发送 - 人工接管”这条主链路跑通再逐步做精细化调优。接下来你可以继续深入的方向有几个一是知识库的数据清洗和自动更新这是回复质量持续稳定的前提二是意图识别模型效果优化可以选择微调一个行业意图分类模型三是做更完善的 A/B 测试对比不同 Prompt 和模型在真实流量下的表现。如果你正在做类似的 AI 客服系统希望这篇内容能帮你少踩几个坑。文中代码是简化示例实际项目中还需要结合自己的业务规则、平台 API 和模型服务做适配。有任何问题欢迎在评论区交流。
返回列表