本页目录
Lesson 06 — 进阶检索:混合检索 + Rerank
本课目标:搞懂为什么单纯向量检索不够,以及业界真正在用的进阶检索技术。这是 RAG 进阶的分水岭。
前 5 课你只用向量检索。这一课你会看到向量检索的致命软肋,并学会用混合检索 + Rerank 来弥补。
1. 向量检索的局限:对"关键词"不敏感
向量检索擅长语义匹配——"年假"能匹配到"带薪休假",因为它懂语义。
但它有个致命弱点:对关键词、专有名词、编号、代码不敏感。看几个翻车场景:
| 用户查询 | 向量检索可能的问题 |
|---|---|
RFC 7231 |
找不到精确编号,可能召回"RFC 2616"这种语义相近但编号不对的 |
产品 AB-200 报错 |
找不到型号精确匹配 |
报错码 ERR_0x42 |
向量不懂这个码,按语义瞎召回 |
张三的审批记录 |
"张三"是人名,向量检索可能召回"李四"的记录 |
为什么?因为 embedding 把文本压缩成"语义向量",具体的字符、编号、人名这些"精确信息"在压缩中被模糊化了。语义相近 ≠ 完全匹配。
🎯 核心认知:向量检索擅长"意思相近",关键词检索擅长"字面精确"。生产级 RAG 必须两者结合。
2. BM25:关键词检索的老牌劲旅
BM25(Best Matching 25) 是信息检索领域几十年的经典算法,搜索引擎的基石之一。
它怎么工作(直觉版)
给每个文档算一个"和查询的相关性分数",考虑三个因素:
- 词频 (TF):查询词在文档里出现得越多,越相关
- 逆文档频率 (IDF):越罕见的词越重要("的"这种常见词权重低,"AB-200"这种罕见词权重高)
- 文档长度归一化:避免长文档天然占便宜
BM25 的优势(向量检索没有的)
- ✅ 精确匹配:查"AB-200"就只匹配含"AB-200"的,绝不混淆
- ✅ 对罕见词/编号敏感:IDF 机制让罕见词权重很高
- ✅ 可解释:分数怎么算的清清楚楚
- ✅ 不需要训练:纯统计方法,拿来就用
BM25 的劣势(向量检索的优势)
- ❌ 不懂语义:查"年假"匹配不到"带薪休假"(字面不同)
- ❌ 拼写错误/同义词无能为力
3. 混合检索 (Hybrid):取长补短的业界主流
既然向量检索和 BM25 各有优劣,为什么不都用? 这就是混合检索:
用户查询
┌──┴──┐
向量检索 BM25检索
(语义召回) (关键词召回)
│ │
└────┬───────┘
加权融合分数
│
排序取 Top-K
融合方法:RRF (Reciprocal Rank Fusion)
最常用的融合方法。思路:不看原始分数(向量分数和 BM25 分数量纲不同,没法直接加),而看排名:
RRF分数 = Σ 1 / (k + 排名)
各路检索
k 通常取 60。一个文档如果在两路检索里都排名靠前,它的 RRF 分数就高——这就是"两路都认可"的文档最可能是真相关。
加权融合(另一种方法)
也可以给两路不同的权重:
最终分数 = α × 向量分数 + (1-α) × BM25分数
α 通常 0.5~0.7。查询偏关键词时调高 BM25 权重,偏语义时调高向量权重。
🎯 核心认知:混合检索是生产级 RAG 的标配。LangChain、LlamaIndex、各类企业 RAG 方案几乎都用它。
4. Rerank 重排序:召回+精排两段式
混合检索解决了"召回什么",但召回的质量参差不齐。于是工业界用两段式架构:
第一阶段:召回 (Recall)
用快但糙的方法(向量/BM25/混合)召回 top-20~50
目标:宁可多召,不要漏(高召回率)
第二阶段:精排 (Rerank)
用慢但准的模型对这 20~50 个逐一精排
只保留最相关的 top-5
目标:精确,把最相关的排到前面(高精确率)
为什么不直接用精排模型检索全部?
因为精排模型(cross-encoder)很慢。对 100 万个文档逐一精排要几小时,但对 50 个精排只要几十毫秒。所以先用快方法筛到 50 个,再精排——速度和精度的平衡。
Cross-encoder vs Bi-encoder(了解)
| Bi-encoder(向量检索用的) | Cross-encoder(Rerank 用的) | |
|---|---|---|
| 怎么算 | 问题和文档分别编码成向量,算相似度 | 问题和文档拼在一起送进模型,直接输出相关度 |
| 速度 | 快(可预先算好文档向量) | 慢(每对都要跑一次模型) |
| 精度 | 中等 | 高 |
真实生产用什么做 Rerank?
- 智谱:有官方 reranker 模型
- bge-reranker:智源开源,可本地部署
- Cohere Rerank:海外常用
⚠️ 本课说明:为了让你在本地、零额外依赖地理解"召回+精排"思想,code.py 用一个基于字符精确匹配度的轻量重排来模拟 reranker 的行为(不引入大模型权重/网络)。真实生产请换成 bge-reranker 或智谱 reranker,原理和流程完全一样——只是把"打分函数"换成交叉编码器。
5. 本课代码会做什么
code.py 会做四个实验,让你看到每种检索的优劣:
① 向量检索翻车现场
构造一个带编号/专有名词的查询(如"表单 FORM-A12 怎么填"),看向量检索召回了什么(往往不准)。
② BM25 关键词检索
同样的查询用 BM25,看它怎么精准命中含编号的文档。
③ 混合检索
用 RRF 融合两路结果,看排名如何改善。
④ Rerank 重排序
对召回结果做精排,看最相关的文档排到第一。
四种方式逐个对比,你会量化看到检索质量从"纯向量"到"混合+rerank"的提升。
6. 跑起来
python lessons/06_advanced_retrieval/code.py
终端会打印四种检索方式的 Top-K 结果对比。重点观察:含编号的文档在纯向量检索里排不上号,但在 BM25 和混合检索里排到了前面。
下一课 Lesson 07 — Query 改写 会讲:用户问题表达不清时,怎么改造 query 让检索更准。