← Voltar

FLAT vs IVF: Como funciona o Índice de Ficheiros Invertido

Os mesmos dados, a mesma consulta — mas uma estratégia de pesquisa diferente. Arraste o ponto de consulta, ajuste nprobee prima «Executar Pesquisa » para ver como « IVF » ignora a maior parte dos dados.

nprobe2
Pesquisa « 2 » de « 8 » clusters
Velocidade20ms
Mais baixo = animação mais rápida

FLAT — Busca exaustiva

analisa todos os pontos
Comparações
200 / 200
Estado
✓ Concluído
Recall
100%

IVF — Arquivo invertido

pesquisas nprobe clusters
Comparações
33 / 33
Estado
✓ Concluído
Recall@5
100%

O que se passa?

  1. Fase de construção (já concluída): o algoritmo K-means dividiu os pontos 200 em 8 agrupamentos. Cada agrupamento tem um centroide (as marcas ×).
  2. Passo 1 — avaliar centróides: « IVF » calcula primeiro a distância entre a consulta e cada centróide. São apenas 8 comparações, independentemente do tamanho do conjunto de dados.
  3. Passo 2 — selecione os aglomerados « nprobe » mais próximos: estes ficam destacados. Todos os outros aglomerados são totalmente ignorados.
  4. Passo 3 — analisar pontos dentro dos aglomerados escolhidos: apenas cerca de50 dos pontos 200.

O compromisso: quanto maior nprobe → mais aglomerados analisados → maior recall, mas mais lento. Menor nprobe → mais rápido, mas poderá perder vizinhos verdadeiros que se encontram em aglomerados não analisados. Experimente definir nprobe = 1 e arrastar a consulta para perto do limite de um cluster para ver a queda na recuperação.

O que é um índice « IVF »?

IVF (Inverted File) é um índice de vizinho mais próximo aproximado, baseado em agrupamento. Na fase de construção, o k-means divide todos os vetores em nlist agrupamentos, cada um representado pelo seu centroide. No momento da consulta, a pesquisa compara primeiro a consulta apenas com os centroides, seleciona os nprobe e analisa apenas os vetores dentro deles — ignorando tudo o resto.

Milvus inclui várias variantes do « IVF » que trocam memória por precisão: IVF_FLAT armazena vetores em bruto (mais preciso), IVF_SQ8 comprime cada dimensão para um byte (~4× menos memória, pequeno custo de recall), e IVF_PQ aplica quantização de produto para uma compressão muito superior com um custo de recall mais elevado.

Ajuste nlist e nprobe

  • nlist (tempo de compilação): o número de agrupamentos k-means. Um ponto de partida comum é 4 × sqrt(N) para N vetores. Mais agrupamentos significam que cada um é mais pequeno — varreduras mais rápidas, mas a varredura dos centróides tem um custo maior e os efeitos de fronteira aumentam.
  • nprobe (tempo de consulta): quantos clusters devem ser analisados por consulta. Este é o principal regulador de recall/latência — exatamente o que o controlo deslizante acima controla. Comece por nlist / 16 e aumente até que a recuperação atinja o seu objetivo.
  • Opção de variantes: comece com « IVF_FLAT ». Passe para « IVF_SQ8 » quando a memória estiver escassa e para « IVF_PQ » apenas quando o conjunto de dados for demasiado grande para « SQ8 » — e verifique a precisão de recuperação nos seus próprios dados após cada redução.

IVF vs HNSW vs DiskANN

IVF compila rapidamente, tem um pequeno consumo de memória além dos vetores e é fácil de compreender — mas, com o mesmo objetivo de recall, o « HNSW » geralmente responde às consultas mais rapidamente na memória. Escolha « IVF » quando reconstruir índices com frequência (a rapidez da compilação é importante), quando a memória for limitada (IVF_SQ8/IVF_PQ), ou quando pretender um comportamento de varredura previsível e ajustável. Escolha HNSW para obter a menor latência de consulta na memória e DiskANN quando os vetores já não couberem de todo em RAM.

Perguntas frequentes

Qual é a diferença entre IVF_FLAT, IVF_SQ8 e IVF_PQ?

Todos os três agrupam vetores da mesma forma; diferem na forma como os vetores são armazenados dentro dos agrupamentos. « IVF_FLAT » mantém vetores de tipo float não processados (melhor recall). « IVF_SQ8 » quantiza cada dimensão para 8 bits, reduzindo a memória em cerca de 4× com uma pequena perda de recall. « IVF_PQ » substitui os vetores por códigos curtos de quantização de produto, para a maior compressão e a maior perda de recall.

Como devo escolher entre nlist e nprobe?

Uma regra prática comum é que « nlist » = 4 × sqrt(N) para N vetores; em seguida, ajuste « nprobe » no momento da consulta. Um « nprobe » maior analisa mais aglomerados: maior recall, maior latência. Comece por cerca de « nlist » /16 e aumente até que o recall num conjunto de consultas de teste atinja o seu objetivo.

Por que razão o « IVF » não identifica alguns vizinhos mais próximos verdadeiros?

Devido aos limites dos clusters. Se a consulta se situar perto da borda de um cluster, alguns dos seus verdadeiros vizinhos podem encontrar-se num cluster adjacente que não estava entre os clusters nprobe analisados. É possível observar isto na visualização arrastando o ponto de consulta para perto de um limite com nprobe = 1.

Devo usar IVF ou HNSW?

Com a mesma precisão de recuperação, o « HNSW » é normalmente mais rápido para pesquisas na memória, mas utiliza mais memória e demora mais tempo a compilar. O « IVF » compila-se rapidamente e combina bem com a quantização (SQ8/PQ) quando a memória é escassa. Para conjuntos de dados que excedam totalmente o « RAM », considere em vez disso o « DiskANN ».

Aprofunde-se: leia a documentação «IVF_FLAT » para conhecer os parâmetros de indexação ou consulte «Index Explained» para obter o guia de decisão completo.

Continue a explorar