Un index vectoriel est un mécanisme d'indexation efficace dans MaxCompute qui accélère les recherches de similarité sur des données vectorielles à grande échelle. Cette rubrique explique comment utiliser les index vectoriels et fournit des exemples.
Notes
Les index vectoriels ne peuvent être créés que sur les Delta Tables.
-
Déclencheurs de construction d'index
Génération synchrone : utilisée principalement pour le traitement par lots hors ligne. Après la définition d'un index avec
CREATE VECTOR INDEX, les opérationsINSERTdéclenchent la génération de l'index de manière synchrone.Reconstruction complète : si la récupération via l'index est inefficace, reconstruisez l'index sur l'ensemble du jeu de données. Vous pouvez déclencher cette opération manuellement avec la commande
REBUILD INDEXou laisser un processus en arrière-plan le faire automatiquement lorsqu'il détecte une faible efficacité de récupération.
Le système empêche la suppression d'une colonne référencée par un index vectoriel. Pour supprimer la colonne, supprimez d'abord l'index correspondant.
Pour reconstruire un index vectoriel sur une table partitionnée, spécifiez la plage de partitions avec
PARTITION (...). Sinon, le système renvoie une erreur d'analyse sémantique.Vous pouvez supprimer l'index d'une partition spécifique d'une table partitionnée.
Vous ne pouvez créer qu'un seul index par colonne.
Dans une même table, vous pouvez créer des index distincts avec des noms différents pour plusieurs colonnes vectorielles.
Créer un index vectoriel
Créer un index vectoriel
Créez un index sur une colonne vectorielle pour accélérer les requêtes de récupération. La commande est la suivante :
CREATE VECTOR INDEX <index_name>
ON <table_name> (<description_embedding>)
IDXPROPERTIES (
'algorithm' = 'xxx',
'distance_type' = 'xxx',
'build_params' = 'xxx'
...
);
Paramètres
Paramètre | Description |
index_name | Nom de l'index. |
table_name | Nom de la table sur laquelle construire l'index vectoriel. Seules les Delta Tables sont prises en charge. |
description_embedding | Nom de la colonne vectorielle à indexer. |
algorithm | Spécifie l'algorithme de construction de l'index vectoriel. Seul l'algorithme |
distance_type | Spécifie la méthode de calcul de la similarité entre les vecteurs. Les types suivants sont pris en charge :
|
build_params | Spécifie les paramètres de configuration pour la construction de l'index au format JSON. Exemple :
Les index vectoriels prennent également en charge la quantification vectorielle interne. Les paramètres suivants sont liés à la quantification :
Pour plus d'informations sur la configuration de la quantification, consultez Configuration de la quantification des index vectoriels. |
Configuration de la quantification des index vectoriels
Les index vectoriels prennent en charge la quantification vectorielle interne afin de réduire le stockage de l'index, la mémoire d'exécution et la surcharge d'accès mémoire lors de la récupération. La quantification modifie uniquement l'encodage vectoriel au sein de l'index. Elle n'altère ni les données VECTOR(FLOAT, dimension) d'origine dans la table, ni la manière dont VECTOR_SEARCH est appelé. Les index vectoriels MaxCompute prennent en charge les deux méthodes de récupération suivantes :
Récupération en une seule étape : utilise directement le base_quantization_type pour la traversée du graphe et le calcul de distance. Cette méthode aboutit à une structure d'index plus simple et à une utilisation mémoire réduite.
Récupération en deux étapes : utilise d'abord des vecteurs de base basse précision pour une récupération rapide des candidats, puis utilise des vecteurs précis pour recalculer les distances. Cette méthode offre un compromis entre les performances de récupération et le rappel.
Le tableau suivant décrit les combinaisons courantes de paramètres de quantification.
|
Configuration |
Combinaison de paramètres |
Description |
|
FP32 |
|
Caractéristiques : référence pleine précision avec un rappel stable, mais une consommation mémoire élevée. Cas d'utilisation : scénarios nécessitant une haute précision ou impliquant de petits jeux de données. |
|
FP16 |
|
Caractéristiques : réduit l'empreinte mémoire des vecteurs à environ 50 % de celle du FP32, avec un rappel quasi identique. Cas d'utilisation : scénarios nécessitant une haute précision ou impliquant de petits jeux de données. Offre un léger compromis sur le rappel par rapport au FP32. |
|
SQ8 |
|
Caractéristiques : réduit l'empreinte mémoire des vecteurs à environ 25 % de celle du FP32, avec une perte mineure de rappel. Cas d'utilisation : scénarios sensibles à la mémoire où une légère perte de rappel est acceptable. |
|
SQ8 + Réorganisation haute précision |
|
Caractéristiques : utilise SQ8 pour la traversée du graphe, puis restaure le rappel grâce au recalcul de distance haute précision. Cas d'utilisation : scénarios nécessitant un équilibre entre l'efficacité de la récupération et le rappel. |
|
RaBitQ + Réorganisation haute précision |
|
Caractéristiques : utilise un encodage plus compact pour la traversée du graphe et réorganise les résultats candidats en utilisant des vecteurs haute précision. Cas d'utilisation : scénarios avec des reconstructions d'index fréquentes nécessitant un rappel élevé. |
La quantification offre les avantages suivants :
Réduit la taille des fichiers d'index et l'empreinte mémoire d'exécution.
Diminue la surcharge de bande passante mémoire lors du chargement et de la récupération de l'index.
Améliore l'utilisation du cache CPU, permettant à un seul worker de charger et traiter davantage de vecteurs.
Permet d'équilibrer les performances de récupération, les coûts des ressources et le rappel en combinant la quantification de base avec une réorganisation haute précision.
Nous recommandons d'utiliser FP16 lors de la création d'un index HGraph. Pour plus d'exemples, consultez Exemple : Créer un index vectoriel avec quantification FP16 et Exemple : Créer un index vectoriel avec traversée basse précision RaBitQ et réorganisation haute précision.
Alimenter les données
INSERT OVERWRITE TABLE <table_name> [PARTITION <partition_spec>]
SELECT ......
Reconstruire un index vectoriel
Utilisez les commandes suivantes pour reconstruire un index vectoriel pour les données existantes.
Reconstruire un index pour une table non partitionnée.
ALTER TABLE <table_name> REBUILD INDEX <index_name> ;
Reconstruire un index pour une table partitionnée. Vous pouvez reconstruire l'index vectoriel pour plusieurs partitions en une seule fois.
ALTER TABLE <table_name> PARTITION
(<partition_name1=value1>[, partition_name2=value2, ...]) REBUILD INDEX <index_name> ;
ALTER TABLE <table_name> PARTITION(partition_name >=value) REBUILD INDEX <index_name> ;
Lister les index vectoriels d'une table
SHOW INDEXES ON <table_name>;
Afficher les informations d'un index vectoriel
DESC INDEX index_name ON <table_name> [PARTITION <partition_spec>];
Supprimer un index vectoriel
DROP INDEX [IF EXISTS] index_name ON <table_name> [PARTITION <partition_spec>];
Exemples
Préparer les données
SET odps.sql.type.system.odps2=true;
SET odps.sql.type.vector.enable=true;
DROP TABLE IF EXISTS vector_test;
DROP VIEW IF EXISTS vector_test;
CREATE TABLE IF NOT EXISTS vector_test(
c0 int,
c1 vector(float, 2),
c2 vector(float, 3)
) STORED AS aliorc
TBLPROPERTIES (
'table.format.version'='2',
'acid.data.retain.hours'='24',
'columnar.nested.type'='true',
'transactional'='true'
);
INSERT OVERWRITE vector_test SELECT 1, vector(1.1F,2.2F), vector(1.1F,2.2F,3.3F) UNION ALL
SELECT 2, vector(2.2F,3.3F), vector(2.2F,3.3F,4.4F)
UNION ALL
SELECT 3, vector(3.3F,4.4F), vector(3.3F,4.4F,5.5F);
Exemple : Créer un index vectoriel et insérer des données
CREATE VECTOR INDEX c2_vector_index
ON vector_test (c2)
IDXPROPERTIES (
'algorithm' = 'hgraph',
'distance_type' = 'cosine',
'build_params' = '{"max_degree": 16, "ef_construction": 128}');
ALTER TABLE vector_test REBUILD INDEX c2_vector_index;
INSERT OVERWRITE vector_test SELECT 1, vector(1.1F,2.2F), vector(1.1F,2.2F,3.3F)
UNION ALL
SELECT 2, vector(2.2F,3.3F), vector(2.2F,3.3F,4.4F)
UNION ALL
SELECT 3, vector(3.3F,4.4F), vector(3.3F,4.4F,5.5F)
UNION ALL
SELECT 4, vector(4.4F,5.5F), vector(4.4F,5.5F,6.6F)
UNION ALL
SELECT 5, vector(5.5F,6.6F), vector(5.5F,6.6F,7.7F);
Exemple : Reconstruire un index vectoriel
ALTER TABLE vector_test REBUILD INDEX c2_vector_index;
SELECT * FROM vector_test;
-- The following result is returned:
+------+------+------+
| c0 | c1 | c2 |
+------+------+------+
| 1 | [1.1, 2.2] | [1.1, 2.2, 3.3] |
| 2 | [2.2, 3.3] | [2.2, 3.3, 4.4] |
| 3 | [3.3, 4.4] | [3.3, 4.4, 5.5] |
| 4 | [4.4, 5.5] | [4.4, 5.5, 6.6] |
| 5 | [5.5, 6.6] | [5.5, 6.6, 7.7] |
+------+------+------+
Exemple : Lister les index vectoriels
SHOW INDEXES ON vector_test;
-- The following result is returned:
{"Indexes": [{
"createTime": 1779900024105,
"id": "512d520**45e1c7ba8",
"indexColumns": [{"name": "c2"}],
"name": "c2_vector_index",
"properties": {
"algorithm": "hgraph",
"build_params": "{\"max_degree\": 16, \"ef_construction\": 128}",
"distance_type": "cosine"},
"type": "VECTOR"}]}
Exemple : Afficher les informations d'un index vectoriel
DESC INDEX c2_vector_index ON vector_test;
-- The following result is returned:
+------------------------------------------------------------------------------------+
| Index Detail |
+------------------------------------------------------------------------------------+
| name: c2_vector_index |
| id: 512d520**e1c7ba8 |
| index_type: VECTOR |
| index_columns: c2 |
| status: ACTIVE |
| coverage_percentage: 100% |
| storage_size_bytes: 6940 |
| properties: build_params={"max_degree": 16, "ef_construction": 128}, distance_type=cosine, algorithm=hgraph |
+------------------------------------------------------------------------------------+
Exemple : Supprimer un index vectoriel
DROP INDEX c2_vector_index ON vector_test;
-- The following result is returned:
{"Indexes": []}
Exemple : Créer un index vectoriel avec quantification FP16
CREATE VECTOR INDEX doc_vector_index
ON doc_table (embedding)
IDXPROPERTIES (
'algorithm' = 'hgraph',
'distance_type' = 'dot_product',
'build_params' = '{
"max_degree":48,
"ef_construction":400,
"base_quantization_type":"fp16"
}'
);
-- After you create the index, you must rebuild it for existing data.
ALTER TABLE doc_table PARTITION (pt='20260730') REBUILD INDEX doc_vector_index;
Exemple : Créer un index vectoriel avec RaBitQ et réorganisation
CREATE VECTOR INDEX doc_vector_index
ON doc_table (embedding)
IDXPROPERTIES (
'algorithm' = 'hgraph',
'distance_type' = 'dot_product',
'build_params' ='{
"max_degree":48,
"ef_construction":400,
"base_quantization_type":"rabitq",
"use_reorder":true,
"precise_quantization_type":"fp32"
}'
);