通过重新评分恢复准确性
当我们使用标量量化、二进制量化或乘积量化等量化方法时,我们正在压缩向量以节省内存并提高性能。然而,这种压缩会略微降低相似性搜索的准确性,因为量化向量是原始数据的近似值。为了缓解这种准确性损失,您可以使用过采样和重采样,这有助于提高最终搜索结果的准确性。
因此,假设我们正在对使用二进制量化的集合执行搜索。Qdrant 使用量化向量检索最靠前的候选对象,根据它们与查询向量的相似性(由量化数据确定)。由于我们使用的是量化向量,此步骤速度很快。
过采样
由于在初始搜索中可能会遗漏一些相关的匹配项,为了弥补这一点,我们将应用过采样。这意味着您将检索更多的候选对象,从而增加最相关的向量进入最终结果的机会。
例如,如果您所需的搜索结果数量 (limit) 为 4,并且您将过采样因子设置为 2,Qdrant 将检索 8 个候选对象 (4 × 2)。更多的候选对象意味着获得高质量的 Top-K 结果的机会更大。
重新评分
在过采样以收集更多潜在匹配项后,将根据附加条件重新评估每个候选对象,以确保更高的准确性和与查询的相关性。重采样过程将量化向量映射到其对应的原始向量,允许您考虑初始搜索中未包含的上下文、元数据或附加相关性等因素,从而获得更准确的结果。
在重采样期间,过采样中较低排名的候选对象之一可能会比一些原始的 Top-K 候选对象更匹配。尽管重采样使用原始的、更大的向量,但该过程仍然快得多,因为只读取了非常少量的向量。
重采样带来的重新排名
根据重采样得到的新相似性分数,重新排名是根据更新后的相似性分数确定最终 Top-K 候选对象的过程。
例如,在我们的案例中,限制为 4,在初始量化搜索中排名第 6 的候选对象在重采样后可能会提高其分数,因为原始向量捕获了更多的上下文或元数据。因此,该候选对象在重新排名后可能会进入最终的 Top 4,替换初始搜索中不太相关的选项。
实施
from qdrant_client import QdrantClient, models
import os
client = QdrantClient(url=os.getenv("QDRANT_URL"), api_key=os.getenv("QDRANT_API_KEY"))
# For Colab:
# from google.colab import userdata
# client = QdrantClient(url=userdata.get("QDRANT_URL"), api_key=userdata.get("QDRANT_API_KEY"))
response = client.query_points(
collection_name="quantized_collection",
query=[0.12] * 1536,
limit=10,
search_params=models.SearchParams(
hnsw_ef=128,
quantization=models.QuantizationSearchParams(
ignore=False, # Use quantization for initial search
rescore=True, # Enable original vectors-based rescoring
oversampling=3.0, # Retrieve 3x candidates for rescoring
),
),
with_payload=True,
)
在 TypeScript、Rust、Java、C# 和 Go 客户端中查看如何设置过采样和重采样。
如果量化正在影响需要高准确性的应用程序的性能,那么将过采样与重采样结合是一个不错的选择。但是,如果您需要更快的搜索并且可以容忍一些准确性损失,您可能选择使用不过采样的重采样,或者将过采样因子调整为较低的值。
查看我们的量化技巧