Cette page décrit les bonnes pratiques d'indexation vectorielle qui optimisent vos index vectoriels et améliorent les résultats des requêtes de voisin le plus proche approximatif (ANN).
Régler les options de recherche vectorielle
Si vous ne spécifiez aucune option d'index vectoriel, Spanner tente de choisir automatiquement des options optimisées. Les utilisateurs avancés qui souhaitent ajuster les options d'index vectoriel pour leur charge de travail spécifique peuvent définir et ajuster ces valeurs en créant un index vectoriel et en définissant index_option_list dans l'instruction CREATE VECTOR INDEX. Les valeurs les plus optimales pour les options de votre index vectoriel dépendent de votre cas d'utilisation, de votre ensemble de données vectorielles et des vecteurs de requête. Vous devrez peut-être effectuer un réglage itératif pour trouver les meilleures valeurs pour votre charge de travail spécifique.
Voici quelques consignes utiles à suivre pour choisir les valeurs appropriées :
tree_depth(niveau d'arborescence) : si la table que vous indexez comporte moins de 10 millions de lignes, utilisez untree_depthde2. Sinon, unetree_depthde3permet de gérer des tables comportant jusqu'à environ 10 milliards de lignes. Si aucune valeur n'est spécifiée, Spanner détermine automatiquement la valeur detree_depth.num_leaves: Nous vous recommandons de cibler entre 200 et 1 000 lignes par feuille. Une valeur plus élevée denum_leavesaugmente la durée de la compilation de l'index vectoriel, mais peut réduire le coût de la requête pour un rappel cible donné. Toutefois, des valeurs trop élevées denum_leavespeuvent entraîner une nouvelle augmentation du coût des requêtes en raison des frais généraux associés à la recherche dans de nombreux clusters feuilles très petits. Si aucune valeur n'est spécifiée, Spanner détermine automatiquement la valeur denum_leaves.num_branches: cette option ne s'applique que lorsquetree_depthest défini sur 3. Nous vous recommandons de cibler entre 50 et 500 feuilles par branche, etnum_branchesdoit être inférieur ànum_leaves. Une valeur plus élevée denum_branchesaugmente le temps de création de l'index vectoriel, mais peut réduire le coût des requêtes pour un rappel cible donné. Toutefois, des valeurs denum_branchestrop élevées peuvent entraîner une nouvelle augmentation du coût des requêtes en raison des frais généraux associés à la recherche dans de nombreux clusters feuilles très petits. Si aucune valeur n'est spécifiée, Spanner détermine automatiquement la valeur denum_branches.num_leaves_to_search: cette option indique le nombre de nœuds feuilles de l'index à rechercher. L'augmentation denum_leaves_to_searchaméliore le rappel, mais augmente également la latence et les coûts. Nous vous recommandons d'utiliser une valeurnum_leaves_to_searchégale à 1% du nombre total de feuilles défini dans l'instructionCREATE VECTOR INDEX. Si vous utilisez une clause de filtre, augmentez cette valeur pour élargir la recherche.
Si vous obtenez un rappel acceptable, mais que le coût des requêtes est trop élevé, ce qui entraîne un faible nombre maximal de requêtes par seconde, essayez d'augmenter num_leaves en suivant ces étapes :
- Définissez
num_leavessur un multiplekde sa valeur d'origine (par exemple,2 * (table_row_count / 1000)). - Définissez
num_leaves_to_searchsur le même multiple k de sa valeur d'origine. - Essayez de réduire
num_leaves_to_searchpour améliorer le coût et les RPS tout en conservant le rappel.
Déterminer les valeurs des options de recherche vectorielle
Pour déterminer les paramètres tree_depth, num_leaves et num_branches que Spanner utilise pour l'index vectoriel, interrogez la vue INFORMATION_SCHEMA.INDEX_OPTIONS. Les valeurs des paramètres peuvent différer légèrement de celles que vous avez spécifiées de manière explicite lors de la création de l'index, car Spanner les ajuste parfois pour mieux s'adapter à vos données.
Si vous n'avez pas spécifié ces paramètres, la vue INFORMATION_SCHEMA.INDEX_OPTIONS affiche les valeurs choisies par Spanner.
Exécutez cette requête pour afficher les valeurs des paramètres :
SELECT
opt.option_name,
opt.option_type,
opt.option_value
FROM
INFORMATION_SCHEMA.INDEX_OPTIONS AS opt
WHERE
opt.index_name = @vector_index_name;
La requête renvoie des lignes incluant option_name : system_optimized_tree_depth, system_optimized_num_leaves et system_optimized_num_branches, qui reflètent les paramètres utilisés par l'index.
Améliorer le rappel
Pour améliorer le rappel, envisagez d'ajuster la valeur num_leaves_to_search ou de reconstruire votre index vectoriel.
Augmenter la valeur num_leaves_to_search
Si la valeur num_leaves_to_search est trop petite, vous aurez peut-être plus de mal à trouver les voisins les plus proches pour certains vecteurs de requête. Créer un index vectoriel avec une valeur num_leaves_to_search plus élevée peut aider à améliorer le rappel en recherchant davantage de feuilles. Les requêtes récentes peuvent contenir davantage de ces vecteurs complexes.
Recompiler l'index vectoriel
La structure arborescente de l'index vectoriel est optimisée pour l'ensemble de données au moment de la création et reste statique par la suite. Par conséquent, si des vecteurs très différents sont ajoutés après la création de l'index vectoriel initial, la structure arborescente peut être sous-optimale, ce qui entraîne un rappel plus faible.
Pour actualiser votre index vectoriel sans temps d'arrêt, choisissez l'une des options suivantes :
Option 1 : Réindexer sur place avec les mêmes options (en utilisant le LDD)
Si vous souhaitez réindexer votre index vectoriel sur place avec les mêmes options d'index, vous pouvez exécuter l'instruction LDD suivante en fonction de votre dialecte de base de données. La réindexation s'effectue en arrière-plan et permet de poursuivre les opérations de lecture et d'écriture sur l'index.
GoogleSQL
ALTER VECTOR INDEX IncidentVectorIndex REBUILD;PostgreSQL
REINDEX INDEX CONCURRENTLY incidentvectorindex;Option 2 : Réindexer manuellement avec des options modifiées
Si vous devez modifier les options d'index (comme
num_leaves,tree_depth, etc.), procédez comme suit :- Créez un index vectoriel sur la même colonne d'embedding que l'index vectoriel actuel, en mettant à jour les paramètres (par exemple,
OPTIONS) selon vos besoins. Une fois l'index créé, évaluez celui qui offre les meilleures performances. Spanner décide automatiquement de l'index à utiliser lors de l'exécution de la requête. Choisissez l'une des méthodes suivantes pour évaluer et comparer vos index :
a. Modifiez votre application : vous pouvez mettre à jour un sous-ensemble de vos requêtes afin qu'elles utilisent l'indication
FORCE_INDEXpour pointer vers le nouvel index afin de mettre à jour la requête de recherche vectorielle. Cela garantit que la requête utilise le nouvel index de vecteur. Avec cette méthode, vous devrez peut-être réajusternum_leaves_to_searchdans votre nouvelle requête.b. Modifier votre schéma : vous pouvez définir l'option
disable_searchsur l'un de vos index vectoriels. Lorsque ce paramètre est défini surtrue, Spanner désactive l'index vectoriel. Pour ce faire, exécutez l'instruction de modification du schémaALTER VECTOR INDEX:ALTER VECTOR INDEX IncidentVectorIndex SET OPTIONS (disable_search=true);Cette méthode empêche Spanner d'utiliser cet index vectoriel dans votre base de données. Si vous avez deux index et que vous définissez cette option sur l'index le plus ancien, toutes les requêtes utiliseront le nouvel index une fois la modification du schéma appliquée. Si vous utilisez l'indication
FORCE_INDEXpour spécifier un index vectoriel dont l'optiondisable_searchest définie surtrue, la requête échoue.Supprimez l'index vectoriel obsolète.
- Créez un index vectoriel sur la même colonne d'embedding que l'index vectoriel actuel, en mettant à jour les paramètres (par exemple,
Étapes suivantes
En savoir plus sur les index vectoriels Spanner
En savoir plus sur les plus proches voisins approximatifs de Spanner
En savoir plus sur les fonctions GoogleSQL
APPROXIMATE_COSINE_DISTANCE(),APPROXIMATE_EUCLIDEAN_DISTANCE()etAPPROXIMATE_DOT_PRODUCT()En savoir plus sur les instructions
VECTOR INDEXGoogleSQL