稀疏、稠密与混合检索
本节目标
本节从一条 query 的两种失败出发:词面系统不认识同义改写,dense 系统又可能忽略错误码和数字。目标不是背产品 API,而是建立 BM25-only、dense-only、hybrid 三条可复现基线,理解融合为什么有效以及何时会变差。
BM25 的最小直觉
BM25 是基于词项的排序函数。对 query 词项 t 和文档 d,一个常见形式为:
- :候选语料的文档数;
- :包含 t 的文档数,越少见通常权重越高;
- :t 在文档中的频次;
- :文档长度归一化;
- :词频饱和速度;
- :长度归一化强度。
直觉是:E042 这种稀有精确词应比“系统”更有区分力;同一词重复 100 次不应线性增加 100 倍;长文天然包含更多词,需要适当校正。
公式只是排序的一部分。Analyzer 如何切中文、保留型号、处理同义词,会先改变 t、 和文档长度。不同搜索产品对字段、boost、停用词和实现细节的处理也可能不同,不能只复制 就宣称复现一致。
Dense 检索的互补能力
Dense bi-encoder 把 query 与 document 编码成固定维向量,再做近邻搜索。它可能把“钱被扣了两次”召回“订单发生重复扣款”,即使两者没有共享二字符词项;但也可能:
- 把两个相似主题的文档混在一起;
- 对 E042、型号、金额、日期区分不足;
- 忽略否定或条件顺序;
- 因训练语言/领域不匹配而失效;
- 因 ANN 参数漏掉 exact 邻居。
因此 dense 不应替代 BM25,而应先作为独立通道评测。若 dense-only 已比 hybrid 好,弱词面通道可能只在注入噪声;反之亦然。
学习式 sparse 是第三类,不是 BM25 别名
学习式 sparse 模型仍输出高维稀疏权重,可借助倒排结构检索,并可能为文本扩展相关词项。SPLADE 是代表性研究路线。它的模型 revision、词表、稀疏度、索引大小和训练域同样需要评测;“可解释词项”也不保证每个权重符合人工直觉。
基础路线先保留:
- 一个可解释 BM25/关键词基线;
- 一个锁定契约的 dense 基线;
- 一个简单 rank fusion;
- 必要时再加入 learned sparse 或 multi-vector。
为什么不能直接相加原始分数
BM25 分数通常不受固定上界约束;cosine 常在有限范围内但分布依模型/query 变化;产品还可能转换为 distance/relevance。直接计算:
并不代表两个通道“各占一半”,较大量纲会支配结果。线性融合需要在 validation 集上定义归一化/校准、权重、缺失候选处理和稳定性监控。
Reciprocal Rank Fusion
RRF 只使用每路名次:
- :包含文档 d 的通道集合;
- rank 从 1 开始;
- c 是 rank constant;越大时,较后名次之间的差异相对更平缓;
- 每路只在 rank window 内贡献。
RRF 避开原始分数量纲问题,并奖励多路靠前出现的文档。它仍不是自动最优:
- 弱通道也能给错误文档加分;
- rank window 太小会截断互补候选;
- 通道内平局和去重会改变 rank;
- 等权 RRF 不表达通道可靠性差异;
- constant 与 window 应在本地 validation 集选择。
原始 RRF 论文与产品实现要分开。当前 Elasticsearch RRF retriever 暴露 rank_constant/rank_window_size;当前 Qdrant Hybrid Queries 文档还描述 RRF、加权变体与其他融合方式。这些是截至资料日期的产品事实,默认值和 API 不能推广到所有系统。
候选预算如何流动
假设最终给 reranker 20 条,可先实验:
| 阶段 | 参数示例 | 需要测什么 |
|---|---|---|
| BM25 | top 50 | 错误码/专名 Recall、延迟 |
| Dense | top 50,ANN candidates 另记 | 语义改写 Recall、ANN recall |
| RRF | 每路 window 50,输出 40 | 通道贡献、融合 Recall/nDCG |
| 去重 | 每原文最多 3 个 chunk | evidence coverage |
| Reranker | 输入 40,输出 10 | 排序质量、成本 |
表中数字只是实验起点。窗口必须按自身 qrels、尾延迟和下游预算决定。
一个可解释示例
项目中的 q-e042:
- BM25 只返回错误码文档 d-02-e042;
- toy dense 认为通用格式文档 d-01 与错误码文档同分,并用 ID 把 d-01 排第一;
- RRF 让同时出现在 BM25 与 dense 的 d-02 升到第一;
- graded qrels 将 d-02 标为 3、d-01 标为 1,因此 hybrid nDCG 高于 dense。
项目中的 q-double-charge 使用口语“钱被扣了两次”,BM25 二字符通道没有命中“重复扣款”,toy dense 召回正确文档。两个例子分别展示精确词面与语义改写的互补,但手工向量不代表真实模型会成功。
实验矩阵
每次只改一个主要因素:
| 实验 | 对照 | 结果至少报告 |
|---|---|---|
| Analyzer | 词/字/n-gram、同义词 | 分层 Recall、索引大小 |
| Dense 模型 | 同一 corpus/query/filter | Recall/MRR/nDCG、延迟、成本 |
| 融合 | BM25、dense、RRF、校准线性 | 通道贡献、错误分类 |
| Window | 每路 10/20/50/100 | 质量—延迟曲线 |
| 去重 | 无、按原文限额 | chunk 与原文 evidence coverage |
| ANN | exact 与参数组合 | ANN recall 和业务指标 |
保存数据 checksum、qrels 版本、模型/索引 revision、参数和随机种子;否则表格无法复现。
常见错误与排查
- 只比较 hybrid 与旧系统:补 BM25-only、dense-only;
- 直接平均原始分数:先用 RRF,或在 validation 集明确校准;
- 词面通道没有 analyzer 版本:锁定并重建索引;
- Dense 通道忘记 exact/ANN 区分:用 exact top-k 建 ANN ground truth;
- 通道候选在过滤后不足:按过滤选择率分层并扩大候选或改执行计划;
- 融合后无法解释:保留每路 rank、score、window 和贡献;
- 只看总体均值:错误码、同义改写、数字、否定、权限分别报告。
练习
- 为 E042、RTX-5090、退款到账、重复扣款各写 3 条 query;
- 预测 BM25 与 dense 各自最可能失败的样本;
- 手算两个长度为 3 的排名在 c=10 时的 RRF;
- 设计每路 10/50/100 三档窗口实验;
- 若 dense-only nDCG 高于 hybrid,列出至少 4 个诊断步骤;
- 写出线性融合必须保存的校准数据和回滚条件。
掌握检查
- 我能解释 BM25 的 IDF、词频饱和与长度归一化。
- Dense 的同义召回优势与数字/否定风险都被评测。
- Learned sparse 不被误称为普通 BM25。
- 原始不可比分数不直接相加。
- RRF 的 constant、rank window、平局与弱通道风险清楚。
- 每次融合实验都有三条独立基线和分层错误分析。
下一步:Query 处理与过滤。
参考资料
- Robertson & Zaragoza, The Probabilistic Relevance Framework: BM25 and Beyond
- Karpukhin et al., Dense Passage Retrieval
- Formal et al., SPLADE v2
- Cormack, Clarke & Buettcher, Reciprocal Rank Fusion
- Elasticsearch: Reciprocal rank fusion
- Qdrant: Hybrid and Multi-Stage Queries
来源获取日期:2026-07-14。返回 语义搜索目录。