RDS PostgreSQL基于pgvector插件提供RabitQ索引能力。RabitQ是一种高压缩比的向量量化索引方法,相较于pgvector原生索引,可大幅降低索引存储空间,并显著提升向量搜索吞吐,同时保持较高的召回精度。本文介绍RabitQ索引的基本原理、使用方式以及与pgvector原生索引的性能测试对比。
背景
RabitQ是一种先进的向量量化方法,其核心理论包括以下三方面:
高压缩比的向量量化:把D维空间上的点投影到单位球面上,RabitQ的码本是这个单位球面上内接立方体的所有顶点。每一维的取值都是 1/√D 或 -1/√D。这样码本上的每一条向量都可以用一个D-bit的串来表示,相较于原生pgvector使用float32数组表示每一条向量,实现了高达32倍的压缩比。
距离计算加速:通过数学推导,RabitQ下两条向量的距离运算可以被转换成二进制串的位运算和popcount运算,极大增加了距离运算效率。
无偏估计器:相较于其它的量化方式,RabitQ证明了估计距离和实际精确距离的理论最大误差值。在向量搜索时可以先根据估算距离初筛,再对少量向量计算精确距离并rerank,实现高精度的向量搜索。
前提条件
如需启用RabitQ索引,RDS PostgreSQL实例需满足以下要求:
实例大版本为RDS PostgreSQL 14或以上。
实例内核小版本为20260330或以上。
实例已安装pgvector插件,且插件版本为0.8.0.2或以上。
使用方式
阿里云在pgvector原生的ivfflat access method上拓展了RabitQ与ivf索引结合的能力。索引构建时,先进行ivf聚类,然后对每个cluster下的向量进行RabitQ量化,并保证了对存量ivfflat索引的完全向前兼容。
步骤一:检查并升级pgvector插件版本
连接到目标数据库后,执行下面的SQL查看pgvector插件的版本,并在版本低于0.8.0.2时进行升级。
postgres=# \dx vector
List of installed extensions
Name | Version | Schema | Description
--------+---------+--------+------------------------------------------------------
vector | 0.8.0.2 | public | vector data type and ivfflat and hnsw access methods
(1 row)
postgres=# ALTER EXTENSION vector UPDATE TO "0.8.0.2";步骤二:创建ivf-RabitQ索引
执行下面的SQL创建ivf-RabitQ索引:
CREATE INDEX ON items USING ivfflat (embedding rabitq_vector_cosine_ops) WITH (lists=1000);其中,items为目标表名,embedding为存储向量数据的列名,rabitq_vector_cosine_ops为余弦相似度的RabitQ算子。lists为ivf聚类的中心数量,建议根据数据规模选择合适的值。
步骤三:调整搜索参数
ivf-RabitQ在原有ivfflat的索引构建参数和查询参数基础上,引入了下表所列的搜索参数。您可以通过SET命令在会话级别调整这些参数。
参数名 | 默认值 | 取值范围 | 说明 |
| 1.9 | [0.1, 4.0] | 无偏估计器里计算误差的系数。设置越大,召回率越高。 |
| 10 | [1, 32768] | rerank阶段,调整计算精确距离的向量数量。建议设置等于向量召回的数量。 |
| 5000 | [1, INT_MAX] | rerank阶段,调整重排序的向量数量。 |
性能测试
测试环境
测试项 | 说明 |
RDS PostgreSQL实例 |
|
测试工具 | ann-benchmarks |
测试数据集 |
|
测试参数 |
|
索引构建对比
在相同数据集和构建参数下,对比ivf-RabitQ与pgvector原生ivfflat索引的构建时间和占用空间:
索引类型 | 创建时间 | 索引空间 |
ivfflat(原生) | 95.32s | 7820MB |
ivf-RabitQ | 78.72s | 248MB |
从结果可以看出,相比pgvector原生ivfflat索引,ivf-RabitQ将索引空间从7820MB降至248MB,压缩比约31倍,同时索引构建时间也有所降低。
查询性能对比
相比pgvector原生的ivfflat索引,RabitQ可以在1%以内的召回精度损失下,获得成倍的搜索性能提升。详细测试结果如下:
参数设置 | ivfflat QPS | ivf-RabitQ QPS | 加速比 | ivfflat 召回率 | ivf-RabitQ 召回率 |
nprobes = 1 | 566.36 | 1033.56 | 1.83x | 66.87% | 69.38% |
nprobes = 2 | 350.77 | 758.88 | 2.16x | 79.40% | 80.09% |
nprobes = 4 | 203.78 | 501.56 | 2.47x | 87.84% | 87.96% |
nprobes = 8 | 110.98 | 298.43 | 2.69x | 92.69% | 92.80% |
nprobes = 16 | 56.99 | 162.75 | 2.86x | 95.71% | 95.28% |
nprobes = 32 | 28.56 | 53.98 | 1.89x | 97.37% | 96.84% |
nprobes = 50 | 18.32 | 53.98 | 2.94x | 98.05% | 97.71% |
nprobes = 100 | 9.26 | 26.74 | 2.89x | 98.93% | 98.54% |
QPS-Recall曲线如下图所示,包含多种索引类型的对比测试结果:
pgvector:社区原生hnsw索引。pgvector_ivfflat:社区原生ivfflat索引。pgvector_ivfrabitq:ivf-RabitQ索引。pgvector_hnsw_rabitq:hnsw-RabitQ索引,引入重排序。pgvector_hnsw_rabitq_without_refine:直接使用量化距离,以换取更高的查询性能。
