学习型稀疏召回是什么:从 BM25 到 SPLADE
学习型稀疏召回不是把 BM25 换成向量检索,而是在保留倒排索引可解释性和效率的同时,用神经模型学习词项权重和语义扩展。
学习型稀疏召回是什么:从 BM25 到 SPLADE
RAG 系统做不好,很多时候不是大模型不会答,而是检索阶段没有把正确材料找出来。
最常见的检索方案有两类:一种是 BM25 这样的关键词检索,擅长命中错误码、术语、字段名和专有名词;另一种是 dense embedding 检索,擅长处理同义表达和自然语言语义。学习型稀疏召回站在两者之间:它仍然使用稀疏表示和倒排索引,但词项权重和扩展词不再只靠人工公式,而是由模型学习出来。
SPLADE 是这一方向里最有代表性的方法之一。理解它之前,需要先看清 BM25 解决了什么,又没解决什么。
BM25 为什么仍然重要
BM25 是经典词法检索算法。它的基本直觉很朴素:查询词在文档中出现得越多,相关性通常越高;一个词在整个语料中越少见,它越能区分文档;文档太长时,词频不能无限加分,需要做长度归一化。
比如用户问:
E1042 是什么错误?
如果知识库里有一段:
E1042 表示导出额度不足。
BM25 会很稳地把它排上来。错误码、接口名、产品型号、配置字段这类信息,最怕被语义检索“模糊处理”。E1042 和 E1043 在 embedding 空间里可能很近,但在排障场景里,它们是两个完全不同的信号。
BM25 的另一个优势是工程成熟。倒排索引可以快速找到包含某个词项的文档,查询结果容易解释,线上调试也直观。看到一篇文档排上来,通常能从命中的词项、词频和字段权重里找到原因。
问题在于,BM25 对“没写出来的词”无能为力。
用户问:
员工离职后怎么禁止继续登录?
文档写的是:
离职账号需要完成权限回收,包括 SSO、VPN 和代码仓库访问。
这两个文本语义相近,但共享词不多。BM25 可能抓住“离职”或“账号”,但“禁止继续登录”和“权限回收”之间的关系不是公式能直接知道的。它需要同义词、上下位词、领域术语映射,或者某种能学习语义扩展的机制。
学习型稀疏召回就是在这个位置出现的。
稀疏召回不等于 BM25
“稀疏”说的是表示形式。一个文档或查询可以被表示成一个很大的向量,维度对应词表里的词。绝大多数维度是 0,只有少量词有非零权重,这就是稀疏向量。
BM25 可以看作一种传统稀疏召回:非零维度主要来自文本中实际出现过的词,权重由统计公式计算。
学习型稀疏召回也是稀疏表示,但权重来自模型。更重要的是,它可以给原文里没有出现的词分配权重,这就是扩展能力。
一个简化例子:
原文:离职账号需要完成权限回收
BM25 可能看到:
离职: 1.8
账号: 1.2
权限: 1.5
回收: 1.6
学习型稀疏模型可能看到:
离职: 1.8
账号: 1.2
权限: 1.5
回收: 1.6
登录: 0.9
访问: 1.1
禁用: 0.8
后面三个词不一定出现在原文中,但它们和文本含义相关。这样用户问“禁止登录”时,系统更可能召回“权限回收”这段文档。
这和 dense embedding 的差别在于:学习型稀疏召回仍然把结果落在词表维度上。它不是一个每一维都难解释的 dense vector,而是一组带权词项。工程上仍然可以用倒排索引,也能看到哪些词推动了召回。
学习型稀疏召回学的是什么
学习型稀疏召回通常学习三件事。
第一是词项权重。传统 BM25 用词频、逆文档频率和长度归一化给词打分;学习型方法可以用上下文模型判断某个词在当前文档里是否重要。
例如“苹果发布了新系统”和“我买了一个苹果”,两个句子都包含“苹果”。BM25 只能看到词面,学习型模型可以借助上下文区分公司和水果。对于检索来说,它至少能更准确地判断相关词项的重要性。
第二是文档扩展。模型可以为文档补出潜在相关词。文档写“权限回收”,模型可能扩展出“访问控制”“登录限制”“账号禁用”。这让词法检索具备一部分语义召回能力。
第三是查询扩展。用户问题通常很短,词少,容易漏召回。学习型模型可以把“报错 1042”扩展到“错误码、导出失败、额度不足”等相关词项。短查询被扩展后,和文档的交集会更丰富。
DeepImpact、uniCOIL 和 SPLADE 都属于这一波把神经模型引入稀疏检索的代表方向。它们的共同目标不是抛弃倒排索引,而是让倒排索引里的词项权重更聪明。
SPLADE 的核心思路
SPLADE 的全名是 Sparse Lexical and Expansion Model。这个名字已经把它的两件事说出来了:Sparse Lexical 表示它仍然是词法稀疏表示;Expansion 表示它会做词项扩展。
SPLADE 通常基于 masked language model。给定一段文本,模型会预测词表中哪些词和这段文本相关,并给这些词分配权重。最后得到的是一个高维稀疏向量:维度对应词表,非零维度对应模型认为重要的词。
比如文档是:
用户无法导出账单,提示 E1042。
SPLADE 可能不仅保留“用户、导出、账单、E1042”,还给“错误、额度、限制、失败”等词一定权重。这样当用户问“账单导出失败是不是额度问题”时,召回机会就比纯 BM25 更高。
它的优势在于同时保留两种能力:
| 能力 | BM25 | Dense embedding | SPLADE |
|---|---|---|---|
| 精确词匹配 | 强 | 弱 | 强 |
| 语义扩展 | 弱 | 强 | 中到强 |
| 可解释性 | 强 | 弱 | 较强 |
| 倒排索引兼容 | 强 | 弱 | 强 |
SPLADE v2 在原始 SPLADE 基础上继续改进效率和效果,例如更适合检索任务的训练策略、蒸馏方法和稀疏化约束。它关注的不只是“召回更准”,还包括“非零词项不能太多”。因为稀疏向量如果膨胀得太厉害,倒排索引会变大,查询也会变慢。
为什么 RAG 会关心学习型稀疏召回
RAG 知识库里有大量“半结构化文本”:产品文档、FAQ、接口说明、错误码、工单记录、配置说明。用户问题却往往是自然语言。
这会造成两个矛盾。
第一个矛盾是精确词不能丢。用户问 E1042,召回系统必须命中 E1042,不能把 E1043 当成相似答案。BM25 擅长这个。
第二个矛盾是语义表达经常不一致。用户问“怎么禁止离职员工登录”,文档写“权限回收流程”。Dense embedding 擅长这个。
学习型稀疏召回的价值,是在一个检索器里同时保留精确词和语义扩展。它不会完全替代 dense embedding,也不会让 BM25 失去意义,但在 RAG 的第一阶段召回里,它可以成为很有竞争力的一路。
一个实用设计是多路召回:
flowchart TD
A["用户问题"] --> B["BM25"]
A --> C["Dense 向量检索"]
A --> D["学习型稀疏召回"]
B --> E["候选文档"]
C --> E
D --> E
E --> F["融合 / 去重"]
F --> G["重排序"]
G --> H["上下文组装"]
BM25 保底精确词,dense embedding 覆盖语义相似,SPLADE 这类学习型稀疏召回补上“词法可解释 + 语义扩展”的中间地带。
工程上要注意什么
学习型稀疏召回不是免费午餐。
首先是索引体积。BM25 只索引原文词项,学习型稀疏模型会扩展出额外词项。如果稀疏化做得不好,每篇文档的非零维度太多,索引会变大,查询延迟也会上升。
其次是训练和领域适配。通用模型学到的扩展词不一定适合企业知识库。比如“额度不足”和“套餐限制”在一个 SaaS 文档里很近,但在财务系统或云资源计费里,含义可能不同。高质量的查询-文档对、点击日志或蒸馏数据,会显著影响效果。
第三是解释不能过度相信。学习型稀疏向量比 dense embedding 更可解释,因为能看到词项权重;但这些扩展词仍然是模型预测出来的,不等于文档真的写了这些词。生成答案时,仍然要让模型依据原文片段,而不是依据扩展词本身。
第四是评估要分开做。不能只看最终回答是否好。至少要评估 recall@k、precision@k、索引大小、查询延迟,以及和 BM25 / dense embedding / hybrid retrieval 的对比。
什么时候值得用
如果知识库里充满错误码、接口名、配置项、产品型号,BM25 很难被完全替代。如果用户问题又经常是口语化表达,纯 BM25 会漏掉很多相关文档。这个时候,学习型稀疏召回值得尝试。
更具体地说,它适合这些场景:
- 技术文档问答:术语精确,但表达方式很多。
- 客服知识库:用户说法口语化,文档说法规范化。
- 企业搜索:既要命中关键词,又要处理同义词和缩写。
- RAG 第一阶段召回:需要较高 recall,同时不希望完全放弃可解释性。
如果你的问题主要是图片、代码语义、跨语言长文本理解,dense embedding 或专门模型可能更重要。如果你的知识库很小,BM25 加重排序已经足够,学习型稀疏召回可能带来不必要的系统复杂度。
结语
BM25 让检索系统拥有稳定、可解释、工程成熟的词法召回能力。Dense embedding 让检索系统能跨过字面词,捕捉语义相似。学习型稀疏召回试图把两边的优点拉到一起:仍然使用稀疏词项和倒排索引,但用模型学习哪些词重要、哪些扩展词应该出现。
SPLADE 的代表性就在这里。它不是“更复杂的 BM25”,也不是“另一种 dense embedding”,而是一种神经化的稀疏词法检索方法。对于 RAG 来说,它提供了一条很实用的中间路线:既保留关键词检索的稳定性,又补上语义扩展能力。
检索系统最终不该迷信单一路线。BM25、学习型稀疏召回、dense embedding 和 reranker 各有位置。真正重要的是知道每一路召回在补什么短板,再用评估集验证它是否真的让答案更可靠。
参考资料
- Stephen Robertson, Hugo Zaragoza, The Probabilistic Relevance Framework: BM25 and Beyond, 2009.
- Thibault Formal, Benjamin Piwowarski, Stéphane Clinchant, SPLADE: Sparse Lexical and Expansion Model for First Stage Ranking, 2021.
- Thibault Formal et al., SPLADE v2: Sparse Lexical and Expansion Model for Information Retrieval, 2021.
- Lesheng Jin et al., DeepImpact: Learning Passage Impacts for Inverted Indexes, 2021.
- Jimmy Lin, Xueguang Ma, A Few Brief Notes on DeepImpact, COIL, and a Conceptual Framework for Information Retrieval Techniques, 2021.
- Nandan Thakur et al., BEIR: A Heterogeneous Benchmark for Zero-shot Evaluation of Information Retrieval Models, 2021.
- NAVER Labs Europe, SPLADE GitHub Repository.
我是姚磊
大模型应用开发者,关注 RAG、Agent 和产品化工程。沉淀实践中的判断、踩坑记录和可复用方法。联系我:yaolei_agent@163.com



