En una consulta vectorial, la recuperación es importante porque mide el porcentaje de resultados relevantes obtenidos de una búsqueda. La recuperación te ayuda a evaluar la precisión de los resultados de una búsqueda del vecino más cercano aproximado (ANN) en comparación con los resultados de una búsqueda de k vecinos más cercanos (KNN).
ANN es un algoritmo que busca puntos de datos similares a un punto de consulta determinado y mejora la velocidad al encontrar los vecinos aproximados en lugar de los reales. Cuando usas una ANN, equilibras la velocidad con el recuerdo.
KNN es un algoritmo que busca los k vectores más similares a un vector de consulta determinado en un conjunto de datos, en función de una métrica de similitud. k es el número de vecinos que quieres que devuelva la consulta.
Puedes medir la recuperación de tu consulta de búsqueda vectorial para diferentes índices vectoriales, incluidos los siguientes:
- Vecinos más cercanos escalables (ScaNN): un algoritmo para la búsqueda eficiente de similitud de vectores.
- HNSW (Hierarchical Navigable Small World): algoritmo basado en gráficos que se usa para realizar búsquedas eficientes del vecino más cercano aproximado en bases de datos vectoriales.
- Archivo invertido con compresión plana (IVFFLAT) y archivo invertido plano (IVF):
tipos de índices vectoriales que se usan en búsquedas de vecinos más cercanos aproximados (ANN), sobre todo en bases de datos
como la extensión
pgvector
de PostgreSQL.
En esta página se da por hecho que conoces PostgreSQL, AlloyDB Omni y la búsqueda vectorial.
Antes de empezar
Instala o actualiza la extensión pgvector.
Si la extensión
pgvector
no está instalada, instala la versión0.8.0.google-3
o una posterior de la extensiónvector
para almacenar las inserciones generadas como valoresvector
. La extensiónvector
incluye funciones y operadores depgvector
. Google amplía esta versión depgvector
con optimizaciones para AlloyDB Omni.CREATE EXTENSION IF NOT EXISTS vector WITH VERSION '0.8.0.google-3';
Para obtener más información, consulta Almacenar, indexar y consultar vectores.
Si la extensión
pgvector
ya está instalada, actualiza la extensiónvector
a la versión 0.8.0.google-3 o posterior para obtener las funciones de evaluador de recordatorio.ALTER EXTENSION vector UPDATE TO '0.8.0.google-3';
Para crear índices de ScaNN, instala la extensión
alloydb_scann
.CREATE EXTENSION IF NOT EXISTS alloydb_scann;
Evaluar la recuperación de consultas vectoriales en un índice vectorial
Puedes consultar el recall de una consulta de vector en un índice de vector para una configuración determinada mediante la función evaluate_query_recall
. Esta función te permite ajustar los parámetros para obtener los resultados de recuperación de consultas vectoriales que quieras.
La retirada es la métrica que se usa para medir la calidad de la búsqueda y se define como el porcentaje de los resultados devueltos que están objetivamente más cerca de los vectores de consulta. La función evaluate_query_recall
está activada de forma predeterminada.
Hallar la recuperación de una consulta vectorial
- Abre un editor de SQL en AlloyDB Studio o un cliente de
psql
. Comprueba que la opción
enable_indexscan
Bandera esté activada. Si la marca está desactivada, no se elige ningún análisis de índice y el recuerdo de todos los índices es 1.Ejecuta la función
evaluate_query_recall
, que toma la consulta como parámetro y devuelve el siguiente recuerdo:SELECT * FROM evaluate_query_recall( QUERY_TEXT, QUERY_TIME_CONFIGURATIONS, INDEX_METHODS )
Antes de ejecutar este comando, haz las siguientes sustituciones:
QUERY_TEXT
: la consulta de 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 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)
Si el resultado es
Recall is 1
(la recuperación de la consulta es1
), puede indicar que el índice vectorial no está presente en la tabla o que no se ha elegido durante la ejecución de la consulta. Esta situación se produce cuando no hay ningún índice vectorial en la tabla o cuando el planificador no elige el análisis del índice vectorial.Si la consulta es
select id, name from table order by embedding <->'[1,2,3]' LIMIT 10;.
y el valor esperado del nombre de la columna es
NULL
, cambia la consulta por una de las siguientes:select id, COALESCE(name, 'NULL') as name from table order by embedding <-> '[1,2,3]' LIMIT 10;
O
select id from table order by embedding <-> '[1,2,3]' LIMIT 10;
Siguientes pasos
- Crea un índice de ScaNN.
- Almacenar, indexar y consultar vectores.
- Ajustar el rendimiento de las consultas vectoriales