夜里 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 弹性扩缩容)
**架构闭环**
用户提问以后,整个系统就像一个"流水线工厂",按下面的步骤快速跑一遍:
-
入口 → 用户的问题先经过 API 网关(像大门口保安,先登记)。
-
找答案 → 进入 RAG 服务,调用 Chroma 向量库 去找相关资料(TopK)。
-
整理上下文 → 把找到的资料,按模板和规则拼接好(就像厨师配好食材)。
-
生成答案 → 交给 DeepSeek 模型生成完整回答(也能切换其他模型)。
-
质量检查 → 做一遍 安全与准确性校验,不靠谱就兜底。
-
快速送达 → 通过 WebSocket,像"外卖骑手",把答案一段段流式送给用户,首包 <300ms。
-
全程监控 → 每个环节都打点记录(时延、命中率、切换次数、满意度)。
<!---->
用户提问
↓
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**
-
时延:P50 / P95 / 首包时延
-
召回:TopK 命中率(含重排后)
-
有效率:回答通过人工抽检的比例
-
切换:模型切换次数和原因分布
-
稳定:熔断/降级触发率
-
体验:CSAT(满意度)和 转人工比例
**告警策略**
* 连续 3 分钟 P95>3s,需要扩容和暂停长文本处理
* 召回命中率<75%,需要回滚最新知识版本或重建索引
* 兜底触发率>15%,需要排查模板/分块策略/知识缺口
05 踩坑与复盘:别再踩一次
-
**知识过期**:版本/型号耦合,导致"答非所问"。
-
* 解决:知识条目强制携带**型号 + 固件 + 生效期**,过期自动降权/下线。
-
**切片太细/太粗**:上下文无关或信息缺失。
-
* 解决:**语义块 + 规则块**混合切分;步骤表格单独建知识单元。
-
**幻觉输出**:模型自信但不靠谱。
-
* 解决:引用片段校验 + 低置信兜底卡 + 敏感动作白名单。
-
**高峰雪崩**:短时并发拉满。
-
* 解决:**限流 + 队列 + 预估计费**,热点问答走**缓存副本**。
-
**埋点缺失**:问题看不见,优化无从谈起。
-
* 解决:全链路 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 落地不是"换个模型",而是把数据、检索、生成、容错和监控做成一个稳定的产品能力,当它能够稳定工作,工单就会自己降下去。
***
关注微信公众号:邹小邹-AI