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及以上)
背景信息
全精度的向量每一维度都需要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/子向量 |
| 16,000 |
RaBitQ | 1 bit | 32倍 | 16,000 |
SQ4和SQ8
向量的每一个维度使用SQ量化算法压缩到4 bit或8 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%的前提下,可以看到向量索引内存大幅下降的同时,查询和索引构建的性能都有不同幅度的提升。


