Práticas recomendadas para ajustar índices ScaNN no AlloyDB para PostgreSQL

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:

  1. Para criar o índice ScaNN otimizado para os casos a seguir, defina o parâmetro num_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 como sqrt(rows).
    • quality define num_leaves como rows/100.
  2. 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.
  3. Anote a proporção entre scann.num_leaves_to_search e num_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 de scann.pre_reordering_num_neighbors. O valor padrão é definido como 500 * K, em que K é o limite definido na consulta.
  4. Se o QPS estiver muito baixo depois que as consultas atingirem uma taxa de recall desejada, siga estas etapas:
    1. Recrie o índice, aumentando o valor de num_leaves e scann.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 tiver num_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 com num_leaves, que você anotou na etapa 3.
      • Defina num_leaves como um valor menor ou igual à contagem de linhas dividida por 100.
    2. 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 de scann.num_leaves_to_search sem reconstruir o índice.
  5. 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:

  1. Crie o índice ScaNN com as seguintes combinações de num_leaves e max_num_levels com base nas suas metas de performance:

    • equilibrar tempo de build e qualidade do índice: defina max_num_levels como 2 e num_leaves como power(rows, ⅔).
    • Otimizar para qualidade: defina max_num_levels como 2 e num_leaves como rows/100.
  2. Execute suas consultas de teste. Para mais informações sobre como analisar consultas, consulte Analisar suas consultas.

  3. Anote a proporção entre scann.num_leaves_to_search e num_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.

  1. 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 e scann.num_leaves_to_search de acordo com as seguintes orientações:
    • Defina num_leaves como um fator maior de power(rows, ⅔). Por exemplo, se o índice tiver num_leaves definido como power(rows, ⅔), tente definir como o dobro de power(rows, ⅔). Se o valor já for o dobro, tente definir como o triplo de power(rows, ⅔).
    • Aumente scann.num_leaves_to_search conforme necessário para manter a proporção com num_leaves, que você anotou na etapa 3.
    • Defina num_leaves com um valor menor ou igual a rows/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 de scann.num_leaves_to_search sem reconstruir o índice.
  2. 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.

A seguir