937 字
约 3 分钟
10
S20-B03 · 检索与重排:向量、BM25、混合、HyDE
适用读者:检索"总能返回结果",但答案总不对的人。
前置:S20-B02、S13-B03。
覆盖旧文:1067(114) 570(198) 283(102) 1070(87) 1073(102) 280(83) + 1066(113) 1075(111) = 910 点。
覆盖扩展:E-S20-005(混合检索与 RRF)。
上一篇:S20-B02 · 分块与 Embedding
下一篇:S20-B04 · 幻觉、冲突与语义漂移。
1. 一句话结论
检索有两条路:向量(语义)与 BM25(字面)。单用任何一条都会漏——所以工业级 RAG 几乎都是"多路召回 + 融合 + 重排"。
| 方式 | 强项 | 弱项 |
|---|---|---|
| 向量 | 同义、口语化 | 精确词、编号、罕见术语 |
| BM25 | 精确词、可解释 | 同义词 |
| 混合 | 兼顾 | 复杂度与成本 |
这与 S13-A02 的"混合检索"是同一件事——那里讲搜索引擎,这里讲 RAG。
2. 四步链路(E-S20-005)
① 查询改写(Query Rewriting) → 补全指代、扩展同义(A-1070)
② 多路召回 → 向量 topK + BM25 topK(A-283)
③ 融合(RRF) → 按排名合并,避免分数不可比
④ 重排(Rerank) → 交叉编码器精排(A-1067)
| 步骤 | 解决的问题 |
|---|---|
| 改写 | 用户问"它多少钱"(缺指代) |
| 多路 | 单路必漏 |
| RRF | 向量分与 BM25 分量纲不同 |
| 重排 | 召回多、精度差 |
3. 为什么用 RRF 而不是分数相加
实测原理(与 S13-A02 §3 同):余弦相似度在 −1..1,BM25 无上界。直接相加会让某一路主导。
RRF(score) = Σ 1 / (k + rank_i) # k 常取 60
判据:"两路分数可比吗?" 不可比 → RRF;可比(同一模型不同索引)→ 加权。
4. 三个进阶技巧
| 技巧 | 用途 | 代价 |
|---|---|---|
| HyDE(A-1073) | 让模型先"假设答案"再检索 | 多一次生成调用 |
| 动态 topK(A-280) | 按问题难度调整召回数 | 需阈值策略 |
| Self-RAG(A-1075) | 模型自评"要不要检索/答得够不够" | 循环调用、延迟上升 |
"HyDE 为什么有效":假设答案的措辞更接近文档表述,从而提升召回——但它也可能把错误假设带进检索。
5. 检索失败的排查顺序
① 看召回:topK 里有没有正确片段? → 没有:分块/embedding/改写问题
② 有片段但答案错: → 生成侧问题(B04)
③ 有片段但排序靠后: → 加重排(Rerank)
④ 完全没结果: → 索引没建/维度不匹配(B02)
判据:"先把 topK 打出来看" —— 这是 RAG 调试的第一步,比换模型有效得多。
6. 五个误区
| 误区 | 真相 |
|---|---|
| "向量检索能替代 BM25" | 精确词会漏 |
| "分数可以直接相加" | 量纲不同,用 RRF |
| "topK 越大越好" | 噪声进上下文反而更差 |
| "重排能救召回不到" | 只能优化已召回的结果 |
| "HyDE 一定更好" | 错误假设会被带进检索 |
7. 自检
- 向量与 BM25 的强弱项?
- 四步链路各解决什么?
- 为什么用 RRF?
- HyDE 的原理与风险?
- 检索失败的四级排查顺序?
8. 下一篇
S20-B04 · 幻觉、冲突与语义漂移
检索讲完,下一篇讲最麻烦的:检索到的东西和模型知识冲突时怎么办。
本篇属于系列《S20 · AI 应用与工程》。旧文来源:A-1067/570/283/1070/1073/280/1066/1075;扩展点 E-S20-005。
S20-B03 · 检索与重排:向量、BM25、混合、HyDE
https://www.clxhxhhr.top/posts/5466/ 评论
0 条
还没有评论,先写一条吧。