Cette page décrit les différentes manières d'interroger des embeddings vectoriels. Pour obtenir une présentation des recherches de similarité ANN et KNN, consultez la section Recherches vectorielles.
Rechercher les voisins les plus proches approximatifs (ANN)
Pour effectuer une recherche ANN, utilisez la fonction approx_distance
dans une clause SELECT
et ORDER BY
. Vous devez utiliser une clause LIMIT
dans une recherche ANN. Vous pouvez également obtenir la valeur de la distance en plaçant approx_distance
dans une liste SELECT
.
Utilisez la syntaxe suivante pour les requêtes ANN:
# Ordering by distance
SELECT title
FROM books
ORDER BY approx_distance(embedding, string_to_vector('[1,2,3]'), 'distance_measure=l2_squared')
LIMIT 4;
# Selecting the distance value
SELECT
approx_distance(
embedding_name,
string_to_vector('[1,2,3]'),
'distance_measure=cosine,num_leaves_to_search=3')
dist
FROM table
ORDER BY dist
LIMIT limit_value;
La fonction approx_distance
utilise les options suivantes:
embedding
: utilise le nom de la colonne d'embedding vectoriel de la table de base.string_to_vector
ouvector_to_string
: convertit un vecteur en chaîne et une chaîne en vecteur pour rendre le vecteur lisible.distance_measure
: spécifie la mesure de distance à utiliser pour une recherche de similarité vectorielle. Cette valeur doit correspondre à celle que vous avez définie dans le paramètredistance_measure
lorsque vous avez créé l'index. Ce paramètre est obligatoire. Les valeurs possibles pour ce paramètre sont les suivantes :COSINE
L2_SQUARED
DOT_PRODUCT
num_leaves_to_search
: facultatif. Spécifie le nombre de feuilles à explorer pour une recherche de similarité vectorielle ANN. Si vous ne spécifiez pas le nombre de feuilles, Cloud SQL utilise une valeur générée en fonction de la taille de la table, du nombre de feuilles dans l'index vectoriel et d'autres facteurs. Vous pouvez consulter cette valeur dansinformation_schema.innodb_vector_indexes
. Nous vous recommandons d'ajusternum_leaves_to_search
pour trouver le meilleur équilibre entre la qualité de recherche et les performances pour votre charge de travail spécifique. Si vous l'augmentez, cela affecte les performances, mais améliore la mémorisation.
L'exemple suivant montre comment utiliser approx_distance
pour trouver les K premières lignes les plus proches à l'aide de la mesure de distance l2_squared
et organiser les résultats par distance.
# Ordering by distance
SELECT title
FROM books
ORDER BY approx_distance(embedding, string_to_vector('[1,2,3]'),
'distance_measure=l2_squared')
LIMIT 4;
# Selecting the distance value
SELECT
approx_distance
(embedding, string_to_vector('[1,2,3]'),
'distance_measure=l2_squared') dist
FROM table
ORDER BY dist
LIMIT 4;
Filtrer les résultats des requêtes approx_distance
Vous pouvez utiliser la fonction approx_distance
avec des conditions WHERE
qui filtrent les résultats de requête avec un prédicat non vectoriel pour effectuer un post-filtrage. La fonction approx_distance
est évaluée avant l'application du filtre, ce qui signifie que le nombre de résultats renvoyés n'est pas déterministe.
Par exemple, pour la requête suivante :
SELECT id FROM products WHERE price < 100
ORDER BY approx(embedding, @query_vector,'distance_measure=cosine')
LIMIT 11;
La fonction approx_distance
renvoie les 11 voisins les plus proches du vecteur de requête, quel que soit le prix. Dans le post-filtrage, les produits dont le prix est inférieur à 100 € sont sélectionnés. Il est possible que tous les voisins les plus proches aient un prix inférieur à 100. Il y a donc 11 résultats pour la requête. En outre, si aucun des voisins les plus proches n'a un prix inférieur à 100, aucune ligne n'est renvoyée.
Si vous prévoyez que votre filtre dans la condition WHERE
est très sélectif, une recherche exacte (KNN) peut être une meilleure option pour vous assurer qu'un nombre suffisant de lignes est renvoyé.
Vérifier l'état de remplacement des recherches ANN
Dans certains cas, une recherche ANN est remplacée par une recherche KNN. En voici quelques-uns:
- Aucun index vectoriel n'est associé à la table de base.
- Il existe un indice vectoriel dans la table de base, mais il utilise une mesure de distance différente de celle du paramètre
distance_measure
dans les options de rechercheapprox_distance
. - L'index vectoriel est corrompu ou invisible pour la transaction en cours.
- La valeur
LIMIT
spécifiée est supérieure à 10 000. - Aucune
LIMIT
n'est spécifiée. - La requête actuelle implique plusieurs appels
approx_distance
sur la même table de base. - L'optimiseur calcule qu'il est plus efficace d'utiliser KNN.
Dans tous ces cas, un avertissement est envoyé au client pour indiquer qu'une recherche exacte a été effectuée et pourquoi.
Utilisez la commande suivante dans le client mysql pour afficher l'état de remplacement:
SHOW global status LIKE '%cloudsql_vector_knn_fallback%';
Si vous souhaitez utiliser une ANN et que le réseau de neurones de type KNN est utilisé, la requête peut s'exécuter plus lentement. Vous devez identifier la raison de ce retour et déterminer si vous devez apporter des modifications pour que l'ANN soit utilisé à la place.
Exemple: Créer un index vectoriel et exécuter une requête ANN
L'exemple de tutoriel suivant décrit la procédure à suivre pour créer un indice vectoriel et exécuter une requête ANN dans Cloud SQL.
- Générer des embeddings vectoriels Vous pouvez créer des embeddings vectoriels manuellement ou utiliser l'API d'embedding de texte de votre choix. Pour obtenir un exemple utilisant Vertex AI, consultez la section Générer des embeddings vectoriels basés sur des données de ligne.
Créez une table dans Cloud SQL contenant une colonne d'embeddings vectoriels à trois dimensions.
CREATE TABLE books( id INTEGER PRIMARY KEY AUTO_INCREMENT, title VARCHAR(60), embedding VECTOR(3) USING VARBINARY);
Insérez un embedding vectoriel dans la colonne.
INSERT INTO books VALUES ((1, 'book title', string_to_vector('[1,2,3]')));
Effectuez un commit sur les modifications :
commit;
Créez l'index vectoriel à l'aide de la fonction
L2_squared
pour mesurer la distance.CREATE VECTOR INDEX vectorIndex ON dbname.books(embeddings) USING SCANN QUANTIZER = SQ8 DISTANCE_MEASURE = l2_squared;
Utilisez la syntaxe suivante pour effectuer une recherche ANN avec un
LIMIT
de quatre résultats de recherche:SELECT title FROM books ORDER BY approx_distance(embedding, string_to_vector('[1,2,3]'), 'distance_measure=l2_squared') LIMIT 4; SELECT approx_distance(embedding, string_to_vector('[1,2,3]'), 'distance_measure=cosine') dist FROM books ORDER BY dist LIMIT 4;
Recherche des k plus proches voisins (KNN)
Pour effectuer une recherche des k plus proches voisins, utilisez la fonction vector_distance
avec une option de mesure de distance et une fonction de conversion vectorielle (string_to_vector
ou vector_to_string
) dans une instruction SELECT
. Utilisez la syntaxe suivante:
SELECT vector_distance(string_to_vector('[1,2,3]'),
string_to_vector('[1,2,3]'),
'Distance_Measure=dot_product');
Remplacez les valeurs [1,2,3] par les valeurs d'encapsulation de vos données.
L'exemple suivant montre comment utiliser cette requête avec la fonction cosine_distance
et la fonction de conversion de vecteur string_to_vector
.
SELECT id,cosine_distance(embedding, string_to_vector('[1,2,3]')) dist
FROM books
ORDER BY distance
LIMIT 10;
Obtenir la distance de cosinus dans une requête KNN
Utilisez la fonction cosine_distance
Cloud SQL pour calculer la distance à l'aide du cosinus.
SELECT cosine_distance(embedding, string_to_vector('[3,1,2]')) AS distance FROM books WHERE id = 10;
Obtenir la distance de produit scalaire dans une requête KNN
Utilisez la fonction dot_product
Cloud SQL pour calculer la distance à l'aide du produit scalaire.
SELECT dot_product(embedding, string_to_vector('[3,1,2]')) AS distance FROM books WHERE id = 10;
Obtenir la distance L2 au carré dans une requête KNN
Utilisez la fonction l2_squared_distance
Cloud SQL pour calculer la distance à l'aide de la distance L2 au carré.
SELECT
l2_squared_distance(embedding, string_to_vector('[3,1,2]'))
AS distance
FROM books
WHERE id = 10;
Étape suivante
- Consultez la présentation de la recherche vectorielle dans Cloud SQL.
- Découvrez comment activer et désactiver les embeddings vectoriels sur votre instance.
- Découvrez comment générer des embeddings vectoriels.
- Découvrez comment créer des index vectoriels.
- Découvrez comment effectuer des recherches sur des embeddings vectoriels.