Agent Engineering 课程阅读
首页/课程一 · RAG 手写/进阶检索:混合检索 + Rerank

在 GitHub 查看原文

本页目录

Lesson 06 — 进阶检索:混合检索 + Rerank

本课目标:搞懂为什么单纯向量检索不够,以及业界真正在用的进阶检索技术。这是 RAG 进阶的分水岭。

前 5 课你只用向量检索。这一课你会看到向量检索的致命软肋,并学会用混合检索 + Rerank 来弥补。


1. 向量检索的局限:对"关键词"不敏感

向量检索擅长语义匹配——"年假"能匹配到"带薪休假",因为它懂语义。

但它有个致命弱点:对关键词、专有名词、编号、代码不敏感。看几个翻车场景:

用户查询 向量检索可能的问题
RFC 7231 找不到精确编号,可能召回"RFC 2616"这种语义相近但编号不对的
产品 AB-200 报错 找不到型号精确匹配
报错码 ERR_0x42 向量不懂这个码,按语义瞎召回
张三的审批记录 "张三"是人名,向量检索可能召回"李四"的记录

为什么?因为 embedding 把文本压缩成"语义向量",具体的字符、编号、人名这些"精确信息"在压缩中被模糊化了。语义相近 ≠ 完全匹配。

🎯 核心认知:向量检索擅长"意思相近",关键词检索擅长"字面精确"。生产级 RAG 必须两者结合


2. BM25:关键词检索的老牌劲旅

BM25(Best Matching 25) 是信息检索领域几十年的经典算法,搜索引擎的基石之一。

它怎么工作(直觉版)

给每个文档算一个"和查询的相关性分数",考虑三个因素:

  1. 词频 (TF):查询词在文档里出现得越多,越相关
  2. 逆文档频率 (IDF):越罕见的词越重要("的"这种常见词权重低,"AB-200"这种罕见词权重高)
  3. 文档长度归一化:避免长文档天然占便宜

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 让检索更准。