Calendar 第 4 天

通过重新评分恢复准确性


当我们使用标量量化、二进制量化或乘积量化等量化方法时,我们正在压缩向量以节省内存并提高性能。然而,这种压缩会略微降低相似性搜索的准确性,因为量化向量是原始数据的近似值。为了缓解这种准确性损失,您可以使用过采样和重采样,这有助于提高最终搜索结果的准确性。

因此,假设我们正在对使用二进制量化的集合执行搜索。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,
)

TypeScriptRustJavaC#Go 客户端中查看如何设置过采样和重采样

如果量化正在影响需要高准确性的应用程序的性能,那么将过采样与重采样结合是一个不错的选择。但是,如果您需要更快的搜索并且可以容忍一些准确性损失,您可能选择使用不过采样的重采样,或者将过采样因子调整为较低的值。

查看我们的量化技巧