Meça a capacidade de memorização de consultas de vetores

Esta página descreve como medir a capacidade de obtenção de consultas vetoriais no AlloyDB para PostgreSQL. No contexto da pesquisa vetorial, a relembrança refere-se à percentagem de vetores que o índice devolve e que são os verdadeiros vizinhos mais próximos. Por exemplo, se uma consulta de vizinho mais próximo para os 20 vizinhos mais próximos devolver 19 dos vizinhos mais próximos da verdade fundamental, a taxa de recall é de 19/20 x 100 = 95%.

Numa consulta vetorial, a capacidade de resposta é importante porque mede a percentagem de resultados relevantes obtidos a partir de uma pesquisa. A funcionalidade Recall ajuda a avaliar a precisão dos resultados de uma pesquisa de vizinho mais próximo aproximado (ANN) em comparação com os resultados de uma pesquisa de k-vizinhos mais próximos (KNN).

ANN é um algoritmo que encontra pontos de dados semelhantes a um ponto de consulta fornecido e melhora a velocidade ao encontrar os vizinhos aproximados em vez dos vizinhos reais. Quando usa a RNA, equilibra a velocidade com a capacidade de memorização.

O KNN é um algoritmo que encontra os "k" vetores mais semelhantes a um determinado vetor de consulta num conjunto de dados, com base numa métrica de semelhança. k é o número de vizinhos que quer que a consulta devolva.

Pode medir a capacidade de memorização da sua consulta de pesquisa vetorial para diferentes índices vetoriais, incluindo o seguinte:

  • Scalable Nearest Neighbors (ScaNN): um algoritmo para uma pesquisa eficiente de similaridade de vetores.
  • Hierarchical Navigable Small World (HNSW): um algoritmo baseado em grafos usado para a pesquisa eficiente de vizinhos mais próximos aproximados em bases de dados vetoriais.
  • Ficheiro invertido com compressão simples (IVFFLAT) e ficheiro invertido simples (IVF): tipos de índices vetoriais usados para pesquisas de ANN, particularmente em bases de dados como a extensão pgvector do PostgreSQL.

Esta página pressupõe que tem conhecimentos do PostgreSQL, do AlloyDB e da pesquisa vetorial.

Antes de começar

  1. Instale ou atualize a extensão pgvector.

    1. Se a extensão pgvector não estiver instalada, instale a versão vector ou posterior da extensão para armazenar as incorporações geradas como valores vector.0.8.0.google-3 A extensão vector inclui pgvector funções e operadores. A Google expande esta versão do pgvector com otimizações para o AlloyDB.

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

      Para mais informações, consulte o artigo Armazene, indexe e consulte vetores.

    2. Se a extensão pgvector já estiver instalada, atualize-a para a versão 0.8.0.google-3 ou posterior para ter acesso às capacidades do avaliador de recolha.vector

      ALTER EXTENSION vector UPDATE TO '0.8.0.google-3';
      
  2. Para criar índices ScaNN, instale a extensão alloydb_scann.

    CREATE EXTENSION IF NOT EXISTS alloydb_scann;
    

Avalie a capacidade de memorização para consultas de vetores num índice de vetores

Pode encontrar a revocação de uma consulta vetorial num índice vetorial para uma determinada configuração através da função evaluate_query_recall. Esta função permite-lhe ajustar os parâmetros para alcançar os resultados de recall da consulta vetorial pretendidos. A recolha é a métrica usada para a qualidade da pesquisa e é definida como a percentagem dos resultados devolvidos que estão objetivamente mais próximos dos vetores de consulta. A função evaluate_query_recall está ativada por predefinição.

Encontre a capacidade de memorização para uma consulta vetorial

  1. Abra um editor de SQL no AlloyDB Studio ou abra um cliente psql.
  2. Crie um índice de vetores ScaNN, HNSW ou IVFFLAT.

  3. Certifique-se de que a enable_indexscan opção está ativada. Se a flag estiver desativada, não é escolhida nenhuma análise de índice e a taxa de recolha para todos os índices é 1.

  4. Execute a função evaluate_query_recall, que recebe a consulta como um parâmetro e devolve a seguinte anulação:

    SELECT * FROM evaluate_query_recall( QUERY_TEXT, QUERY_TIME_CONFIGURATIONS, INDEX_METHODS )
    

    Antes de executar este 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 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)
    
    

    Se o resultado for Recall is 1 (a obtenção da consulta é 1), isto pode indicar que o índice vetorial não está presente na tabela ou que o índice vetorial não foi escolhido durante a execução da consulta. Esta situação ocorre quando não existe um índice vetorial na tabela ou quando o planeador não escolhe a análise do índice vetorial.

    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 for NULL, altere a consulta para uma das seguintes:

    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;
    

O que se segue?