在检索增强生成(RAG)系统的构建中,开发者们常常面临一个残酷的现实:“检索质量决定了RAG的上限,而LLM只能决定它逼近这个上限的程度。”
过去的一两年里,基于稠密向量(Dense Embeddings)的语义检索成为了绝对的标配。然而,随着应用深入真实业务场景,稠密向量在面对专有名字、缩写、工业代码、或者是要求精准匹配的特定术语时,常常表现得力不从心。为了弥补这一缺陷,行业逐渐回归到“混合检索”(Hybrid Search)的架构上。
在构建混合检索时,我们往往需要在传统的 BM25 和现代的基于机器学习的 稀疏向量(Sparse Vectors,如 SPLADE) 之间做出选择。本文将为你深度拆解两者的技术差异,并教你如何在 RAG 系统中选择最适合的混合检索策略。
核心概念解析
在探讨对比之前,我们先理清这两种“字面匹配”流派的底层逻辑。
BM25:基于统计的传统检索之王
BM25 是一种经典的词袋模型(Bag-of-Words)排序算法,可以看作是 TF-IDF 的进化版。它通过评估查询词在文档中出现的频率(TF)、文档长度的惩罚(Length Normalization),以及词在整个语料库中的罕见程度(IDF)来计算相关性得分。BM25 真正超越 TF-IDF 的关键在于引入了两个可调参数:k1(词频饱和因子,通常取 1.2-2.0,防止词频线性无限放大相关性得分)和 b(长度归一化强度,取值 0-1,默认 0.75,b=0 则完全不做长度惩罚),使召回效果对参数调整更具鲁棒性。
- 工作机制:完全基于精确的字面匹配。依靠倒排索引(Inverted Index)运行,速度极快。
- 优势:开箱即用(无需训练)、计算资源消耗极低、对专有名词(如报错日志、特定产品型号、人名)匹配极其精准、具备极强的可解释性。
- 劣势:存在 词汇不匹配(Vocabulary Mismatch) 问题。如果用户搜“汽车”,文档里写的是“轿车”,BM25 将完全无法召回。
稀疏向量:AI赋能的词法检索
稀疏向量本质上是将文本映射到一个极高维度(通常与词表大小一致,如3万维)的空间中,但其中绝大多数维度的值为 0。以 SPLADE(SParse Lexical AnD Expansion model)为代表的神经稀疏检索模型,通过类似 BERT 的掩码语言模型(MLM)来生成稀疏表示。
- 工作机制:不仅为文本中已有的词汇分配权重,还会进行上下文感知的词汇扩展(Term Expansion)。例如,输入“矢量数据库”,它可能会自动激活“向量搜索”、“相似度计算”、“高维空间”、“近似最近邻”、“embedding”等语义相关词汇的非零权重。
- 优势:巧妙地结合了词法匹配和部分语义能力,自动解决了同义词和词汇不匹配问题,在公共数据集(如 MS MARCO)的召回率上通常碾压 BM25。
- 劣势:需要 GPU/CPU 进行模型推理来生成向量,索引体积(因为扩展了词汇,非零元素更多)通常比 BM25 大,且存在领域偏移(Domain Shift)问题——如果在极其生僻的专有领域,它扩展的词汇可能反而带来噪音。
- 代表模型:除 SPLADE 外,Elasticsearch 官方推出的 ELSER(Elastic Learned Sparse EncodeR) 也是工业界广泛采用的学习型稀疏模型,对于已经使用 ES 技术栈的团队,ELSER 可无缝集成,无需自建推理服务。
BM25 vs 稀疏向量:多维对比总结
为了更直观地展示,我们可以从以下几个维度对两者进行打分对比:
| 对比维度 | BM25 (传统倒排索引) | 稀疏向量 (SPLADE等神经稀疏模型) |
|---|---|---|
| 精确匹配能力 | ⭐️⭐️⭐️⭐️⭐️ (专攻精准匹配) | ⭐️⭐️⭐️⭐️ (保留了大部分精确匹配) |
| 语义/同义词能力 | ⭐️ (极弱,依赖人工维护同义词典) | ⭐️⭐️⭐️⭐️ (自动进行上下文词汇扩展) |
| 计算开销 (生成阶段) | ⭐️ (极低,仅需分词) | ⭐️⭐️⭐️⭐️ (较高,需运行Transformer模型推理) |
| 开箱即用性 | ⭐️⭐️⭐️⭐️⭐️ (无需任何训练,直接建索引) | ⭐️⭐️ (需要加载模型权重,特定领域可能需微调) |
| 可解释性 | ⭐️⭐️⭐️⭐️⭐️ (完全透明,权重可溯源) | ⭐️⭐️⭐️ (非零维度对应真实词汇,但扩展词可能出乎意料) |
| 生僻领域适应性 | ⭐️⭐️⭐️⭐️ (生词也是词,直接匹配即可) | ⭐️⭐️ (受限于预训练语料,未见过的行业黑话扩展效果差) |
| 查询阶段延迟 | ⭐️⭐️⭐️⭐️⭐️ (极低,倒排索引直接命中,通常 < 10ms) | ⭐️⭐️⭐️⭐️ (稍高于BM25,但借助WAND等稀疏索引算法仍较快) |
RAG 系统中的混合检索策略选择
在 RAG 系统中,“混合检索”通常意味着 “语义检索(稠密向量 Dense Embedding) + 词法检索(BM25 或 稀疏向量)” 的组合。通过如 RRF(Reciprocal Rank Fusion,倒数秩融合)或线性加权(Alpha Weighting)将两者结果融合,可以取长补短。两种融合方式各有侧重:
- RRF 只依赖排名而非绝对分值,天然免疫不同来源分数量纲不一致的问题,鲁棒性强,是大多数场景的默认首选;
- Alpha Weighting 允许手动分配各路权重比例,但必须先对各路分数做 Min-Max 归一化处理,否则量纲差异会导致效果劣于 RRF。
那么,作为架构师或开发者,应该如何选择混合策略?
策略 1:稠密向量 + BM25
🔥 适用场景:通用 RAG、高频实时搜索、极度垂直的细分领域(医疗、法律、代码库)。
这是目前工业界最成熟、性价比最高、也是默认的黄金组合。
- 为什么选它:稠密向量负责解决同义词、语义泛化问题;BM25 作为最坚实的兜底方案,确保用户输入产品 ID、具体数字、报错代码时能够 100% 命中。
- 技术栈支持:目前主流搜索引擎(如 Elasticsearch、OpenSearch)和专用向量数据库(如 Qdrant、Weaviate,以及原生支持稀疏向量的 Milvus 2.5)均已直接或间接原生支持这种架构。
- 缺点:如果文档结构极度口语化,且用户搜索的词非常非标,BM25 这路的召回可能会失效。
策略 2:稠密向量 + 稀疏向量
🔥 适用场景:追求极致召回率、公共知识问答系统、计算资源充足的团队。
- 为什么选它:这是一种“双模型驱动”的架构。SPLADE 作为稀疏向量,在语义与词法之间架起了一座桥梁。在很多测评(如 BEIR)中,这种组合能刷出极高的 NDCG 和 Recall 分数。它免去了人工维护“停用词表”和“同义词典”的繁琐操作。
- 缺点:存在能力重叠(Dense和SPLADE都在解决语义和同义词问题),且你需要维护两个推理 Pipeline。当系统 QPS 极高时,SPLADE 的推理成本和内存占用是不容忽视的隐患。
策略 3:三路召回 (Dense + BM25 + Sparse)
🔥 适用场景:不差钱的巨型企业应用、对查全率要求达到苛刻级别的场景。
- 前沿实践:IBM 近期的研究和某些原生 AI 数据库(如 Infinity)提出了多维度的 N 路召回机制。研究表明,稠密向量(捕获深层语义)、稀疏向量(捕获泛化关键词和局部上下文)、以及原始 BM25(确保纯正的字面不丢失)的 3 路融合,能够产生当前最鲁棒的检索效果。
- 缺点:架构极度复杂,延迟可能增加,且调参(融合权重)难度呈指数级上升。
给开发者的落地建议
如果你正在准备重构你们团队的 RAG 检索链路,请参考以下决策流:
- 从 Baseline 开始:无脑选择 Dense Embedding + BM25 + RRF 融合。这个组合能够以最低的开发成本,解决 80% 的检索不匹配问题。
- 评估领域词汇:如果你的文档里全是公司内部代号、特定机器型号(例如 “TX-9902”、”NullPointerException”),坚守 BM25。因为 SPLADE 等稀疏模型根本没见过这些词,强行词汇扩展反而会引入噪声破坏检索。
- 何时切换到稀疏向量 (SPLADE):如果你的业务是面向 C 端的通用知识库,用户提问非常多样化(经常用各种大白话去搜专业的文档),且你不想花精力去维护庞大的同义词库(Synonym Dictionary),此时引入 SPLADE 替换 BM25,会带来肉眼可见的体验提升。
- 关注基础设施能力:引入前必须考虑底层数据库是否支持。例如,Milvus 2.5 引入了原生稀疏浮点向量(Sparse Float Vector)的存储与索引支持,Elasticsearch 和 OpenSearch 也推出了基于 ELSER 的 Neural Sparse Search。选择与你当前基建对齐的方案,能避免系统架构变得过于臃肿。
结语
在 RAG 的世界里,并没有“一招鲜吃遍天”的银弹。BM25 并不是过时的老古董,它是工程上最优雅的词法兜底方案;而稀疏向量也不是华而不实的玩具,它是 AI 时代对词法检索的又一次重要升级。深刻理解业务场景中的“Query 长什么样”,才是选择检索策略的唯一真理。