La recherche vectorielle dans Spanner Omni est une fonctionnalité intégrée hautes performances qui permet d'effectuer des recherches sémantiques et des mises en correspondance de similarités sur des données vectorielles de grande dimension. En stockant et en indexant les embeddings vectoriels directement dans votre base de données transactionnelle, Spanner Omni élimine les bases de données vectorielles distinctes et les pipelines ETL (extract, transform, load) complexes.
Les sujets abordés dans ce document s'appliquent à Spanner Omni de la même manière qu'à Spanner.
Fonctionnement de la recherche vectorielle
La recherche vectorielle vous permet de trouver des éléments sémantiquement similaires en représentant les données sous forme de vecteurs numériques (embeddings). Spanner Omni accepte deux méthodes de recherche principales :
K-plus proches voisins (KNN) : effectue une recherche exacte en calculant la distance entre la requête et chaque vecteur de l'ensemble de données. Il offre le meilleur rappel, mais peut être coûteux en termes de calcul pour les grands ensembles de données.
Voisin le plus proche approximatif (ANN) : utilise un index vectoriel pour trouver rapidement des correspondances dans de grands ensembles de données. Il sacrifie une petite partie de la précision (rappel) pour gagner en vitesse et en évolutivité.
La recherche vectorielle est particulièrement efficace lorsqu'elle est combinée à d'autres fonctionnalités :
| Combinaison | Avantage |
|---|---|
| Recherche vectorielle avec filtrage SQL | Combinez efficacement la recherche vectorielle avec des filtres (par exemple, "Trouver des images similaires où la catégorie est 'chaussures' et le prix est inférieur à 100"). |
| Recherche vectorielle + recherche en texte intégral | Combinez la similarité sémantique et la précision des mots clés à l'aide de la fusion de classement réciproque (RRF) pour améliorer la pertinence des recherches. |
| Vecteur + graphique | Utilisez la recherche vectorielle pour trouver des points d'entrée (nœuds) pertinents dans un graphique de propriétés, puis parcourez des relations complexes. |
Pour en savoir plus, consultez la présentation de la recherche vectorielle Spanner dans la documentation Spanner.
Effectuer une recherche des k plus proches voisins
Spanner Omni accepte la recherche des k plus proches voisins (KNN) à l'aide de fonctions de distance intégrées. Vous pouvez fournir un embedding vectoriel comme paramètre d'entrée pour trouver les vecteurs les plus proches dans un espace à N dimensions.
Les fonctions de distance suivantes sont disponibles :
COSINE_DISTANCE(): mesure le cosinus de l'angle entre deux vecteurs.EUCLIDEAN_DISTANCE(): mesure la distance en ligne droite la plus courte entre deux vecteurs.DOT_PRODUCT(): calcule le cosinus de l'angle multiplié par le produit des magnitudes des vecteurs (idéal pour les données normalisées).
Pour en savoir plus, consultez Effectuer une recherche de similarité vectorielle en recherchant les k plus proches voisins dans la documentation Spanner.
Choisir la meilleure fonction de distance vectorielle
Le choix de la fonction de distance appropriée dépend de vos données et du modèle utilisé pour générer les embeddings.
| Fonction | Description | Relation avec l'augmentation de la similarité |
|---|---|---|
| Produit scalaire | Calcule le cosinus de l'angle multiplié par le produit des magnitudes de vecteurs correspondantes. | Augmentations |
| Distance de cosinus | Mesure le cosinus de l'angle entre deux vecteurs (1 – similarité cosinus). | Diminutions |
| Distance euclidienne | Mesure la distance en ligne droite entre deux vecteurs. | Diminutions |
Si vos embeddings sont normalisés (magnitude = 1,0), DOT_PRODUCT() est généralement un choix efficace. Pour les données non normalisées, testez COSINE_DISTANCE() ou EUCLIDEAN_DISTANCE() pour déterminer lequel produit les meilleurs résultats pour votre cas d'utilisation.
Pour en savoir plus, consultez Choisir des fonctions de distance vectorielle dans la documentation Spanner.
Voisins les plus proches approximatifs (ANN)
La recherche ANN est conçue pour les très grands ensembles de données où la recherche KNN exacte devient trop lente ou trop coûteuse. Il utilise un index vectoriel pour fournir des résultats rapides avec un léger compromis en termes de rappel.
Sans nœuds de calcul dédiés, la recherche ANN dans Spanner Omni est compatible avec les ensembles de données contenant jusqu'à un million de vecteurs, pour des vecteurs d'une longueur maximale de 128 dimensions. Si vos vecteurs comportent plus de dimensions, le nombre de vecteurs acceptés diminue proportionnellement. Spanner Omni est compatible avec les tables plus volumineuses lorsque vous déployez des nœuds de calcul pour créer vos index vectoriels. Pour en savoir plus, consultez Créer et gérer des index vectoriels.
Effectuer une recherche ANN avec des index vectoriels
Pour effectuer une recherche ANN, utilisez des fonctions de distance approximatives telles que APPROX_COSINE_DISTANCE(), APPROX_EUCLIDEAN_DISTANCE() ou APPROX_DOT_PRODUCT(). Ces fonctions nécessitent :
Un index vectoriel existant sur la colonne d'embedding.
Clause
ORDER BYutilisant la fonction de distance approximative.Une clause
LIMITpour spécifier le nombre de résultats.
Pour en savoir plus, consultez Rechercher les plus proches voisins approximatifs (ANN) et interroger les embeddings vectoriels dans la documentation Spanner.
Créer et gérer des index vectoriels
Lorsque vous créez un index vectoriel, spécifiez le vector_length de votre colonne d'intégration et utilisez la clause STORING pour inclure des colonnes supplémentaires afin d'accélérer le filtrage.
Voici un exemple de création d'un index vectoriel :
CREATE VECTOR INDEX INDEX_NAME
ON TABLE_NAME(EMBEDDING_COLUMN)
OPTIONS (distance_type = 'DISTANCE_TYPE', tree_depth = 2, num_leaves = 1000);
Pour en savoir plus, consultez Créer et gérer des index vectoriels dans la documentation Spanner.
Pour créer des index vectoriels sur des tables volumineuses qui dépassent les limites de Voisin le plus proche approximatif (ANN), vous avez besoin de nœuds de calcul dédiés pour décharger le traitement de vos serveurs Spanner Omni. Pour en savoir plus, consultez Déployer et gérer des nœuds de calcul.
Utiliser l'échantillonnage lors de la création d'un index vectoriel
Pour les grands ensembles de données (par exemple, les tables comportant des dizaines de millions de lignes ou plus), vous pouvez réduire le temps de création de l'index vectoriel en spécifiant un pourcentage d'échantillonnage. Utilisez l'option clustering_sampling_percentage dans l'instruction CREATE VECTOR INDEX pour échantillonner un sous-ensemble de l'ensemble de données lorsque vous créez l'arborescence d'index initiale.
En règle générale, visez au moins 50 lignes échantillonnées par feuille. Par exemple, pour un ensemble de données de 10 millions de lignes avec 10 000 feuilles, un taux d'échantillonnage de 5 % (clustering_sampling_percentage = 5) échantillonne 500 000 lignes, soit 50 lignes par feuille, comme le montre l'exemple suivant :
CREATE VECTOR INDEX VectorIndex
ON BaseTable(Embedding)
WHERE Embedding IS NOT NULL
OPTIONS (
tree_depth = 3,
num_leaves = 10000,
num_branches = 100,
leaf_scatter_factor = 32,
distance_type = 'COSINE',
min_branch_splits = 10,
min_leaf_splits = 10,
clustering_sampling_percentage = 5
);
Par rapport à la création d'un index sur l'ensemble de données sans échantillonnage, l'échantillonnage augmente la latence des requêtes et l'utilisation du processeur par requête pour le même rappel cible. Augmenter le pourcentage d'échantillonnage augmente le temps de création de l'index, mais réduit la latence des requêtes et le coût du processeur par requête. Choisissez un pourcentage d'échantillonnage qui équilibre le temps de création de l'index et les performances des requêtes en fonction des ressources de calcul disponibles pour la création de l'index.
Bonnes pratiques pour l'indexation vectorielle
Pour maintenir des performances et un rappel de recherche élevés :
Ajuster les options d'index : ajustez
num_leavesetnum_leaves_to_searchen fonction de la taille de vos données et de vos exigences en termes de performances.Recréez-le régulièrement : recréez votre index si la distribution de vos vecteurs change de manière significative au fil du temps.
Utilisez efficacement le filtrage : stockez les colonnes fréquemment filtrées dans l'index pour améliorer l'efficacité de la recherche.
Pour en savoir plus, consultez les bonnes pratiques d'indexation vectorielle dans la documentation Spanner.