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 umtree_depthde2. Caso contrário, umtree_depthde3aceita tabelas de até 10 bilhões de linhas. Se não for especificado, o Spanner vai determinar automaticamente o valor detree_depth.num_leaves: recomendamos segmentar de 200 a 1.000 linhas por folha. Um valor maior denum_leavesaumenta 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 denum_leavespodem 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 denum_leaves.num_branches: essa opção só é aplicável quandotree_depthé 3. Recomendamos segmentar de 50 a 500 folhas por ramificação, enum_branchesprecisa ser menor quenum_leaves. Um valor maior denum_branchesaumenta 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 denum_branchespodem 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 denum_branches.num_leaves_to_search: essa opção especifica quantos nós folha do índice são pesquisados. Aumentarnum_leaves_to_searchmelhora 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çãoCREATE VECTOR INDEXcomo o valor denum_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:
- Defina
num_leavescomo um múltiplokdo valor original (por exemplo,2 * (table_row_count / 1000)). - Defina
num_leaves_to_searchcomo o mesmo múltiplo k do valor original. - Tente reduzir
num_leaves_to_searchpara 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.
Aumentar o valor de num_leaves_to_search
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_depthetc.), siga estas etapas:- 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. 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_INDEXe 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 reajustarnum_leaves_to_searchna nova consulta.b. Mude seu esquema: você pode definir a opção
disable_searchem um dos seus índices de vetor. Quando definido comotrue, o Spanner desativa o índice de vetor. Para isso, execute a instrução de mudança de esquemaALTER 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_INDEXpara especificar um índice de vetores que tenha a opçãodisable_searchdefinida comotrue, a consulta vai falhar.Remova o índice vetorial desatualizado.
- Crie um novo índice vetorial na mesma coluna de embedding do índice atual, atualizando os parâmetros (por exemplo,
A seguir
Saiba mais sobre os índices de vetor do Spanner.
Saiba mais sobre os vizinhos mais próximos aproximados do Spanner.
Saiba mais sobre as funções GoogleSQL
APPROXIMATE_COSINE_DISTANCE(),APPROXIMATE_EUCLIDEAN_DISTANCE(),APPROXIMATE_DOT_PRODUCT().Saiba mais sobre as instruções
VECTOR INDEXdo GoogleSQL.