拆解 ElasticSearch 默认相似度算法的每一个分子——TF 饱和、长度归一化、IDF 平滑,以及为什么你的老师看一眼就知道这是 BM25。
BM25(Best Matching 25)是目前工业界应用最广泛的信息检索排序函数,也是 ElasticSearch 的默认相似度算法。它诞生于 1994 年,由 Stephen Robertson 和 Karen Spärck Jones 基于概率检索模型(Probabilistic IR)推导而来。
在 ElasticSearch 8.x 中,你不需要任何配置,match 查询默认使用的就是 BM25。它回答的核心问题是:
这个问题看似简单,但 BM25 的优雅之处在于,它用一组紧凑的公式,同时处理了三个关键因素:
BM25 对查询中的每个词项(term)分别打分,然后求和:
这是一个典型的「各词项独立贡献,加总得出文档相关度」的结构。下面我们拆开看 IDF 和 TF Component 各自长什么样。
| 符号 | 含义 |
|---|---|
N | 集合中的文档总数 |
n(qi) | 包含词项 qi 的文档数(即 df, document frequency) |
直觉上:包含该词的文档越少(df 越小),IDF 越高,说明这个词越有区分力。比如「增值税」比「的」的 IDF 高得多。
其中 K 是长度归一化因子:
| 符号 | 含义 | 默认值 |
|---|---|---|
f(qi, D) | 词项 qi 在文档 D 中的出现次数 | — |
|D| | 文档 D 的长度(词数) | — |
avgdl | 集合中所有文档的平均长度 | — |
k1 | TF 饱和参数,控制词频增长的衰减速度 | 1.2 |
b | 长度归一化参数,控制文档长度对评分的影响程度 | 0.75 |
理解 BM25 的关键入口是 TF 饱和机制。在朴素 TF 模型中,词频越高分越高——「税务」出现 10 次的文档得分是出现 1 次的 10 倍。但现实中,一个词出现 3 次和出现 10 次的相关度差异远没有这么夸张。
BM25 通过以下结构实现饱和:
这是一个递增但有上界的函数。当 tf → ∞ 时,分子分母中 tf 的系数抵消,S(tf) → k1 + 1。也就是说,无论关键词出现多少次,TF 分量的贡献永远不会超过 k1 + 1。
用经济学类比:第一杯水对沙漠中的人价值巨大(tf: 0→1,收益陡增),第十杯水的边际价值几乎为零(tf: 9→10,收益趋平)。BM25 的 TF 饱和曲线精确地刻画了这种「递减的边际收益」。
k1 控制饱和的速度:
b 参数控制的是文档长度对评分的影响程度。它通过以下公式发挥作用:
核心结构 (1 - b) + b × |D|/avgdl 是一个凸组合(Convex Combination),也叫线性插值。它在两个极端值之间做加权平均:
K = k1 × 1 = k1
K = k1 × |D|/avgdl
b 的影响路径是这样的:
b = 0.75 意味着75% 的权重给了文档长度,25% 的权重给了常数 1。这是一个经过大量实验验证的「甜点值」——既能有效惩罚过长的文档,又不会过度压制长文档中真正高质量的内容。
这两个数值不是拍脑袋定的,而是历经近三十年、多轮大规模评测的产物。
| 年份 | 里程碑 | 关键参数 |
|---|---|---|
| 1976 | Robertson & Spärck Jones 提出二值权重模型 | 无 k1, b(只用 0/1) |
| 1983 | 引入 TF 权重,形成 BM 系列前身 | k1 参数出现 |
| 1994 | Okapi BM25 正式命名(Robertson 等) | k1 ∈ [1.0, 2.0], b ∈ [0.4, 1.0] |
| 2009 | Robertson & Zaragoza 出版 Understanding IR | k1=1.2, b=0.75 被确认为默认推荐值 |
TREC(Text REtrieval Conference)是信息检索领域的「奥林匹克」。从 1992 年至今,BM25 在 TREC 的 Ad-hoc 任务中持续表现优异。大量研究者对 k1 和 b 进行了网格搜索:
// 自定义 BM25 参数
{
"mappings": {
"properties": {
"content": {
"type": "text",
"similarity": "custom_bm25"
}
}
},
"settings": {
"similarity": {
"custom_bm25": {
"type": "BM25",
"k1": 1.5,
"b": 0.6
}
}
}
}
这是一个有趣的问题:为什么有经验的算法工程师看一眼公式就能认出这是 BM25?因为 BM25 有三个鲜明的结构指纹,几乎不可能与其他公式混淆。
指纹 1:分子分母差 k1
观察 TF 分量的结构:tf × (k1 + 1)(分子)vs tf + k1 × K(分母)。当 tf = 0 时,分子 = 0,整体得分为 0(没有出现就是没有出现)。当 tf > 0 时,分子恒比分母大 k1(因为分子中 tf 的系数是 1 而分母中是 1 乘以归一化因子 K ≤ 1 + b),这正是饱和特性的数学来源。
指纹 2:凸组合 1 - b + b × ...
这种 (1 - weight) + weight × ratio 的写法在统计学和工程中极为常见(凸组合 / 线性插值),但在 IR 公式中,它几乎唯一地指向 BM25 的长度归一化模块。看到这个结构就等于看到了「文档长度调节旋钮」。
指纹 3:平滑 IDF
ln(1 + (N - df + 0.5) / (df + 0.5)) 中的 +0.5 是 BM25 的标识性改动。经典的 Robertson-Spärck Jones IDF 是 log((N - df) / df),BM25 的平滑版本避免了 df = N 时 IDF = 0 的退化问题。
在 RAG(Retrieval Augmented Generation)时代,BM25 并没有过时。事实上,BM25 + 向量检索的混合搜索(Hybrid Search)已经成为当前检索架构的主流范式。
ElasticSearch 8.x 通过 RRF(Reciprocal Rank Fusion) 实现混合搜索:
RRF 不依赖原始分数的绝对值,只依赖排名序号。这使得 BM25 分数(通常 0~30)和向量相似度分数(通常 0~1)可以在同一框架下公平融合。
税务领域实战经验:在我们的税务合规 AI 应用中,查询「小规模纳税人增值税免税政策」时,BM25 能精确命中包含「小规模纳税人」和「增值税」的法规条款,而向量检索能召回语义相近但用词不同的「小微企业税收优惠」。两者互补,Recall 可提升 15-25%。
| 场景 | 建议 k1 | 建议 b | 理由 |
|---|---|---|---|
| 短文本(标题、商品名) | 1.2 ~ 1.5 | 0.0 ~ 0.3 | 短文本长度差异小,无需强归一化 |
| 长文档(论文、法规) | 1.2 ~ 2.0 | 0.7 ~ 0.9 | 长文档需惩罚长度偏差,允许 TF 缓慢饱和 |
| 混合长度文档集 | 1.2 | 0.75 | 默认值,最稳定的通用选择 |
| 日志 / 错误信息搜索 | 0.5 ~ 1.0 | 0.1 ~ 0.3 | 快速饱和、精确匹配更重要 |
BM25 之所以能统治信息检索领域三十年,不仅因为它的效果经过充分验证,更因为它在简洁性和表达力之间取得了精妙的平衡:
理解 BM25 的每一个分子和分母,不仅能帮你更好地调优 ElasticSearch,更能让你在构建 RAG 系统时做出更明智的检索策略选择。