一个 AI 顶 5 个客服,工单直接砍一半!我们用 RAG 做到了

127 阅读7分钟

夜里 11 点,充电桩旁,一个用户焦急等待:

怎么还是充不上?

过去至少要来回 3 轮问答,才能定位问题。

现在,AI 客服只需 1 秒识别设备型号与错误码,一次性给出可执行步骤。

不是科幻,这是我们把 RAG(检索增强生成)工程化 的成果:

人力下降60%,

工单下降50%+

响应<2 秒

满意度上升40%

你将看到什么

  • 为什么选RAG做智能客服
  • 一眼看懂的RAG系统架构
  • 检索、拼接、生成、流式的关键实现细节
  • 多模型切换、容错监控、SLA 的工程化做法
  • 实测数据、踩坑复盘、可复制清单

01 FAQ 堆不动了,高峰期容易“崩”

什么是FAQ? FAQ,全称 Frequently Asked Questions,中文叫 常见问题解答。

在客服场景里,它一般指:

把用户最常问的问题(比如“充电桩连不上网怎么办”) 和标准答案(比如“重启→检查 SIM 卡→联系客服”) 整理成 知识库/文档/问答列表,给客服或用户快速查询。

它的优点是:

成本低:写好一次,重复使用很多次

上手快:新人客服靠 FAQ 也能回答常见问题

覆盖广:大多数用户只会问那 20% 的高频问题

为什么容易崩?

在传统的 FAQ 模式里,问题一旦复杂、高并发,容易出现以下痛点:

更新慢

设备型号、固件版本更新快

FAQ 文档常常没来得及更新,答案就过期了

用户问的是新问题,客服手里还是老答案

问题相似度高,背后成因不同

用户都说“充不上电”

但可能是插枪故障、也可能是刷卡异常、还可能是后台掉线

FAQ 给的“标准答案”很容易误判

人工检索慢

文档动辄上百页,关键词搜索结果几十条

客服要花时间比对,用户要干等

高峰期一堆人排队,体验直接崩

高并发不堪重负

节假日、恶劣天气时,工单量突然暴涨

人工客服数量有限,FAQ 检索跟不上

结果就是:客服问得急,用户等得烦,双方挫败感拉满

所以FAQ 就像一本厚厚的“说明书”,在问题多、版本杂、场景复杂、高并发的情况下,它就会显得笨重、滞后,甚至“崩掉”。 而这,正是 RAG(检索增强生成)可以大显身手的地方。

所以我们不再追 SOTA(买最新款的顶配跑车,马力最强、速度最快),我们只追 SLA(一辆省油、耐用、不挑路况的家用车,天天能开,不掉链子)。

02 RAG技术方案:把“搜索 + DeepSeek大模型”做成稳定服务

技术栈

• 后端:Spring Boot 3.2.4 + Spring Cloud 2023.0.1(Leyton)

• AI 引擎:DeepSeek-R1 主力

• 向量库:Chroma 0.5.4(语义召回)

• 通信:WebSocket(流式首包快)

• 部署:Docker 24.0 + Kubernetes 1.29(支持 HPA 弹性扩缩容)

架构闭环

用户提问以后,整个系统就像一个“流水线工厂”,按下面的步骤快速跑一遍:

  1. 入口 → 用户的问题先经过 API 网关(像大门口保安,先登记)。
  2. 找答案 → 进入 RAG 服务,调用 Chroma 向量库 去找相关资料(TopK)。
  3. 整理上下文 → 把找到的资料,按模板和规则拼接好(就像厨师配好食材)。
  4. 生成答案 → 交给 DeepSeek 模型生成完整回答(也能切换其他模型)。
  5. 质量检查 → 做一遍 安全与准确性校验,不靠谱就兜底。
  6. 快速送达 → 通过 WebSocket,像“外卖骑手”,把答案一段段流式送给用户,首包 <300ms。
  7. 全程监控 → 每个环节都打点记录(时延、命中率、切换次数、满意度)。
                            用户提问
                               ↓
                            API 网关(入口)
                               ↓
                            RAG 服务(调度)
                               ↓
                            Chroma 检索(找到相关资料)
                               ↓
                            上下文拼接(整理成可用信息)
                               ↓
                            DeepSeek 生成(生成答案)
                               ↓
                            质量 & 安全校验(靠谱才发)
                               ↓
                            WebSocket 流式返回(实时送达)
                               ↓
                            监控打点(全程追踪)

03 让AI一次说对

3.1 语义检索:先找“哪几段话”

  • 文档治理:去格式噪音(表格、PDF 目录、页脚)、标准化错误码与设备型号别名。
  • 分块策略:按语义段落或步骤模块做切片,携带来源元数据(设备型号、固件、场站)。
  • 召回重排:先 TopK 语义召回,再用规则重排(同型号优先、时间戳优先、相似去重)。

3.2 上下文拼接:把“能用的信息”喂给模型

  • 模板约束(示例):
    • 必含:设备型号、错误码、判定步骤、执行步骤、风险提示、转人工条件
    • 禁用:不确定性猜测、越权操作
    • 格式:步骤化输出 + 1 段 30 字内摘要,便于二次摘要与工单结构化

3.3 生成与流式返回:快与稳兼得

  • 生成:DeepSeek 为主,提示词内置“追问意图澄清”与“安全边界”;
  • 流式:WebSocket 推送 token,首包目标 <300ms,用户体感“秒回”。
  • 幻觉控制:答案必须引用命中的知识片段,低置信度触发兜底卡片(相关文档和转人工客服入口)。

毕竟大多数情况下还是需要人工最后兜底😄。

3.4 多模型与降级:把不确定性进行“结构化对冲”

  • 策略:主模型 → 备选模型 → FAQ 模板 → 标准语音引导/工单收敛
  • 切换触发:超时、错误码、负载阈值、置信度阈值。
  • 工程落地:Feign + Hystrix 熔断,Prometheus 指标驱动切换;调用链路全量日志

多模型接入,不是求更强,而是要最稳。

04 监控与 SLA:看板驱动的可靠性

我们盯的 6 个 KPI

  1. 时延:P50 / P95 / 首包时延
  2. 召回:TopK 命中率(含重排后)
  3. 有效率:回答通过人工抽检的比例
  4. 切换:模型切换次数和原因分布
  5. 稳定:熔断/降级触发率
  6. 体验:CSAT(满意度)和 转人工比例

告警策略

  • 连续 3 分钟 P95>3s,需要扩容和暂停长文本处理
  • 召回命中率<75%,需要回滚最新知识版本或重建索引
  • 兜底触发率>15%,需要排查模板/分块策略/知识缺口

05 踩坑与复盘:别再踩一次

  1. 知识过期:版本/型号耦合,导致“答非所问”。
    • 解决:知识条目强制携带型号 + 固件 + 生效期,过期自动降权/下线。
  2. 切片太细/太粗:上下文无关或信息缺失。
    • 解决:语义块 + 规则块混合切分;步骤表格单独建知识单元。
  3. 幻觉输出:模型自信但不靠谱。
    • 解决:引用片段校验 + 低置信兜底卡 + 敏感动作白名单。
  4. 高峰雪崩:短时并发拉满。
    • 解决:限流 + 队列 + 预估计费,热点问答走缓存副本
  5. 埋点缺失:问题看不见,优化无从谈起。
    • 解决:全链路 Trace ID,关键环节必须打点(召回数、重排耗时、生成耗时、切换原因)。

06 可复制清单:照着做,少走弯路

  • 文档治理:统一设备/错误码命名,补齐生效期和型号元数据
  • 分块策略:语义段和步骤块,TopK=3或者5起步
  • 模板约束:强结构化输出,禁止越权
  • 多模型接入:主、备、兜底全链路打点
  • 监控看板:P95、命中率、兜底率、切换率必上墙
  • 变更策略:知识库更新、灰度、回滚机制
  • 性能兜底:热点问答缓存、首包优先、流式返回

07 工程代码示例

public Answer handle(String userQuery) {
    // 检索
    List<Doc> hits = chroma.search(embed(userQuery), topK = 5);
    List<Doc> reranked = domainReRank(hits);  // 型号/时间加权
    
    // 拼接
    Prompt prompt = buildPrompt(userQuery, reranked, TEMPLATE);
    
    // 生成
    LlmResult result = llm.generate(prompt, provider = "DeepSeek", timeout = 2_000);
    if (lowConfidence(result) || isTimeout(result)) {
        result = fallbackChain(prompt);  // OpenAI → FAQ → 人工
    }
    
    // 监控
    monitor.log(Metrics.from(result, hits));  // 时延/命中/切换
    
    // 返回
    return streamOverWebSocket(result);  // 首包<300ms
}

08 后续优化

  • 多模态:识别设备面板照片、语音描述,从而一步定位问题
  • 知识图谱:设备、固件、错误码、充电桩、天气、工单,从而进行语义关联
  • 个性化:基于历史行为的答复风格与步骤优先级
  • 边缘计算:在站点边缘节点部署轻量检索,低网也能回答如流

总结:RAG 落地不是“换个模型”,而是把数据、检索、生成、容错和监控做成一个稳定的产品能力,当它能够稳定工作,工单就会自己降下去。


image.png