Mesurer la capacité de rappel des requêtes vectorielles

Sélectionnez une version de la documentation :

Cette page explique comment mesurer le rappel des requêtes vectorielles dans AlloyDB Omni. Dans le contexte de la recherche vectorielle, le rappel fait référence au pourcentage de vecteurs renvoyés par l'index qui sont de vrais voisins les plus proches. Par exemple, si une requête de 20 voisins les plus proches renvoie un résultat de 19 voisins les plus proches de "vérité terrain", le rappel est de 19/20 x 100 = 95 %.

Dans une requête vectorielle, le rappel est important, car il mesure le pourcentage de résultats pertinents récupérés à partir d'une recherche. Le rappel vous aide à évaluer la précision des résultats d'une recherche approximative des voisins les plus proches (ANN) par rapport aux résultats d'une recherche des k plus proches voisins (KNN).

ANN est un algorithme qui trouve des points de données semblables à un point de requête donné. Il améliore la vitesse en trouvant les voisins approximatifs plutôt que les voisins réels. Lorsque vous utilisez ANN, vous équilibrez la vitesse et le rappel.

KNN est un algorithme qui trouve les k vecteurs les plus semblables à un vecteur de requête donné dans un ensemble de données, en fonction d'une métrique de similarité. k correspond au nombre de voisins que vous souhaitez que la requête renvoie.

Vous pouvez mesurer le rappel de votre requête de recherche vectorielle pour différents index vectoriels, y compris les suivants :

  • Scalable Nearest Neighbors (ScaNN) : algorithme permettant une recherche efficace de similarités vectorielles.
  • Hierarchical Navigable Small World (HNSW) : algorithme basé sur des graphiques utilisé pour une recherche efficace des voisins les plus proches approximatifs dans les bases de données vectorielles.
  • Inverted File with Flat Compression (IVFFLAT) et Inverted File Flat (IVF) : types d'index vectoriels utilisés pour les recherches ANN, en particulier dans les bases de données telles que l'extension pgvector de PostgreSQL.

Cette page part du principe que vous connaissez PostgreSQL, AlloyDB Omni et la recherche vectorielle.

Avant de commencer

  1. Installez ou mettez à jour l'extension pgvector.

    1. Si l'extension pgvector n'est pas installée, installez la version 0.8.0.google-3 ou ultérieure de l'extension vector pour stocker les embeddings générés sous forme de valeurs vector. L'extension vector inclut des fonctions et des opérateurs pgvector. Google étend cette version de pgvector avec des optimisations pour AlloyDB Omni.

      CREATE EXTENSION IF NOT EXISTS vector WITH VERSION '0.8.0.google-3';
      

      Pour en savoir plus, consultez Stocker, indexer et interroger des vecteurs.

    2. Si l'extension pgvector est déjà installée, mettez à niveau l'extension vector vers la version 0.8.0.google-3 ou ultérieure pour bénéficier des fonctionnalités d'évaluation du rappel.

      ALTER EXTENSION vector UPDATE TO '0.8.0.google-3';
      
  2. Pour créer des index ScaNN, installez l'extension alloydb_scann.

    CREATE EXTENSION IF NOT EXISTS alloydb_scann;
    

Évaluer le rappel pour les requêtes vectorielles sur un index vectoriel

Vous pouvez trouver le rappel d'une requête vectorielle sur un index vectoriel pour une configuration donnée à l'aide de la fonction evaluate_query_recall. Cette fonction vous permet d'ajuster vos paramètres pour obtenir les résultats de rappel de requête vectorielle souhaités. Le rappel est la métrique utilisée pour la qualité de la recherche. Il est défini comme le pourcentage des résultats renvoyés qui sont objectivement les plus proches des vecteurs de requête. La fonction evaluate_query_recall est activée par défaut.

Trouver le rappel pour une requête vectorielle

  1. Ouvrez un éditeur SQL dans AlloyDB Studio ou un client psql.
  2. Créez un index vectoriel ScaNN, HNSW ou IVFFLAT.

  3. Assurez-vous que l'indicateur enable_indexscan est activé. Si le signalement est désactivé, aucune analyse d'index n'est choisie et le rappel pour tous les index est de 1.

  4. Exécutez la fonction evaluate_query_recall, qui prend la requête comme paramètre et renvoie le rappel suivant :

    SELECT * FROM evaluate_query_recall( QUERY_TEXT, QUERY_TIME_CONFIGURATIONS, INDEX_METHODS )
    

    Avant d'exécuter cette commande, effectuez les remplacements suivants :

    • QUERY_TEXT : requête SQL, entre $$.
    • QUERY_TIME_CONFIGURATIONS: Optional: the configuration that you can set for the ANN query. This must be in JSON format. The default value is NULL.
    • INDEX_METHODS: Optional: a text array that contains different vector index methods for which you want to calculate the recall. If you set an index method for which a corresponding index doesn't exist, the recall is 1. The input must be a subset of {scann, hnsw, ivf, ivfflat}. If no value is provided, the ScaNN method is used.

      To view differences between query recall and execution time, change the query time parameters for your index.

      The following table lists query time parameters for ScaNN, HNSW, and IVF/IVFFLAT index methods. The parameters are formatted as {"scann.num_leaves_to_search":1, "scann.pre_reordering_num_neighbors":10, "hnsw.ef_search": 1}.

      Index type Parameters
      ScaNN
      • scann.num_leaves_to_search
      • scann.pre_reordering_num_neighbors
      • scann.pct_leaves_to_search
      • scann.num_search_threads
      HNSW
      • hnsw.ef_search
      • hnsw.iterative_scan
      • hnsw.max_scan_tuples
      • hnsw.scan_mem_multiplier
      IVF
      • ivf.probes
      IVFFLAT
      • ivfflat.probes
      • ivfflat.iterative_scan
      • ivfflat.max_probes

      For more information about ScaNN index methods, see AlloyDB Omni ScaNN Index reference. For more information about HNSW and IVF/IVFFLAT index methods, see pgvector.

  5. Optional: You can also add configurations from pg_settings to the QUERY_TIME_CONFIGURATIONS. For example, to run a query with columnar engine scan enabled, add the following config from pg_settings as {"google_columnar_engine.enable_columnar_scan" : on}.

    The configurations are set locally in the function. Adding these configurations doesn't impact the configurations that you set in your session. If you don't set any configurations, AlloyDB uses all of the configurations that you set in the session. You can also set only those configurations that are best suited for your use case.

  6. Optional: To view the default configuration settings, run the SHOW command or view the pg_settings.

  7. Optional: If you have a ScaNN index for which you want to tune the recall, see the tuning parameters in ScaNN index reference.

    The following is an example output, where ann_execution_time is the time that it takes a vector query to execute using index scans. ground_truth_execution_time is the time that it takes the query to run using a sequential scan.

    ann_execution_time and ground_truth_execution_time are different from but directly dependent on Execution time in the query plan. Execution time is the total time to execute the query from the client.

    t=# SELECT * FROM evaluate_query_recall( $$ SELECT id FROM t1 ORDER BY val <=> '[1000,1000,49000]' LIMIT 10 $$, '{"scann.num_leaves_to_search":1, "scann.pre_reordering_num_neighbors":10, "hnsw.ef_search": 1}', ARRAY['scann', 'hnsw']);
    NOTICE:  Recall is 1. This might mean that the vector index is not present on the table or index scan not chosen during query execution.
    id|               query                                               |                                         configurations                                         |  recall |ann_execution_time | ground_truth_execution_time |  index_type
    ----+-------------------------------------------------------------------+------------------------------------------------------------------------------------------------+--------+--------------------+-----------------------------+------------
    1 |  SELECT id FROM t1 ORDER BY val <=> '[1000,1000,49000]' LIMIT 10  | {"scann.num_leaves_to_search":1, "scann.pre_reordering_num_neighbors":10, "hnsw.ef_search": 1} |    0.5 |               4.23 |                     118.211 | scann
    2 |  SELECT id FROM t1 ORDER BY val <=> '[1000,1000,49000]' LIMIT 10  | {"scann.num_leaves_to_search":1, "scann.pre_reordering_num_neighbors":10, "hnsw.ef_search": 1} |      1 |            107.198 |                     118.211 | hnsw
    (2 rows)
    
    

    Si le résultat est Recall is 1 (rappel de la requête est 1), cela peut indiquer que l'index vectoriel n'est pas présent dans la table ou qu'il n'a pas été choisi lors de l'exécution de la requête. Cette situation se produit lorsqu'aucun index vectoriel n'existe dans la table ou lorsque le planificateur ne choisit pas l'analyse de l'index vectoriel.

    Si la requête est select id, name from table order by embedding <->'[1,2,3]' LIMIT 10;. et que la valeur attendue du nom de la colonne est NULL, modifiez la requête en l'une des suivantes :

    select id, COALESCE(name, 'NULL') as name from table order by embedding <-> '[1,2,3]' LIMIT 10;
    

    Ou

    select id from table order by embedding <-> '[1,2,3]' LIMIT 10;
    

Étapes suivantes