Bonnes pratiques pour l'indexation vectorielle

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 (ANN) approximatives.

Ajuster les options de recherche vectorielle

Si vous ne spécifiez aucune option d'index vectoriel, Spanner tente de choisir automatiquement des options optimisées. Pour les utilisateurs avancés qui souhaitent ajuster les options d’index vectoriel pour leur charge de travail spécifique, vous pouvez définir et ajuster ces valeurs en créant un nouvel index vectoriel et en définissant les index_option_list dans l’instruction CREATE VECTOR INDEX. Les valeurs les plus optimales pour vos options d'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 conseils utiles à suivre lorsque vous choisissez des valeurs appropriées :

  • tree_depth (niveau de l'arborescence) : si la table que vous indexez comporte moins de 10 millions de lignes, utilisez une tree_depth de 2. Sinon, une tree_depth de 3 est compatible avec les tables contenant jusqu'à environ 10 milliards de lignes. Si elle n'est pas spécifiée, Spanner détermine automatiquement la valeur de tree_depth.

  • num_leaves : nous vous recommandons de cibler 200 à 1 000 lignes par feuille. Une valeur plus élevée de num_leaves augmente 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 de num_leaves peuvent entraîner une augmentation du coût de la requête en raison des frais généraux associés à la recherche de nombreux clusters de feuilles très petits. Si elle n'est pas spécifiée, Spanner détermine automatiquement la valeur de num_leaves.

  • num_branches : cette option n'est applicable que lorsque tree_depth est égal à 3. Nous vous recommandons de cibler 50 à 500 feuilles par branche, et num_branches doit être inférieur à num_leaves. Une valeur plus élevée de num_branches augmente 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 de num_branches peuvent entraîner une augmentation du coût de la requête en raison des frais généraux associés à la recherche de nombreux clusters de feuilles très petits. Si elle n'est pas spécifiée, Spanner détermine automatiquement la valeur de num_branches.

  • num_leaves_to_search: cette option spécifie le nombre de nœuds feuilles de l'index à rechercher. L'augmentation de num_leaves_to_search améliore le rappel, mais augmente également la latence et le coût. Nous vous recommandons d'utiliser un nombre correspondant à 1% du nombre total de feuilles défini dans l'instruction CREATE VECTOR INDEX comme valeur pour num_leaves_to_search. Si vous utilisez une clause de filtre, augmentez cette valeur pour élargir la recherche.

Si un rappel acceptable est obtenu, mais que le coût de la requête est trop élevé, ce qui entraîne un faible nombre maximal de requêtes par seconde, essayez d'augmenter num_leaves en procédant comme suit :

  1. Définissez num_leaves sur un multiple k de sa valeur d'origine (par exemple, 2 * (table_row_count / 1000)).
  2. Définissez num_leaves_to_search sur le même multiple k de sa valeur d'origine.
  3. Essayez de réduire num_leaves_to_search pour améliorer le coût et le 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 explicitement 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, y compris 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 recréer votre index vectoriel.

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. La création d'un index vectoriel avec une valeur num_leaves_to_search plus élevée peut améliorer le rappel en recherchant davantage de feuilles. Les requêtes récentes peuvent contenir davantage de ces vecteurs difficiles.

Recréer 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 recréer votre index vectoriel sans temps d'arrêt :

  1. Créez un index vectoriel sur la même colonne d'embeddings que l'index vectoriel actuel, en mettant à jour les paramètres (par exemple, OPTIONS) selon vos besoins. Une fois la création de l'index terminée, vous pouvez évaluer lequel de vos deux index est le plus performant. Si c'est le cas, passez à l'étape suivante. Sinon, passez à la suppression de l'index vectoriel obsolète.
  2. Spanner décide automatiquement quel index utiliser lors de l'exécution de la requête. Spanner vous permet de spécifier l'index à utiliser de deux manières. 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'indicateur FORCE_INDEX pour 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 vectoriel. Avec cette méthode, vous devrez peut-être réajuster num_leaves_to_search dans votre nouvelle requête.

    b. Modifiez votre schéma : vous pouvez définir l'option disable_search sur l'un de vos index vectoriels. Lorsque cette option est définie sur true, Spanner désactive l'index vectoriel. Pour ce faire, exécutez l'instruction de modification de schéma ALTER 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 disposez de deux index et que vous définissez cette option sur l'index le plus ancien, toutes les requêtes utilisent le nouvel index une fois la modification du schéma appliquée. Si vous utilisez l'indicateur FORCE_INDEX pour spécifier un index vectoriel dont l'option disable_search est définie sur true, la requête échoue.

  3. Supprimez l'index vectoriel obsolète.

Étape suivante