Questa pagina descrive come utilizzare gli incorporamenti archiviati per generare indici ed eseguire query sugli incorporamenti utilizzando un indice HNSW
con AlloyDB per PostgreSQL.
Per saperne di più sull'archiviazione degli embedding, consulta
Archivia gli embedding vettoriali.
Prima di iniziare
Prima di poter iniziare a creare indici, devi completare i seguenti prerequisiti.
I vettori di incorporamento vengono aggiunti a una tabella nel tuo database AlloyDB.
È installata la
vector
versione dell'estensione0.5.0
o successive basate supgvector
, estese da Google per AlloyDB.CREATE EXTENSION IF NOT EXISTS vector;
Crea un indice HNSW
AlloyDB supporta la creazione di un indice hnsw
basato su grafici
disponibile con pgvector
utilizzando l'estensione pgvector
di AlloyDB. L'utilizzo di un indice hnsw
comporta una ricerca greedy che si sposta nel grafico alla costante ricerca del vicino più vicino al vettore di query finché non trova un risultato ottimale. Offre prestazioni delle query più veloci, ma tempi di compilazione più lenti rispetto a IVF
.
Per saperne di più sull'algoritmo HNSW, consulta Grafici HNSW (Hierarchical Navigable Small World).
Per creare un indice hnsw
, esegui questa query:
CREATE INDEX INDEX_NAME ON TABLE
USING hnsw (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (m = NUMBER_OF_CONNECTIONS, ef_construction = 'CANDIDATE_LIST_SIZE');
Sostituisci quanto segue:
INDEX_NAME
: il nome dell'indice che vuoi creare, ad esempiomy-hnsw-index
.TABLE
: la tabella a cui aggiungere l'indice.EMBEDDING_COLUMN
: una colonna che memorizza i dativector
.DISTANCE_FUNCTION
: la funzione di distanza da utilizzare con questo indice. Scegli una delle opzioni seguenti:Distanza L2:
vector_l2_ops
Prodotto interno:
vector_ip_ops
Distanza coseno:
vector_cosine_ops
NUMBER_OF_CONNECTIONS
: il numero massimo di connessioni da un nodo nel grafico. Puoi iniziare con il valore predefinito16
e sperimentare con valori più alti in base alle dimensioni del tuo set di dati.CANDIDATE_LIST_SIZE
: la dimensione di un elenco di candidati mantenuto durante la costruzione del grafico, che aggiorna costantemente i migliori candidati attuali per i vicini più prossimi di un nodo. Imposta questo valore su un valore superiore al doppio del valorem
, ad esempio64
.
Per visualizzare l'avanzamento dell'indicizzazione, utilizza la visualizzazione pg_stat_progress_create_index
:
SELECT * FROM pg_stat_progress_create_index;
La colonna phase
mostra lo stato attuale della creazione dell'indice e la fase
building graph
scompare dopo la creazione dell'indice.
Per ottimizzare l'indice per un bilanciamento di precisione e QPS target, consulta Ottimizzare un indice hnsw
.
Esegui una query
Dopo aver archiviato e indicizzato gli embedding nel database, puoi iniziare
a eseguire query utilizzando la funzionalità di query pgvector
.
Per trovare i vicini semantici più vicini per un vettore di incorporamento, puoi eseguire la seguente query di esempio, in cui imposti la stessa funzione di distanza che hai utilizzato durante la creazione dell'indice.
SELECT * FROM TABLE
ORDER BY EMBEDDING_COLUMN DISTANCE_FUNCTION_QUERY ['EMBEDDING']
LIMIT ROW_COUNT
Sostituisci quanto segue:
TABLE
: la tabella contenente l'embedding a cui confrontare il testo.INDEX_NAME
: il nome dell'indice che vuoi utilizzare, ad esempiomy-hnsw-index
.EMBEDDING_COLUMN
: la colonna contenente gli incorporamenti archiviati.DISTANCE_FUNCTION_QUERY
: la funzione di distanza da utilizzare con questa query. Scegli una delle seguenti opzioni in base alla funzione di distanza utilizzata durante la creazione dell'indice:Distanza L2:
<->
Prodotto interno:
<#>
Distanza coseno:
<=>
EMBEDDING
: il vettore di embedding di cui vuoi trovare i vicini semantici memorizzati più vicini.ROW_COUNT
: il numero di righe da restituire.Specifica
1
se vuoi solo la corrispondenza migliore.
Per altri esempi di query, consulta la sezione Query.
Puoi anche utilizzare la funzione embedding()
per tradurre il testo in un vettore. Applica il vettore a uno degli
pgvector
operatori del vicino più prossimo<->
, per la distanza L2, per trovare le righe del database con gli
incorporamenti semanticamente più simili.
Poiché embedding()
restituisce un array real
, devi eseguire il cast esplicito della chiamata embedding()
a vector
per utilizzare questi valori con gli operatori pgvector
.
Passaggi successivi
- Crea un indice ScaNN
- Esegui ricerche di similarità vettoriale
- Ottimizzare il rendimento delle query vettoriali
- Metriche dell'indice vettoriale
- Scopri come creare un assistente per lo shopping intelligente con AlloyDB, pgvector e la gestione degli endpoint del modello.