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 Scann

  1. 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.

  2. 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.

  3. 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 para SCANN.

  • metric_type: O método utilizado para calcular a distância entre vectores. Os valores suportados incluem COSINE, L2, e IP. 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

nlist

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.

with_raw_data

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: true, false

Valor predefinido: true

Definido para true para uma maior precisão de pesquisa e quando o espaço de armazenamento não é uma preocupação principal. Os dados vectoriais originais permitem cálculos de semelhança mais precisos durante a reclassificação.

Defina para false para reduzir a sobrecarga de armazenamento e a utilização de memória, especialmente para grandes conjuntos de dados. No entanto, isto pode resultar numa precisão de pesquisa ligeiramente inferior, uma vez que a fase de reclassificação irá utilizar vectores quantizados.

Recomendado: Use true para aplicações de produção em que a precisão é crítica.

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

reorder_k

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 reorder_k maior conduz geralmente a uma maior precisão de pesquisa, uma vez que são considerados mais candidatos durante a fase de refinamento final. No entanto, isto também aumenta o tempo de pesquisa devido a computação adicional.

Considere o aumento de reorder_k quando a obtenção de uma alta recuperação é crítica e a velocidade de pesquisa é menos preocupante. Um bom ponto de partida é 2-5x o limit desejado (TopK resultados a retornar).

Considere diminuir reorder_k 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 você defina um valor dentro deste intervalo:[limite, limite * 5].

nprobe

O número de clusters para pesquisar candidatos.

Tipo: Integer

Range: [1, nlist]

Valor predefinido: 8

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 nprobe proporcionalmente a nlist para equilibrar velocidade e precisão.

Na maioria dos casos, recomendamos que você defina um valor dentro deste intervalo: [1, nlist].

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
Feedback

Esta página foi útil?