稀疏向量与混合查询
Qdrant 允许在同一集合里配置 dense 与 sparse 多路向量:稀疏向量承载关键词权重或学习式稀疏表示,稠密向量负责语义匹配。查询时用 prefetch 做多路召回,再用融合方式(RRF 或 DBSF)合并结果。它适合既要精确命中型号、错误码与术语,又需要一定语义泛化能力的场景。
基本信息
| 配置要求 | 建集合时声明 dense 与 sparse 两路向量 |
|---|---|
| 查询方式 | prefetch 多路召回,query 指定融合方式 |
| 融合选项 | RRF 按名次融合,DBSF 按分数分布归一化 |
| 写入要求 | 同时提供两路向量,缺一路只影响该路召回 |
典型使用场景
- 技术文档检索:错误码与型号需要精确命中,概念解释需要语义匹配
- 电商类目问答:商品名与规格靠关键词,使用问题靠语义
- 混合检索试点:在已有稠密集合上补一路稀疏,改造成本低于换库
- 关键词权重可解释:稀疏向量维度对应词项,便于分析命中原因
- 替换纯 BM25:服务端融合省去自建关键词索引的维护成本
混合查询
混合查询
res = client.query_points(
collection_name="kb",
prefetch=[
models.Prefetch(query=dense_vec, using="dense", limit=20),
models.Prefetch(query=models.SparseVector(indices=[12, 70], values=[0.9, 0.4]),
using="sparse", limit=20), # 稀疏向量:词项下标与权重
],
query=models.FusionQuery(fusion=models.Fusion.RRF), # 融合两路结果
limit=10, with_payload=True,
)
# prefetch 的 limit 决定融合候选规模,过小会让融合无料可用
融合方式对比
| 方式 | 依据 | 特点 |
|---|---|---|
| RRF | 名次倒数加权 | 免标定、稳健,忽略分数差距 |
| DBSF | 分数分布归一化后求和 | 保留分数信息,需在评测集上调 |
| 只走 dense | 不做融合 | 语义强,专有名词容易漏 |
| 只走 sparse | 不做融合 | 精确匹配强,同义表达弱 |
稀疏字段需在集合配置中声明;写入时同时提供 dense 与 sparse 向量,缺一路只影响该路召回,不会导致整条记录写入失败。
稀疏向量的生成质量决定上限:用 BM25 类词权重与用学习式稀疏模型产出的向量,效果差别可能比融合方式更大,建议先固定生成方式再调融合,否则两个变量同时变化无法归因。
写入与查询要共用同一套分词与权重规则:入库时用的是哪种分词器、权重是否做归一化,查询侧必须保持一致,否则同一词项在两端的表示对不上,稀疏路召回会明显偏少。