Práticas recomendadas para indexação vetorial

Esta página descreve as práticas recomendadas de indexação de vetores que otimizam seus índices de vetores e melhoram os resultados de consultas de vizinho mais próximo aproximado (ANN).

Ajustar as opções de pesquisa de vetor

Se você não especificar nenhuma opção de índice vetorial, o Spanner vai tentar escolher opções otimizadas automaticamente. Para usuários avançados que querem ajustar as opções de índice de vetor para a carga de trabalho específica, é possível definir e ajustar esses valores criando um novo índice de vetor e definindo index_option_list na instrução CREATE VECTOR INDEX. Os valores mais adequados para as opções de índice vetorial dependem do caso de uso, do conjunto de dados de vetores e dos vetores de consulta. Talvez seja necessário fazer um ajuste iterativo para encontrar os melhores valores para sua carga de trabalho específica.

Confira algumas diretrizes úteis para escolher valores adequados:

  • tree_depth (nível da árvore): se a tabela que você está indexando tiver menos de 10 milhões de linhas, use um tree_depth de 2. Caso contrário, um tree_depth de 3 aceita tabelas de até 10 bilhões de linhas. Se não for especificado, o Spanner vai determinar automaticamente o valor de tree_depth.

  • num_leaves: recomendamos segmentar de 200 a 1.000 linhas por folha. Um valor maior de num_leaves aumenta o tempo de build do índice de vetor, mas pode reduzir o custo da consulta para um recall desejado específico. No entanto, valores muito grandes de num_leaves podem fazer com que o custo da consulta aumente novamente devido aos sobrecargas associadas à pesquisa de muitos clusters de folha muito pequenos. Se não for especificado, o Spanner vai determinar automaticamente o valor de num_leaves.

  • num_branches: essa opção só é aplicável quando tree_depth é 3. Recomendamos segmentar de 50 a 500 folhas por ramificação, e num_branches precisa ser menor que num_leaves. Um valor maior de num_branches aumenta o tempo de build do índice de vetor, mas pode reduzir o custo da consulta para um recall de destino específico. No entanto, valores muito grandes de num_branches podem fazer com que o custo da consulta aumente novamente devido às sobrecargas associadas à pesquisa de muitos clusters de folha muito pequenos. Se não for especificado, o Spanner vai determinar automaticamente o valor de num_branches.

  • num_leaves_to_search: essa opção especifica quantos nós folha do índice são pesquisados. Aumentar num_leaves_to_search melhora o recall, mas também aumenta a latência e o custo. Recomendamos usar um número que seja 1% do número total de folhas definidas na instrução CREATE VECTOR INDEX como o valor de num_leaves_to_search. Se você estiver usando uma cláusula de filtro, aumente esse valor para ampliar a pesquisa.

Se um recall aceitável for alcançado, mas o custo da consulta for muito alto, resultando em um QPS máximo baixo, tente aumentar num_leaves seguindo estas etapas:

  1. Defina num_leaves como um múltiplo k do valor original (por exemplo, 2 * (table_row_count / 1000)).
  2. Defina num_leaves_to_search como o mesmo múltiplo k do valor original.
  3. Tente reduzir num_leaves_to_search para melhorar o custo e o QPS, mantendo o recall.

Determinar valores de opção de pesquisa de vetor

Para determinar os parâmetros tree_depth, num_leaves e num_branches que o Spanner está usando para o índice de vetores, consulte a visualização INFORMATION_SCHEMA.INDEX_OPTIONS. Os valores de parâmetro podem ser um pouco diferentes dos valores especificados explicitamente durante a criação do índice porque o Spanner às vezes os ajusta para se adequarem melhor aos seus dados. Se você não especificou esses parâmetros, a visualização INFORMATION_SCHEMA.INDEX_OPTIONS mostra os valores escolhidos pelo Spanner.

Execute esta consulta para mostrar os valores dos parâmetros:

SELECT
  opt.option_name,
  opt.option_type,
  opt.option_value
FROM
  INFORMATION_SCHEMA.INDEX_OPTIONS AS opt
WHERE
  opt.index_name = @vector_index_name;

A consulta retorna linhas, incluindo option_name: system_optimized_tree_depth, system_optimized_num_leaves e system_optimized_num_branches, que refletem os parâmetros usados pelo índice.

Melhorar o recall

Para melhorar o recall, ajuste o valor de num_leaves_to_search ou recrie o índice de vetor.

Se o valor de num_leaves_to_search for muito pequeno, talvez seja mais difícil encontrar os vizinhos mais próximos para alguns vetores de consulta. Criar um novo índice vetorial com um valor num_leaves_to_search maior pode ajudar a melhorar o recall pesquisando mais folhas. As consultas recentes podem conter mais desses vetores desafiadores.

Recriar o índice vetorial

A estrutura de árvore do índice de vetor é otimizada para o conjunto de dados no momento da criação e permanece estática depois disso. Portanto, se vetores significativamente diferentes forem adicionados após a criação do índice de vetor inicial, a estrutura de árvore poderá ser inadequada, resultando em uma recuperação mais baixa.

Para atualizar seu índice de vetores sem tempo de inatividade, escolha uma das seguintes opções:

  • Opção 1: reindexação no local com as mesmas opções (usando DDL)

    Se você quiser fazer uma reindexação no local do seu índice de vetor com as mesmas opções de índice, emita a seguinte instrução DDL, dependendo do dialeto do banco de dados. A reindexação ocorre em segundo plano e permite que as operações de leitura e gravação no índice continuem.

    GoogleSQL

    ALTER VECTOR INDEX IncidentVectorIndex REBUILD;
    

    PostgreSQL

    REINDEX INDEX CONCURRENTLY incidentvectorindex;
    
  • Opção 2: reindexar manualmente com opções modificadas

    Se você precisar mudar as opções de índice (como num_leaves, tree_depth etc.), siga estas etapas:

    1. Crie um novo índice vetorial na mesma coluna de embedding do índice atual, atualizando os parâmetros (por exemplo, OPTIONS) conforme necessário. Depois que a criação do índice for concluída, avalie qual deles tem melhor performance.
    2. O Spanner decide automaticamente qual índice usar na execução da consulta. Escolha um dos métodos a seguir para avaliar e comparar seus índices:

      a. Mude seu aplicativo: você pode atualizar um subconjunto de consultas para que elas usem a dica FORCE_INDEX e apontem para o novo índice para atualizar a consulta de pesquisa de vetor. Isso garante que a consulta use o novo índice de vetor. Ao usar esse método, talvez seja necessário reajustar num_leaves_to_search na nova consulta.

      b. Mude seu esquema: você pode definir a opção disable_search em um dos seus índices de vetor. Quando definido como true, o Spanner desativa o índice de vetor. Para isso, execute a instrução de mudança de esquema ALTER VECTOR INDEX:

         ALTER VECTOR INDEX IncidentVectorIndex SET OPTIONS (disable_search=true);
      

      Esse método impede que o Spanner use esse índice de vetor no seu banco de dados. Se você tiver dois índices e definir essa opção no mais antigo, todas as consultas usarão o novo índice depois que a mudança de esquema for aplicada. Se você usar a dica FORCE_INDEX para especificar um índice de vetores que tenha a opção disable_search definida como true, a consulta vai falhar.

    3. Remova o índice vetorial desatualizado.

A seguir