HNSW_PQ
HNSW_PQ sfrutta i grafi Hierarchical Navigable Small World (HNSW) con la Quantizzazione del Prodotto (PQ), creando un metodo di indicizzazione vettoriale avanzato che offre un compromesso controllabile tra dimensione e accuratezza. Rispetto a HNSW_SQ, questo tipo di indice offre un tasso di richiamo più elevato allo stesso livello di compressione, anche se con una velocità di elaborazione delle query inferiore e un tempo di costruzione dell'indice più lungo.
Panoramica
HNSW_PQ combina due tecniche di indicizzazione: HNSW per una navigazione veloce basata sui grafi e PQ per un'efficiente compressione vettoriale.
HNSW
HNSW costruisce un grafo multistrato in cui ogni nodo corrisponde a un vettore del set di dati. In questo grafo, i nodi sono collegati in base alla loro somiglianza, consentendo una rapida navigazione nello spazio dei dati. La struttura gerarchica consente all'algoritmo di ricerca di restringere i vicini candidati, accelerando in modo significativo il processo di ricerca in spazi ad alta dimensionalità.
Per ulteriori informazioni, consultare HNSW.
PQ
PQ è una tecnica di compressione vettoriale che scompone i vettori ad alta dimensione in sottovettori più piccoli, che vengono poi quantizzati e compressi. La compressione riduce drasticamente i requisiti di memoria e accelera i calcoli della distanza.
Per ulteriori informazioni, consultare FIV_PQ.
HNSW + PQ
HNSW_PQ combina i punti di forza di HNSW e PQ per consentire un'efficiente ricerca approssimata dei vicini. Utilizza PQ per comprimere i dati (riducendo così l'uso della memoria) e quindi costruisce un grafo HNSW su questi vettori compressi per consentire un rapido recupero dei candidati. Durante la ricerca, l'algoritmo può opzionalmente raffinare i risultati dei candidati utilizzando dati di maggiore precisione per migliorare la precisione. Ecco come funziona il processo:
Compressione dei dati: PQ divide ogni vettore in più sottovettori e li quantizza utilizzando un codebook di centroidi, controllato da parametri come
m(numero di sottovettori) enbits(bit per sottovettore).Costruzione del grafico: I vettori compressi vengono quindi utilizzati per costruire un grafo HNSW. Poiché i vettori sono memorizzati in forma compressa, il grafo risultante è in genere più piccolo, richiede meno memoria e può essere percorso più rapidamente, accelerando notevolmente la fase di recupero dei candidati.
Recupero dei candidati: Quando viene eseguita una query, l'algoritmo utilizza i dati compressi nel grafo HNSW per identificare in modo efficiente un pool di vicini candidati. Questa ricerca basata sul grafo riduce drasticamente il numero di vettori da considerare, migliorando la latenza della query rispetto alle ricerche brute-force.
(Opzionale) Affinamento dei risultati: I risultati candidati iniziali possono essere raffinati per ottenere una maggiore precisione, in base ai seguenti parametri:
refine: Controlla se questa fase di raffinamento è attivata. Se impostato sutrue, il sistema ricalcola le distanze utilizzando rappresentazioni di precisione superiore o non compresse.refine_type: Specifica il livello di precisione dei dati utilizzati durante il raffinamento (ad esempio, SQ6, SQ8, BF16). Una scelta di precisione superiore, comeFP32, può dare risultati più accurati, ma richiede più memoria. Il livello di precisione deve essere superiore alla precisione dell'insieme di dati compresso originale disq_type.refine_k: Agisce come fattore di ingrandimento. Ad esempio, se il top k è 100 erefine_kè 2, il sistema classifica nuovamente i 200 candidati migliori e restituisce i 100 migliori, migliorando l'accuratezza complessiva.
Per un elenco completo dei parametri e dei valori validi, consultare la sezione Parametri dell'indice.
Creazione dell'indice
Per costruire un indice HNSW_PQ 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="HNSW_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": 30, # Maximum number of neighbors each node can connect to in the graph
"efConstruction": 360, # Number of candidate neighbors considered for connection during index construction
"m": 384,
"nbits": 8,
"refine": true, # Whether to enable the refinement step
"refine_type": "SQ8" # Precision level of data used for refinement
} # Index building params
)
In questa configurazione:
index_type: Il tipo di indice da costruire. In questo esempio, impostare il valore suHNSW_PQ.metric_type: Il metodo utilizzato per calcolare la distanza tra i vettori. I valori supportati sonoCOSINE,L2eIP. Per maggiori dettagli, consultare Tipi di metriche.params: Opzioni di configurazione aggiuntive per la costruzione dell'indice. Per i dettagli, fare riferimento a Parametri di costruzione dell'indice.
Una volta configurati i parametri dell'indice, si può creare l'indice usando 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": {
"ef": 10, # Parameter controlling query time/accuracy trade-off
"refine_k": 1 # The magnification factor
}
}
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
)
In questa configurazione:
params: Opzioni di configurazione aggiuntive per la ricerca sull'indice. Per i dettagli, 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 durante la creazione di un indice.
Parametro |
Descrizione |
Valore Intervallo |
Suggerimento per la messa a punto |
|
|---|---|---|---|---|
HNSW |
|
Numero massimo di connessioni (o bordi) che ogni nodo può avere nel grafo, compresi i bordi in uscita e in entrata. Questo parametro influisce direttamente sulla costruzione dell'indice e sulla ricerca. |
Tipo: Intervallo: [2, 2048] Valore predefinito: |
Un valore maggiore di Si consiglia di diminuire Nella maggior parte dei casi, si consiglia di impostare un valore compreso in questo intervallo: [5, 100]. |
|
Numero di vicini candidati considerati per la connessione durante la costruzione dell'indice. Per ogni nuovo elemento viene valutato un pool più ampio di candidati, ma il numero massimo di connessioni effettivamente stabilite è ancora limitato da |
Tipo: Intervallo: [1, int_max] Valore predefinito: |
Un valore più alto di Considerare di diminuire Nella maggior parte dei casi, si consiglia di impostare un valore compreso in questo intervallo: [50, 500]. |
|
PQ |
|
Numero 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 Nella maggior parte dei casi, si consiglia di impostare un valore compreso in questo intervallo: [D/8, D]. |
|
Il numero di bit utilizzati per rappresentare l'indice del centroide di ciascun sottovettore nella forma compressa. Determina direttamente la dimensione di ciascun codebook. Ogni codebook conterrà centroidi a 2 bit. Ad esempio, se |
Tipo: Intervallo di valori: [1, 24] Valore predefinito: |
Un valore più alto di |
|
|
Un flag booleano che controlla se viene applicata una fase di raffinamento durante la ricerca. Il raffinamento consiste nel riordinare i risultati iniziali calcolando le distanze esatte tra il vettore della query e i candidati. |
Tipo: Booleano Intervallo: [ Valore predefinito: |
Impostare |
|
|
Determina la precisione dei dati utilizzati durante il processo di raffinamento. Questa precisione deve essere superiore a quella dei vettori compressi (come impostato dai parametri |
Tipo: String Range:[ Valore predefinito: Nessuno |
Utilizzare |
Parametri di ricerca specifici per l'indice
La tabella seguente elenca i parametri che possono essere configurati in search_params.params per la ricerca sull'indice.
Parametro |
Descrizione |
Valore Intervallo |
Suggerimento per la messa a punto |
|
|---|---|---|---|---|
HNSW |
|
Controlla l'ampiezza della ricerca durante il recupero dei vicini. Determina il numero di nodi visitati e valutati come potenziali vicini. Questo parametro influisce solo sul processo di ricerca e si applica esclusivamente al livello inferiore del grafo. |
Tipo: Intero Intervallo: [1, int_max] Valore predefinito: limit (TopK vicini da restituire) |
Un valore maggiore di Considerare di diminuire Nella maggior parte dei casi, si consiglia di impostare un valore compreso in questo intervallo: [K, 10K]. |
PQ |
|
Fattore di ingrandimento che controlla quanti candidati in più vengono esaminati durante la fase di raffinamento (reranking), rispetto ai primi K risultati richiesti. |
Tipo: Variabile Intervallo: [1, float_max) Valore predefinito: 1 |
Valori più alti di |