Questa pagina descrive come utilizzare gli incorporamenti archiviati per generare indici ed eseguire query
sugli incorporamenti utilizzando un indice IVF con AlloyDB per PostgreSQL.
Per saperne di più sull'archiviazione degli embedding, consulta
Archiviazione degli embedding vettoriali.
Prima di iniziare
Prima di poter iniziare a creare indici, devi completare i seguenti prerequisiti.
I vettori di embedding vengono aggiunti a una tabella nel tuo database AlloyDB.
È installata l'estensione
vectorversione0.5.0o successive basate supgvector, estesa da Google per AlloyDB.CREATE EXTENSION IF NOT EXISTS vector;
Crea un indice IVF
Stock pgvector supporta la ricerca del vicino più prossimo approssimato tramite l'indicizzazione. AlloyDB aggiunge a questo supporto una funzionalità di quantizzazione scalare che puoi specificare quando crei un indice.
Se abilitata, la quantizzazione scalare può accelerare notevolmente le query con vettori dimensionali più grandi e consente di archiviare vettori con un massimo di 8000 dimensioni.
Per attivare la quantizzazione scalare su un indice basato su pgvector, specifica IVF
come metodo di indice e SQ8 come quantizzatore:
CREATE INDEX INDEX_NAME ON TABLE
USING ivf (EMBEDDING_COLUMN DISTANCE_FUNCTION)
WITH (lists = LIST_COUNT, quantizer = 'QUANTIZER');
Sostituisci quanto segue:
INDEX_NAME: il nome dell'indice che vuoi creare, ad esempiomy-ivf-index. I nomi degli indici vengono 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:
vector_l2_opsProdotto interno:
vector_ip_opsDistanza coseno:
vector_cosine_ops
LIST_COUNT: il numero di elenchi da utilizzare con questo indice. Per ulteriori informazioni su come decidere questo valore, consulta Ottimizzare un indice IVF.QUANTIZER: il tipo di quantizzatore che vuoi utilizzare.Imposta uno dei seguenti valori:
SQ8: consigliato. Risposta più rapida alle query, ma con una perdita di precisione che non influisce sugli scenari di produzione.FLAT: risposta alle query più lenta e maggiore memoria utilizzata, ma può ottenere una perdita di richiamo trascurabile.
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 dativector:
CREATE INDEX INDEX_NAME ON TABLE
USING ivf (CAST(EMBEDDING_COLUMN AS vector(DIMENSIONS)))'}} DISTANCE_FUNCTION)
WITH (lists = LIST_COUNT, quantizer = 'SQ8');
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 postings indica che la creazione dell'indice è quasi
completata.
Per ottimizzare l'indice per un bilanciamento del recupero e delle QPS target, consulta Ottimizzare un indice IVF.
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 embedding, 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.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
1se 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 del vicino più prossimo pgvector, <-> 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.