第9章:RAG 检索优化全攻略——从召回率到答案质量
系列导读:检索是 RAG 的命脉,召回的内容质量决定了 LLM 回答的天花板。本章系统讲解检索优化的四维框架。
一、为什么要系统优化检索?
先看三个现实问题:
- 用户问"退款政策",召回的第一步是"配送说明",第二步才是"退款政策"——漏召回
- 用户问"这个功能怎么用?",召回的 10 个 chunk 里有 3 个完全无关——召回噪音大
- 用户问了一个涉及两个不同知识点的复合问题,检索只找到了其中一个——覆盖不全
这三个问题对应的分别是:
- 召回精度的优化
- 召回噪音的优化
- 多路召回的优化
二、四层检索优化框架
第一层:索引层——知识怎么存
切割策略优化:
- 第7章讲过的四种策略按需选择和组合
- 父子结构不过分零碎也不过分庞大
metadata 索引:
- 为每个 chunk 打上分类标签、文档类型、版本号、创建时间
- 检索时做前置过滤,缩小搜索范围
向量索引参数调优:
- HNSW 的 ef_construction:构建时越精细,搜索越准,但构建越慢
- HNSW 的 ef_search:搜索时额外探索更多候选,提高召回率但增加延迟
第二层:查询层——问题怎么转换
Query Rewrite 四大方法(详见第6章总结):
| 方法 | 核心思想 | 解决的问题 |
|---|---|---|
| 直接改写 | 口语 → 书面语 | 用户提问随意 |
| 查询扩展 | 加相关关键词 | 术语不匹配 |
| HyDE | LLM 假设答案 → 用答案向量检索 | 用户问题表述匮乏 |
| Step-back | 抽象具体问题 | 需要更广泛背景 |
应用场景举例:
- 用户问"这东西坏了咋整"→ 直接改写成"产品故障排查指南"
- 用户问"张三是谁"→ 扩展"张三 | 人物 | 简介 | 生平"
- 用户只有一个缩写词"OKR"→ Step-back 到"目标管理体系"
第三层:召回层——从哪些路径找
多路召回:不走单一检索路径,而是从多个角度同时找,然后把结果合并:
┌─ 向量检索(语义匹配) → Top-K1 结果
├─ BM25/全文检索(关键词匹配) → Top-K2 结果
├─ 结构化查询(metadata过滤 + 精确匹配) → Top-K3 结果
└─ 混合融合 → 去重 → 合并排序 → 进入 Rerank
每种召回方法有不同的优势:
- 向量检索:语义相近但用词不同的内容
- BM25:精确的关键词匹配、术语命中
- Structured Query:条件查找(某版本、某产品的文档)
融合策略:
- 加权融合:weight_vector × score_vector + weight_bm25 × score_bm25
- RRF(Reciprocal Rank Fusion):不关心绝对分数,只关心排名位置
第四层:重排序层——哪些给 LLM
粗招召回的结果数量通常远超过 LLM context 能容纳的。Rerank 的作用:
用更精确的模型重新打分,选最相关的 Top-N 传给 LLM
常见 Rerank 方案:
- Cross-Encoder Reranker:问题和每个 chunk 拼接一起送进模型,输出一个相关性分数。比双塔(bi-encoder)更准但计算更慢
- LLM-as-Judge:让 LLM 对每个召回 chunk 打分(慢但效果最好,适合少量结果)
- 规则过滤:按 metadata 排除明显不相关的
三、系统性优化流程
不要东一榔头西一棒槌,按以下流程来:
步骤1:建立评估基准
└─ 标注 50-100 组"问题/期望答案",称为 golden set
步骤2:跑基线
└─ 用最简单的 chunking + 默认模型 + 向量检索,测召回率和答案质量
步骤3:逐层优化
└─ 先看召回层:调整 chunking、换 Embedding 模型、加多路召回
└─ 再看查询层:加 Query Rewrite,看是否能召回原本漏掉的内容
└─ 最后看重排序层:加 Reranker,提高精度、降低噪音
步骤4:回归验证
└─ 每次改动后跑 full golden set,确保没有 regression
四、常见检索 bad case 速查表
| 现象 | 根因 | 解法 |
|---|---|---|
| 问题措辞不同就检索不到 | Embedding 语义映射不够 | 换模型 / 加 Query Rewrite |
| 专有名词搜不到 | 语义匹配 + 精确匹配不足 | 加 BM25 / 结构化索引 |
| 召回很多无关内容 | 粗排粒度太粗 | 加 Reranker / 缩小 Top-K |
| 需要跨文档关联才能回答 | 单路召回覆盖不全 | 多路召回 + 多跳检索 |
| 召回内容正确但太碎片化 | Chunk 太小 | 父子结构 / 增大 chunk |
五、本章小结
- 检索优化的目标:不漏(召回率)、不杂(精确度)、够用(覆盖度)
- 四层框架:索引层 → 查询层 → 召回层 → 重排序层
- 黄金法则:先建评估基准(golden set),再逐层优化,每次改动都跑回归
- RAG 系统的上限在检索层,搜索做得越好,LLM 回答的天花板越高
思考题
- 多路召回中,向量检索和 BM25 的分数范围不同,直接加权融合可能不公平。你除了 RRF 之外还有什么融合策略?
- 如果你的 golden set 只有 20 条,怎么防止过拟合评估集?