稠密 vs 稀疏向量(Dense vs Sparse Vector)
一句话 TL;DR:稠密向量是所有维度都有值的向量(如 embedding),稀疏向量是大部分维度为 0 的向量(如 BM25/TF-IDF 词袋表示)。稠密擅长语义相似,稀疏擅长关键词精确匹配。现代 RAG 系统常用混合检索(hybrid search)结合两者优势。
L1 · 一句话点破
两种向量表示:
稠密向量(Dense Vector):每个维度都有非零值,维度低(768-3072),由 embedding 模型生成。
"猫" 的 dense embedding: [0.23, -0.45, 0.12, ..., 0.78] # 1536 维,每维都有值稀疏向量(Sparse Vector):大部分维度为 0,只有少数维度非零,维度高(等于词表大小,如 30K-250K)。
"猫" 的 sparse (BM25/TF-IDF) 表示: {猫: 1.5, 宠物: 0.8, 喵: 0.6} # 只有出现的词非零
"猫" 的 sparse (SPLADE) 表示: {猫: 2.1, 宠物: 1.5, 动物: 1.2, 喵喵: 0.9, ...} # 扩展的稀疏两者擅长不同:
- 稠密:语义相似("猫" 和 "小猫" 接近)
- 稀疏:关键词匹配("iPhone 15" 精确匹配)
现代 RAG 系统常用混合检索,结合两者。
L2 · 通俗类比
两种找书方式:
- 稠密向量:把每本书的内容浓缩成一个"语义指纹"(如 1536 个数字),按"主题相似度"找。能找到"主题相关"但用词不同的书。但可能错过"用词完全匹配"的书。
- 稀疏向量:把每本书看成一个"关键词清单",按"关键词重合"找。能精确找到含特定关键词的书。但同义词/换说法找不到。
具体例子:
查询:"苹果手机"
- 稠密向量:找到"iPhone 15 评测"、"智能手机对比"等语义相关文档(即使不含"苹果手机")
- 稀疏向量:找到含"苹果"+"手机"的文档,但可能错过"iPhone"(同义词不同词)
两者结合(混合检索):
- 稠密召回语义相关
- 稀疏保证关键词命中
- 用 RRF 或加权融合合并结果
这是现代 RAG 的主流方案。
L3 · 正经定义
稠密向量(Dense Vector):$\mathbf{x} \in \mathbb{R}^d$,所有维度都有非零值,$d$ 较小(768-3072)。由 embedding 模型生成。
稀疏向量(Sparse Vector):$\mathbf{x} \in \mathbb{R}^V$,大部分维度为 0,$V$ 等于词表大小(30K-250K)。只存非零项({index: value})。
稀疏向量的来源:
| 方法 | 思路 | 代表 |
|---|---|---|
| 词袋 / TF-IDF | 词频统计 | 经典 IR |
| BM25 | TF-IDF 改进,加文档长度归一 | Lucene, Elasticsearch |
| 学习型稀疏(SPLADE) | 神经网络生成稀疏表示 | SPLADE |
| 词权重 | 每个词一个权重 | uniCOIL 等 |
对比:
| 维度 | 稠密 | 稀疏 |
|---|---|---|
| 维度 | 低(768-3072) | 高(30K-250K) |
| 非零比例 | 100% | <1% |
| 存储 | 大(每维都存) | 小(只存非零) |
| 语义相似 | 强 | 弱 |
| 关键词匹配 | 弱 | 强 |
| 可解释性 | 弱 | 强(看哪些词匹配) |
| 计算索引 | ANN (HNSW) | 倒排索引 |
参考资料:
- Robertson & Zaragoza, 2009 - The Probabilistic Relevance Framework: BM25 and Beyond
- Formal et al., 2021 - SPLADE
- Luan et al., 2021 - Sparse, Dense, and Attentional Representations for Text Retrieval
- Karpukhin et al., 2020 - DPR
L4 · 原理深挖
4.1 稠密向量:语义相似的力量
稠密向量由 embedding 模型(如 BERT、OpenAI text-embedding-3)生成。每个维度编码一个"语义侧面"。
优势:
- 语义相似:"猫" 和 "小猫"、"猫科动物" embedding 接近,能找到同义/相关
- 跨语言:多语言 embedding 模型让中英文"猫" 和 "cat" 接近
- 泛化:能处理训练时没见过的查询和文档
劣势:
- 关键词匹配弱:查询"iPhone 15"可能召回"iPhone 14"(语义太近)
- 可解释性差:为什么这个文档被召回?看 embedding 维度看不出
- 小数据训练不足:embedding 模型在某些领域(如医疗、法律专有词)可能不准
4.2 稀疏向量:精确匹配的力量
稀疏向量基于词项匹配,每个维度对应一个词。
经典方法:BM25 / TF-IDF
文档 "猫是一种常见的宠物" -> {猫: 1.2, 是: 0.1, 一种: 0.1, 常见: 0.8, 宠物: 1.0}
查询 "猫" -> {猫: 1}
匹配: 文档含"猫",得分高优势:
- 精确匹配:查询词在文档中精确出现,得分高
- 可解释:看哪些词匹配,为什么召回清晰
- 无需训练:BM25 是无监督的,开箱即用
- 专有名词强:罕见词、专有名词、代码标识符等精确匹配
劣势:
- 语义弱:查询"猫"找不到"小猫"、"cat"
- 依赖分词:中文需先分词,分词错误影响检索
- 词表大:维度等于词表大小,存储和计算需特殊处理
4.3 学习型稀疏:SPLADE 等新方法
SPLADE (Formal et al., 2021) 等方法用神经网络生成稀疏向量,结合稠密和稀疏优势:
查询 "猫" 通过 SPLADE 模型 -> {猫: 2.1, 宠物: 1.5, 动物: 1.2, 喵喵: 0.9, 小猫: 1.8, ...}模型不只是输出"猫",还预测相关词("宠物"、"小猫"等)的权重,形成"扩展的稀疏表示"。
SPLADE 的优势:
- 语义扩展:通过模型预测相关词,比纯 BM25 语义更强
- 稀疏存储:仍只存非零项,存储高效
- 可解释:仍是词项匹配,可看哪些词匹配
- 倒排索引友好:可直接用 Lucene 等倒排索引
SPLADE 的劣势:
- 需训练数据
- 推理比 BM25 慢
- 工程集成比 dense 复杂
SPLADE 在 BEIR 等 benchmark 上常优于纯 dense 检索,是稀疏检索的前沿。
4.4 混合检索:结合两者优势
现代 RAG 系统常用混合检索(Hybrid Search):
1. 同时用 dense 和 sparse 检索
dense_results = dense_search(query, top_k=50)
sparse_results = sparse_search(query, top_k=50)
2. 融合结果
fused = rrf(dense_results, sparse_results) # 或加权融合
3. 返回 top-k
return fused[:top_k]融合方法:
- RRF (Reciprocal Rank Fusion):按排名倒数求和,无需归一化分数
- 加权融合:$\alpha \cdot \text{dense_score} + (1-\alpha) \cdot \text{sparse_score}$,需分数归一化
- 学习型融合(LTR):训练模型学习融合权重
为什么混合检索有效:
- 稠密覆盖语义相关
- 稀疏覆盖精确匹配
- 互补,召回率提升
- 实证:混合检索 RAG 效果常优于纯 dense 或纯 sparse
主流方案:Elasticsearch 8+、Vespa、Weaviate、Milvus 2.4+ 等都内置混合检索。
4.5 稠密 vs 稀疏:什么时候用哪个
纯稠密适合:
- 语义查询为主("关于 AI 的文章")
- 跨语言检索
- 查询和文档用词差异大
- embedding 模型在领域内表现好
纯稀疏适合:
- 关键词查询为主("iPhone 15 价格")
- 专有名词、代码标识符检索
- 数据量小,不值得训 embedding
- 可解释性要求高
混合检索适合:
- 通用 RAG(既有可能问概念,也可能问具体词)
- 高质量检索场景
- 工程资源允许维护两套索引
实务:多数生产 RAG 用混合检索,效果最稳。
4.6 稀疏向量的索引:倒排索引
稀疏向量天然适合倒排索引(inverted index):
倒排索引:
"猫" -> [文档1, 文档5, 文档8]
"宠物" -> [文档1, 文档3, 文档5]
...查询时:取查询词对应的文档列表,求交集/并集,按权重排序。
倒排索引是 BM25、TF-IDF 的基础,也是 Lucene/Elasticsearch 的核心数据结构。它对稀疏向量高效:
- 只需查非零维度
- 复杂度与查询词数成正比,与词表大小无关
- 成熟工程(Lucene 几十年优化)
对比稠密向量的 ANN 索引(HNSW、IVF):两种索引针对不同向量类型,工程实现完全不同。混合检索系统需同时维护两套索引。
L5 · 沿革与坑
沿革
- 1970s-1990s:稀疏向量(TF-IDF、BM25)统治信息检索。倒排索引成熟。
- 2013-2018:Word2Vec、BERT 等让稠密向量崛起,但早期检索效果不如 BM25。
- 2020:DPR (Karpukhin et al.) 证明稠密检索在开放域 QA 上超越 BM25。
- 2021:SPLADE 等学习型稀疏出现,结合稠密和稀疏优势。
- 2022-2023:RAG 兴起,混合检索成为主流。Elasticsearch、Milvus 等集成混合检索。
- 2024-2025:ColBERT、Multi-vector 等新表示出现,但 dense+sparse 混合仍是 RAG 主流。
常见误解
❌ 误解:稠密向量一定比稀疏好。 ✅ 真相:稠密擅长语义,稀疏擅长关键词。各有所长,混合检索常优于纯稠密(4.5)。
❌ 误解:稀疏向量过时了。 ✅ 真相:BM25 等稀疏方法在关键词匹配上仍强,且无需训练。混合检索让稀疏回归主流(4.4)。
❌ 误解:稀疏向量维度低。 ✅ 真相:稀疏向量维度等于词表大小(30K-250K),远高于稠密(768-3072)。只是大部分为 0,存储高效(L3)。
❌ 误解:BM25 是稀疏向量。 ✅ 真相:BM25 是一种打分函数,输出可看作稀疏向量(每个词一个权重)。概念上有联系但不等同(4.2)。
❌ 误解:SPLADE 是稠密向量。 ✅ 真相:SPLADE 是学习型稀疏向量,输出仍是稀疏的(大部分维度为 0),但用神经网络生成(4.3)。
❌ 误解:混合检索就是把两套结果合并。 ✅ 真相:合并需要正确的融合方法(RRF、加权、LTR)。简单合并可能让一种结果淹没另一种。RRF 是常用稳健方法(4.4)。
面试怎么考
- "稠密向量和稀疏向量的区别?" --稠密所有维度非零、低维、语义强;稀疏大部分为 0、高维、关键词强(L1、L3)。
- "什么时候用稠密,什么时候用稀疏?" --语义查询用稠密,关键词查询用稀疏,通用场景混合检索(4.5)。
- "什么是混合检索?怎么融合?" --同时用 dense+sparse 检索,用 RRF 或加权融合合并。主流 RAG 方案(4.4)。
- "SPLADE 是什么?" --学习型稀疏向量,用神经网络生成扩展的稀疏表示。结合稠密语义和稀疏存储优势(4.3)。
- "稀疏向量用什么索引?" --倒排索引。成熟高效,是 Lucene/ES 的核心(4.6)。
- "为什么 RAG 常用混合检索?" --稠密覆盖语义,稀疏覆盖关键词,互补。实证常优于纯 dense 或纯 sparse(4.4)。
延伸阅读
- 📄 Formal et al., 2021 - SPLADE
- 📄 Karpukhin et al., 2020 - DPR
- 📄 Luan et al., 2021 - Sparse, Dense, and Attentional
- 📝 Elastic - Hybrid Search