量化算法

更新时间:
复制为 MD 格式

PolarDB PostgreSQL的向量检索基于pgvector深度优化,支持PQ、SQ4、SQ8、RabitQ等多种量化算法。通过量化技术,可以在降低内存消耗的同时保证召回率,提升检索性能。

适用范围

支持的PolarDB PostgreSQL版的版本如下:

  • PostgreSQL 14(内核小版本2.0.14.20.44.0及以上)

  • PostgreSQL 16(内核小版本2.0.16.13.16.0及以上)

  • PostgreSQL 17(内核小版本2.0.17.9.6.0及以上)

  • PostgreSQL 18(内核小版本2.0.18.3.2.0及以上)

说明

您可在控制台查看内核小版本号,也可以通过SHOW polardb_version;语句查看。如未满足内核小版本要求,请升级内核小版本

背景信息

全精度的向量每一维度都需要4字节,在高维向量场景下,向量索引会消耗大量的内存,不仅成本高,并且更容易出现缓存失效,影响性能。通过量化技术,把原始精度的向量压缩成更紧凑的编码,再结合自动重排、随机旋转、ADC等各种优化技术,在降低内存消耗的同时保证了召回率,提升了性能。

量化算法使用方式

PolarDB PostgreSQL支持PQ、SQ4、SQ8、RaBitQ四种量化算法,目前仅支持HNSW算法。量化功能仅支持vector(全精度浮点)数据类型。

量化算法通过 WITH (quantization = pq/sq4/sq8/rabitq) 来开启并指定具体的量化算法。

各量化算法关键参数对比如下:

算法

每维精度

压缩率

最大支持维度

SQ8

8 bit

4

8,000

SQ4

4 bit

8

16,000

PQ

8 bit/子向量

dim/pq_m

16,000

RaBitQ

1 bit

32

16,000

SQ4SQ8

向量的每一个维度使用SQ量化算法压缩到4 bit8 bit来存储,压缩率分别为8倍和4倍。

  • SQ8:最大支持8,000维。

  • SQ4:最大支持16,000维。

CREATE INDEX ON vecs USING hnsw(embedding vector_l2_ops) WITH (m=16, ef_construction=256, quantization=sq4, train_samples=5000);
CREATE INDEX ON vecs USING hnsw(embedding vector_l2_ops) WITH (m=16, ef_construction=256, quantization=sq8, train_samples=5000);

PQ

PQ量化算法将原始向量分割为pq_m个子向量,对每组子向量独立进行K-means聚类,学习各自的码本(codebook)。每个子向量固定使用1字节存储,因此对于1024维全精度向量,pq_m = 128意味着有8倍的压缩率。pq_m参数决定了压缩率和精度之间的平衡:pq_m越小压缩率越高,但精度损失越大。

  • 最大支持维度:16,000。

  • 限制:向量维度必须是pq_m的整数倍,且维度须大于pq_m

CREATE INDEX ON vecs USING hnsw(embedding vector_l2_ops) WITH (m=16, ef_construction=256, quantization=pq, pq_m=128, train_samples=5000);

RabitQ

RaBitQ使用快速Walsh-Hadamard变换(FWHT)结合随机符号翻转对向量进行随机旋转,再以1 bit量化每个维度,压缩率为32倍。

  • 最大支持维度:16,000。

  • 限制:向量维度必须是8的整数倍(如128、256、512、1024等),以满足字节对齐的二进制编码要求。

CREATE INDEX ON vecs USING hnsw(embedding vector_l2_ops) WITH (m=16, ef_construction=256, quantization=rabitq, train_samples=5000);

重排

不同的量化算法在降低内存占用的同时,相对于量化之前的全精度原始向量会带来一定的精度损失。内核自动重排是在通过量化之后的向量索引召回候选集的基础上,访问表中的全精度向量数据重新计算相似度进行重排,从而带来更高的召回率。虽然这会带来一定的性能消耗,但得益于量化算法已经大幅优化了向量索引检索过程中的性能,所以即使开启重排依然可以保证较好的性能。

参数设置

SET hnsw.enable_rerank = on;
SET hnsw.rerank_k_factor = 2.0;

参数说明:

  • hnsw.enable_rerank:是否开启重排,默认关闭。建议根据业务场景选择是否开启。

  • hnsw.rerank_k_factor:控制在向量索引检索期间返回更多的候选集,在重排期间进一步提高召回率。

效果

Cohere 1M数据集为例,使用HNSW + SQ8算法,在保证召回率都大于95%的前提下,可以看到向量索引内存大幅下降的同时,查询和索引构建的性能都有不同幅度的提升。

image

image

image