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 完全归一。调参前先固定分词器,否则指标变化无法归因。
与向量路配合的注意点
- 两路查询要能并行发起,串行执行会直接把两段延迟叠加
- 融合前统一切片标识,否则同一片段会被当成两条独立结果占名额
- 关键词路的候选数量不宜过小,专名类答案常排在该路的中后段
- 定期回看无效命中,多数问题出在分词与停用词而不是权重设置
- 记录两路各自的命中情况,专名类问题命中差通常提示关键词路缺位