搞不懂BM25?你RAG的检索可能白做了

📅 2026/8/13 8:38:20
搞不懂BM25?你RAG的检索可能白做了
你以为向量检索万能其实漏了一半很多人聊RAG上来就是Embedding、向量数据库、语义匹配好像关键词检索已经是上个时代的产物。但真实情况是你问大模型2024年第三季度营收向量检索可能给你召回一堆聊财务分析方法论的文档而BM25精准命中含2024“第三季度”营收这三个词的段落。这不是向量检索不行是它天然不擅长精确匹配。BM25在这个场景里至今无可替代。 Elasticsearch、Lucene、OpenSearch这些搜索引擎的底层排序算法用的都是它。RAG框架里做混合检索hybrid searchBM25负责稀疏检索那一半。今天把BM25从分词到打分的完整链路拆清楚不讲废话。第一步分词——检索的起点BM25的第一步不是算分是把文本切成词。英文分词简单按空格切就行。machine learning切成 machine、learning再做个词干还原stemminglearning 变回 learn就算完事。中文麻烦得多。“自然语言处理这个词可以切成自然/语言/处理”也可以切成自然语言/处理甚至不切当一整个词。切法不同检索结果天差地别。# jieba 分词示例import jiebatext 自然语言处理是人工智能的重要方向# 精确模式words jieba.lcut(text)# 输出: [自然语言, 处理, 是, 人工智能, 的, 重要, 方向]# 搜索引擎模式更细粒度words_search jieba.lcut_for_search(text)# 输出: [自然, 语言, 自然语言, 处理, 是, 人工, 智能, 人工智能, 的, 重要, 方向]搜索引擎模式会额外切出子词保证自然语言作为整体词被检索到的同时单独搜语言也能命中。RAG场景里文档分词和查询分词必须用同一套分词器否则词对不上等于白搭。分词之后停用词的、是、在、了通常会被过滤掉。这些词在每篇文档里都出现没有区分度留着只会增加噪音。第二步倒排索引——为什么能秒回分完词下一步是建倒排索引。正排索引是从文档找词文档A包含[苹果, 手机, 评测]。倒排索引反过来从词找文档苹果→[文档A, 文档C, 文档F]手机→[文档A, 文档B]。搜苹果 手机的时候系统不需要遍历所有文档直接在倒排索引里查这两个词取交集瞬间拿到候选文档列表。这就是搜索引擎能在毫秒级返回结果的原因。倒排索引结构示意词项 → 文档列表含词频─────────────────────────────────苹果 → [文档A:2, 文档C:1, 文档F:3]手机 → [文档A:1, 文档B:2]评测 → [文档A:1, 文档D:1]自然语言处理 → [文档B:1, 文档E:2] ![](http://cdn.zhipoai.cn/8336f837.jpg) 有了候选文档列表接下来就是核心问题怎么给每篇候选文档打分BM25登场。 --- BM25的打分公式三个变量决定一切 ------------------ BM25的全称是 Best Matching 25由 Robertson 等人在1994年提出至今仍是信息检索领域的标准排序算法。 核心思路一个词在当前文档出现越多分数越高但这个词在所有文档里都出现的话重要性就低。再加一个文档长度归一化——短文档里出现的词比长文档里出现的词更值钱。 公式长这样 plaintext score(q, d) Σ IDF(qi) × TF_term(qi, d)其中TF_term f(qi, d) × (k1 1) / (f(qi, d) k1 × (1 - b b × |d| / avgdl))IDF(qi) log((N - n(qi) 0.5) / (n(qi) 0.5) 1)看着复杂拆开就三个部分「词频饱和」——出现次数不是越多越好f(qi, d) 是词 qi 在文档 d 里出现的次数。朴素想法是出现越多越相关但BM25加了个饱和机制词频增长到一定程度后分数增益迅速衰减。一篇文档里苹果出现3次确实比出现1次更相关但出现30次不一定比3次相关30倍。k1 控制饱和速度默认值1.2。k1越大饱和越慢词频影响越大k1越小饱和越快词频很快就不怎么加分了。「IDF逆文档频率」——烂大街的词不值钱N 是文档总数n(qi) 是包含词 qi 的文档数。一个词在所有文档里都出现n(qi) ≈ NIDF趋近于0这个词几乎不贡献分数。“的”是这种停用词的IDF就是0被自动过滤。反过来一个词只在少数文档里出现IDF很高命中时分数暴涨。这就是为什么专业术语比通用词更能精准定位文档。「文档长度归一化」——短文档里命中更值钱|d| 是当前文档长度avgdl 是所有文档的平均长度。b 控制归一化强度默认0.75。直觉上理解一篇10个词的文档里命中了查询词说明这篇文档跟查询高度相关一篇10000个词的文档里命中同样的查询词可能只是顺带提了一嘴。BM25通过这个机制惩罚长文档让短而精的文档排在前面。参数怎么调k1 和 b 是BM25仅有的两个可调参数理解了它们的含义调参就有方向了。k1默认1.2控制词频饱和速度。文档内容差异大、词频分布不均匀时适当调大1.5-2.0文档长度均匀、内容相似时调小0.5~1.0。大多数场景默认值就够用。b默认0.75控制文档长度归一化强度。文档长度差异大时保持0.75如果文档长度都差不多b可以调小甚至设为0不做事长归一化。如果发现长文档总是排在前面适当调大b。# 用 rank_bm25 库快速实现from rank_bm25 import BM25Okapi# 文档库已分词corpus [ [苹果, 手机, 评测, 续航], [华为, 手机, 拍照, 评测], [苹果, 电脑, 性能, 评测], [小米, 手机, 性价比, 评测]]bm25 BM25Okapi(corpus)# 查询同样要分词query [苹果, 手机, 评测]scores bm25.get_scores(query)# 输出: [2.14, 0.0, 1.07, 0.0]# 文档0得分最高因为同时命中苹果手机评测三个词# 获取最相关的文档top_k bm25.get_top_n(query, corpus, n1)# 输出: [[苹果, 手机, 评测, 续航]]文档0得分最高不难理解三个查询词全部命中且文档长度短归一化后得分更高。文档2只命中了苹果和评测少了手机IDF贡献少了一块分数自然低。在RAG里怎么用BM25单用BM25做RAG检索能解决精确匹配问题但搞不定语义相似。用户问营收增长文档里写的是收入提升BM25对不上。所以现代RAG系统普遍采用混合检索hybrid retrieval# 混合检索示意defhybrid_search(query,top_k5):# 稀疏检索BM25 bm25_scoresbm25.get_scores(tokenize(query))# 稠密检索向量相似度 query_vecembedding_model.encode(query)vec_scorescosine_similarity(query_vec,doc_vectors)# 分数融合简单加权或RRF final_scores0.5*normalize(bm25_scores)0.5*normalize(vec_scores)returntop_k_indices(final_scores)BM25负责捞精确匹配向量检索负责捞语义相近两路结果融合后送进大模型生成回答。目前LangChain、LlamaIndex、Dify这些主流RAG框架都内置了混合检索支持。权重分配没有标准答案。查询偏向精确匹配代码搜索、专有名词、数字日期时BM25权重调高查询偏向语义理解开放问答、概念解释时向量权重调高。实际项目里建议用RRFReciprocal Rank Fusion做融合比简单加权更稳。别让检索环节拖后腿RAG系统效果不好90%的问题出在检索环节不在大模型。召回不到正确的文档再强的模型也只能一本正经地胡说。BM25的价值在于它简单、快、可解释、不需要GPU。向量检索再火精确匹配这件事BM25做得比谁都好。两者搭配才是RAG检索的正确姿势。搞懂分词、倒排索引、TF-IDF打分这三件事BM25的核心就吃透了。剩下的参数调优拿真实数据跑几轮对比比看十篇博客都管用。学AI大模型的正确顺序千万不要搞错了2026年AI风口已来各行各业的AI渗透肉眼可见超多公司要么转型做AI相关产品要么高薪挖AI技术人才机遇直接摆在眼前有往AI方向发展或者本身有后端编程基础的朋友直接冲AI大模型应用开发转岗超合适就算暂时不打算转岗了解大模型、RAG、Prompt、Agent这些热门概念能上手做简单项目也绝对是求职加分王给大家整理了超全最新的AI大模型应用开发学习清单和资料手把手帮你快速入门学习路线:✅大模型基础认知—大模型核心原理、发展历程、主流模型GPT、文心一言等特点解析✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑✅开发基础能力—Python进阶、API接口调用、大模型开发框架LangChain等实操✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经以上6大模块看似清晰好上手实则每个部分都有扎实的核心内容需要吃透我把大模型的学习全流程已经整理好了抓住AI时代风口轻松解锁职业新可能希望大家都能把握机遇实现薪资/职业跃迁这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】