学习式稀疏向量是什么
SPLADE 类模型把文本编码成词表维度的稀疏权重向量:经过语言模型头、ReLU 与最大池化后,每个词表位置得到一个非负权重,绝大多数位置是零。它把神经检索的结果搬进了倒排体系——索引只存非零项,检索时按权重累加打分,因此能直接和 BM25 放进同一个引擎混排。相比纯词频,稀疏权重还带查询扩展效应:文档中与原词相关的近义词也会获得权重,对专名与词形变化更稳健。
基本信息
| 输出形态 | {token_id: weight} 的稀疏字典,非零项通常几十到上百个 |
|---|---|
| 向量维度 | 等于模型词表大小(数万),但只存非零项 |
| 索引类型 | 倒排(Milvus 的 SPARSE_INVERTED_INDEX、Qdrant 的 sparse 向量) |
| 打分方式 | 查询与文档的非零项权重求交并累加 |
| 依赖 | 需要配套的稀疏编码模型,不能直接用稠密模型代替 |
典型使用场景
- 混合检索第二路:稠密向量抓语义,稀疏向量补专名与精确词形
- 已有 Elasticsearch 体系时的轻量升级:保留倒排栈,再加一路学习式稀疏
- 多语言或术语密集的专业语料:比纯 BM25 更耐受同义改写
- 冷启动阶段:训练数据有限时,稀疏模型的表现通常比微调稠密模型更稳
- 成本敏感场景:稀疏索引存储与查询开销低于大规模 HNSW 内存驻留
稀疏向量的生成与写入
稀疏向量的生成与写入
# 由 MLM 头 + ReLU + max 池化产生,形如 {token_id: weight}
sparse = embed_sparse('向量数据库怎么选型')
# {2345: 0.71, 8712: 1.42, 9903: 0.35, ...}
# Qdrant 写入稀疏向量
client.upsert('kb', points=[models.PointStruct(
id='c-1', vector={'text': models.SparseVector(indices=[2345, 8712], values=[0.71, 1.42])})])与 BM25 的差异
| 维度 | BM25 | 学习式稀疏 |
|---|---|---|
| 词项来源 | 分词结果,一一对应 | 模型预测,允许扩展近义词 |
| 权重 | 词频与文档频率统计 | 模型学习的非负权重 |
| 同义词 | 靠词典人工维护 | 模型自带部分扩展能力 |
| 可控性 | 规则透明、易解释 | 权重来源不可逐项解释 |
稀疏模型自带查询扩展,文档里含同名不同义的词时可能引入噪声匹配:上线前用真实查询抽样看误召回的具体例子,别只看总体指标。