什么是 BM25?

BM25 是一族概率词法排序函数,它根据查询词证据、逆文档频率、饱和词频与文档长度归一化为文档计算排序分数。

工作原理

BM25 如何形成排序信号

对词项 t,常见形式将 IDF(t) 乘以 tf * (k1 + 1) / (tf + k1 * (1 - b + b * dl / avgdl))。k1 控制重复词项多快进入饱和,b 控制字段长度对词项贡献的影响。[Lucene 10.3.1](https://lucene.apache.org/core/10_3_1/core/org/apache/lucene/search/similarities/BM25Similarity.html) 的 IDF 为 log(1 + (N - df + 0.5) / (df + 0.5)),默认 k1=1.2、b=0.75。

这些是实现默认值,不是跨语料最优标准。Tokenizer、词干化、停用词、同义词、字段 Boost 与重叠 Token 处理常常在参数调优前就改变排序。

分数不能证明什么

BM25 分数不是校准概率、置信度、答案支持度,也不能跨查询直接比较。它依赖语料统计、字段边界和索引状态;即使候选文本不变,新增文档也可能改变 IDF 与平均长度。高分仍可能来自重复但无关的词,零分也可能源于 Analyzer 不一致而非证据不存在。短语、邻近度、时效、来源权威与访问控制都需要显式 Query Clause 或后续排序特征。

调优并评测完整检索契约

先固定语料、Analyzer、字段 Schema 与相关性标注。将 BM25 与 Boolean 或更简单的词法基线比较,再在训练查询上搜索 k1、b、字段 Boost 与候选深度,并用留出查询做发布判断。报告候选覆盖的 Recall@K、排序的 MRR 或 nDCG、p95 延迟、零结果率,以及标识符、长自然语言问题、语言和权限切片。[BEIR 基准](https://arxiv.org/abs/2104.08663)表明 BM25 在异构任务上是稳健的 Zero-shot 基线,但 Benchmark 平均值不能证明它适合某个具体语料。

主要特点

  • 使用 Analyzer 产生的稀疏词法证据,而不是学习得到的稠密语义
  • 通过具体实现的 IDF 函数提高语料稀有词的权重
  • 让重复词频逐渐饱和,而不是线性奖励重复出现
  • 通过 b 参数按文档或字段长度归一化词项贡献
  • 输出查询与索引特定的排序分数,而不是校准概率
  • 可借助倒排索引执行与剪枝高效完成第一阶段检索

常见用途

  1. 按精确错误码、配置键、版本和 API 名称检索运行手册
  2. 在引入学习型检索前建立可复现的词法基线
  3. 作为混合 RAG 候选管线中的稀疏检索分支
  4. 搜索措辞本身构成证据的法律、政策或合规文本
  5. 诊断排序问题来自分析、候选深度还是后续重排

示例

loading...
Loading code...

常见问题

BM25 分数是文档相关概率吗?

不是。BM25 源于概率相关性研究,但最终分数只是具体实现与查询范围内的排序信号,并未校准为概率。从其他查询、索引、字段或引擎复制的阈值没有稳定含义。

所有 BM25 部署都应该使用 k1=1.2、b=0.75 吗?

不应该。这是 Lucene 的常见默认值,可作为起点;合适配置取决于字段长度、Analyzer、语料与相关性标注。应在代表性查询上调参,再用留出切片验证,而不是把默认值当成标准答案。

为什么文档明明包含查询文本,BM25 仍可能漏掉?

可见文本经过 Tokenizer、词干化、停用词、Unicode 归一化、字段选择或权限过滤后,索引词项与查询词项可能不再一致。应先检查 Analyzer 输出与 Query Plan,再判断评分公式是否有问题。

不同查询的 BM25 分数可以直接比较吗?

通常不可以。不同查询词具有不同文档频率,每个查询会形成不同分数分布。分数适合在同一检索契约内排序候选;跨查询决策或拒答阈值必须用带标注数据单独校准。

什么时候应该组合 BM25 与稠密检索?

当工作负载同时包含精确标识符、词法约束、改写与概念型问题时,可以评测混合检索。应在相同标注、权限、候选深度、延迟与成本下比较 BM25、Dense 与融合结果,不能预设 Hybrid 一定更好。

相关术语

相关文章