做 RAG 的工程师大多先接触向量检索,然后在某个深夜发现:用户问「K8s 的 nodeAffinity 怎么配」,向量检索返回了一堆「Kubernetes 调度概述」——语义相近,但精确的关键词没对上。这时救场的往往是 BM25:一个诞生于 1990 年代的概率检索公式,至今仍是 Lucene/Elasticsearch 的默认相关性算法(自 ES 5 起),也是混合检索里标准配置的另一半(见《混合检索与重排序》)。为什么它 30 年不倒?因为它用三个直觉抓住了「什么文档算匹配」的本质。
直觉一:越稀有的词越能定位文档(IDF)
查询词「的」「怎么」在所有文档里都出现,对判断哪篇文档更相关毫无贡献;「nodeAffinity」只出现在少数文档里,一锤定音。这就是 IDF(逆文档频率):一个词在语料中出现得越少,它在查询里的定位价值越高。BM25 里的 IDF 项长这样(Lucene 实现):
IDF(q) = ln(1 + (N − n + 0.5) / (n + 0.5))
N 是语料总文档数,n 是包含该词的文档数。词越稀有(n 越小),IDF 越大;停用词的 n 接近 N,IDF 趋近于零。注意公式里有平滑项(0.5),保证没见过负数——这是工程公式与教科书公式的第一处不同。
直觉二:词多不等于更相关(词频饱和)
TF-IDF 时代,一个词出现 10 次得分是 1 次的 10 倍——这明显不对:提到「nodeAffinity」10 次的文档确实比 1 次的相关,但 100 次并不比 10 次相关 10 倍,词的相关性贡献应该有上限。BM25 给 TF 项加了个饱和结构:
tf 项 = tf · (k1 + 1) / (tf + k1)
当 tf 很小时,这一项近似线性增长;tf 很大时,它渐近收敛到一个上限(k1+1)。k1 就是「饱和有多快」的旋钮:Lucene/Elasticsearch 默认 k1 = 1.2——词频的边际收益在出现几次后迅速衰减。这一项是 BM25 对早期概率检索模型最重要的修正,实战里它直接抑制了「关键词堆砌」的作弊文档。
直觉三:长文档占便宜,要按长度纠正(b)
一万字的长文档天然更容易「包含」查询词——只按词频打分,检索器会系统性地偏爱长文档。BM25 的解法是把文档长度 dl 与语料平均长度 avgdl 的比值喂进分母:
tf 项 = tf · (k1 + 1) / (tf + k1 · (1 − b + b · dl/avgdl))
文档比平均长(dl/avgdl > 1),分母变大,得分被压;比平均短,得分被抬。b 控制这个「长度惩罚」的强度:b = 0 完全不管长度,b = 1 完全按长度比例惩罚,默认 b = 0.75——强惩罚但不赶尽杀绝,因为长文档多出来的词也确实可能更相关。
合起来:BM25 的完整打分
对查询里的每个词 qi,BM25 打分是三个直觉的乘积,再对查询内所有词求和:
score(D, Q) = Σ IDF(qi) · tf(qi, D) · (k1 + 1)
─────────────────────────────────────
tf(qi, D) + k1 · (1 − b + b · |D|/avgdl)
把它读成人话:稀有词(IDF 高) × 出现得恰到好处(饱和 TF) × 长度不吃亏(归一化)= 相关。三个部件各自解决一个具体 bug,组合起来却异常稳健——这是它经受住 TREC 评测、搜索引擎工业界和 30 年时间考验的原因。
调参的实战直觉
k1(默认 1.2):调「词频信号的敏感度」。查询多为长尾关键词、文档长度均匀时,默认值基本不用动;关键词堆砌作弊多时可调低(饱和更早);b(默认 0.75):调「长度公平」。语料里文档长度差异极大(比如 API 文档混着教程长文),可上调到 0.9 压长文的天然优势;短文本语料(商品标题、评论)可下调——短文本长度本来就差不多,b 的作用有限;- 分词先于一切:BM25 是词面匹配,中文分词质量直接决定召回上限——分词器没切对的词,IDF 与 TF 全是错的。
它和向量检索各管哪一半
BM25 只认词面:nodeAffinity 必须字面出现才能命中,同义词、换说法一概不认——这是它的天花板,也是向量检索(语义近似)的强项(见《一篇读懂 Embedding》《pgvector 实战》)。反过来,向量检索的软肋恰是 BM25 的强项:精确标识符(型号、函数名、报错码)、稀有术语(向量空间里被常见词淹没,而 IDF 给它们高权重)、零样本新词(embedding 模型没见过的词没有可靠向量,BM25 天生认识一切词面)。
所以 2026 年的生产检索几乎都做混合检索:BM25 抓精确与稀有,向量抓语义与改写,再用 RRF 或 rerank 融合(见《混合检索与重排序》《向量数据库选型指南》)。BM25 不是被时代淘汰的老古董,而是这条流水线里那个「认死理」的同事——语义再模糊的世界,也需要有人对字面负责。
结语
BM25 的公式只有一行,却浓缩了信息检索三十年最重要的三个教训:词的稀有度决定价值,频率的边际收益会饱和,长度必须公平对待。理解它不需要高等数学,需要的是把三个「为什么」想通——想通之后,你调 k1、b 时就不再是抄参数,而是真的知道自己在拧哪个旋钮。
读者留言
COMMENTS 暂无还没有留言,来说第一句?