RAG 工程化:从切分到重排的调优实录

RAG 的 demo 十分钟能搭出来:Embedding + 向量库 + Prompt 拼接。但一上生产就露馅:答非所问、漏召回、幻觉。这篇文章用招聘平台知识库(FAQ + 规则文档)做案例,记录把答案准确率从 55% 提到 85% 的全过程。

一、基线:先搭一个能跑的

E m b e d d i n g T o p K P r o m p t L L M

基线参数:

  • 切分:固定 500 token,重叠 50
  • Embedding:通用 embedding 模型
  • 检索:向量 top10
  • 效果:准确率 55%——能答,但经常漏关键信息、答非所问

二、第一刀:切分不是"均匀切块"

固定 500 token 切分的痛:一个完整规则被切到两段里,上下文断裂

按语义结构切

招聘规则文档是天然结构化的(标题 + 段落 + 列表)。用 markdown 结构切分:

5 0 # 0 # # # t / # o k # e 1 # n - # 2

效果:召回完整率从 55% → 68%。切分的第一原则:尊重文档结构,而不是平均切

三、第二刀:混合检索,别只靠向量

向量检索对"语义相近但用词不同"好,对"精确关键词/编号/规则号"差。

= t o p 1 0 B M 2 5 t o p 1 0

招聘规则里全是"旷工 3 次"“竞业协议 12 个月"这种精确数字——BM25 一搜一个准。混合后准确率 68% → 76%。

四、第三刀:重排(Rerank)决定上限

Top20 的候选里真正有用的可能就 3 条。重排模型(bge-reranker)把候选按与问题的相关度重新排序,只取前 5 进 Prompt。

7 6 % 8 5 2 % t o p 5

重排是性价比最高的一刀:不用改检索逻辑,准确率 +6%。

五、第四刀:上下文压缩(告别 Prompt 爆炸)

Top5 每段 500 token = 2500 token 塞进 Prompt,其中一半是噪音。上下文压缩:

+ T o p 5 " "

输出控制在 800 token 内的精华。好处:准确率 82% → 85%(噪音少了,LLM 更聚焦);token 成本降 60%。

六、完整的调优链路

环节 方案 准确率
基线 固定切分 + 纯向量 55%
+语义切分 按文档结构 68%
+混合检索 向量 ∪ BM25 76%
+重排 bge-reranker top5 82%
+上下文压缩 提取精华 85%

七、评测:没有评测就没有调优

调优的前提是能量化。建一个 200 条 QA 评测集(真实用户问题 + 标准答案 + 文档来源),每条跑完让 LLM 打分(相关/部分/不相关),跑批算准确率。每次改动跑一遍评测集,不凭感觉调参。

八、踩坑记录

坑 1:Embedding 没更新

文档更新后向量库里的旧向量还在,检索到过期内容。文档更新要联动向量删除/覆盖,或用带版本号的 chunk ID。

坑 2:重排模型要进服务端

Rerank 别在客户端做(模型文件几百 MB),服务端封装 /rerank 接口,配一个 GPU 实例专门跑。

坑 3:Prompt 里的"参考答案"要标明来源

让 LLM 引用来源([来源: 考勤制度.md 第3节]),幻觉率大降——LLM 知道答案要可溯源,就不敢编了

坑 4:多轮对话的上下文污染

“它”、“这个规则"指代上文的检索片段,第二轮就丢了。多轮场景把对话历史也做检索(HyDE),或把上一轮引用片段保留在上下文里

总结

RAG 工程化的主线:

  1. 切分尊重结构:语义块 > 固定块
  2. 检索混合:向量 + 关键词互补
  3. 重排定上限:TopK 质量比数量重要
  4. 压缩减噪音:精华进 Prompt,省 token 又提准

RAG 没有银弹,每一刀 +5~8%,叠起来就是 85%。而且永远带着评测集调优——数据说话,不靠感觉。