Misurare il richiamo delle query vettoriali

Questa pagina descrive come misurare il recupero delle query vettoriali in AlloyDB per PostgreSQL. Nel contesto della ricerca vettoriale, il richiamo si riferisce alla percentuale di vettori che l'indice restituisce e che sono veri vicini più prossimi. Ad esempio, se una query sul vicino più prossimo per i 20 vicini più prossimi restituisce 19 dei vicini più prossimi del vero valore, il richiamo è 19/20 x 100 = 95%.

In una query vettoriale, il richiamo è importante perché misura la percentuale di risultati pertinenti recuperati da una ricerca. Il richiamo ti aiuta a valutare l'accuratezza degli risultati di una ricerca del vicino più prossimo approssimativa (ANN) rispetto ai risultati di una ricerca di vicini k più prossimi (KNN).

ANN è un algoritmo che trova punti dati simili a un determinato punto di query e migliora la velocità trovando i vicini approssimativi anziché quelli effettivi. Quando utilizzi le ANN, bilanci la velocità con il richiamo.

KNN è un algoritmo che trova i "k" vettori più simili a un determinato vettore di query all'interno di un set di dati in base a una metrica di somiglianza. k è il numero di vicini che vuoi che la query restituisca.

Puoi misurare il richiamo della query di ricerca vettoriale per diversi indici vettoriali, tra cui:

  • Scalable Nearest Neighbors (ScaNN): un algoritmo per la ricerca di somiglianza vettoriale efficiente.
  • Hierarchical Navigable Small World (HNSW): un algoritmo basato su grafo utilizzato per la ricerca approssimativa del vicino più prossimo nei database di vettori.
  • File invertito con compressione piatta (IVFFLAT) e file invertito piatto (IVF): tipi di indici vettoriali utilizzati per le ricerche ANN, in particolare nei database come l'estensione pgvector PostgreSQL.

Questa pagina presuppone che tu abbia dimestichezza con PostgreSQL, AlloyDB e la ricerca vettoriale.

Prima di iniziare

  1. Installa o aggiorna l'estensione pgvector.

    1. Se l'estensione pgvector non è installata, installa la versione 0.8.0.google-3 o successiva dell'estensione pgvector per memorizzare gli embedding generati come valori vector.vector L'estensione vector include funzioni e operatori pgvector. Google estende questa versione di pgvector con ottimizzazioni per AlloyDB.

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

      Per ulteriori informazioni, consulta Vettori di archiviazione, indicizzazione e query.

    2. Se l'estensione pgvector è già installata, esegui l'upgrade alla versione 0.8.0.google-3 o successiva per ottenere le funzionalità di valutazione del richiamo.vector

      ALTER EXTENSION vector UPDATE TO '0.8.0.google-3';
      
  2. Per creare indici ScaNN, installa l'estensione alloydb_scann.

    CREATE EXTENSION IF NOT EXISTS alloydb_scann;
    

Valutare il recupero per le query vettoriali su un indice vettoriale

Puoi trovare il richiamo per una query vettoriale su un indice vettoriale per una determinata configurazione utilizzando la funzione evaluate_query_recall. Questa funzione ti consente di ottimizzare i parametri per ottenere i risultati di recupero delle query vettoriali che preferisci. Il richiamo è la metrica utilizzata per la qualità della ricerca ed è definita come la percentuale di risultati restituiti oggettivamente più vicini ai vettori di query. La funzione evaluate_query_recall è attiva per impostazione predefinita.

Trovare il richiamo per una query vettoriale

  1. Apri un editor SQL in AlloyDB Studio o un client psql.
  2. Crea un indice vettoriale ScaNN, HNSW o IVFFLAT.

  3. Assicurati che l'indicatore enable_indexscan sia attivo. Se l'indicatore non è attivo, non viene scelta alcuna scansione dell'indice e il richiamo per tutti gli indici è 1.

  4. Esegui la funzione evaluate_query_recall, che riceve la query come parametro e restituisce il seguente richiamo:

    SELECT * FROM evaluate_query_recall( QUERY_TEXT, QUERY_TIME_CONFIGURATIONS, INDEX_METHODS )
    

    Prima di eseguire questo comando, effettua le seguenti sostituzioni:

    • QUERY_TEXT: la query SQL, chiusa tra $$.
    • 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
      • ivf.iterative_scan
      • ivf.max_probes
      IVFFLAT
      • ivfflat.probes
      • ivfflat.iterative_scan
      • ivfflat.max_probes

      For more information about ScaNN index methods, see AlloyDB 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)
    
    

    Se il risultato è Recall is 1 (il richiamo della query è 1), potrebbe indicare che l'indice vettoriale non è presente nella tabella o che l'indice vettoriale non è stato scelto durante l'esecuzione della query. Questa situazione si verifica quando non esiste alcun indice vettoriale nella tabella o quando il pianificatore non sceglie la scansione dell'indice vettoriale.

    Se la query è select id, name from table order by embedding <->'[1,2,3]' LIMIT 10;. e il valore previsto del nome della colonna è NULL, modifica la query in una delle seguenti:

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

    Oppure

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

Passaggi successivi