IVF_FLAT
O índice IVF_FLAT é um algoritmo de indexação que pode melhorar o desempenho da pesquisa para vectores de vírgula flutuante.
Este tipo de índice é ideal para conjuntos de dados de grande escala que requerem respostas de consulta rápidas e elevada precisão, especialmente quando o agrupamento do conjunto de dados pode reduzir o espaço de pesquisa e está disponível memória suficiente para armazenar dados de agrupamento.
Síntese
O termo IVF_FLAT significa Inverted File Flat (Ficheiro Invertido Plano), que encapsula a sua abordagem de duas camadas para indexação e pesquisa de vectores de vírgula flutuante:
- Inverted File (IVF): Refere-se ao agrupamento do espaço vetorial em regiões gerenciáveis usando o agrupamento k-means. Cada agrupamento é representado por um centróide, que serve de ponto de referência para os vectores nele contidos.
- Plano: Indica que, dentro de cada cluster, os vectores são armazenados na sua forma original (estrutura plana), sem qualquer compressão ou quantização, para cálculos de distância precisos.
A figura seguinte mostra o seu funcionamento:
ivf-flat-1.png
Este método de indexação acelera o processo de pesquisa, mas tem uma potencial desvantagem: o candidato encontrado como o mais próximo da incorporação de consulta pode não ser exatamente o mais próximo. Isto pode acontecer se a incorporação mais próxima da incorporação de consulta residir num agrupamento diferente do selecionado com base no centróide mais próximo (ver visualização abaixo).
Para resolver este problema, o IVF_FLAT fornece dois hiperparâmetros que podemos ajustar:
nlist
: Especifica o número de partições a criar utilizando o algoritmo k-means.nprobe
: Especifica o número de partições a considerar durante a pesquisa de candidatos.
Agora, se definirmos nprobe
para 3 em vez de 1, obtemos o seguinte resultado:
ivf-flat-2.png
Ao aumentar o valor de nprobe
, é possível incluir mais partições na pesquisa, o que pode ajudar a garantir que a incorporação mais próxima da consulta não seja perdida, mesmo que resida numa partição diferente. No entanto, isso tem o custo de aumentar o tempo de pesquisa, pois mais candidatos precisam ser avaliados. Para obter mais informações sobre o ajuste de parâmetros de índice, consulte Parâmetros de índice.
Construir índice
Para construir um índice IVF_FLAT
num campo vetorial em Milvus, utilize o método add_index()
, especificando os parâmetros index_type
, metric_type
, e parâmetros adicionais para o índice.
from pymilvus import MilvusClient
# Prepare index building params
index_params = MilvusClient.prepare_index_params()
index_params.add_index(
field_name="your_vector_field_name", # Name of the vector field to be indexed
index_type="IVF_FLAT", # Type of the index to create
index_name="vector_index", # Name of the index to create
metric_type="L2", # Metric type used to measure similarity
params={
"nlist": 64, # Number of clusters for the index
} # Index building params
)
Nesta configuração:
index_type
: O tipo de índice a construir. Neste exemplo, defina o valor paraIVF_FLAT
.metric_type
: O método utilizado para calcular a distância entre vectores. Os valores suportados incluemCOSINE
,L2
, eIP
. Para obter detalhes, consulte Tipos de métricas.params
: Opções de configuração adicionais para criar o índice.nlist
: Número de clusters para dividir o conjunto de dados.
Para saber mais sobre os parâmetros de construção disponíveis para o índice
IVF_FLAT
, consulte Parâmetros de construção do índice.
Assim que os parâmetros do índice estiverem configurados, pode criar o índice utilizando diretamente o método create_index()
ou passando os parâmetros do índice no método create_collection
. Para obter detalhes, consulte Criar coleção.
Pesquisar no índice
Depois de o índice ser construído e as entidades serem inseridas, pode efetuar pesquisas de semelhança no índice.
search_params = {
"params": {
"nprobe": 10, # Number of clusters to search
}
}
res = MilvusClient.search(
collection_name="your_collection_name", # Collection name
data=[[0.1, 0.2, 0.3, 0.4, 0.5]], # Query vector
limit=3, # TopK results to return
search_params=search_params
)
Nesta configuração:
params
: Opções de configuração adicionais para pesquisar no índice.nprobe
: Número de clusters a serem pesquisados.
Para saber mais sobre os parâmetros de pesquisa disponíveis para o índice
IVF_FLAT
, consulte Parâmetros de pesquisa específicos do índice.
Parâmetros de índice
Esta secção fornece uma visão geral dos parâmetros utilizados para criar um índice e efetuar pesquisas no índice.
Parâmetros de construção do índice
A tabela seguinte lista os parâmetros que podem ser configurados em params
ao construir um índice.
Parâmetro | Descrição | Intervalo de valores | Sugestão de ajuste |
---|---|---|---|
nlist | O número de clusters a criar utilizando o algoritmo k-means durante a construção do índice. Cada cluster, representado por um centróide, armazena uma lista de vectores. Aumentar este parâmetro reduz o número de vectores em cada cluster, criando partições mais pequenas e mais focadas. | Tipo: Inteiro Intervalo: [1, 65536] Valor padrão: 128 | Valores maiores nlist melhoram a recuperação, criando clusters mais refinados, mas aumentam o tempo de construção do índice. Optimize com base no tamanho do conjunto de dados e nos recursos disponíveis. Na maioria dos casos, recomendamos que defina um valor dentro deste intervalo: [32, 4096]. |
Parâmetros de pesquisa específicos do índice
A tabela a seguir lista os parâmetros que podem ser configurados em search_params.params
ao pesquisar no índice.
Parâmetro | Descrição | Intervalo de valores | Sugestão de ajuste |
---|---|---|---|
nprobe | O número de clusters para pesquisar candidatos. Valores mais altos permitem que mais clusters sejam pesquisados, melhorando a recuperação ao expandir o escopo da pesquisa, mas ao custo de uma maior latência de consulta. | Tipo: Integer Range: [1, nlist] Valor padrão: 8 | Aumentar este valor melhora a recuperação, mas pode tornar a pesquisa mais lenta. Defina nprobe proporcionalmente a nlist para equilibrar velocidade e precisão.Na maioria dos casos, recomendamos que defina um valor dentro deste intervalo: [1, nlist]. |