RDS PostgreSQL prend en charge l'indexation RabitQ via l'extension pgvector. RabitQ compresse les vecteurs avec un taux allant jusqu'à 32x, tout en augmentant le débit de recherche et en maintenant un rappel élevé.
Fonctionnement de RabitQ
RabitQ est une méthode de quantification vectorielle fondée sur trois principes clés :
Quantification à haute compression : RabitQ projette les vecteurs sur une sphère unitaire et encode chacun d'eux sous forme de chaîne binaire de D bits en utilisant les sommets d'un hypercube. Cette approche permet d'atteindre une compression jusqu'à 32 fois supérieure par rapport aux tableaux float32 utilisés nativement par pgvector.
Calcul rapide des distances : RabitQ réduit les calculs de distance entre vecteurs à des opérations bit à bit et de comptage de bits (popcount) sur des chaînes binaires, ce qui est nettement plus rapide que l'arithmétique basée sur les nombres à virgule flottante.
Estimateur sans biais : RabitQ offre une borne théorique prouvée sur l'erreur d'estimation de la distance. Lors de la recherche, les candidats sont filtrés selon la distance estimée, puis un petit sous-ensemble est reclassé à l'aide des distances exactes pour garantir un rappel élevé.
Prérequis
Votre instance RDS PostgreSQL doit répondre aux exigences suivantes :
RDS PostgreSQL version 14 ou ultérieure.
Version mineure du noyau 20260330 ou ultérieure.
Extension pgvector version 0.8.0.2 ou ultérieure installée.
Premiers pas
Alibaba Cloud étend la méthode d'accès native ivfflat en intégrant la quantification RabitQ. Le clustering IVF s'exécute en premier, puis RabitQ quantifie les vecteurs de chaque cluster. Cette solution est entièrement compatible avec les index ivfflat existants.
Étape 1 : Vérifier et mettre à niveau l'extension pgvector
Connectez-vous à la base de données cible et vérifiez la version de pgvector. Mettez à niveau l'extension si sa version est antérieure à 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";
Étape 2 : Créer un index ivf-RabitQ
Exécutez la commande SQL suivante pour créer un index ivf-RabitQ :
CREATE INDEX ON items USING ivfflat (embedding rabitq_vector_cosine_ops) WITH (lists=1000);
items correspond à la table cible, embedding à la colonne de vecteurs et rabitq_vector_cosine_ops à l'opérateur de similarité cosinus RabitQ. Le paramètre lists définit le nombre de centroïdes IVF. Choisissez une valeur adaptée à la taille de votre jeu de données.
Étape 3 : Ajuster les paramètres de recherche
ivf-RabitQ ajoute les paramètres de recherche suivants aux paramètres standards d'ivfflat. Ajustez-les au niveau de la session à l'aide de la commande SET.
|
Paramètre |
Valeur par défaut |
Plage |
Description |
|
|
1,9 |
[0,1, 4,0] |
Coefficient de marge d'erreur pour l'estimateur de distance. Des valeurs plus élevées augmentent le rappel. |
|
|
10 |
[1, 32768] |
Nombre de vecteurs à reclasser à l'aide de la distance exacte. Définissez cette valeur sur le nombre de résultats que vous souhaitez récupérer. |
|
|
5000 |
[1, INT_MAX] |
Nombre maximal de vecteurs candidats à analyser pour le reclassement. |
Benchmarks de performance
Environnement de test
|
Élément |
Description |
|
Instance RDS PostgreSQL |
|
|
Outil de test |
ann-benchmarks |
|
Jeu de données de test |
|
|
Paramètres de test |
|
Comparaison de la création d'index
Comparaison du temps de construction et de la taille de l'index en utilisant le même jeu de données et les mêmes paramètres :
|
Type d'index |
Temps de construction |
Taille de l'index |
|
ivfflat (natif) |
95,32 s |
7820 Mo |
|
ivf-RabitQ |
78,72 s |
248 Mo |
ivf-RabitQ réduit la taille de l'index de 7820 Mo à 248 Mo, soit un taux de compression supérieur à 31x, tout en accélérant la phase de construction.
Comparaison des performances de requête
ivf-RabitQ offre un débit QPS jusqu'à 2,9 fois supérieur avec une perte de rappel inférieure à 1 % par rapport à ivfflat natif :
|
Paramètre |
QPS Ivfflat |
QPS Ivf-RabitQ |
Facteur d'accélération |
Rappel Ivfflat |
Rappel 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 % |
Courbe QPS-rappel comparant les types d'index suivants :
pgvector: Index HNSW natif (pgvector communautaire).pgvector_ivfflat: Index ivfflat natif (pgvector communautaire).pgvector_ivfrabitq: Index ivf-RabitQ.pgvector_hnsw_rabitq: Index HNSW-RabitQ avec reclassement.pgvector_hnsw_rabitq_without_refine: Index HNSW-RabitQ sans reclassement, utilisant directement les distances quantifiées pour un débit plus élevé.
