IVF_PQ
O índice IVF_PQ é um algoritmo de indexação baseado em quantização para pesquisa aproximada do vizinho mais próximo em espaços de alta dimensão. Embora não seja tão rápido quanto alguns métodos baseados em grafos, o IVF_PQ geralmente requer muito menos memória, tornando-o uma opção prática para grandes conjuntos de dados.
Descrição geral
O IVF_PQ significa Inverted File with Product Quantization (Ficheiro invertido com quantificação de produtos), uma abordagem híbrida que combina indexação e compressão para uma pesquisa e recuperação vectoriais eficientes. Aproveita dois componentes principais: Inverted File (IVF) e Product Quantization (PQ).
IVF
O IVF é 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 (vectores) relevantes. 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:
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).
Atribuição: Cada vetor é atribuído ao cluster cujo centróide está mais próximo dele.
Índice invertido: É criado um índice que mapeia cada centróide de cluster para a lista de vectores atribuídos a esse cluster.
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.
PQ
A Quantização de Produtos (PQ) é um método de compressão para vectores de elevada dimensão que reduz significativamente os requisitos de armazenamento, permitindo operações de pesquisa de semelhanças rápidas.
O processo de PQ envolve as seguintes etapas principais:
Ivf Pq 1
Decomposição da dimensão: O algoritmo começa por decompor cada vetor de alta dimensão em
msub-vectores de igual dimensão. Esta decomposição transforma o espaço D-dimensional original emmsubespaços disjuntos, em que cada subespaço contém D/m dimensões. O parâmetromcontrola a granularidade da decomposição e influencia diretamente a taxa de compressão.Geração do livro de códigos do subespaço: Dentro de cada subespaço, o algoritmo aplica o agrupamento k-means para aprender um conjunto de vectores representativos (centróides). Estes centróides formam coletivamente um livro de códigos para esse subespaço. O número de centróides em cada livro de códigos é determinado pelo parâmetro
nbits, em que cada livro de códigos contém centróides de 2nbits. Por exemplo, senbits = 8, cada livro de códigos conterá 256 centróides. A cada centróide é atribuído um índice único comnbitsbits.Quantizaçãodo vetor: Para cada sub-vetor do vetor original, a PQ identifica o seu centróide mais próximo no subespaço correspondente utilizando um tipo de métrica específico. Este processo mapeia efetivamente cada sub-vetor para o seu vetor representativo mais próximo no livro de códigos. Em vez de armazenar as coordenadas completas do sub-vetor, apenas o índice do centróide correspondente é retido.
Representação comprimida: A representação comprimida final consiste em
míndices, um de cada subespaço, coletivamente designados por códigos PQ. Esta codificação reduz o requisito de armazenamento de D × 32 bits (assumindo números de vírgula flutuante de 32 bits) para m × nbits bits, conseguindo uma compressão substancial ao mesmo tempo que preserva a capacidade de aproximar as distâncias vectoriais.
Para mais detalhes sobre a afinação e otimização de parâmetros, consulte Parâmetros de índice.
Considere um vetor com D = 128 dimensões usando números de ponto flutuante de 32 bits. Com os parâmetros PQ m = 64 (sub-vectores) e nbits = 8 (portanto k =28 = 256 centróides por subespaço), podemos comparar os requisitos de armazenamento:
Vetor original: 128 dimensões × 32 bits = 4.096 bits
Vetor comprimido por PQ: 64 sub-vectores × 8 bits = 512 bits
Isto representa uma redução de 8x nos requisitos de armazenamento.
Cálculo da distância com PQ
Ao efetuar uma pesquisa de similaridade com um vetor de consulta, a PQ permite o cálculo eficiente da distância através dos seguintes passos:
Pré-processamento da consulta
O vetor de consulta é decomposto em
msub-vectores, correspondendo à estrutura de decomposição PQ original.Para cada sub-vetor de consulta e o seu livro de códigos correspondente (contendo centróides de 2nbits ), calcular e armazenar as distâncias a todos os centróides.
Isto gera
mtabelas de pesquisa, em que cada tabela contém distâncias de 2nbits.
Aproximação das distâncias
Para qualquer vetor da base de dados representado por códigos PQ, a sua distância aproximada ao vetor de consulta é calculada da seguinte forma:
Para cada um dos sub-vectores
m, obter a distância pré-computada da tabela de pesquisa correspondente utilizando o índice do centróide armazenado.Somar estas
mdistâncias para obter a distância aproximada com base num tipo de métrica específico (por exemplo, distância euclidiana).
Ivf Pq 2
IVF + PQ
O índice IVF_PQ combina os pontos fortes do IVF e do PQ para acelerar as pesquisas. O processo funciona em duas etapas:
Filtragem grosseira com IVF: IVF particiona o espaço vetorial em clusters, reduzindo o escopo da pesquisa. Em vez de avaliar todo o conjunto de dados, o algoritmo concentra-se apenas nos clusters mais próximos do vetor de consulta.
Comparação fina com PQ: Dentro dos clusters selecionados, PQ utiliza representações vectoriais comprimidas e quantizadas para calcular rapidamente distâncias aproximadas.
O desempenho do índice IVF_PQ é significativamente afetado pelos parâmetros que controlam os algoritmos IVF e PQ. O ajuste desses parâmetros é crucial para obter os melhores resultados para um determinado conjunto de dados e aplicação. Informações mais detalhadas sobre esses parâmetros e como ajustá-los podem ser encontradas em Parâmetros de índice.
Criar índice
Para construir um índice IVF_PQ 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_PQ", # 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": 4, # Number of sub-vectors to split eahc vector into
} # Index building params
)
Nesta configuração:
index_type: O tipo de índice a construir. Neste exemplo, defina o valor paraIVF_PQ.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 de sub-vectores em que dividir o vetor.
Para saber mais sobre os parâmetros de construção disponíveis para o índice
IVF_PQ, 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": {
"nprobe": 10, # 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=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_PQ, 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 |
|
|---|---|---|---|---|
IVF |
|
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: |
Valores maiores de |
PQ |
|
O número de sub-vectores (utilizados para quantização) para dividir cada vetor de alta dimensão durante o processo de quantização. |
Tipo: Inteiro Intervalo: [1, 65536] Valor predefinido: Nenhum |
Um valor Na maioria dos casos, recomendamos que defina um valor dentro deste intervalo: [D/8, D]. |
|
O número de bits utilizados para representar o índice do centróide de cada sub-vetor na forma comprimida. Determina diretamente o tamanho de cada livro de códigos. Cada livro de códigos conterá centroides de 2nbits. Por exemplo, se |
Tipo: Integer Intervalo: [1, 24] Valor por defeito: |
Um valor |
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 |
|
O número de clusters para procurar candidatos. |
Tipo: Integer Intervalo: [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]. |