第9章:RAG 检索优化全攻略——从召回率到答案质量

第9章:RAG 检索优化全攻略——从召回率到答案质量

系列导读:检索是 RAG 的命脉,召回的内容质量决定了 LLM 回答的天花板。本章系统讲解检索优化的四维框架。


一、为什么要系统优化检索?

先看三个现实问题:

  1. 用户问"退款政策",召回的第一步是"配送说明",第二步才是"退款政策"——漏召回
  2. 用户问"这个功能怎么用?",召回的 10 个 chunk 里有 3 个完全无关——召回噪音大
  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 方案

  1. Cross-Encoder Reranker:问题和每个 chunk 拼接一起送进模型,输出一个相关性分数。比双塔(bi-encoder)更准但计算更慢
  2. LLM-as-Judge:让 LLM 对每个召回 chunk 打分(慢但效果最好,适合少量结果)
  3. 规则过滤:按 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 回答的天花板越高

思考题

  1. 多路召回中,向量检索和 BM25 的分数范围不同,直接加权融合可能不公平。你除了 RRF 之外还有什么融合策略?
  2. 如果你的 golden set 只有 20 条,怎么防止过拟合评估集?