深色模式
03 · 检索与重排:怎么找到最相关的几块
学完你能说出:
- 向量检索为什么要用「近似」最近邻,HNSW 大概怎么工作。
- 关键词检索(BM25)和向量检索各自擅长什么,怎么用 RRF 合并成混合检索。
- 重排(Rerank)为什么能提升效果:先粗筛、再精排。
先看地图
库建好了(上一篇)。这一篇讲在线阶段最关键的一步:从几万、几百万块里找出最相关的几块。
本篇讲 4 个点:① 向量检索怎么做到快 → ② 关键词检索补什么短板 → ③ 混合检索怎么合并 → ④ 重排为什么能更准。
一句话本质
检索 = 先用便宜的方法快速捞一批候选(召回),再用贵但准的方法给候选排个序(重排),最后取前几名交给大模型。
生活类比:公司招聘
- 简历初筛(召回):HR 一天看上千份,用关键词、学历快速筛出 50 份。快,但粗。
- 面试(重排):对这 50 人逐个深聊,挑出最合适的 3 个。准,但慢,没法对 1000 人都面试。
- 两步配合:又快又准。
一步步看
1. 向量检索:近似最近邻
最笨的办法:问题向量和库里每一块都算一次相似度,再排序。100 万块就要算 100 万次,太慢。
ANN(近似最近邻) 的思路:牺牲一点点准确率,换取速度。常见算法 HNSW 可以理解成「分层的交通网」:
顶层:只有几个大城市,高铁直达 → 先快速跳到大致区域
中层:城市更多,有普通火车 → 逐步缩小范围
底层:所有小镇都在,走乡间小路 → 在附近精确找最近的查询时从顶层开始,每层都往「离目标更近」的点走,越往下越精细。不用遍历全部,就能找到几乎是最近的那些块。
2. 关键词检索:BM25
向量检索擅长「意思相近」,但有个短板:专有名词、编号、型号。
问「错误码 E1043 怎么处理」,向量检索可能找回一堆「讲错误处理的通用段落」,偏偏漏掉写着 E1043 的那一块。
BM25 是经典的关键词打分方法,大白话就三条:
- 问题里的词在这块里出现越多,分越高(但增长有上限,不会无限加分);
- 这个词在全库越稀有(比如 E1043),出现一次越值钱;「的」「是」到处都有,几乎不加分;
- 块越长,分数会被适当压低,防止长块靠堆字数取胜。
3. 混合检索:用 RRF 合并两份名单
两种检索各给出一份排名,怎么合并?分数的尺度不同(余弦在 −1 到 1 之间,BM25 可能是 12.7),没法直接相加。
RRF(倒数排名融合):不看分数,只看名次。
RRF 分 = Σ 1 / (k + 名次) 常用 k = 60例子(k = 60):
| 文档块 | 向量检索名次 | BM25 名次 | RRF 分 |
|---|---|---|---|
| A | 1 | 3 | 1/61 + 1/63 ≈ 0.0323 |
| B | 2 | 1 | 1/62 + 1/61 ≈ 0.0325 |
| C | 3 | 没进榜 | 1/63 ≈ 0.0159 |
B 在两边都靠前,排第一;C 只在一边出现,排最后。两边都认可的,才靠前。
4. 重排:Rerank
召回阶段(向量 + BM25)快速拿到比如 30 块,再用重排模型逐块精细打分,取前 5 块给大模型。
两种模型的区别是重点:
| Embedding 模型(召回用) | 重排模型(精排用) | |
|---|---|---|
| 怎么看 | 问题、文档分别变成向量,再比较 | 把「问题 + 文档」放在一起读,直接打相关分 |
| 类比 | 看两人简历照片,判断像不像 | 让两人面对面聊一次 |
| 速度 | 快,文档向量可以提前算好 | 慢,每对都要现场算 |
| 准确度 | 一般 | 高 |
为什么这么设计
为什么用近似最近邻,而不是精确找?
- 问题:精确比较要和每一块都算一次,数据量一大就太慢。
- 方案:用 HNSW 这类索引,分层导航,只访问一小部分点。
- 好处:查询从「全部扫一遍」变成「跳几步」,毫秒级返回,准确率损失很小。
一句话答法
精确检索要和所有向量比一遍,数据量大时太慢;ANN 用索引结构只访问少量候选,以极小的精度损失换来数量级的速度提升。
为什么要混合检索?
- 问题:向量检索不擅长专有名词、编号、精确术语;关键词检索不认同义词。
- 方案:两路一起检索,再用 RRF 按名次合并。
- 好处:语义匹配和精确匹配互补,召回更全。
一句话答法
向量检索懂语义但对专有名词不敏感,BM25 精确匹配关键词但不懂同义词,混合检索取长补短;用 RRF 按名次融合,避免两种分数尺度不同的问题。
为什么要两阶段(召回 + 重排),不直接用重排模型?
- 问题:重排模型准,但要把问题和每一块拼在一起算一遍,对 100 万块做不到。
- 方案:先用快的方法召回几十块,再只对这几十块重排。
- 好处:兼顾速度和准确率。
一句话答法
重排模型准但慢,没法对全库使用;先用向量和关键词快速召回几十条,再对这一小批精排,兼顾速度和效果。
英文术语拆解
| 术语 | 拆开看 | 一句话意思 |
|---|---|---|
| Retrieval | retrieve 取回 + -al | 检索 |
| Recall | re 再 + call 叫 | 召回:先捞出候选;也指「该找到的找到了多少」 |
| ANN | Approximate 近似的 + Nearest 最近的 + Neighbor 邻居 | 近似最近邻搜索 |
| HNSW | Hierarchical 分层的 + Navigable 可导航的 + Small World 小世界 | 分层导航的图索引,常用的 ANN 算法 |
| BM25 | Best Matching 最佳匹配 + 第 25 版公式 | 经典的关键词相关性打分方法 |
| Hybrid Search | hybrid 混合的 + search 搜索 | 向量 + 关键词混合检索 |
| RRF | Reciprocal 倒数的 + Rank 排名 + Fusion 融合 | 按名次倒数合并多路结果 |
| Rerank | re 重新 + rank 排序 | 重排:对候选再精细排序 |
| Bi-encoder / Cross-encoder | bi 双 / cross 交叉 + encoder 编码器 | 分开编码再比较 / 拼在一起编码直接打分 |
面试怎么问
Q:向量检索和关键词检索各自的优缺点?
向量检索能匹配语义、同义词,但对专有名词、编号、精确短语不敏感,可解释性差;BM25 精确匹配关键词、对罕见词敏感、可解释,但不懂同义词。实际常用混合检索。
Q:什么是 Rerank?为什么能提升效果?
在召回之后,用 cross-encoder 把问题和每个候选拼在一起打相关性分数并重新排序。它能让问题和文档的词直接交互,比 bi-encoder 分开编码再比较更准;因为慢,只用于召回后的几十条候选。
Q:RRF 是怎么融合的?为什么不直接把分数相加?
每路结果按名次计算 1/(k + rank),累加作为最终分数,k 常取 60。不同检索的分数尺度和分布不一样,直接相加没有意义;RRF 只用名次,简单稳健。
容易混的地方
- 召回(Recall)有两个意思:一是流程上的「召回阶段」;二是评估指标「召回率」。看上下文区分。
- 近似 ≠ 不准:HNSW 的结果在绝大多数情况下和精确结果一样或非常接近,参数可以在速度和精度之间调。
- 重排不能找回没召回的块:召回阶段漏掉的,重排也救不回来。所以召回要「宁多勿漏」,重排负责「去粗取精」。
和其他知识的连接
- ← 来自 Embedding:向量检索比较的就是余弦相似度。
- ← 来自 切块与入库:元数据可以在检索时做过滤。
- → 影响 评估与常见坑:召回率、命中率就是用来衡量这一步的。
- 类比 索引与 B+ 树:数据库用 B+ 树加速精确查找,向量库用 HNSW 加速相似查找,都是「先建索引,查时少走路」。
自测 3 问
Q1:用「招聘」类比,说清召回和重排的分工。
点开看答案
召回像 HR 简历初筛:用快速、粗略的方法从上千份里挑出几十份;重排像面试:对这几十个人逐个深入评估,选出最好的几个。先快后准,兼顾效率和效果。
Q2:问「错误码 E1043 怎么处理」,只用向量检索可能出什么问题?怎么解决?
点开看答案
向量检索对编号、专有名词不敏感,可能找回一堆讲「错误处理」的通用段落,漏掉真正写着 E1043 的那块。解决:加上 BM25 关键词检索做混合检索,再用 RRF 合并结果。
Q3:为什么重排模型比 Embedding 检索准,却不能直接拿来检索全库?
点开看答案
重排模型把问题和文档拼在一起读,词与词之间能直接交互,所以更准;但每对都要现场算,全库几百万块算不过来。所以只对召回后的几十条用它。
✅ 验收清单
- 能用「分层交通网」类比,说清 HNSW 为什么快
- 能说出 BM25 打分的三条大白话规则
- 能手算一个 RRF 的例子,并解释为什么不直接把分数相加
- 能对比 bi-encoder(Embedding)和 cross-encoder(重排)
- 能讲清「两阶段检索」的设计理由(问题 → 方案 → 好处)
下一步该懂什么
- RAG 搭好了,怎么判断它好不好?答错了从哪查起?→ 评估与常见坑