BM25 总览
BM25 是一个文档评分算法。 给它一个 query 和一批文档,它为每篇文档算出一个相关度分数,得分高的排前面:搜索、企业 wiki、RAG 候选召回背后最常见的打分器。GitHub 搜关键字、Slack 找一条旧消息、Elasticsearch 查日志、Claude 类产品的 RAG 召回,底下跑的都是它或它的变种。
它从 1960 年代开始酝酿,1994 年在 City University 的 Okapi 系统里成型,2000 年左右定型,然后 25 年基本没变。工业界所有人用它,靠的是一组写死的默认参数:k1 = 1.2, b = 0.75。
要理解它在解决什么,先分清「相关」和「相似」。两篇讲神经网络的文档可以高度相似(同一批专有名词),但一篇入门、一篇在反驳某派观点,相关程度完全不同;反过来,两篇几乎不共词的也可以都相关。“像不像”是几何问题,“相关不相关”是概率问题。 BM25 这条研究线,从 1960 年代起就在死磕”相关概率怎么估”。
那两个数字为什么是这样?公式解决了什么问题?为什么 25 年没变、向量模型出来后还没死?这篇面向软件工程师,下面给答案。
历史脉络
BM25 不是一次发明出来的。它是一条长达半个世纪的工作线的当前最优点。按时间走一遍:
1960 · Maron 和 Kuhns M. E. Maron 和 J. L. Kuhns 发表论文 On Relevance, Probabilistic Indexing and Information Retrieval。这是概率方法在信息检索中第一次正式亮相。他们想让图书馆员在给书做索引时预测不同读者会不会觉得这本书相关,从”预测”引出”概率”。时代背景:打孔卡片还在用,计算机存储以 KB 计,“相关性”被当成一个玄学概念。
1976 · Robertson 和 Spärck Jones
Stephen Robertson(伦敦 UCL,后来去剑桥、再去 Microsoft Research Cambridge)和 Karen Spärck Jones(剑桥)发表 Relevance Weighting of Search Terms。这篇论文干了两件事:(1)推出 RSJ weight 公式,把”词在相关文档 vs 非相关文档中的出现”变成一个 log-odds 权重;(2)发现了一个反直觉的洞见 —— 词的”缺失”也是信息。如果一个词应该出现在相关文档里但没出现,这个”没出现”应该扣分。今天 BM25 评分里那个 (N - n) 项就来自这个洞见。
1994 · Robertson 和 Walker · Okapi
Robertson 和 Stephen Walker 在 SIGIR 会议上发表 Some Simple Effective Approximations to the 2-Poisson Model。这篇是 BM25 真正的起源。他们把 Harter 早年的 2-Poisson 模型(词频服从双 Poisson 混合分布)近似成一个极简公式 tf / (k₁ + tf),再加上文档长度归一化。当时他们管这组公式叫 BM11、BM15(“Best Match”系列)。公式跑在 City University 的 Okapi 实验系统上,在 TREC 评测里大幅领先。
2000 · Spärck Jones、Walker、Robertson 三人合写 A Probabilistic Model of Information Retrieval: Development and Comparative Experiments(分两篇发在 Information Processing and Management)。这篇是定型之作:参数 、 的实验依据就是这里发布的。一整套评分公式的命名体系(CW、CIW、QACW、QACIW)也在这里定下。注意”BM25”这个名字其实是 Okapi 系统里参赛版本的编号(BM11 → … → BM25),不是哪一篇论文的标题。
2009 · Robertson 和 Zaragoza · 统一综述 Robertson 和 Hugo Zaragoza 合写 The Probabilistic Relevance Framework: BM25 and Beyond,这是一篇 60 页的长综述。它把 30 多年的工作整合成一个叫 Probabilistic Relevance Framework (PRF) 的统一理论,还引入了 BM25F(多字段加权的版本,title / body / anchor 分开算)。这篇是现代所有工业 BM25 实现的参考来源。
2020s · RAG 时代 BM25 没退场。混合检索里它和向量模型并肩工作,成了新的标配。Anthropic 在 2024 年 Claude 的 Contextual Retrieval 研究里也把 BM25 作为基线之一。
一条主线:50 年来,这条研究线一直在回答同一个问题 —— 怎么把”词的出现 / 不出现 / 出现多少次”翻译成”相关概率”。这个问题没完全解决(概率估计永远有噪声),但 BM25 给出了一个足够好、足够稳、足够廉价的工程解。
核心思想
如果要一句话讲清 BM25 在评分时考虑什么,就是三层:
第一层:稀有词权重高
在地铁里听见”机器学习”这个词,比听见”的”、“是”这种高频字有信息量得多 —— 因为”机器学习”稀有。BM25 用 log(总文档数 / 含这个词的文档数) 度量稀有程度,越稀有权重越高。这就是经典的 idf 思想。
有意思的是,这个 idf 最早是 Karen Spärck Jones 1971 年凭直觉提出来的,没有理论支撑。直到 BIM(Binary Independence Model)推出来后,人们发现 idf 其实是 BIM 在”无 relevance 信息”假设下的自然退化 —— 直觉反过来被理论追认了。
第二层:词频饱和
反直觉的点来了。如果一个文档里”机器学习”出现了 10 次 vs 出现了 1 次,后者哪篇更相关?
差不多。
这不是 BM25 的 bug,是 feature。它的设计者观察到:一个词在文档里第 1 次出现提供很强的信号(“这篇在讲这个”),第 2 次加强这个信号,第 3 次再加强但增量变小,第 10 次的增量几乎可以忽略。
BM25 用一个叫 saturation function 的形式把这个观察编码进公式。效果是:再怎么堆同一个词,权重也不会超过一个上限。这能挡住”关键词堆砌”式的 SEO 作弊 —— 这条特性在 2000 年代对抗黑帽 SEO 时起了关键作用。
第三层:长文档打折
如果不做任何处理,长文档会天然占便宜 —— 它们包含的词多,任何 query 的词都更容易匹配。BM25 用一个由 控制的长度归一化因子,把”超过平均长度的文档”相对扣分。
值代表打折力度: 时按长度完全归一化, 时不归一化。实验得到的甜点是 —— 略微打折,但不完全消除长文档的优势(因为有些长文档确实覆盖更多内容,不该被简单当成”啰嗦”)。
三层合起来就是 BM25
文档 对 query 的得分是每个 query 词得分之和:
注意第三层的长度归一化不是独立乘进来的,而是嵌在第二层的分母里 —— 这个结构让参数更少、行为更稳。完整推导见 BM25 公式拆解。
这个骨架从 1994 年定型以来基本没变,所有工业实现都是这一套。不同的只是:默认参数、是否支持多字段(BM25F)、是否融合非文本信号(PageRank 等)。
常见问题
神经模型 / vector search 能替代 BM25 吗?
不能全替代,两者互补。BM25 擅长精确词匹配(用户搜 GPT-4o 要的是含这个字符串的文档,不是”语义相近”的)、运行成本极低、不需要训练数据、对未见过的词也能工作。向量搜索反过来擅长语义 / 同义词 / 多语言,但贵、要训练、可能”漂移”。2023 年以后几乎所有严肃 RAG 系统都是 hybrid:两路打分融合。Anthropic 2024 年 Contextual Retrieval 也把 BM25 当作基线之一。
BM25 和 tf-idf 究竟差在哪?
两者都是 idf × tf 的结构。差别在 tf 分量:tf-idf 用原始 tf(或 1 + log(tf)),不饱和;BM25 用 tf / (k_1 + tf) 式的饱和函数,并且做了文档长度归一化。实测 BM25 在长文档、长短混合集合上明显更稳。
是怎么定的? 1994 年 Robertson-Walker 在 TREC 数据上 grid search,发现 都行;2000 年 Spärck Jones 等人在更大规模实验里把 收敛到 0.75。这些数字是实证的,没有一阶原理支持,不同 collection 应该各自调。Elasticsearch / Lucene 用这组默认是因为它在通用文本上不错,但专业领域(医学 / 法律)往往需要微调。
BM25 能处理中文吗? 能,但要先分词。BM25 本身是词袋模型,“词”怎么切取决于 tokenizer。Elasticsearch 里中文默认用 IK 分词或 Jieba 分词,分完后 BM25 照常跑。分词质量对效果的影响比参数调优大得多。
BM25F 和 BM25 有什么不同? BM25F 把”文档 = 一块纯文本”扩展成”文档 = 多个加权字段”(如 title / body / anchor)。对 Web search 和有明显字段结构的场景(paper / product)有用。需要调的参数更多(每个字段一个 、一组字段权重),但模型结构是 BM25 的直接扩展。
参考资料
论文(按年份,带简评):
- Maron & Kuhns 1960 · On Relevance, Probabilistic Indexing and Information Retrieval · DOI · 概率方法首次亮相,历史意义 > 实用
- Robertson & Spärck Jones 1976 · Relevance Weighting of Search Terms · DOI · RSJ weight 诞生,读 Appendix 部分即可
- Robertson & Walker 1994 · Some Simple Effective Approximations to the 2-Poisson Model · ACM · BM25 的起源,极简 10 页,推荐读——也是饱和项 的推导出处
- Spärck Jones, Walker & Robertson 2000 · A Probabilistic Model of Information Retrieval: Development and Comparative Experiments · Part 1 · Part 2 · 定型之作,较长但实验数据完整
- Robertson & Zaragoza 2009 · The Probabilistic Relevance Framework: BM25 and Beyond · 免费下载 · 60 页综述,最佳入门 —— 直接读这本也行
书:
- Manning, Raghavan, Schütze · Introduction to Information Retrieval(Cambridge UP, 2008)· 第 11 章覆盖概率检索和 BM25;网上有免费版
实现参考:
开源实现:
- Python ·
rank_bm25(小而直接,一个文件就能嵌进项目)· Pyterrier(完整 IR 实验框架,封装 Terrier)·elasticsearch-py(生产场景接 Elasticsearch) - Rust · Tantivy(全文搜索引擎,BM25 默认打分,Lucene 风格的性能)
- Node.js / 浏览器 · Lunr.js(2.x 起用 BM25,可以跑在客户端)· MiniSearch(更轻)
- Java / JVM · Lucene(所有人最终的汇合点)· Elasticsearch · Solr
- Go · Bleve