跳到正文

BM25 公式与 TF-IDF 对比

BM25 公式、词频饱和、长度归一化与 TF-IDF 对比

原题:请解释BM25算法的原理,给出其数学公式,并说明相比TF-IDF在文档评分上的主要改进及其实际意义。

向量检索 · 美团真题

回答与解析

BM25核心原理

BM25(Best Match 25)是概率检索框架下的经典算法,核心思想:词频贡献存在饱和效应,文档长度需要归一化

数学公式

$score(D,Q) = \sum_{i=1}^{n} IDF(q_i) \cdot \frac{f(q_i,D) \cdot (k_1+1)}{f(q_i,D) + k_1 \cdot (1-b+b\cdot\frac{|D|}{avgdl})}$

其中:

  • $f(q_i,D)$:词项$q_i$在文档$D$中的词频
  • $|D|$:文档长度,$avgdl$:平均文档长度
  • $k_1 \in [1.2,2.0]$:控制词频饱和速度(通常取1.5)
  • $b \in [0,1]$:控制长度归一化强度(通常取0.75)

IDF计算: $IDF(q_i) = \ln\frac{N-n(q_i)+0.5}{n(q_i)+0.5}$

相比TF-IDF的主要改进

改进点 TF-IDF问题 BM25解决方式
词频饱和 词频线性增长,高频词过度加权 引入饱和函数 $\frac{f(k_1+1)}{f+k_1}$,词频收益递减
长度归一化 长文档天然占优(词多) 参数$b$动态调整,避免惩罚过度
IDF稳定性 低频词IDF过大 加0.5平滑,防止除零

实际意义

  1. 抑制关键词堆砌:词频超过阈值后贡献趋平,防止SEO作弊
  2. 公平对待长短文档:技术文档vs短回答都能合理竞争
  3. 参数可解释调优:$k_1$/$b$可根据领域数据优化(如新闻vs论文库)

在RAG中,BM25常与向量检索混合使用(如Elasticsearch + 向量DB),利用其精确匹配优势弥补语义检索的模糊性问题。

学习建议

建议系统学习该知识点

口语版讲法(约4分钟)

  • 一句话定位:BM25解决词频和长度问题
  • 公式拆解:饱和函数和长度归一化
  • 对比TF-IDF的改进点
  • 业务场景:客服退款文档检索
  • 落地风险与混合检索
  • 可延伸点:b参数对短文档的影响

这道题其实问的是,在关键词匹配的框架下,怎么更合理地给文档打分。BM25的核心就两件事:一个是词频贡献不能一直涨,得有个天花板;另一个是文档长度不一样,长文档不能天然占便宜。这两个问题TF-IDF都没解决好,BM25就是来补这个坑的。

具体公式我直接说:score等于对每个查询词求和,IDF乘以一个词频函数。那个函数是 f 乘以 k1+1 除以 f 加上 k1 乘一个长度惩罚项。k1控制词频饱和速度,一般取1.5,b控制长度归一化强度,典型值0.75。IDF部分加了0.5平滑,避免低频词权重爆炸。

相比TF-IDF,改进点很明确。先说词频饱和,TF-IDF里词频线性增长,一个词出现100次得分就是出现1次的100倍,这不合理。BM25用那个分式让词频贡献到一定程度就涨不动了,说白了就是高频词再重要也就那样,防止关键词堆砌。再看长度归一化,TF-IDF里长文档因为词多天然得分高,BM25通过文档长度除以平均长度来做惩罚,b参数控制惩罚力度,短文档不会吃亏。还要看IDF平滑,低频词IDF不会太大,避免罕见词喧宾夺主。

实际意义得放到业务里看。比如客服系统里搜退款政策,用户问“怎么申请退款”,文档里“退款”出现五次和出现二十次,对判断相关性的帮助差别不大,但TF-IDF会疯狂给二十次那个文档加分。BM25的词频饱和就能抑制这种。再比如,技术文档很长,但用户只关心其中一小块,BM25的长度归一化能让短回答和长文档公平竞争,不会因为长文档词多就排前面。

落地的时候有个坑:BM25本质是稀疏检索,依赖精确的关键词匹配。如果用户问“我要退货”,但文档里写的是“退款”,同义词问题它就抓瞎。所以真正上线,我不会只用BM25,而是做 Hybrid Search,把BM25和 Dense Retrieval 结合起来,BM25保证精确匹配,向量检索捕捉语义相似。前提是向量检索的 Embedding 质量要够好,不然混进来一堆噪声反而拉低效果。

另外,b参数的调优很容易被忽略。比如客服场景里文档长度差异巨大,b取0.75可能对短文档太友好,导致长文档里的关键信息被埋没。我上线前会用一批真实query做A/B测试,观察不同b值下长文档的召回率变化,找到一个平衡点。

所以我会把BM25看作关键词检索的一个成熟基线,尤其在冷启动或者小样本场景下比纯向量检索靠谱。但真要上线,我更倾向混合检索加 Rerank,先用BM25和向量召回来个粗排,再用 Cross-Encoder 精排,这样精度和召回都能兼顾。

关键一句:b参数对短文档友好度的影响及调优方法

面试官还可能这样问

  1. 问法 1 · 场景切入

    假设你要做一个电商搜索,用户搜“苹果手机”,结果里有商品标题“苹果手机”出现5次的长描述,也有只出现1次的短标题。你觉得直接用TF-IDF评分会不会有问题?那你会怎么优化?

  2. 问法 2 · 层层追问

    你了解TF-IDF怎么计算文档相关性吧?……那如果一篇文章里某个词出现很多次,TF-IDF会线性增加分数,你觉不觉得这有点不合理?……那怎么改进这个词频饱和的问题?另外,长文档天然词多,怎么公平比较?

  3. 问法 3 · 直球架构

    请解释BM25算法的原理,写出它的数学公式,重点说明它相比TF-IDF在文档评分上改进了什么,以及这些改进在实际应用比如RAG或搜索引擎中有什么意义。

同模块相关题目