• Informazioni su Milvus
  • Iniziare
  • Concetti
  • Guida per l'utente
  • Importazione dei dati
  • Strumenti AI
  • Guida all'amministrazione
  • Strumenti
  • Integrazioni
  • Tutorial
  • Domande frequenti
  • API Reference

FIV_SQ8

L'indice IVF_SQ8 è un algoritmo di indicizzazione basato sulla quantizzazione, progettato per affrontare le sfide della ricerca di similarità su larga scala. Questo tipo di indice consente di ottenere ricerche più rapide con un ingombro di memoria molto più ridotto rispetto ai metodi di ricerca esaustiva.

Panoramica

L'indice IVF_SQ8 si basa su due componenti chiave:

  • File invertito (IVF): Organizza i dati in cluster, consentendo all'algoritmo di ricerca di concentrarsi solo sui sottoinsiemi di vettori più rilevanti.

  • Quantizzazione scalare (SQ8): Comprime i vettori in una forma più compatta, riducendo drasticamente l'uso della memoria e mantenendo una precisione sufficiente per un rapido calcolo della similarità.

FIV

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

SQ8

La quantizzazione scalare (SQ) è una tecnica utilizzata per ridurre le dimensioni dei vettori ad alta dimensionalità sostituendo i loro valori con rappresentazioni più piccole e compatte. La variante SQ8 utilizza numeri interi a 8 bit invece dei tipici numeri in virgola mobile a 32 bit per memorizzare ogni valore di dimensione di un vettore. Questo riduce notevolmente la quantità di memoria necessaria per memorizzare i dati.

Ecco come funziona SQ8:

  1. Identificazione dell'intervallo: Innanzitutto, si identificano i valori minimi e massimi all'interno del vettore. Questo intervallo definisce i limiti per la quantizzazione.

  2. Normalizzazione: Normalizzare i valori del vettore in un intervallo compreso tra 0 e 1 utilizzando la formula:

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

    Questo assicura che tutti i valori siano mappati in modo proporzionale all'interno di un intervallo standardizzato, preparandoli per la compressione.

  3. Compressione a 8 bit: Moltiplicare il valore normalizzato per 255 (il valore massimo per un intero a 8 bit) e arrotondare il risultato al numero intero più vicino. In questo modo si comprime ogni valore in una rappresentazione a 8 bit.

Supponiamo di avere un valore di dimensione pari a 1,2, con un valore minimo di -1,7 e un valore massimo di 2,3. La figura seguente mostra come SQ8 viene applicato per convertire un valore float32 in un intero int8.

Ivf Sq8 FIV + SQ8

FIV + SQ8

L'indice IVF_SQ8 combina IVF e SQ8 per eseguire in modo efficiente le ricerche di similarità:

  1. IVF restringe l'ambito di ricerca: Il set di dati viene suddiviso in cluster e quando viene emessa una query, IVF confronta prima la query con i centroidi dei cluster, selezionando i cluster più rilevanti.

  2. SQ8 accelera il calcolo delle distanze: All'interno dei cluster selezionati, SQ8 comprime i vettori in numeri interi a 8 bit, riducendo l'uso della memoria e accelerando il calcolo delle distanze.

Utilizzando la FIV per focalizzare la ricerca e SQ8 per accelerare i calcoli, FIV_SQ8 consente di ottenere tempi di ricerca rapidi ed efficienza di memoria.

Creazione dell'indice

Per costruire un indice IVF_SQ8 su un campo vettoriale in Milvus, utilizzare il metodo add_index(), specificando i parametri index_type, metric_type e altri 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_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
)

In questa configurazione:

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

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

    • nlist: Numero di cluster da creare con l'algoritmo k-means durante la costruzione dell'indice.

    Per ulteriori informazioni sui parametri di costruzione disponibili per l'indice IVF_SQ8, 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": 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
)

In questa configurazione:

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

    • nprobe: Numero di cluster in cui cercare i candidati.

    Per conoscere altri parametri di ricerca disponibili per l'indice IVF_SQ8, fare riferimento a Parametri di ricerca specifici per l'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.

Parametro

Descrizione

Valore Intervallo

Suggerimento per la messa a punto

FIV

nlist

Numero 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].

Parametri di ricerca specifici per l'indice

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

Parametro

Descrizione

Valore Intervallo

Suggerimento per la messa a punto

FIV

nprobe

Numero 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 proporzione 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?