Abruf von Vektorabfragen messen

Auf dieser Seite wird beschrieben, wie Sie die Abrufrate von Vektorabfragen in AlloyDB for PostgreSQL messen. Im Kontext der Vektorsuche bezieht sich die Trefferquote auf den Prozentsatz der vom Index zurückgegebenen Vektoren, die echte 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/20x100 = 95%.

Bei einer Vektorabfrage ist die Trefferquote wichtig, da damit der Prozentsatz der relevanten Ergebnisse gemessen wird, die bei einer Suche zurückgegeben werden. Mit 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 Neighbor) 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, können Sie Geschwindigkeit und Abrufleistung in Einklang bringen.

KNN ist ein Algorithmus, der anhand eines Ähnlichkeitsmaßes die „k“ Ähnlichsten Vektoren zu einem bestimmten Abfragevektor in einem Datensatz findet. k ist die Anzahl der Nachbarn, die von der Abfrage zurückgegeben werden sollen.

Sie können die Trefferquote Ihrer Vektorsuchabfrage für verschiedene Vektorindizes messen, darunter:

  • Scalable Nearest Neighbors (ScaNN): ein Algorithmus für die effiziente Suche nach Vektorähnlichkeiten.
  • Hierarchical Navigable Small World (HNSW): Ein graphenbasierter Algorithmus, der für eine effiziente Suche nach dem ungefähren 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 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 pgvector-Operatoren. Google erweitert diese Version von pgvector um Optimierungen für AlloyDB.

      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 auf Version 0.8.0.google-3 oder höher aus, um die Funktionen der Abrufbewerter zu nutzen.vector

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

    CREATE EXTENSION IF NOT EXISTS alloydb_scann;
    

Recall für Vektorabfragen in einem Vektorindex bewerten

Mit der Funktion evaluate_query_recall können Sie den Recall für eine Vektorabfrage in einem Vektorindex für eine bestimmte Konfiguration ermitteln. Mit dieser Funktion können Sie Ihre Parameter optimieren, um die gewünschten Ergebnisse für die Aufzählung von Ergebnissen bei der Vektorabfrage zu erzielen. Der Recall ist der Messwert für die Suchqualität. Er wird als Prozentsatz der zurückgegebenen Ergebnisse definiert, die objektiv den Abfragevektoren 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. Erstellen Sie einen ScaNN-, HNSW- oder IVFFLAT-Vektorindex.

  3. Das Flag enable_indexscan muss aktiviert sein. Wenn das Flag deaktiviert ist, wird kein Indexscan ausgewählt und die Rückrufrate für alle Indexe ist 1.

  4. Führen Sie die Funktion evaluate_query_recall aus, die die Abfrage als Parameter entgegennimmt und die folgende Erinnerung zurückgibt:

    SELECT * FROM evaluate_query_recall( QUERY_TEXT, QUERY_TIME_CONFIGURATIONS, INDEX_METHODS )
    

    Bevor Sie diesen Befehl ausführen, ersetzen Sie die folgenden Werte:

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

    Wenn das Ergebnis Recall is 1 ist (Abruf der Abfrage ist 1), kann das darauf hindeuten, dass der Vektorindex nicht in der Tabelle vorhanden ist oder dass er bei der Abfrageausführung nicht ausgewählt wurde. Das ist der Fall, wenn für die Tabelle kein Vektorindex vorhanden ist oder der Planer den Vektorindex-Scan 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