RabitQ索引

更新时间:
复制为 MD 格式

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上拓展了RabitQivf索引结合的能力。索引构建时,先进行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算子。listsivf聚类的中心数量,建议根据数据规模选择合适的值。

步骤三:调整搜索参数

ivf-RabitQ在原有ivfflat的索引构建参数和查询参数基础上,引入了下表所列的搜索参数。您可以通过SET命令在会话级别调整这些参数。

参数名

默认值

取值范围

说明

ivf_rabitq.epsilon

1.9

[0.1, 4.0]

无偏估计器里计算误差的系数。设置越大,召回率越高。

ivf_rabitq.topk

10

[1, 32768]

rerank阶段,调整计算精确距离的向量数量。建议设置等于向量召回的数量。

ivf_rabitq.max_rerank_scan_tuples

5000

[1, INT_MAX]

rerank阶段,调整重排序的向量数量。

性能测试

测试环境

测试项

说明

RDS PostgreSQL实例

  • 大版本:RDS PostgreSQL 17

  • 内核小版本:20260330

  • 规格:pg.x4.2xlarge.1

测试工具

ann-benchmarks

测试数据集

dbpedia-openai-1000k-angular

测试参数

  • ivfflat.lists = 1000

  • ivfflat.nprobes 梯度增加:[1, 2, 4, 8, 16, 32, 50, 100]

索引构建对比

在相同数据集和构建参数下,对比ivf-RabitQpgvector原生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:直接使用量化距离,以换取更高的查询性能。

image.png