BM25(Best Matching 25)是经典概率检索模型,Elasticsearch、Lucene 等系统的默认文本相关性打分都基于它。 理解 BM25 不需要先啃透 Okapi 全文,抓住两个工程现象就够了。
现象一:词频饱和
TF-IDF 里词频 tf 线性增长:一个词出现 100 次,贡献是出现 10 次的十倍。 实际语料中,重复堆砌关键词的文档未必更相关——相关性对词频的边际收益应该递减。
BM25 用如下形式刻画词频贡献(对单个词项):
tf_component = (tf * (k1 + 1)) / (tf + k1)
当 k1 ≈ 1.2 时,tf 从 0 增到 5 分数涨得快,从 50 增到 55 几乎不动。 k1 控制饱和速度:越大,高频词越「值钱」。
现象二:长文档偏置
一篇 5000 字的文章天然比 200 字的摘要更容易命中任意查询词。 需要按文档长度做归一化,但不能一刀切——极短文档也不应因分母小而无限加分。
len_norm = 1 - b + b * (doc_len / avgdl)
b ∈ [0, 1] 控制长度惩罚强度:b = 0 完全不惩罚;b = 1 按与平均长度比例线性惩罚。 常见默认 b ≈ 0.75。
完整 BM25 一项
score(q, d) = Σ IDF(qi) * tf_component(qi, d) / len_norm(d)
IDF 部分与经典 TF-IDF 类似,衡量词项的区分度。 查询中多个词项的分数相加(独立假设),便得到文档对查询的相关性估计。
与向量检索的关系
现代系统常把 BM25(稀疏)与 embedding 相似度(稠密)做混合检索(hybrid search)。 BM25 擅长精确词匹配与可解释性;向量检索擅长语义泛化。二者不是替代关系,而是互补。