O RDS PostgreSQL suporta indexação RabitQ por meio da extensão pgvector. O RabitQ comprime vetores com taxa de até 32x, aumenta o throughput de busca e mantém alto recall.
Como o RabitQ funciona
O RabitQ é um método de quantização vetorial fundamentado em três princípios centrais:
Quantização de alta compressão: o RabitQ projeta vetores em uma esfera unitária e codifica cada um como uma string de D bits usando vértices de hipercubo. Isso alcança compressão de até 32x em relação aos arrays float32 usados pelo pgvector nativo.
Cálculo rápido de distâncias: o RabitQ reduz os cálculos de distância vetorial a operações bitwise e popcount em strings binárias, significativamente mais rápidas que a aritmética baseada em float.
Estimador não enviesado: o RabitQ fornece um limite teórico comprovado para o erro de estimativa de distância. Durante a busca, os candidatos são filtrados pela distância estimada; um pequeno subconjunto é então reclassificado com distâncias exatas para garantir alto recall.
Pré-requisitos
A instância do RDS PostgreSQL deve atender aos seguintes requisitos:
RDS PostgreSQL 14 ou superior.
Versão de kernel secundária 20260330 ou superior.
pgvector 0.8.0.2 ou superior instalado.
Introdução
O Alibaba Cloud estende o método de acesso nativo ivfflat integrando a quantização RabitQ. O clustering IVF é executado primeiro e, em seguida, o RabitQ quantiza os vetores de cada cluster. Essa abordagem é totalmente compatível com índices ivfflat existentes.
Etapa 1: Verifique e atualize a extensão pgvector
Conecte-se ao banco de dados de destino e verifique a versão do pgvector. Se a versão for anterior à 0.8.0.2, atualize a extensão.
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";
Etapa 2: Crie um índice ivf-RabitQ
Execute o seguinte comando SQL para crie um índice ivf-RabitQ:
CREATE INDEX ON items USING ivfflat (embedding rabitq_vector_cosine_ops) WITH (lists=1000);
items é a tabela de destino, embedding é a coluna de vetores e rabitq_vector_cosine_ops é o operador de similaridade de cosseno do RabitQ. lists define o número de centróides IVF. Escolha um valor de acordo com o tamanho do conjunto de dados.
Etapa 3: Ajuste os parâmetros de busca
O ivf-RabitQ acrescenta os seguintes parâmetros de busca aos parâmetros padrão do ivfflat. Ajuste-os no nível da sessão com o comando SET.
|
Parâmetro |
Padrão |
Valor |
Descrição |
|
|
1.9 |
[0.1, 4.0] |
Coeficiente de margem de erro para o estimador de distância. Valores mais altos aumentam o recall. |
|
|
10 |
[1, 32768] |
Número de vetores a serem reclassificados com distância exata. Defina esse valor igual à quantidade de resultados que deseja recuperar. |
|
|
5000 |
[1, INT_MAX] |
Número máximo de vetores candidatos a examinar na reclassificação. |
Benchmarks de desempenho
Ambiente de teste
|
Item |
Descrição |
|
Instância do RDS PostgreSQL |
|
|
Ferramenta de teste |
ann-benchmarks |
|
Conjunto de dados de teste |
|
|
Parâmetros de teste |
|
Comparação de criação de índice
Comparação de tempo de criação e tamanho do índice usando o mesmo conjunto de dados e os mesmos parâmetros:
|
Tipo de índice |
Tempo de criação |
Tamanho do índice |
|
ivfflat (nativo) |
95,32s |
7820 MB |
|
ivf-RabitQ |
78,72s |
248 MB |
O ivf-RabitQ reduz o tamanho do índice de 7820 MB para 248 MB — uma taxa de compressão superior a 31x — e ainda é criado mais rapidamente.
Comparação de desempenho de consultas
O ivf-RabitQ entrega até 2,9x mais QPS com menos de 1% de perda de recall em relação ao ivfflat nativo:
|
Parâmetro |
QPS Ivfflat |
QPS Ivf-RabitQ |
Fator de aceleração |
Recall Ivfflat |
Recall 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% |
Curva QPS-recall comparando os seguintes tipos de índice:
pgvector: índice HNSW nativo (pgvector da comunidade).pgvector_ivfflat: índice ivfflat nativo (pgvector da comunidade).pgvector_ivfrabitq: índice ivf-RabitQ.pgvector_hnsw_rabitq: índice HNSW-RabitQ com reclassificação.pgvector_hnsw_rabitq_without_refine: índice HNSW-RabitQ sem reclassificação, usando distâncias quantizadas diretamente para maior throughput.
