首页/AI/RAG 与向量库速查/BM25 排序算法
Embedding 与检索50 条

BM25 排序算法

BM25 基于词频与逆文档频率打分,含词频饱和(k1)与文档长度归一(b)两个参数;是关键词检索的常用算法,也是混合检索中的一路召回。

RAG 与向量库速查AI更新于 2026-10-13

BM25 是什么

BM25 是基于词频与逆文档频率的打分算法:一个词在某文档里出现越多、在整个语料里越罕见,得分越高;同时用长度归一化压制长文档的天然优势。它不需要训练,实现简单、可解释,是关键词检索的默认算法,也是混合检索里的关键词一路。

BM25 单查询词打分公式

BM25 单查询词打分公式
score(q_i, d) =
  IDF(q_i) · [ f(q_i,d)·(k1+1) ] / [ f(q_i,d) + k1·(1 - b + b·|d|/avgdl) ]

Lucene 系默认:k1 = 1.2,b = 0.75

参数

k1控制词频饱和,常用 1.2 至 2.0;越大词频收益越持久
b长度归一强度,0 关闭、1 完全归一,默认 0.75
分词器中文必须分词,IK、jieba 等各不相同,换分词器等于换排名
IDF逆文档频率,在语料统计的基础上计算,语料变化会改变打分

调参方法

  • 先固定分词器与停用词表,再谈 k1 与 b:分词不一致时调参结论不可复用
  • 用同一批评测查询对比不同 b 值,观察长文档类问题的排名变化
  • 把业务专名加入自定义词典,通常比调权重更能解决召回不到的问题
  • 语料增量更新后检查 IDF 统计是否需要重建,否则新词的权重会失真
  • 与向量路联调时优先用排名融合,避免两路分数直接相加

常见问题与对策

现象原因对策
专名检索不到被分词器切开加自定义词典或补充同义词
无关词命中靠前停用词表不全补停用词并检查分词粒度
长文档永远排后长度归一过强适当降低 b,或对标题加权
同一查询结果不稳语料统计变化固定索引快照用于评测
k1 增大让词频收益更持久;b 取 0 关闭长度归一、取 1 完全归一。调参前先固定分词器,否则指标变化无法归因。

与向量路配合的注意点

  • 两路查询要能并行发起,串行执行会直接把两段延迟叠加
  • 融合前统一切片标识,否则同一片段会被当成两条独立结果占名额
  • 关键词路的候选数量不宜过小,专名类答案常排在该路的中后段
  • 定期回看无效命中,多数问题出在分词与停用词而不是权重设置
  • 记录两路各自的命中情况,专名类问题命中差通常提示关键词路缺位

易错点

  • 中文不分词直接按字切,BM25 与向量检索的效果都会失真
  • 忽略长度归一造成的短文档偏置,长文档归纳类需求排序吃亏
  • 改分词器后未重建索引,查询与索引的分词口径不一致
  • 把 BM25 分数与余弦相似度直接相加,量纲不同导致一路长期压制另一路

数据来源与参考

  • Robertson & Zaragoza, The Probabilistic Relevance Framework: BM25 and Beyond
  • Elasticsearch 官方文档(Practical BM25)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌