HNSW
O índice HNSW é um algoritmo de indexação baseado em grafos que pode melhorar o desempenho na pesquisa de vectores flutuantes de elevada dimensão. Oferece uma excelente precisão de pesquisa e baixa latência, embora exija uma elevada sobrecarga de memória para manter a sua estrutura hierárquica de grafos.
Síntese
O algoritmo Hierarchical Navigable Small World (HNSW) constrói um gráfico de várias camadas, como um mapa com diferentes níveis de zoom. A camada inferior contém todos os pontos de dados, enquanto as camadas superiores consistem num subconjunto de pontos de dados amostrados a partir da camada inferior.
Nesta hierarquia, cada camada contém nós que representam pontos de dados, ligados por arestas que indicam a sua proximidade. As camadas superiores fornecem saltos de longa distância para se aproximarem rapidamente do alvo, enquanto as camadas inferiores permitem uma pesquisa fina para obter os resultados mais exactos.
Eis como funciona:
- Ponto de entrada: A pesquisa começa num ponto de entrada fixo na camada superior, que é um nó pré-determinado no gráfico.
- Pesquisa gulosa: O algoritmo move-se avidamente para o vizinho mais próximo na camada atual até não conseguir aproximar-se mais do vetor de consulta. As camadas superiores servem um objetivo de navegação, actuando como um filtro grosseiro para localizar potenciais pontos de entrada para a pesquisa mais fina nos níveis inferiores.
- Camada descendente: Quando é atingido um mínimo local na camada atual, o algoritmo salta para a camada inferior, utilizando uma ligação pré-estabelecida, e repete a pesquisa gulosa.
- Refinamentofinal: Este processo continua até atingir a camada inferior, onde um passo final de refinamento identifica os vizinhos mais próximos.
HNSW
O desempenho do HNSW depende de vários parâmetros chave que controlam tanto a estrutura do grafo como o comportamento da pesquisa. Estes incluem:
M
: O número máximo de arestas ou ligações que cada nó pode ter no gráfico em cada nível da hierarquia. UmM
mais elevado resulta num gráfico mais denso e aumenta a recordação e a precisão, uma vez que a pesquisa tem mais caminhos para explorar, o que também consome mais memória e torna o tempo de inserção mais lento devido às ligações adicionais. Como se pode ver na imagem acima, M = 5 indica que cada nó do gráfico HNSW está diretamente ligado a um máximo de 5 outros nós. Isto cria uma estrutura de grafo moderadamente densa em que os nós têm vários caminhos para chegar a outros nós.efConstruction
: O número de candidatos considerados durante a construção do índice. UmefConstruction
mais elevado resulta geralmente num gráfico de melhor qualidade, mas requer mais tempo para ser construído.ef
: O número de vizinhos avaliados durante uma pesquisa. Aumentaref
melhora a probabilidade de encontrar os vizinhos mais próximos, mas torna o processo de pesquisa mais lento.
Para obter detalhes sobre como ajustar estas definições de acordo com as suas necessidades, consulte Parâmetros de índice.
Criar índice
Para construir um índice HNSW
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="HNSW", # 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={
"M": 64, # Maximum number of neighbors each node can connect to in the graph
"efConstruction": 100 # Number of candidate neighbors considered for connection during index construction
} # Index building params
)
Nesta configuração:
index_type
: O tipo de índice a construir. Neste exemplo, defina o valor paraHNSW
.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.M
: Número máximo de vizinhos a que cada nó se pode ligar.efConstruction
: Número de vizinhos candidatos considerados para ligação durante a construção do índice.
Para saber mais sobre os parâmetros de construção disponíveis para o índice
HNSW
, 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 criado e as entidades serem inseridas, pode efetuar pesquisas de semelhança no índice.
search_params = {
"params": {
"ef": 10, # Number of neighbors to consider during the 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=10, # TopK results to return
search_params=search_params
)
Nesta configuração:
params
: Opções de configuração adicionais para pesquisar no índice.ef
: Número de vizinhos a considerar durante uma pesquisa.
Para saber mais sobre os parâmetros de pesquisa disponíveis para o índice
HNSW
, 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 afinação |
---|---|---|---|
M | Número máximo de ligações (ou arestas) que cada nó pode ter no gráfico, incluindo as arestas de saída e de entrada. Este parâmetro afecta diretamente tanto a construção como a pesquisa do índice. | Tipo: Inteiro Range: [2, 2048] Valor por defeito: 30 (até 30 arestas de saída e 30 arestas de entrada por nó) | Um M maior geralmente leva a uma maior precisão, mas aumenta a sobrecarga de memória e torna mais lenta a construção do índice e a pesquisa.Considere o aumento de M para conjuntos de dados com elevada dimensionalidade ou quando é crucial uma elevada recuperação.Considere diminuir M quando a utilização da memória e a velocidade de pesquisa forem as principais preocupações.Na maioria dos casos, recomendamos que defina um valor dentro deste intervalo: [5, 100]. |
efConstruction | Número de vizinhos candidatos considerados para conexão durante a construção do índice. Um conjunto maior de candidatos é avaliado para cada novo elemento, mas o número máximo de conexões realmente estabelecidas ainda é limitado por M . | Tipo: Integer Range: [1, int_max] Valor predefinido: 360 | Um efConstruction mais elevado resulta normalmente num índice mais preciso, uma vez que são exploradas mais ligações potenciais. No entanto, isto também leva a um tempo de indexação mais longo e a uma maior utilização de memória durante a construção.Considere aumentar efConstruction para melhorar a precisão, especialmente em cenários em que o tempo de indexação é menos crítico.Considere diminuir efConstruction para acelerar a construção do índice quando as restrições de recursos são uma preocupação.Na maioria dos casos, recomendamos que defina um valor dentro deste intervalo: [50, 500]. |
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 |
---|---|---|---|
ef | Controla a amplitude da pesquisa durante a recuperação do vizinho mais próximo. Ele determina quantos nós são visitados e avaliados como possíveis vizinhos mais próximos. Este parâmetro afecta apenas o processo de pesquisa e aplica-se exclusivamente à camada inferior do gráfico. | Tipo: Inteiro Intervalo: [1, int_max] Valor por defeito: limite (TopK vizinhos mais próximos a devolver) | Um ef maior conduz geralmente a uma maior precisão de pesquisa, uma vez que são considerados mais vizinhos potenciais. No entanto, isto também aumenta o tempo de pesquisa.Considere aumentar ef quando a obtenção de uma elevada recuperação é crítica e a velocidade de pesquisa é menos preocupante.Considere diminuir ef para dar prioridade a pesquisas mais rápidas, especialmente em cenários em que uma ligeira redução na precisão é aceitável.Na maioria dos casos, recomendamos que defina um valor dentro deste intervalo: [K, 10K]. |