Rechercher et filtrer avec des embeddings vectoriels

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 ou vector_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ètre distance_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 dans information_schema.innodb_vector_indexes. Nous vous recommandons d'ajuster num_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 recherche approx_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.

  1. 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.
  2. 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);
    
  3. Insérez un embedding vectoriel dans la colonne.

    INSERT INTO books VALUES ((1, 'book title', string_to_vector('[1,2,3]')));
    
  4. Effectuez un commit sur les modifications :

    commit;
    
  5. 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;
    
  6. 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