Abruf von Vektorabfragen messen

Wählen Sie eine Dokumentationsversion aus:

Auf dieser Seite wird beschrieben, wie Sie den Recall von Vektorabfragen in AlloyDB Omni messen. Im Kontext der Vektorsuche bezieht sich die Trefferquote auf den Prozentsatz der Vektoren, die vom Index zurückgegeben werden und die tatsächlichen nächsten Nachbarn sind. Wenn z. B. eine Abfrage nach 20 nächsten Nachbarn 19 der „grundlegend echten“ nächsten Nachbarn zurückgibt, beträgt der Recall 19/20 × 100 = 95%.

Bei einer Vektoranfrage ist der Recall wichtig, da er den Prozentsatz der relevanten Ergebnisse misst, die bei einer Suche abgerufen werden. Mithilfe der Trefferquote können Sie die Genauigkeit der Ergebnisse einer ANN-Suche (Approximate Nearest Neighbor) im Vergleich zu den Ergebnissen einer KNN-Suche (K-Nearest Neighbors) bewerten.

ANN ist ein Algorithmus, der Datenpunkte findet, die einem bestimmten Abfragepunkt ähneln. Er verbessert die Geschwindigkeit, indem er die ungefähren Nachbarn anstelle der tatsächlichen Nachbarn findet. Wenn Sie ANN verwenden, wägen Sie Geschwindigkeit und Recall gegeneinander ab.

KNN ist ein Algorithmus, der anhand eines Ähnlichkeitsmesswerts die k ähnlichsten Vektoren zu einem bestimmten Anfragevektor in einem Dataset findet. k ist die Anzahl der Nachbarn, die von der Anfrage zurückgegeben werden sollen.

Sie können den Recall Ihrer Vektorsuchanfrage für verschiedene Vektorindexe messen, darunter:

  • Scalable Nearest Neighbors (ScaNN): ein Algorithmus für die effiziente Suche nach Vektorähnlichkeiten.
  • Hierarchical Navigable Small World (HNSW): Ein auf Grafiken basierender Algorithmus, der für die effiziente Suche nach dem nächsten Nachbarn in Vektordatenbanken verwendet wird.
  • Inverted File with Flat Compression (IVFFLAT) und Inverted File Flat (IVF): Arten von Vektorindexen, die für ANN-Suchen verwendet werden, insbesondere in Datenbanken wie der PostgreSQL-Erweiterung pgvector.

Auf dieser Seite wird davon ausgegangen, dass Sie mit PostgreSQL, AlloyDB Omni und der Vektorsuche vertraut sind.

Hinweise

  1. Installieren oder aktualisieren Sie die pgvector-Erweiterung.

    1. Wenn die pgvector-Erweiterung nicht installiert ist, installieren Sie die vector-Erweiterungsversion 0.8.0.google-3 oder höher, um generierte Einbettungen als vector-Werte zu speichern. Die vector-Erweiterung enthält pgvector-Funktionen und ‑Operatoren. Google erweitert diese Version von pgvector um Optimierungen für AlloyDB Omni.

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

      Weitere Informationen finden Sie unter Vektoren speichern, indexieren und abfragen.

    2. Wenn die pgvector-Erweiterung bereits installiert ist, führen Sie ein Upgrade der vector-Erweiterung auf Version 0.8.0.google-3 oder höher durch, um die Funktionen des Recall-Evaluators zu erhalten.

      ALTER EXTENSION vector UPDATE TO '0.8.0.google-3';
      
  2. Wenn Sie ScaNN-Indizes erstellen möchten, müssen Sie die alloydb_scann-Erweiterung installieren.

    CREATE EXTENSION IF NOT EXISTS alloydb_scann;
    

Recall für Vektoranfragen in einem Vektorindex auswerten

Mit der Funktion evaluate_query_recall können Sie den Recall für eine Vektoranfrage für einen Vektorindex für eine bestimmte Konfiguration ermitteln. Mit dieser Funktion können Sie Ihre Parameter so anpassen, dass Sie die gewünschten Recall-Ergebnisse für Vektorabfragen erzielen. Recall ist der Messwert für die Suchqualität und wird als Prozentsatz der zurückgegebenen Ergebnisse definiert, die den Anfragevektoren objektiv am nächsten sind. Die Funktion evaluate_query_recall ist standardmäßig aktiviert.

Recall für eine Vektorabfrage ermitteln

  1. Öffnen Sie einen SQL-Editor in AlloyDB Studio oder einen psql-Client.
  2. ScaNN-, HNSW- oder IVFFLAT-Vektorindex erstellen

  3. Prüfen Sie, ob das enable_indexscan-Flag aktiviert ist. Wenn das Flag deaktiviert ist, wird kein Indexscan ausgewählt und der Recall für alle Indexe ist 1.

  4. Führen Sie die Funktion evaluate_query_recall aus. Sie verwendet die Abfrage als Parameter und gibt den folgenden Recall zurück:

    SELECT * FROM evaluate_query_recall( QUERY_TEXT, QUERY_TIME_CONFIGURATIONS, INDEX_METHODS )
    

    Ersetzen Sie vor dem Ausführen dieses Befehls die folgenden Werte:

    • QUERY_TEXT: die SQL-Abfrage, eingeschlossen in $$.
    • 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)
    
    

    Wenn das Ergebnis Recall is 1 (Recall der Abfrage ist 1) lautet, kann das darauf hindeuten, dass der Vektorindex nicht in der Tabelle vorhanden ist oder dass er während der Abfrageausführung nicht ausgewählt wurde. Dies ist der Fall, wenn in der Tabelle kein Vektorindex vorhanden ist oder der Planer den Vektorindexscan nicht auswählt.

    Wenn die Abfrage select id, name from table order by embedding <->'[1,2,3]' LIMIT 10;. lautet und der erwartete Wert des Spaltennamens NULL ist, ändern Sie die Abfrage in eine der folgenden:

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

    Oder

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

Nächste Schritte