SCANN
Alimentado pela biblioteca ScaNN da Google, o índice SCANN em Milvus foi concebido para enfrentar os desafios da pesquisa de semelhança de vectores em escala, alcançando um equilíbrio entre velocidade e precisão, mesmo em grandes conjuntos de dados que tradicionalmente colocariam desafios à maioria dos algoritmos de pesquisa.
Visão geral
O ScaNN foi criado para resolver um dos maiores desafios na pesquisa de vectores: encontrar eficientemente os vectores mais relevantes em espaços de elevada dimensão, mesmo quando os conjuntos de dados se tornam maiores e mais complexos. A sua arquitetura divide o processo de pesquisa vetorial em fases distintas:
Scann
Particionamento: Divide o conjunto de dados em clusters. Este método limita o espaço de pesquisa, concentrando-se apenas em subconjuntos de dados relevantes, em vez de analisar todo o conjunto de dados, poupando tempo e recursos de processamento. O ScaNN utiliza frequentemente algoritmos de agrupamento, como o k-means, para identificar clusters, o que lhe permite efetuar pesquisas de semelhança de forma mais eficiente.
Quantização: O ScaNN aplica um processo de quantização conhecido como quantização de vetor anisotrópico após o particionamento. A quantização tradicional concentra-se na minimização da distância geral entre os vectores originais e comprimidos, o que não é ideal para tarefas como a Maximum Inner Product Search (MIPS), em que a semelhança é determinada pelo produto interno dos vectores e não pela distância direta. Em vez disso, a quantização anisotrópica prioriza a preservação de componentes paralelos entre vetores, ou as partes mais importantes para o cálculo de produtos internos precisos. Esta abordagem permite que o ScaNN mantenha uma elevada precisão MIPS, alinhando cuidadosamente os vectores comprimidos com a consulta, permitindo pesquisas de semelhança mais rápidas e precisas.
Re-ranking: A fase de reclassificação é a etapa final, onde o ScaNN ajusta os resultados da pesquisa dos estágios de particionamento e quantização. Essa reclassificação aplica cálculos precisos de produto interno aos principais vetores candidatos, garantindo que os resultados finais sejam altamente precisos. A reclassificação é crucial em motores de recomendação de alta velocidade ou em aplicações de pesquisa de imagens em que a filtragem e o agrupamento iniciais servem como uma camada grosseira e a fase final garante que apenas os resultados mais relevantes são devolvidos ao utilizador.
O desempenho do SCANN é controlado por dois parâmetros-chave que lhe permitem afinar o equilíbrio entre velocidade e precisão:
with_raw_data: Controla se os dados vectoriais originais são armazenados juntamente com as representações quantizadas. A ativação deste parâmetro melhora a precisão durante a reclassificação, mas aumenta os requisitos de armazenamento.reorder_k: Determina quantos candidatos são refinados durante a fase final de reclassificação. Valores mais altos melhoram a precisão, mas aumentam a latência da pesquisa.
Para obter orientações detalhadas sobre a otimização destes parâmetros para o seu caso de utilização específico, consulte Parâmetros de índice.
Criar índice
Para construir um índice SCANN 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="SCANN", # 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={
"with_raw_data": True, # Whether to hold raw data
} # Index building params
)
Nesta configuração:
index_type: O tipo de índice a construir. Neste exemplo, defina o valor paraSCANN.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.with_raw_data: Se devem ser armazenados os dados do vetor original juntamente com a representação quantizada.
Para saber mais sobre os parâmetros de construção disponíveis para o índice
SCANN, consulte Parâmetros de construção do índice.
Uma vez configurados os parâmetros do índice, 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": {
"reorder_k": 10, # Number of candidates to refine
"nprobe": 8 # Number of clusters to search
}
}
res = MilvusClient.search(
collection_name="your_collection_name", # Collection name
anns_field="vector_field", # Vector field 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.reorder_k: Número de candidatos a serem refinados durante a fase de reclassificação.nprobe: Número de clusters a pesquisar.
Para saber mais sobre os parâmetros de pesquisa disponíveis para o índice
SCANN, consulte Parâmetros de pesquisa específicos do índice.
Parâmetros do í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 |
|---|---|---|---|
|
Número de unidades de cluster |
[1, 65536] |
Uma nlist mais alta aumenta a eficiência da poda e normalmente acelera a pesquisa grosseira, mas as partições podem ficar demasiado pequenas, o que pode reduzir a recuperação; uma nlist mais baixa pesquisa clusters maiores, melhorando a recuperação mas tornando a pesquisa mais lenta. |
|
Se deve armazenar os dados do vetor original juntamente com a representação quantizada. Quando ativado, isto permite cálculos de similaridade mais precisos durante a fase de reclassificação, utilizando os vectores originais em vez de aproximações quantizadas. |
Tipo: Booleano Intervalo: Valor predefinido: |
Definido para Defina para Recomendado: Use |
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 |
|---|---|---|---|
|
Controla o número de vectores candidatos que são refinados durante a fase de reclassificação. Este parâmetro determina quantos candidatos de topo das fases iniciais de partição e quantização são reavaliados utilizando cálculos de semelhança mais precisos. |
Tipo: Inteiro Range: [1, int_max] Valor predefinido: Nenhum |
Um Considere o aumento de Considere diminuir Na maioria dos casos, recomendamos que você defina um valor dentro deste intervalo:[limite, limite * 5]. |
|
O número de clusters para pesquisar candidatos. |
Tipo: Integer Range: [1, nlist] Valor predefinido: |
Valores mais altos permitem que mais clusters sejam pesquisados, melhorando a recuperação ao expandir o escopo da pesquisa, mas ao custo de maior latência de consulta. Defina Na maioria dos casos, recomendamos que você defina um valor dentro deste intervalo: [1, nlist]. |