Os parâmetros recomendados para o índice ScaNN
variam dependendo se você escolhe criar um índice de árvore de dois ou três níveis. Esta página
fornece recomendações sobre como ajustar os parâmetros de índice do AlloyDB para PostgreSQL
para um equilíbrio ideal entre recall e QPS.
Criação de índice do ScaNN
Para mais informações, consulte a referência do índice ScaNN.
Índice de árvore de dois níveis
Para aplicar recomendações que ajudam a encontrar os valores ideais de num_leaves
e num_leaves_to_search
para seu conjunto de dados, siga estas etapas recomendadas:
- Para criar o índice
ScaNN
otimizado para os casos a seguir, defina o parâmetronum_leaves
com o valor abaixo, em que "rows" é o número de linhas na tabela indexada:- tempo e qualidade de build de índice equilibrados definem
num_leaves
comosqrt(rows)
. - quality define num_leaves como rows/100.
- tempo e qualidade de build de índice equilibrados definem
- Execute as consultas de teste, aumentando o valor de
scann.num_of_leaves_to_search
até atingir o intervalo de recall desejado, por exemplo, 95%. Para mais informações sobre como analisar suas consultas, consulte Analisar suas consultas. - Anote a proporção entre
scann.num_leaves_to_search
enum_leaves
, que será usada nas próximas etapas. Essa proporção fornece uma aproximação do conjunto de dados que vai ajudar você a alcançar a acurácia desejada.
Se você estiver trabalhando com vetores de alta dimensão (500 dimensões ou mais) e quiser melhorar a acurácia, ajuste o valor descann.pre_reordering_num_neighbors
. O valor padrão é definido como500 * K
, em queK
é o limite definido na consulta. - Se o QPS estiver muito baixo depois que as consultas atingirem uma taxa de recall desejada, siga estas etapas:
- Recrie o índice, aumentando o valor de
num_leaves
escann.num_leaves_to_search
de acordo com as seguintes orientações:- Defina
num_leaves
como um fator maior da raiz quadrada da contagem de linhas. Por exemplo, se o índice tivernum_leaves
definido como a raiz quadrada da contagem de linhas, tente definir como o dobro da raiz quadrada. Se o valor já for duplo, tente definir como o triplo da raiz quadrada. - Aumente
scann.num_leaves_to_search
conforme necessário para manter a proporção comnum_leaves
, que você anotou na etapa 3. - Defina
num_leaves
como um valor menor ou igual à contagem de linhas dividida por 100.
- Defina
- Execute as consultas de teste novamente.
Enquanto executa as consultas de teste, tente reduzir
scann.num_leaves_to_search
e encontre um valor que aumente as QPS e mantenha o recall alto. Teste valores diferentes descann.num_leaves_to_search
sem reconstruir o índice.
- Recrie o índice, aumentando o valor de
- Repita a etapa 4 até que o QPS e o intervalo de recall atinjam valores aceitáveis.
Índice de árvore de três níveis
Além das recomendações para o índice de árvore de dois níveis ScaNN
, use as orientações a seguir.
Para aplicar recomendações e encontrar o valor ideal dos parâmetros de índice num_leaves
e max_num_levels
, siga estas etapas:
Crie o índice
ScaNN
com as seguintes combinações denum_leaves
emax_num_levels
com base nas suas metas de performance:- equilibrar tempo de build e qualidade do índice: defina
max_num_levels
como2
enum_leaves
comopower(rows, ⅔)
. - Otimizar para qualidade: defina
max_num_levels
como2
enum_leaves
comorows/100
.
- equilibrar tempo de build e qualidade do índice: defina
Execute suas consultas de teste. Para mais informações sobre como analisar consultas, consulte Analisar suas consultas.
Anote a proporção entre
scann.num_leaves_to_search
enum_leaves
que será usada nas próximas etapas. Essa proporção fornece uma aproximação do conjunto de dados que vai ajudar você a alcançar o recall desejado.
Se você estiver trabalhando com vetores de alta dimensão (500 dimensões ou mais) e quiser melhorar o recall, ajuste o valor de scann.pre_reordering_num_neighbors
. O valor padrão é definido como 500 * K
, em que K
é o limite definido na consulta.
Se a QPS estiver muito baixa depois que as consultas atingirem uma meta de recall, siga estas etapas:
- Recrie o índice, aumentando o valor de
num_leaves
escann.num_leaves_to_search
de acordo com as seguintes orientações: - Defina
num_leaves
como um fator maior depower(rows, ⅔)
. Por exemplo, se o índice tivernum_leaves
definido comopower(rows, ⅔)
, tente definir como o dobro depower(rows, ⅔)
. Se o valor já for o dobro, tente definir como o triplo depower(rows, ⅔)
. - Aumente
scann.num_leaves_to_search
conforme necessário para manter a proporção comnum_leaves
, que você anotou na etapa 3. - Defina
num_leaves
com um valor menor ou igual arows/100
. - Execute as consultas de teste novamente. Enquanto executa as consultas de teste, tente reduzir
scann.num_leaves_to_search
e encontre um valor que aumente as QPS e mantenha o recall alto. Teste valores diferentes descann.num_leaves_to_search
sem reconstruir o índice.
- Recrie o índice, aumentando o valor de
Repita a etapa 4 até que o QPS e o intervalo de recall atinjam valores aceitáveis.
Melhorar a recuperação de pesquisas filtradas
Ao realizar uma pesquisa de vetor de vizinho k-mais perto (KNN) que inclui um filtro, você pode encontrar situações em que a consulta retorna menos resultados do que o solicitado na cláusula LIMIT
. Isso pode levar ao que é conhecido como recall insuficiente e é mais provável de ocorrer ao usar filtros altamente seletivos. Isso acontece porque as partições ou folhas iniciais que o ScaNN pesquisa não contêm vetores suficientes que atendam às condições do filtro.
Para resolver isso, o AlloyDB oferece um recurso que permite que a pesquisa se expanda dinamicamente além do conjunto inicial de folhas para encontrar resultados correspondentes suficientes.
Como funciona o streaming
Para ativar a funcionalidade de streaming, defina o parâmetro scann.satisfy_limit
como relaxed_order
. Quando ativada, a verificação de vetor continua pesquisando outras partições de folha até encontrar resultados suficientes para atender ao LIMIT
da sua consulta, melhorando assim o recall.
Para evitar que uma pesquisa continue por muito tempo e controlar o impacto no desempenho, use o parâmetro scann.max_pct_leaves_to_search
. Essa configuração funciona como uma proteção ao definir um limite superior para a porcentagem do total de folhas que uma consulta pode visitar. O valor padrão é 15%
.
Quando usar o streaming
Considere usar o recurso de transmissão quando:
- Você usa filtros com suas pesquisas vetoriais.
- Você percebe que suas consultas retornam menos resultados do que o esperado com base na cláusula
LIMIT
.
Ao ativar o scann.satisfy_limit
, você melhora a recuperação das suas pesquisas filtradas. Também é recomendável configurar scann.max_pct_leaves_to_search
para alcançar o equilíbrio entre recall e desempenho da consulta.
Manutenção de índice
Se a sua tabela está sujeita a atualizações ou inserções frequentes, recomendamos reindexar periodicamente o índice ScaNN
atual para melhorar a acurácia de recall.
Você pode monitorar as métricas de índice para visualizar mudanças nas distribuições de vetores ou mutações de vetores desde que o índice foi criado e, em seguida, reindexá-lo corretamente. Para mais informações sobre métricas, consulte Visualizar métricas de índice vetorial.