稀疏、稠密与混合检索

本节目标

本节从一条 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、词表、稀疏度、索引大小和训练域同样需要评测;“可解释词项”也不保证每个权重符合人工直觉。

基础路线先保留:

  1. 一个可解释 BM25/关键词基线;
  2. 一个锁定契约的 dense 基线;
  3. 一个简单 rank fusion;
  4. 必要时再加入 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 条,可先实验:

阶段参数示例需要测什么
BM25top 50错误码/专名 Recall、延迟
Densetop 50,ANN candidates 另记语义改写 Recall、ANN recall
RRF每路 window 50,输出 40通道贡献、融合 Recall/nDCG
去重每原文最多 3 个 chunkevidence 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/filterRecall/MRR/nDCG、延迟、成本
融合BM25、dense、RRF、校准线性通道贡献、错误分类
Window每路 10/20/50/100质量—延迟曲线
去重无、按原文限额chunk 与原文 evidence coverage
ANNexact 与参数组合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 和贡献;
  • 只看总体均值:错误码、同义改写、数字、否定、权限分别报告。

练习

  1. 为 E042、RTX-5090、退款到账、重复扣款各写 3 条 query;
  2. 预测 BM25 与 dense 各自最可能失败的样本;
  3. 手算两个长度为 3 的排名在 c=10 时的 RRF;
  4. 设计每路 10/50/100 三档窗口实验;
  5. 若 dense-only nDCG 高于 hybrid,列出至少 4 个诊断步骤;
  6. 写出线性融合必须保存的校准数据和回滚条件。

掌握检查

  • 我能解释 BM25 的 IDF、词频饱和与长度归一化。
  • Dense 的同义召回优势与数字/否定风险都被评测。
  • Learned sparse 不被误称为普通 BM25。
  • 原始不可比分数不直接相加。
  • RRF 的 constant、rank window、平局与弱通道风险清楚。
  • 每次融合实验都有三条独立基线和分层错误分析。

下一步:Query 处理与过滤。

参考资料

来源获取日期:2026-07-14。返回 语义搜索目录。