Práticas recomendadas para indexação vetorial

Nesta página, descrevemos 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

Os valores mais adequados para as opções de índice vetorial dependem do seu caso de uso, do conjunto de dados de vetor e dos vetores de consulta. É possível definir e ajustar esses valores criando um novo índice de vetor e definindo o index_option_list na instrução CREATE VECTOR INDEX. 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.

  • num_leaves: use a raiz quadrada do número de linhas no conjunto de dados. Um valor maior pode aumentar o tempo de criação do índice de vetor. Evite definir num_leaves maior que table_row_count dividido por 1.000, porque isso resulta em folhas muito pequenas e desempenho ruim.

  • 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 * sqrt(table_row_count)).
  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.

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 pior.

Para recriar o índice de vetores sem inatividade:

  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 dos dois tem melhor performance. Se sim, siga para a próxima etapa. Caso contrário, descarte o índice vetorial desatualizado.
  2. O Spanner decide automaticamente qual índice usar na execução da consulta. O Spanner oferece duas maneiras de especificar o índice a ser usado. Escolha um dos seguintes métodos para avaliar e comparar seus índices:

    a. Mude seu aplicativo: é possível 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 ajustar num_leaves_to_search na nova consulta.

    b. Mude seu esquema: defina 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