Questo documento mostra come utilizzare gli embedding archiviati per generare indici ed eseguire query sugli embedding. Per saperne di più sull'archiviazione degli embedding, consulta Archivia gli embedding 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
efficiente indice dei vicini più prossimi basato su [ScaNN
algorithm](https://github.com/google-research/google-research/blob/master/scann/docs/algorithms.md).
L'indice ScaNN
è un indice di quantizzazione basato su un albero per la ricerca approssimativa
ricerca del vicino più prossimo. Offre tempi di creazione dell'indice più brevi e
footprint della memoria rispetto a HNSW
. Inoltre, offre QPS più veloci in
rispetto a HNSW
in base al workload.
una tabella nel tuo database AlloyDB. Se provi a generare un indice ScaNN
su una tabella vuota o partizionata, potresti riscontrare alcuni problemi. Per saperne di più
Per informazioni sugli errori generati, vedi Risolvere i problemi relativi agli errori dell'indice ScaNN.
Indice ScaNN
ad albero a due livelli
Per applicare un indice ad albero a due livelli utilizzando l'algoritmo ScaNN a una colonna
contenente gli embedding 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 vuoicreare, ad esempio
my-scann-index
. I nomi degli indici vengono condivisinel database. Assicurati che ogni nome dell'indice sia univoco per ogni
tabella nel database.
TABLE
: la tabella a cui aggiungere l'indice.EMBEDDING_COLUMN
: una colonna che memorizzavector
dati pubblici o condivisi.
DISTANCE_FUNCTION
: la funzione di distanza da utilizzarecon 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 applicarequesto indice. Imposta un valore compreso tra 1 e 1048576. Per ulteriori informazioni
Per informazioni su come decidere questo valore, vedi Ottimizzare un indice
ScaNN
.
Indice ScaNN
ad albero a tre livelli
Per creare un indice ad albero a tre livelli utilizzando l'algoritmo ScaNN in una colonna
contenente gli embedding 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 dellaAlbero di clustering K-means. Imposta su
1
(valore predefinito) per la struttura ad albero a due livelliquantizzazione e
2
per la quantizzazione basata su albero a tre livelli.
Dopo aver creato l'indice, puoi eseguire query di ricerca del vicino più prossimo che
utilizza l'indice seguendo le istruzioni riportate in [Crea un indice di ricerca del vicino più prossimo
query con il testo specificato](#query).
I parametri dell'indice devono essere impostati in modo da trovare il giusto equilibrio tra QPS e
richiamo. Per maggiori informazioni sull'ottimizzazione dell'indice ScaNN
, vedi [Ottimizzare un ScaNN
index](/alloydb/omni/containers/15.7.0/docs/ai/tune-indexes).
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 del
colonna di embedding. Per ulteriori informazioni su come trovare le dimensioni,
vedi la funzione vector_dims
in [Vector
functions](https://github.com/pgvector/pgvector?tab=readme-ov-file#vector-functions).
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, mentre
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
, esegui 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
query utilizzando la [pgvector
query
functionality](https://github.com/pgvector/pgvector#querying). Non puoi eseguire
query di ricerca collettive utilizzando l'estensione alloydb_scann
.
Per trovare i vicini semantici più prossimi per un vettore di incorporamento, puoi eseguire il comando
query di esempio seguente, 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 da confrontarea cui inviare il messaggio.
INDEX_NAME
: il nome dell'indice che vuoi utilizzare, ad esempioad esempio,
my-scann-index
.EMBEDDING_COLUMN
: la colonna contenente il valore memorizzatoembedding.
DISTANCE_FUNCTION_QUERY
: la funzione di distanza da utilizzare con questoquery. 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 per cui vuoi trovare il vettore memorizzato più vicinovicini semantici di.
ROW_COUNT
: il numero di righe da restituire.Specifica
1
se vuoi solo la corrispondenza migliore.
Per ulteriori informazioni su altri esempi di query, vedi
Puoi anche utilizzare la funzione embedding()
per tradurre il
in un vettore. Applichi il vettore a uno dei
operatore dei vicini più prossimi pgvector
, <->
per la distanza L2, per trovare le righe del database con il
gli incorporamenti semanticamente più simili.
Poiché embedding()
restituisce un array real
, devi eseguire il cast esplicito di
embedding()
chiama vector
per utilizzare questi valori con pgvector
operatori.
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 vector embedding.
Passaggi successivi
- Un esempio di workflow di incorporamento
- Ottimizzare il rendimento delle query vettoriali
- Metriche dell'indice vettoriale