压缩多向量搜索

压缩多向量搜索

💡 原文英文,约1000词,阅读约需4分钟。
📝

内容提要

Qdrant 1.19 推出 turbo4 数据类型,将稠密向量以每维 4 位存于磁盘,存储降至 float32 的八分之一,召回率仅小幅下降。教程以宠物用品搜索为例,用 ColBERT 多向量存为 turbo4,配合 BM25 稀疏向量:先用 BM25 预取候选,再用 ColBERT 后期交互重排,兼顾速度与精度。

🔎

延伸解读

turbo4 的存储与召回权衡

turbo4 将稠密向量以每维 4 位存于磁盘,存储降至 float32 的八分之一,但召回率会下降低个位数百分点。文章指出,这种小幅召回损失通常不是检索效果的瓶颈,相比检索策略本身的影响更小。因此,在存储成本敏感且能接受轻微精度损失的多向量场景中,turbo4 是一个值得考虑的选项。

多向量场景下的量化选择

文章强调 turbo4 是独立数据类型,而非 TurboQuant 的封装,因此可以进一步量化,例如与 1 位 TurboQuant 结合。它适用于每个点存储多个向量的多向量表示,如 ColBERT 的每 token 向量。这意味着用户可以在不改变多向量结构的前提下,直接通过 datatype 参数控制磁盘占用。

两阶段检索的实用配置

教程采用 BM25 稀疏向量预取候选,再用 ColBERT 多向量后期交互重排。关键配置包括:预取 limit 设为 50,远高于最终 limit,以提供足够候选池;多向量字段设置 hnsw_config 的 m=0 跳过 HNSW 索引,因为该字段仅用于重排小规模候选,建索引无益且昂贵。这种组合兼顾了速度与精度。

❓

Q&A

Qdrant 1.19 的 turbo4 数据类型是什么?它有什么作用?

turbo4 是 Qdrant 1.19 引入的一种数据类型,将稠密向量以每维 4 位(而非 float32 的 32 位)存储在磁盘上,存储空间降至原来的八分之一。它受 Google TurboQuant 量化技术启发,通过旋转向量使信息均匀分布,再将每个值量化为 16 个级别之一,从而在压缩时保持较低损失。在典型基准测试中,召回率仅下降低个位数百分点。

turbo4 和 TurboQuant 量化是什么关系?可以一起使用吗?

turbo4 受 TurboQuant 量化技术启发,但它是独立的数据类型,而非 TurboQuant 的封装。因此你可以进一步量化它,例如将 turbo4 与 1 位 TurboQuant 量化结合使用。

在 Qdrant 中如何为多向量字段配置 turbo4 存储?

在创建集合时,为多向量字段的 VectorParams 设置 datatype=models.Datatype.TURBO4,并配置 multivector_config 使用 MAX_SIM 比较器。例如:description 字段设置 size=96、distance=COSINE、multivector_config=MultiVectorConfig(comparator=MAX_SIM)、datatype=TURBO4,同时可设置 hnsw_config 的 m=0 以跳过 HNSW 索引构建,因为该字段仅用于重排小规模预取结果。

为什么在 ColBERT 多向量字段上设置 hnsw_config 的 m=0?

因为该字段仅用于对少量预取结果进行重排,从不用于全集合搜索。为每个 token 的多向量构建 HNSW 索引成本高昂且没有收益,所以设置 m=0 跳过索引构建。

如何结合 BM25 和 ColBERT 多向量实现高效的产品搜索?

使用 Query API 的 prefetch 机制:先用 BM25 稀疏向量(如标题字段)预取一个较大的候选集(例如 limit=50),再用 ColBERT 多向量(如描述字段)通过后期交互对候选集重排,最终返回少量结果(如 limit=1)。这样避免在全集合上运行昂贵的后期交互,兼顾速度与精度。

turbo4 只能用于单稠密向量吗?能否用于多向量?

turbo4 是通用数据类型,不限于单稠密向量。本教程中它被用于每个 token 的 ColBERT 多向量,并与 BM25 稀疏向量共存于同一集合,通过一次 Query API 调用查询两者。你可以在任何 VectorParams(稠密或多向量)上设置 datatype=models.Datatype.TURBO4 来获得 4 位磁盘占用。

🏷️

标签

➡️

继续阅读