La recherche vectorielle dans Spanner Omni est une fonctionnalité intégrée hautes performances qui permet d'effectuer des recherches sémantiques et de trouver des correspondances de similarité 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 d'extraction, de transformation et de chargement (ETL) complexes.
Les sujets abordés dans ce document s'appliquent à Spanner Omni de la même manière qu'à Spanner.
Présentation 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 :
Recherche des 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. Elle offre le rappel le plus élevé, mais peut être coûteuse en ressources de calcul pour les grands ensembles de données.
Recherche des plus proches voisins approximatifs (ANN) : utilise un index vectoriel pour trouver rapidement des correspondances dans de grands ensembles de données. Elle sacrifie une petite partie de l'exactitude (rappel) au profit de la vitesse et de l'évolutivité.
La recherche vectorielle est particulièrement puissante 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 avec la précision des mots clés à l'aide de la fusion de rang réciproque (RRF) pour améliorer la pertinence de la recherche. |
| Vecteur + graphe | Utilisez la recherche vectorielle pour trouver des points d'entrée (nœuds) pertinents dans un graphe 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 prend en charge 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 vectorielles (idéal pour les données normalisées).
Pour en savoir plus, consultez la section Effectuer une recherche de similarité vectorielle en recherchant les k plus proches voisins dans la documentation Spanner.
Choisir la meilleure fonction de distance vectorielle
La sélection 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 vectorielles correspondantes. | Augmente |
| Distance de cosinus | Mesure le cosinus de l'angle entre deux vecteurs (1 - similarité cosinus). | Diminue |
| Distance euclidienne | Mesure la distance en ligne droite entre deux vecteurs. | Diminue |
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, essayez COSINE_DISTANCE() ou EUCLIDEAN_DISTANCE() pour déterminer laquelle produit les meilleurs résultats pour votre cas d'utilisation.
Pour en savoir plus, consultez la section Choisir des fonctions de distance vectorielle dans la documentation Spanner.
Voisins approximatifs les plus proches (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. Elle utilise un index vectoriel pour fournir des résultats rapides avec un léger compromis en termes de rappel.
La recherche des plus proches voisins approximatifs (ANN) dans Spanner Omni est compatible avec les ensembles de données contenant jusqu'à 1 million de vecteurs pour les vecteurs d'une longueur maximale de 128 dimensions. Si vos vecteurs comportent plus de dimensions, le nombre de vecteurs compatibles diminue proportionnellement.
Effectuer une recherche ANN avec des index vectoriels
Pour effectuer une recherche ANN, vous 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.
Une clause
ORDER BYutilisant la fonction de distance approximative.Une clause
LIMITpour spécifier le nombre de résultats.
Pour en savoir plus, consultez la section 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, vous devez spécifier la vector_length de votre colonne d'embedding et vous pouvez utiliser 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 la section Créer et gérer des index vectoriels dans la documentation Spanner.
Bonnes pratiques d'indexation vectorielle
Pour maintenir des performances de recherche et un rappel é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.Reconstruire périodiquement : reconstruisez votre index si la distribution de vos vecteurs change de manière significative au fil du temps.
Utiliser le filtrage de manière efficace : stockez les colonnes fréquemment filtrées dans l' index pour améliorer l'efficacité de la recherche.
Pour en savoir plus, consultez la section Bonnes pratiques d'indexation vectorielle dans la documentation Spanner.