多向量搜索
Zvec 支持多向量查询,允许你在单次搜索中组合不同的 Embedding。
当查询多个向量 Embedding 时,Zvec 会从每个向量空间中独立检索候选结果,再将它们融合为一个按相关性排序的列表。由于不同向量空间的评分可能无法直接比较,你需要选择合适的重排序策略。
前提条件
本指南假设:
- 你已经打开了一个包含多个向量字段的
collection - 你已经熟悉基本的向量查询概念。如果不熟悉,请先阅读单向量搜索指南
执行多向量搜索
在 Python 中,将查询规范列表传递给 query(),并通过 reranker 指定融合策略。在 Node.js 中,将子查询传递给 multiQuerySync() 或 multiQuery(),并配置 rerank。
此示例同时查询 dense_embedding 和 sparse_embedding,并使用 WeightedReRanker 组合结果。权重按位置与 queries 保持相同顺序。
import zvec
result = collection.query(
topk=3, # 重排序后最终返回的 Document 数量
queries=[ # 查询规范列表 — 每个要搜索的 Embedding 空间一个
zvec.Query(field_name="dense_embedding", vector=[0.1] * 768),
zvec.Query(field_name="sparse_embedding", vector={1: 0.1, 37: 0.43}),
],
reranker=zvec.WeightedReRanker(
weights=[1.2, 1.0], # dense_embedding、sparse_embedding
),
)
print(result)topk 始终控制融合后最终返回的 Document 数量。
- Python 的
Collection.query()目前不提供为每个子查询单独设置候选数量的参数。 - Node.js 可以通过每个子查询的
numCandidates设置候选数量;省略时默认为max(topk, 10)。 topn只在直接调用重排序器的rerank()方法时使用,并不是重排序器构造参数。
重排序策略
Zvec 提供不同的重排序策略来组合多个向量字段的评分。
| 重排序器 | WeightedReRanker | RrfReRanker(倒数排名融合) |
|---|---|---|
| 方法 | 使用自定义权重组合归一化的相似度评分 | 仅基于排名位置融合结果 — 不需要评分 当 r 从 0 开始计数(第一名为 0)时,RRF 评分为: |
| 适用场景 | • 不同向量字段之间的评分大致可比 • 你知道每种 Embedding 类型的相对重要性 | • 评分来自不同的度量或尺度 • 你偏好简单、稳健、无需调参的方法 |
| 参数 | weights:与 queries 顺序一致的权重列表。评分归一化会使用各查询字段的 Schema。 | rank_constant(k):控制排名影响衰减的速度。更高的值会降低排名靠前结果的主导地位。 |