Zvec Logo

多向量搜索

Zvec 支持多向量查询,允许你在单次搜索中组合不同的 Embedding。

当查询多个向量 Embedding 时,Zvec 会从每个向量空间中独立检索候选结果,再将它们融合为一个按相关性排序的列表。由于不同向量空间的评分可能无法直接比较,你需要选择合适的重排序策略


前提条件

本指南假设:

  • 你已经打开了一个包含多个向量字段的 collection
  • 你已经熟悉基本的向量查询概念。如果不熟悉,请先阅读单向量搜索指南


执行多向量搜索

在 Python 中,将查询规范列表传递给 query(),并通过 reranker 指定融合策略。在 Node.js 中,将子查询传递给 multiQuerySync()multiQuery(),并配置 rerank

此示例同时查询 dense_embeddingsparse_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 提供不同的重排序策略来组合多个向量字段的评分。

重排序器WeightedReRankerRrfReRanker(倒数排名融合)
方法使用自定义权重组合归一化的相似度评分仅基于排名位置融合结果 — 不需要评分
r 从 0 开始计数(第一名为 0)时,RRF 评分为:RRF(r)=1k+r+1\text{RRF}(r) = \frac{1}{k + r + 1}
适用场景• 不同向量字段之间的评分大致可比
• 你知道每种 Embedding 类型的相对重要性
• 评分来自不同的度量或尺度
• 你偏好简单、稳健、无需调参的方法
参数weights:与 queries 顺序一致的权重列表。评分归一化会使用各查询字段的 Schema。rank_constantk):控制排名影响衰减的速度。更高的值会降低排名靠前结果的主导地位。

本页目录