Em uma consulta vetorial, o recall é importante porque mede a porcentagem de resultados relevantes recuperados de uma pesquisa. O recall ajuda a avaliar a acurácia dos resultados de uma pesquisa de vizinho mais próximo aproximado (ANN) em comparação com os resultados de uma pesquisa de vizinhos k-mais próximos (KNN).
O ANN é um algoritmo que encontra pontos de dados semelhantes a um determinado ponto de consulta e melhora a velocidade ao encontrar os vizinhos aproximados em vez dos reais. Ao usar a ANN, você equilibra velocidade e recall.
O KNN é um algoritmo que encontra os k vetores mais semelhantes a um determinado vetor de consulta em um conjunto de dados, com base em uma métrica de similaridade. k é o número de vizinhos que você quer que a consulta retorne.
É possível medir o recall da sua consulta de pesquisa vetorial para diferentes índices de vetor, incluindo:
- Vizinhos mais próximos escalonáveis (ScaNN): um algoritmo para pesquisa eficiente de similaridade vetorial.
- Hierarchical Navigable Small World (HNSW): um algoritmo baseado em gráficos usado para pesquisa eficiente de vizinho mais próximo aproximado em bancos de dados de vetores.
- Arquivo invertido com compactação plana (IVFFLAT) e arquivo invertido plano (IVF):
tipos de índices de vetores usados para pesquisas de ANN, principalmente em bancos de dados
como a extensão
pgvectordo PostgreSQL.
Nesta página, presumimos que você esteja familiarizado com o PostgreSQL, o AlloyDB Omni e a pesquisa vetorial.
Antes de começar
Instale ou atualize a extensão pgvector.
Se a extensão
pgvectornão estiver instalada, instale a versão0.8.0.google-3ou mais recente da extensãovectorpara armazenar embeddings gerados como valoresvector. A extensãovectorinclui funções e operadorespgvector. O Google estende essa versão dopgvectorcom otimizações para o AlloyDB Omni.CREATE EXTENSION IF NOT EXISTS vector WITH VERSION '0.8.0.google-3';Para mais informações, consulte Armazenar, indexar e consultar vetores.
Se a extensão
pgvectorjá estiver instalada, faça upgrade da extensãovectorpara a versão 0.8.0.google-3 ou mais recente para ter recursos de avaliador de recall.ALTER EXTENSION vector UPDATE TO '0.8.0.google-3';
Para criar índices do ScaNN, instale a extensão
alloydb_scann.CREATE EXTENSION IF NOT EXISTS alloydb_scann;
Avaliar o recall de consultas de vetor em um índice de vetor
É possível encontrar o recall de uma consulta de vetor em um índice vetorial para uma determinada configuração usando a função evaluate_query_recall. Com essa função, é possível ajustar os parâmetros para alcançar os resultados de recall da consulta de vetor desejados.
O recall é a métrica usada para a qualidade da pesquisa e é definida como a porcentagem dos resultados retornados que estão objetivamente mais próximos dos vetores de consulta. A função evaluate_query_recall fica ativada por padrão.
Encontrar o recall de uma consulta de vetor
- Abra um editor de SQL no
AlloyDB Studio
ou um cliente
psql. Verifique se a flag
enable_indexscanestá ativada. Se a flag estiver desativada, nenhuma verificação de índice será escolhida, e o recall de todos os índices será 1.Execute a função
evaluate_query_recall, que usa a consulta como um parâmetro e retorna o seguinte recall:SELECT * FROM evaluate_query_recall( QUERY_TEXT, QUERY_TIME_CONFIGURATIONS, INDEX_METHODS )Antes de executar esse comando, faça as seguintes substituições:
QUERY_TEXT: a consulta 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_searchscann.pre_reordering_num_neighborsscann.pct_leaves_to_searchscann.num_search_threads
HNSW hnsw.ef_searchhnsw.iterative_scanhnsw.max_scan_tupleshnsw.scan_mem_multiplier
IVF ivf.probes
IVFFLAT ivfflat.probesivfflat.iterative_scanivfflat.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_settingsto theQUERY_TIME_CONFIGURATIONS. For example, to run a query with columnar engine scan enabled, add the following config frompg_settingsas{"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
SHOWcommand 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_timeis the time that it takes a vector query to execute using index scans.ground_truth_execution_timeis the time that it takes the query to run using a sequential scan.ann_execution_timeandground_truth_execution_timeare 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 o resultado for
Recall is 1(o recall da consulta é1), isso pode indicar que o índice vetorial não está presente na tabela ou que não foi escolhido durante a execução da consulta. Isso acontece quando não há um índice de vetor na tabela ou quando o planejador não escolhe a verificação do índice de vetor.Se a consulta for
select id, name from table order by embedding <->'[1,2,3]' LIMIT 10;.e o valor esperado do nome da coluna forNULL, mude a consulta para uma das seguintes opções:select id, COALESCE(name, 'NULL') as name from table order by embedding <-> '[1,2,3]' LIMIT 10;Ou
select id from table order by embedding <-> '[1,2,3]' LIMIT 10;
A seguir
- Crie um índice do ScaNN.
- Armazenar, indexar e consultar vetores.
- Ajustar o desempenho da consulta de vetores.