Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
DiskANN è un algoritmo di ricerca vicino più vicino scalabile per una ricerca vettoriale efficiente su qualsiasi scala. Offre un elevato richiamo, query elevate al secondo e bassa latenza delle query, anche per set di dati di miliardi di punti. Queste caratteristiche lo rendono uno strumento potente per la gestione di grandi volumi di dati.
Per altre informazioni su DiskANN, vedere DiskANN: ricerca vettoriale per la ricerca e la raccomandazione su scala Web.
L'estensione pg_diskann aggiunge il supporto per l'uso di DiskANN per l'indicizzazione e la ricerca di vettori efficienti.
Abilitare pg_diskann
Per usare l'estensione nel pg_diskann server flessibile Database di Azure per PostgreSQL, è necessario consentire l'estensione a livello di server. È quindi necessario creare l'estensione in ogni database in cui si vuole usare la funzionalità fornita dall'estensione.
Poiché pg_diskann ha una dipendenza dall'estensione vector , è possibile consentire e creare l'estensione vector nello stesso database ed eseguire il comando seguente:
CREATE EXTENSION IF NOT EXISTS pg_diskann;
In alternativa, è possibile ignorare esplicitamente l'autorizzazione e la creazione dell'estensione vector ed eseguire invece il comando precedente aggiungendo la CASCADE clausola . PostgreSQL utilizza una clausola per eseguire implicitamente CREATE EXTENSION sull'estensione dalla quale dipende. A tale scopo, utilizzare il seguente comando:
CREATE EXTENSION IF NOT EXISTS pg_diskann CASCADE;
Per eliminare l'estensione dal database a cui si è attualmente connessi, eseguire il comando seguente:
DROP EXTENSION IF EXISTS pg_diskann;
Usare il metodo di accesso all'indice diskann
Dopo aver installato l'estensione, è possibile creare un diskann indice in una colonna di tabella contenente dati vettoriali. Ad esempio, per creare un indice nella embedding colonna della demo tabella, usare il comando seguente:
CREATE TABLE demo (
id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
embedding public.vector(3)
-- other columns
);
-- insert dummy data
INSERT INTO demo (embedding) VALUES
('[1.0, 2.0, 3.0]'),
('[4.0, 5.0, 6.0]'),
('[7.0, 8.0, 9.0]');
-- create a diskann index by using Cosine distance operator
CREATE INDEX demo_embedding_diskann_idx ON demo USING diskann (embedding vector_cosine_ops)
Dopo aver creato l'indice, è possibile eseguire query per trovare i vicini più vicini.
La query seguente trova i cinque vicini più vicini al vettore [2.0, 3.0, 4.0]:
SELECT id, embedding
FROM demo
ORDER BY embedding <=> '[2.0, 3.0, 4.0]'
LIMIT 5;
Postgres decide automaticamente quando usare l'indice DiskANN. Se sceglie di non usare l'indice in uno scenario in cui si vuole usare l'indice, eseguire il comando seguente:
-- Explicit Transcation block to force use for DiskANN index.
BEGIN;
SET LOCAL enable_seqscan TO OFF;
-- Similarity search queries
COMMIT;
Importante
Impostare enable_seqscan su off scoraggia il pianificatore di query dall'usare il piano di scansione sequenziale se sono disponibili altri metodi. Poiché è disabilitato usando il SET LOCAL comando , l'impostazione diventa effettiva solo per la transazione corrente. Dopo un COMMIT o ROLLBACK, l'impostazione del livello di sessione diventa nuovamente effettiva. Se la query include altre tabelle, l'impostazione sconsiglia anche l'uso di analisi sequenziali in tutte le tabelle.
Scalabilità efficiente con quantizzazione (anteprima)
DiskANN usa la quantizzazione del prodotto (PQ) per ridurre notevolmente il footprint di memoria dei vettori. A differenza di altre tecniche di quantizzazione, l'algoritmo PQ può comprimere i vettori in modo più efficace, migliorando significativamente le prestazioni. Usando PQ, DiskANN può mantenere più dati in memoria, ridurre la necessità di accedere all'archiviazione più lenta e usare meno calcolo quando si confrontano vettori compressi. Questo si traduce in prestazioni migliori e in un notevole risparmio sui costi quando si lavora con grandi quantità di dati (>1 milione di righe).
Importante
Il supporto per la quantizzazione dei prodotti in DiskANN è disponibile a partire da pg_diskann v0.6 e versioni successive.
Per ridurre le dimensioni dell'indice e far entrare più dati in memoria, utilizza PQ:
CREATE INDEX demo_embedding_diskann_idx ON demo USING diskann(embedding vector_cosine_ops)
WITH(
product_quantized=true
);
Migliorare l'accuratezza quando si usa la quantizzazione del prodotto con la riclassificazione vettoriale
La riclassificazione con vettori completi è una tecnica usata nei sistemi di ricerca di prossimità ANN, come DiskANN, con quantizzazione del prodotto (PQ) per migliorare l'accuratezza dei risultati riordinando i primi N candidati recuperati usando i vettori originali non compressi (a precisione completa). Questa tecnica di reranking si basa esclusivamente su metriche di somiglianza del vettore esatto (ad esempio, somiglianza del coseno o distanza euclidea). Questa tecnica non è uguale alla riclassificazione tramite un modello di classificazione.
Per bilanciare velocità e precisione nella ricerca di somiglianza vettoriale, implementare una strategia di reranking in due passaggi durante l'esecuzione di query con DiskANN e la quantizzazione del prodotto per migliorare l'accuratezza.
Ricerca di prossimità iniziale: la query interna usa DiskANN per recuperare i primi 50 risultati ANN (Approximate Nearest Neighbor) in base alla distanza coseno tra gli incorporamenti archiviati e il vettore di query. Questo passaggio è rapido ed efficiente, poiché sfrutta le funzionalità di indicizzazione di DiskANN.
Riclassificazione precisa: la query esterna riordina questi 50 risultati in base alla distanza effettiva calcolata e restituisce i primi 10 risultati più pertinenti:
Ecco un esempio di reranking usando questo approccio in due passaggi:
SELECT id
FROM (
SELECT id, embedding <=> %s::vector AS distance
FROM demo
ORDER BY embedding <=> %s::vector asc
LIMIT 50
) AS t
ORDER BY t.distance
LIMIT 10;
Annotazioni
Sostituire %s con il vettore di interrogazione. È possibile usare azure_ai per creare un vettore di query direttamente in Postgres.
Questo approccio bilancia velocità (tramite ricerca di prossimità) e accuratezza (tramite riclassificazione vettoriale completa), garantendo risultati di alta qualità senza dover analizzare l'intero set di dati.
Supporto per incorporamenti di dimensioni elevate
Le applicazioni avanzate di IA generativa si basano spesso su modelli di incorporamento a elevata dimensionalità, come text-embedding-3-large, per ottenere una precisione superiore. Tuttavia, i metodi di indicizzazione tradizionali come HNSW in pgvector sono limitati a vettori con un massimo di 2.000 dimensioni, condizione che limita l'uso di questi potenti modelli.
A partire da pg_diskann v0.6 e versioni successive, DiskANN supporta vettori di indicizzazione con dimensioni fino a 16.000, espandendo significativamente l'ambito per carichi di lavoro di intelligenza artificiale ad alta accuratezza.
Importante
Attivare La quantizzazione del prodotto per sfruttare il supporto ad alta dimensione.
Impostazioni consigliate:
-
product_quantized: impostata su True -
pq_param_num_chunks: impostata su un terzo della dimensione di incorporamento per ottenere prestazioni ottimali. -
pq_param_training_samples: determinata automaticamente in base alle dimensioni della tabella, a meno che non sia stata impostata in modo esplicito.
Questo miglioramento consente una ricerca scalabile ed efficiente su grandi set di dati vettoriali, mantenendo al contempo un elevato livello di richiamo e precisione.
Velocizzare la compilazione dell'indice
Per migliorare i tempi di compilazione dell'indice, provare le raccomandazioni seguenti.
Usare più memoria
Per velocizzare la creazione dell'indice, aumentare la memoria allocata nel server PostgreSQL per la compilazione dell'indice. Specificare l'utilizzo della memoria tramite il maintenance_work_mem parametro .
-- Set the parameters
SET maintenance_work_mem = '8GB'; -- Depending on your resources
Il CREATE INDEX comando usa la memoria di lavoro specificata, a seconda delle risorse disponibili, per compilare l'indice.
CREATE INDEX demo_embedding_diskann_idx ON demo USING diskann (embedding vector_cosine_ops)
Suggerimento
Aumenta le risorse di memoria durante la creazione dell'indice per migliorare la velocità di indicizzazione, quindi riducile al termine dell'indicizzazione.
Uso della parallelizzazione
Per velocizzare la creazione dell'indice, utilizzare worker paralleli. Specificare il numero di worker tramite il parametro di archiviazione parallel_workers dell'istruzione CREATE TABLE durante la creazione della tabella. È possibile modificare questo numero in un secondo momento usando la SET clausola dell'istruzione ALTER TABLE .
CREATE TABLE demo (
id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
embedding public.vector(3)
) WITH (parallel_workers = 4);
ALTER TABLE demo SET (parallel_workers = 8);
Il CREATE INDEX comando usa il numero specificato di ruoli di lavoro paralleli, a seconda delle risorse disponibili, per compilare l'indice.
CREATE INDEX demo_embedding_diskann_idx ON demo USING diskann (embedding vector_cosine_ops)
Importante
Il processo leader non può partecipare alle compilazioni parallele degli indici.
Se si desidera creare l'indice utilizzando processi paralleli, impostare di conseguenza i parametri max_parallel_workers, max_worker_processes e max_parallel_maintenance_workers. Per altre informazioni su questi parametri, vedere parametri che controllano l'utilizzo delle risorse e il comportamento asincrono.
Impostare questi parametri a livelli di granularità diversi. Ad esempio, per impostarli a livello di sessione, eseguire le istruzioni seguenti:
-- Set the parameters
SET max_parallel_workers = 8;
SET max_worker_processes = 8; -- Note: Requires server restart
SET max_parallel_maintenance_workers = 4;
Per altre opzioni per configurare questi parametri in Database di Azure per PostgreSQL server flessibile, vedere Configurare i parametri.
Annotazioni
Il max_worker_processes parametro richiede che il riavvio del server sia effettivo.
Se la configurazione di questi parametri e le risorse disponibili sul server non consentono l'avvio dei lavoratori paralleli, PostgreSQL ricorre automaticamente alla creazione dell'indice in modalità non parallela.
Parametri di configurazione
Quando si crea un diskann indice, specificare vari parametri per controllarne il comportamento.
Parametri di indice
-
max_neighbors: numero massimo di archi per nodo nel grafico. Il valore predefinito è 32. Un valore più alto può migliorare il richiamo fino a un determinato punto. -
l_value_ib: dimensioni dell'elenco di ricerca durante la compilazione dell'indice. Il valore predefinito è 100. Un valore superiore rallenta la compilazione, ma l'indice è di qualità superiore. -
product_quantized: abilita la quantizzazione del prodotto per una ricerca più efficiente. Il valore predefinito è false. -
pq_param_num_chunks: numero di blocchi per la quantizzazione del prodotto. Il valore predefinito è 0, il che significa che il sistema determina automaticamente il valore in base alle dimensioni di incorporamento. Usare un terzo delle dimensioni di incorporamento originali. -
pq_param_training_samples: numero di vettori su cui eseguire il training della tabella pivot PQ. Il valore predefinito è 0, ovvero il sistema determina automaticamente il valore in base alle dimensioni della tabella.
CREATE INDEX demo_embedding_diskann_custom_idx ON demo USING diskann (embedding vector_cosine_ops)
WITH (
max_neighbors = 48,
l_value_ib = 100,
product_quantized=true,
pq_param_num_chunks = 0,
pq_param_training_samples = 0
);
Parametri di estensione
diskann.iterative_search: controlla il comportamento di ricerca.Configurazioni per
diskann.iterative_search:relaxed_order(impostazione predefinita): consente a diskann di cercare in modo iterativo il grafico in batch didiskann.l_value_is, fino a quando non viene restituito il numero desiderato di tuple, possibilmente limitato dallaLIMITclausola. Questa opzione potrebbe far sì che i risultati non siano più nell'ordine corretto.strict_order: simile arelaxed_order, ma garantisce che i risultati vengano restituiti in ordine rigoroso ordinati in base alla distanza.off: usa la funzionalità di ricerca non deterministica. Tenta di recuperare le tuplediskann.l_value_isin un solo passaggio. La ricerca non deterministica può restituire solo un massimo didiskann.l_value_isvettori per una query, indipendentemente dallaLIMITclausola o dal numero di tuple che corrispondono alla query.
Per modificare il comportamento di ricerca in
strict_orderper tutte le query eseguite nella sessione corrente, eseguire l'istruzione seguente:SET diskann.iterative_search TO 'strict_order';Per modificarla in modo che influisca solo su tutte le query eseguite nella transazione corrente, eseguire l'istruzione seguente:
BEGIN; SET LOCAL diskann.iterative_search TO 'strict_order'; -- All your queries COMMIT;diskann.l_value_is: valore L per l'analisi dell'indice (il valore predefinito è 100). Aumentare il valore migliora il ricordo, ma può rallentare le interrogazioni.Per modificare il valore L per l'analisi dell'indice su 20 per tutte le query eseguite nella sessione corrente, eseguire l'istruzione seguente:
SET diskann.l_value_is TO 20;Per modificarla in modo che influisca solo su tutte le query eseguite nella transazione corrente, eseguire l'istruzione seguente:
BEGIN; SET LOCAL diskann.l_value_is TO 20; -- All your queries COMMIT;
Configurazione consigliata dei parametri
| Dimensioni del set di dati (righe) | Tipo di parametro | Nome | Valore consigliato |
|---|---|---|---|
| <1 milione | Compilazione dell'indice | l_value_ib |
100 |
| <1 milione | Compilazione dell'indice | max_neighbors |
32 |
| <1 milione | Tempo query | diskann.l_value_is |
100 |
| 1M-50M | Compilazione dell'indice | l_value_ib |
100 |
| 1M-50M | Compilazione dell'indice | max_neighbors |
64 |
| 1M-50M | Compilazione dell'indice | product_quantized |
true |
| 1M-50M | Tempo query | diskann.l_value_is |
100 |
| >50M | Compilazione dell'indice | l_value_ib |
100 |
| >50M | Compilazione dell'indice | max_neighbors |
96 |
| >50M | Compilazione dell'indice | product_quantized |
true |
| >50M | Tempo query | diskann.l_value_is |
100 |
Annotazioni
Questi parametri possono variare a seconda del set di dati specifico e del caso d'uso. Potrebbe essere necessario provare a usare valori di parametro diversi per trovare le impostazioni ottimali per uno scenario specifico.
Stato CREATE INDEX e REINDEX
A partire da PostgreSQL 12, è possibile usare pg_stat_progress_create_index per controllare lo stato di avanzamento delle operazioni CREATE INDEX o REINDEX.
SELECT phase, round(100.0 * blocks_done / nullif(blocks_total, 0), 1) AS "%" FROM pg_stat_progress_create_index;
Per altre informazioni sulle possibili fasi in cui viene eseguita un'operazione CREATE INDEX o REINDEX, vedere Fasi CREATE INDEX.
Selezione della funzione di accesso all'indice
Il tipo vector supporta tre tipi di ricerche sui vettori archiviati. Selezionare la funzione di accesso corretta per l'indice in modo che il database possa considerare l'indice durante l'esecuzione delle query.
pg_diskann supporta gli operatori di distanza seguenti:
-
vector_l2_ops:<->distanza euclidea -
vector_cosine_ops:<=>distanza coseno -
vector_ip_ops:<#>prodotto interno
Risoluzione dei problemi
Errore: : assertion left == right failed left: 40 right: 0
La versione GA di DiskANN, v0.6.x introduce modifiche significative nel formato dei metadati dell'indice. Gli indici creati con v0.5.x non sono compatibili con le operazioni di inserimento v0.6.x. Se si tenta di inserire in una tabella con un indice obsoleto, viene visualizzato un errore, anche se l'indice viene visualizzato come valido.
Quando si verifica questo errore, risolverlo in base a:
Opzione 1: Esecuzione dell'istruzione
REINDEXoREDINDEX CONCURRENTLYsull'indice.Opzione 2: Ricompilazione dell'indice.
DROP INDEX your_index_name; CREATE INDEX your_index_name ON your_table USING diskann(your_vector_column vector_cosine_ops);
Errore: : diskann index needs to be upgraded to version 2...
- Quando si verifica questo errore, procedere come segue:
Opzione 1: Esecuzione dell'istruzione
REINDEXoREDINDEX CONCURRENTLYsull'indice.Opzione 2: Poiché
REINDEXpotrebbe richiedere molto tempo, l'estensione fornisce anche una funzione definita dall'utente denominataupgrade_diskann_index(), che aggiorna l'indice più velocemente, quando possibile.Per aggiornare l'indice, eseguire l'istruzione seguente:
SELECT upgrade_diskann_index('demo_embedding_diskann_custom_idx');Per aggiornare tutti gli indici diskann nel database alla versione corrente, eseguire l'istruzione seguente:
SELECT upgrade_diskann_index(pg_class.oid) FROM pg_class JOIN pg_am ON (pg_class.relam = pg_am.oid) WHERE pg_am.amname = 'diskann';