
全称Okapi BM25概率检索排序算法是 Elasticsearch、Lucene、RAG 关键词检索的基础你代码里用的BM25Okapi就是它的 Python 实现。核心关键词精确匹配打分词袋模型不理解语义只看分词后的词是否重合。一、核心公式(score(D,Q)\sum_{q_i\in Q} IDF(q_i)\cdot \frac{TF(q_i,D)\cdot(k_11)}{TF(q_i,D)k_1\cdot\left(1-bb\cdot\frac{|D|}{avgdl}\right)})- Q查询D文档(TF(q_i,D))词(q_i)在文档 D 内出现次数词频(IDF(q_i))逆文档频率词越稀有IDF 越大权重越高(|D|)文档长度avgdl全部文档平均长度(k_1、b)可调超参(k_1)控制词频饱和默认 1.5词重复再多分数不会无限上涨防止关键词堆砌刷分b控制文档长度归一默认 0.75压制长文档天然的优势arXiv二、三大核心设计对比 TF-IDF 的改进词频 TF 饱和TF-IDF词出现 100 分≈100 倍 1 次。BM25词出现 1 次收益很大出现 10 次之后继续重复分数提升极少。避免堆砌关键词作弊。IDF 逆文档频率词在越少文档出现IDF 越高。例专业术语医学影像只在少数文档出现命中后权重很高的这种高频停用词 IDF 接近 0几乎不贡献分数。文档长度归一化长文档天然更容易命中关键词BM25 会做惩罚长短文档打分更公平。注意词袋模型不关心词语顺序人工智能辅助医生和医生辅助人工智能分词一样分数一样。三、使用流程就是你写的代码流程文档集合documents [文本1,文本2...]对每篇文档分词 清洗 去停用词得到二维列表corpus[[词1,词2],[词3,词4]]构建 BM25 模型bm25_model BM25Okapi(corpus)查询文本做同样分词得到 query_tokensget_scores(query_tokens)一次性返回所有文档的相关性分数按分数降序排序召回 TopN 文档四、优缺点✅ 优点速度快、可解释性强CPU 就能跑不需要训练、不需要 GPU精准匹配关键词适合知识库、文档检索常用来做 RAG 的关键词召回稳定小数据集也能正常工作❌ 缺点你踩坑的根源只做精确字符串匹配不懂语义、同义词医疗和医学影像是近义词但 token 不一样完全不命中分数 0不理解语序、上下文错别字、同义词无法召回五、RAG 里的工程用法工业界一般BM25 关键词检索 Embedding 向量检索混合召回RRF 融合BM25抓关键词保证关键词一定能召回结果可解释向量检索抓语义、同义词、模糊含义两者互补。六、面试极简背诵版BM25 是概率检索排序算法基于 TF-IDF 做两处改进词频饱和、文档长度归一它是词袋模型只做精确词匹配适合关键词检索缺点是没有语义理解能力RAG 中常和向量检索搭配使用。