🚀 Prova Zilliz Cloud, la versione completamente gestita di Milvus, gratuitamente—sperimenta prestazioni 10 volte più veloci! Prova Ora>>

milvus-logo
LFAI
Casa
  • Guida per l'utente

IVF_PQ

L'indice IVF_PQ è un algoritmo di indicizzazione basato sulla quantizzazione per la ricerca approssimata dei vicini in spazi ad alta dimensione. Sebbene non sia veloce come alcuni metodi basati sui grafi, IVF_PQ richiede spesso una quantità di memoria significativamente inferiore, il che lo rende una scelta pratica per i grandi insiemi di dati.

Panoramica

IVF_PQ è l'acronimo di Inverted File with Product Quantization (File invertito con quantizzazione del prodotto), un approccio ibrido che combina indicizzazione e compressione per una ricerca e un recupero vettoriale efficienti. Sfrutta due componenti fondamentali: Inverted File (IVF) e Product Quantization (PQ).

IVF

L'IVF è come la creazione di un indice in un libro. Invece di esaminare ogni pagina (o, nel nostro caso, ogni vettore), si cercano parole chiave specifiche (cluster) nell'indice per trovare rapidamente le pagine (vettori) pertinenti. Nel nostro scenario, i vettori sono raggruppati in cluster e l'algoritmo cercherà all'interno di alcuni cluster che sono vicini al vettore della query.

Ecco come funziona:

  1. Raggruppamento: Il set di dati vettoriali viene suddiviso in un numero specifico di cluster, utilizzando un algoritmo di clustering come k-means. Ogni cluster ha un centroide (un vettore rappresentativo del cluster).
  2. Assegnazione: Ogni vettore viene assegnato al cluster il cui centroide gli è più vicino.
  3. Indice invertito: Viene creato un indice che mappa ogni centroide del cluster con l'elenco dei vettori assegnati a quel cluster.
  4. Ricerca: Quando si cercano i vicini, l'algoritmo di ricerca confronta il vettore della query con i centroidi dei cluster e seleziona i cluster più promettenti. La ricerca viene quindi ristretta ai vettori all'interno dei cluster selezionati.

Per saperne di più sui dettagli tecnici, consultare FIV_FLAT.

PQ

Laquantizzazione del prodotto (PQ) è un metodo di compressione per vettori ad alta dimensione che riduce in modo significativo i requisiti di memorizzazione, consentendo al contempo operazioni di ricerca di somiglianza veloci.

Il processo di PQ prevede queste fasi chiave:

pq-process-1 pq-processo-1

  1. Decomposizione della dimensione: L'algoritmo inizia con la decomposizione di ogni vettore ad alta dimensione in m sottovettori di dimensioni uguali. Questa decomposizione trasforma lo spazio D-dimensionale originale in m sottospazi disgiunti, dove ogni sottospazio contiene D/m dimensioni. Il parametro m controlla la granularità della decomposizione e influenza direttamente il rapporto di compressione.
  2. Generazione del codebook del sottospazio: All'interno di ogni sottospazio, l'algoritmo applica il clustering k-means per apprendere un insieme di vettori rappresentativi (centroidi). Questi centroidi formano collettivamente un codebook per quel sottospazio. Il numero di centroidi in ogni codebook è determinato dal parametro nbits, dove ogni codebook contiene 2^nbits di centroidi. Ad esempio, se nbits = 8, ogni codebook conterrà 256 centroidi. A ogni centroide viene assegnato un indice unico con nbits bit.
  3. Quantizzazionevettoriale: Per ogni sottovettore del vettore originale, PQ identifica il centroide più vicino all'interno del sottospazio corrispondente utilizzando un tipo di metrica specifico. Questo processo mappa efficacemente ogni sottovettore al suo vettore rappresentativo più vicino nel codebook. Invece di memorizzare le coordinate complete del sottovettore, viene mantenuto solo l'indice del centroide corrispondente.
  4. Rappresentazione compressa: La rappresentazione compressa finale consiste in m indici, uno per ogni sottospazio, denominati collettivamente codici PQ. Questa codifica riduce il requisito di memorizzazione da D × 32 bit (assumendo numeri in virgola mobile a 32 bit) a m × n bit, ottenendo una compressione sostanziale e preservando la capacità di approssimare le distanze vettoriali.

Per maggiori dettagli sulla regolazione e l'ottimizzazione dei parametri, consultare la sezione Parametri dell'indice.

Esempio di compressione

Si consideri un vettore con D = 128 dimensioni che utilizza numeri in virgola mobile a 32 bit. Con i parametri PQ m = 64 (sottovettori) e nbits = 8 (quindi k = 2^8 = 256 centroidi per sottospazio), possiamo confrontare i requisiti di memorizzazione:

  • Vettore originale: 128 dimensioni × 32 bit = 4.096 bit
  • Vettore compresso PQ: 64 sottovettori × 8 bit = 512 bit

Ciò rappresenta una riduzione di 8 volte dei requisiti di memorizzazione.

Calcolo della distanza con PQ

Quando si esegue una ricerca di similarità con un vettore di query, PQ consente di calcolare in modo efficiente la distanza attraverso i seguenti passaggi:

  1. Preelaborazione della query

    1. Il vettore di query viene scomposto in m sottovettori, che corrispondono alla struttura di decomposizione originale di PQ.
    2. Per ogni sottovettore della query e il suo codebook corrispondente (contenente i centroidi a 2^nbits), si calcolano e si memorizzano le distanze da tutti i centroidi.
    3. Questo genera m tabelle di ricerca, dove ogni tabella contiene 2^nbits di distanze.
  2. Approssimazione della distanza

    Per ogni vettore di database rappresentato da codici PQ, la sua distanza approssimativa dal vettore di interrogazione viene calcolata come segue:

    1. Per ciascuno dei sottovettori m, recuperare la distanza precalcolata dalla tabella di ricerca corrispondente utilizzando l'indice del centroide memorizzato.
    2. Sommare queste distanze m per ottenere la distanza approssimativa basata su un tipo di metrica specifica (ad esempio, la distanza euclidea).

pq-process-1 pq-process-1

FIV + PQ

L'indice IVF_PQ combina i punti di forza di IVF e PQ per accelerare le ricerche. Il processo funziona in due fasi:

  1. Filtraggio grossolano con IVF: IVF suddivide lo spazio vettoriale in cluster, riducendo l'ambito di ricerca. Invece di valutare l'intero set di dati, l'algoritmo si concentra solo sui cluster più vicini al vettore di interrogazione.
  2. Confronto a grana fine con PQ: all'interno dei cluster selezionati, PQ utilizza rappresentazioni vettoriali compresse e quantizzate per calcolare rapidamente distanze approssimate.

Le prestazioni dell'indice IVF_PQ sono influenzate in modo significativo dai parametri che controllano gli algoritmi IVF e PQ. La regolazione di questi parametri è fondamentale per ottenere i risultati ottimali per un determinato set di dati e una determinata applicazione. Informazioni più dettagliate su questi parametri e sulla loro messa a punto sono disponibili in Parametri dell'indice.

Creare un indice

Per costruire un indice IVF_PQ su un campo vettoriale in Milvus, utilizzare il metodo add_index(), specificando i parametri index_type, metric_type e i parametri aggiuntivi per l'indice.

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
)

In questa configurazione:

  • index_type: Il tipo di indice da costruire. In questo esempio, impostare il valore su IVF_PQ.

  • metric_type: Il metodo utilizzato per calcolare la distanza tra i vettori. I valori supportati sono COSINE, L2 e IP. Per maggiori dettagli, consultare Tipi di metriche.

  • params: Opzioni di configurazione aggiuntive per la creazione dell'indice.

    • m: Numero di sottovettori in cui dividere il vettore.

    Per conoscere i parametri di costruzione disponibili per l'indice IVF_PQ, fare riferimento a Parametri di costruzione dell'indice.

Una volta configurati i parametri dell'indice, è possibile creare l'indice utilizzando direttamente il metodo create_index() o passando i parametri dell'indice nel metodo create_collection. Per i dettagli, fare riferimento a Creare una raccolta.

Ricerca nell'indice

Una volta costruito l'indice e inserite le entità, è possibile eseguire ricerche di similarità sull'indice.

search_params = {
    "params": {
        "nprobe": 10, # Number of clusters to 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=3,  # TopK results to return
    search_params=search_params
)

In questa configurazione:

  • params: Opzioni di configurazione aggiuntive per la ricerca sull'indice.

    • nprobe: Numero di cluster da ricercare.

    Per conoscere altri parametri di ricerca disponibili per l'indice IVF_PQ, fare riferimento a Parametri di ricerca specifici dell'indice.

Parametri dell'indice

Questa sezione fornisce una panoramica dei parametri utilizzati per la creazione di un indice e per l'esecuzione di ricerche sull'indice.

Parametri di costruzione dell'indice

La tabella seguente elenca i parametri che possono essere configurati in params quando si costruisce un indice.

ParametroDescrizioneValore IntervalloSuggerimento per la messa a punto
FIVnlistNumero di cluster da creare con l'algoritmo k-means durante la creazione dell'indice.Tipo: Intero
Intervallo: [1, 65536]
Valore predefinito: 128
Valori maggiori di nlist migliorano il richiamo creando cluster più raffinati, ma aumentano il tempo di costruzione dell'indice. Ottimizzare in base alle dimensioni del set di dati e alle risorse disponibili.
Nella maggior parte dei casi, si consiglia di impostare un valore compreso in questo intervallo: [32, 4096].
PQmNumero di sottovettori (usati per la quantizzazione) in cui dividere ogni vettore ad alta dimensionalità durante il processo di quantizzazione.Tipo: Intero
Intervallo: [1, 65536]
Valore predefinito: Nessuno
Un valore più alto di m può migliorare la precisione, ma aumenta anche la complessità computazionale e l'utilizzo di memoria.
m deve essere un divisore della dimensione del vettore(D) per garantire una corretta decomposizione. Un valore comunemente consigliato è m = D/2.
Nella maggior parte dei casi, si consiglia di impostare un valore compreso in questo intervallo: [D/8, D].
nbitsIl numero di bit utilizzati per rappresentare l'indice del centroide di ciascun sottovettore nella forma compressa. Ogni codebook conterrà 2^nbits di centroidi. Ad esempio, se nbits è impostato su 8, ogni sottovettore sarà rappresentato da un indice del centroide a 8 bit. Ciò consente di avere 2^8 (256) possibili centroidi nel codebook per quel sottovettore.Tipo: Intero
Intervallo: [1, 64]
Valore predefinito: 8
Un valore più alto di nbits consente di avere codebook più grandi, che potenzialmente portano a rappresentazioni più accurate dei vettori originali. Tuttavia, significa anche utilizzare più bit per memorizzare ciascun indice, con conseguente minore compressione.
Nella maggior parte dei casi, si consiglia di impostare un valore compreso in questo intervallo: [1, 16].

Parametri di ricerca specifici per gli indici

La tabella seguente elenca i parametri che possono essere configurati in search_params.params durante la ricerca sull'indice.

ParametroDescrizioneValore IntervalloSuggerimento per la messa a punto
FIVnprobeNumero di cluster in cui cercare i candidati.Tipo: Intero
Intervallo: [1, nlist]
Valore predefinito: 8
Valori più alti consentono di cercare più cluster, migliorando il richiamo grazie all'espansione dell'ambito di ricerca, ma al costo di una maggiore latenza della query.
Impostare nprobe in modo proporzionale a nlist per bilanciare velocità e precisione.
Nella maggior parte dei casi, si consiglia di impostare un valore compreso in questo intervallo: [1, nlist].

Try Managed Milvus for Free

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

Get Started
Feedback

Questa pagina è stata utile?