←返回文章列表

学习型稀疏召回是什么:从 BM25 到 SPLADE

RAG深度学习信息检索
10 分钟-阅读

学习型稀疏召回不是把 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 各有位置。真正重要的是知道每一路召回在补什么短板,再用评估集验证它是否真的让答案更可靠。

参考资料

YL

我是姚磊

大模型应用开发者,关注 RAG、Agent 和产品化工程。沉淀实践中的判断、踩坑记录和可复用方法。联系我:yaolei_agent@163.com

LLM AppsRAGProductEngineering Notes