IVF_SQ8

O índice IVF_SQ8 é um algoritmo de indexação baseado na quantização, concebido para enfrentar desafios de pesquisa de semelhanças em grande escala. Este tipo de índice consegue pesquisas mais rápidas com um espaço de memória muito mais pequeno em comparação com os métodos de pesquisa exaustiva.

Descrição geral

O índice IVF_SQ8 baseia-se em dois componentes principais:

  • Arquivo invertido (IVF): Organiza os dados em clusters, permitindo que o algoritmo de pesquisa se concentre apenas nos subconjuntos de vectores mais relevantes.

  • Quantização escalar (SQ8): Comprime os vectores para uma forma mais compacta, reduzindo drasticamente a utilização de memória e mantendo a precisão suficiente para cálculos de semelhança rápidos.

FIV

A FIV é como criar um índice num livro. Em vez de analisar todas as páginas (ou, no nosso caso, todos os vectores), procura palavras-chave específicas (clusters) no índice para encontrar rapidamente as páginas relevantes (vectores). No nosso cenário, os vectores são agrupados em clusters e o algoritmo irá procurar dentro de alguns clusters que estejam próximos do vetor de consulta.

Veja como isso funciona:

  1. Agrupamento: O seu conjunto de dados vectoriais é dividido num número especificado de clusters, utilizando um algoritmo de agrupamento como o k-means. Cada cluster tem um centroide (um vetor representativo do cluster).

  2. Atribuição: Cada vetor é atribuído ao cluster cujo centróide está mais próximo dele.

  3. Índice invertido: É criado um índice que mapeia cada centróide de cluster para a lista de vectores atribuídos a esse cluster.

  4. Pesquisa: Quando procura os vizinhos mais próximos, o algoritmo de pesquisa compara o vetor de consulta com os centróides de cluster e seleciona o(s) cluster(s) mais promissor(es). A pesquisa é então reduzida aos vectores dentro desses clusters selecionados.

Para saber mais sobre os seus pormenores técnicos, consulte IVF_FLAT.

SQ8

A Quantização escalar (SQ) é uma técnica utilizada para reduzir o tamanho de vectores de elevada dimensão, substituindo os seus valores por representações mais pequenas e compactas. A variante SQ8 utiliza números inteiros de 8 bits em vez dos típicos números de ponto flutuante de 32 bits para armazenar cada valor de dimensão de um vetor. Isso reduz bastante a quantidade de memória necessária para armazenar os dados.

Veja como o SQ8 funciona:

  1. Identificação do intervalo: Primeiro, identifica os valores mínimo e máximo dentro do vetor. Este intervalo define os limites para a quantização.

  2. Normalização: Normalize os valores do vetor para um intervalo entre 0 e 1 utilizando a fórmula:

    normalized_value=valueminmaxmin\text{normalized\_value} = \frac{\text{value} - \text{min}}{\text{max} - \text{min}}

    Isso garante que todos os valores sejam mapeados proporcionalmente dentro de um intervalo padronizado, preparando-os para a compactação.

  3. Compressão de 8 bits: Multiplique o valor normalizado por 255 (o valor máximo para um número inteiro de 8 bits) e arredonde o resultado para o número inteiro mais próximo. Isso comprime efetivamente cada valor em uma representação de 8 bits.

Suponha que você tenha um valor de dimensão de 1,2, com um valor mínimo de -1,7 e um valor máximo de 2,3. A figura seguinte mostra como o SQ8 é aplicado para converter um valor float32 num número inteiro int8.

Ivf Sq8 Ivf Sq8

IVF + SQ8

O índice IVF_SQ8 combina IVF e SQ8 para efetuar pesquisas de semelhança de forma eficiente:

  1. O IVF limita o âmbito da pesquisa: O conjunto de dados é dividido em clusters e, quando é emitida uma consulta, o IVF compara primeiro a consulta com os centróides dos clusters, selecionando os clusters mais relevantes.

  2. O SQ8 acelera os cálculos de distância: Dentro dos clusters selecionados, o SQ8 comprime os vectores em números inteiros de 8 bits, reduzindo a utilização de memória e acelerando os cálculos de distância.

Ao utilizar o IVF para concentrar a pesquisa e o SQ8 para acelerar os cálculos, o IVF_SQ8 consegue tempos de pesquisa rápidos e eficiência de memória.

Criar índice

Para construir um índice IVF_SQ8 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_SQ8", # 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 to create using the k-means algorithm during index building
    } # Index building params
)

Nesta configuração:

  • index_type: O tipo de índice a construir. Neste exemplo, defina o valor para IVF_SQ8.

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

    • nlist: Número de clusters a criar utilizando o algoritmo k-means durante a construção do índice.

    Para saber mais sobre os parâmetros de construção disponíveis para o índice IVF_SQ8, consulte Parâmetros de construção de í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": {
        "nprobe": 8, # Number of clusters to search for candidates
    }
}

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.

    • nprobe: Número de clusters para pesquisar candidatos.

    Para saber mais sobre os parâmetros de pesquisa disponíveis para o índice IVF_SQ8, 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 afinação

IVF

nlist

O número de clusters a criar utilizando o algoritmo k-means durante a construção do índice.

Tipo: Integer Intervalo: [1, 65536]

Valor predefinido: 128

Valores maiores de nlist melhoram a recuperação, criando clusters mais refinados, mas aumentam o tempo de criaçã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

FIV

nprobe

O número de clusters para procurar candidatos.

Tipo: Integer Intervalo: [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 uma 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?