Questo documento mostra come utilizzare gli embedding archiviati per generare indici ed eseguire query sugli embedding. Per saperne di più sull'archiviazione degli incorporamenti, consulta Memorizzare gli incorporamenti vettoriali.
Con AlloyDB puoi creare indici ScaNN
, IVF
, IVFFlat
e HNSW
.
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;
Per generare gli indici
ScaNN
, installa l'estensionealloydb_scann
oltre all'estensionevector
.CREATE EXTENSION IF NOT EXISTS alloydb_scann;
Crea un indice
Puoi creare uno dei seguenti tipi di indice per le tabelle del database.
Crea un indice ScaNN
AlloyDB alloydb_scann
, un'estensione PostgreSQL sviluppata da Google che implementa un indice dei vicini più prossimi altamente efficiente basato sull'algoritmo ScaNN.
L'indice ScaNN
è un indice di quantizzazione basato su albero per la ricerca approssimativa
del vicino più prossimo. Offre tempi di creazione dell'indice più brevi e un utilizzo della memoria
inferiore rispetto a HNSW
. Inoltre, fornisce QPS più veloci rispetto a HNSW
in base al workload.
Indice ScaNN
ad albero a due livelli
Per applicare un indice ad albero a due livelli utilizzando l'algoritmo ScaNN a una colonna contenente incorporamenti vettoriali archiviati, esegui la seguente query DDL:
CREATE INDEX INDEX_NAME ON TABLE
USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (num_leaves=NUM_LEAVES_VALUE);
Sostituisci quanto segue:
INDEX_NAME
: il nome dell'indice che vuoi creare, ad esempiomy-scann-index
. I nomi degli indici sono condivisi nel database. Assicurati che ogni nome di indice sia univoco per ogni tabella del database.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:
l2
Prodotto scalare:
dot_product
Distanza coseno:
cosine
NUM_LEAVES_VALUE
: il numero di partizioni da applicare a questo indice. Imposta un valore compreso tra 1 e 1048576. Per ulteriori informazioni su come decidere questo valore, vedi Ottimizzare un indiceScaNN
.
Indice ScaNN
ad albero a tre livelli
Per creare un indice ad albero a tre livelli utilizzando l'algoritmo ScaNN in una colonna contenente incorporamenti vettoriali archiviati, esegui la seguente query DDL:
CREATE INDEX INDEX_NAME ON TABLE
USING scann (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (num_leaves=NUM_LEAVES_VALUE, max_num_levels = MAX_NUM_LEVELS);
Sostituisci quanto segue:
MAX_NUM_LEVELS
: il numero massimo di livelli dell'albero del clustering K-means. Imposta1
(valore predefinito) per la quantizzazione basata su albero a due livelli e2
per la quantizzazione basata su albero a tre livelli.
Dopo aver creato l'indice, puoi eseguire query di ricerca del vicino più prossimo che utilizzano l'indice seguendo le istruzioni riportate in Eseguire una query del vicino più prossimo con un testo specifico.
I parametri dell'indice devono essere impostati in modo da trovare il giusto equilibrio tra QPS e
richiamo. Per saperne di più sull'ottimizzazione dell'indice ScaNN
, consulta Ottimizzare un indice ScaNN
.
Per creare questo indice in una colonna di incorporamento che utilizza il tipo di dati real[]
anziché vector
, esegui il cast della colonna nel tipo di dati vector
:
CREATE INDEX INDEX_NAME ON TABLE
USING scann (CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS)) DISTANCE_FUNCTION)
WITH (num_leaves=NUM_LEAVES_VALUE, max_num_levels = MAX_NUM_LEVELS);
Sostituisci DIMENSIONS
con la larghezza dimensionale della
colonna di incorporamento. Per saperne di più su come trovare le dimensioni,
consulta la funzione vector_dims
in Funzioni
vettoriali.
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 index: tree training
scompare dopo la creazione dell'indice.
Per ottimizzare l'indice per un bilanciamento del recupero e delle QPS target, consulta Ottimizzare un indice ScaNN
.
Analizzare la tabella indicizzata
Dopo aver creato l'indice ScaNN
, devi eseguire il comando ANALYZE
per aggiornare le statistiche sui tuoi dati.
ANALYZE TABLE;
Esegui una query
Dopo aver archiviato e indicizzato gli incorporamenti nel database, puoi iniziare
a eseguire query utilizzando la funzionalità
di query pgvector
. Non puoi eseguire
query di ricerca collettive utilizzando l'estensione alloydb_scann
.
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'incorporamento a cui confrontare il testo.INDEX_NAME
: il nome dell'indice che vuoi utilizzare, ad esempiomy-scann-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
operatori pgvector
nearest-neighbor, <->
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
.
CREATE EXTENSION IF NOT EXISTS google_ml_integration;
CREATE EXTENSION IF NOT EXISTS vector;
SELECT * FROM TABLE
ORDER BY EMBEDDING_COLUMN::vector
<-> embedding('MODEL_IDVERSION_TAG', 'TEXT')
LIMIT ROW_COUNT
Sostituisci quanto segue:
MODEL_ID
: l'ID del modello da interrogare.Se utilizzi Vertex AI Model Garden, specifica
text-embedding-005
come ID modello. Questi sono i modelli basati su cloud che AlloyDB può utilizzare per gli incorporamenti di testo. Per ulteriori informazioni, vedi Incorporamenti di testo.Facoltativo:
VERSION_TAG
: il tag della versione del modello da interrogare. Aggiungi il prefisso@
al tag.Se utilizzi uno dei modelli in inglese
text-embedding
con Vertex AI, specifica uno dei tag di versione, ad esempiotext-embedding-005
, elencati in Versioni del modello.Google consiglia vivamente di specificare sempre il tag della versione. Se non specifichi il tag della versione, AlloyDB utilizza sempre l'ultima versione del modello, il che potrebbe portare a risultati imprevisti.
TEXT
: il testo da tradurre in un embedding vettoriale.
Passaggi successivi
- Un esempio di workflow di incorporamento
- Ottimizzare il rendimento delle query vettoriali
- Metriche dell'indice vettoriale