这道题问[[BM25]],我觉得本质是在问信息检索里一个核心洞察:词频贡献不是线性的。一个词出现10次和100次,区分度远不如出现1次和10次。BM25就是基于这个洞察,在概率检索框架下用饱和函数控制词频,同时显式处理文档长度。
具体说一下公式。单查询词得分是IDF乘以一个词频饱和项。IDF用平滑版,经典的是加0.5避免负值,这个细节很多人会忽略。词频饱和项的分母里有个k1参数,控制饱和速度,通常取1.2到2.0之间。k1越大,饱和越慢,区别度越倾向于高频词。还有b参数控制文档长度惩罚,0.75是典型值,b越大对长文档惩罚越重。
跟[[TF-IDF]]对比,区别其实很清楚。TF-IDF的词频是线性增长,一篇文档里某个词出现100次,得分就是出现10次的10倍,这不合理。BM25是非线性的,词频高了之后得分会趋近于k1+1,也就是一个上限。另外TF-IDF没有显式处理文档长度,长文档天然词频高,容易霸榜,BM25用长度归一化解决了这个问题。所以BM25对长文档更友好,而且有参数可调,落地时能根据场景适配。
应用场景上,我主要说[[RAG]]里的[[混合检索]]。BM25做粗排召回,向量模型做精排[[重排]],这是现在比较成熟的做法。为什么需要两条腿走路?因为BM25擅长精确匹配,比如法律条文、医学术语、订单号、错误码这些场景,语义模型反而容易跑偏。而向量模型擅长语义理解,比如同义词、近义表达。所以真正落地时,我会把BM25和向量检索一起上,用Hybrid Search做融合。
这里有个风险点:BM25依赖词频统计,如果文档集合很小或者分布不均匀,IDF算出来可能不准。另外它对同义词、多义词无能为力,比如用户搜“苹果”,分不清是水果还是公司。所以上线前我会特别关注召回结果的多样性,避免BM25只召回字面匹配的,漏掉语义相关的。常见失败场景是纯用BM25做知识库问答,用户表达稍微变化就召回不对,这时候必须配合语义检索。
还有一个实操细节,就是k1和b的调参。不同领域最优参数差异很大,比如客服退款场景,用户问题短、关键词集中,k1可以设小一点让饱和更快;而技术文档场景,关键词重复多,k1需要大一点保留区分度。这个调参过程一般用网格搜索加NDCG评估,没有固定值。
所以整体上,我更倾向把BM25看作信息检索的基石,它简单、高效、可解释,但单独用有天花板,必须和语义检索互补。面试官如果追问,可以聊聊参数调优或者混合检索的融合策略。