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
Installieren oder aktualisieren Sie die pgvector-Erweiterung.
Wenn die
pgvector
-Erweiterung nicht installiert ist, installieren Sie dievector
-Erweiterungsversion0.8.0.google-3
oder höher, um generierte Einbettungen alsvector
-Werte zu speichern. Dievector
-Erweiterung enthältpgvector
-Funktionen und ‑Operatoren. Google erweitert diese Version vonpgvector
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.
Wenn die
pgvector
-Erweiterung bereits installiert ist, führen Sie ein Upgrade dervector
-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';
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
- Öffnen Sie einen SQL-Editor in AlloyDB Studio oder einen
psql
-Client. 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.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 isNULL
.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 is1
. 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
.
Optional: You can also add configurations from
pg_settings
to theQUERY_TIME_CONFIGURATIONS
. For example, to run a query with columnar engine scan enabled, add the following config frompg_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.
Optional: To view the default configuration settings, run the
SHOW
command or view thepg_settings
.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
andground_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 ist1
) 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
- ScaNN-Index erstellen
- Vektoren speichern, indexieren und abfragen.
- Leistung von Vektorabfragen optimieren