Puoi generare e gestire incorporamenti vettoriali per un'intera colonna della tabella, il che ti offre una soluzione scalabile per la creazione di incorporamenti vettoriali su larga scala. Questa soluzione è particolarmente utile per facilitare la ricerca semantica e la Retrieval Augmented Generation (RAG) sui contenuti di testo, tra cui:
- Creazione dell'embedding vettoriale iniziale per una nuova tabella
- Generazione di incorporamenti dopo l'importazione di grandi quantità di dati
- Aggiornamento degli incorporamenti dopo modifiche significative ai dati
- Mantenere gli embedding in modo incrementale
Informazioni sugli incorporamenti vettoriali automatici
Gli incorporamenti vettoriali automatici in AlloyDB forniscono un modo scalabile per automatizzare la generazione e la manutenzione degli incorporamenti vettoriali per i tuoi dati. Anziché generare manualmente gli incorporamenti per ogni nuovo testo o testo aggiornato, puoi configurare gli incorporamenti vettoriali automatici per gestire questo processo. Ciò è particolarmente utile per le applicazioni che si basano su incorporamenti aggiornati per la ricerca semantica, la generazione RAG (Retrieval-Augmented Generation) e altre funzionalità basate sull'AI.
Con i vector embedding automatici puoi:
- Inizializza gli incorporamenti per un'intera tabella: genera incorporamenti per tutti i dati esistenti in una colonna della tabella con un unico comando.
- Mantieni sincronizzati gli incorporamenti: aggiorna automaticamente gli incorporamenti quando cambiano i dati di origine, assicurandoti che le tue applicazioni di AI funzionino sempre con le informazioni più aggiornate.
- Genera incorporamenti su larga scala: crea in modo efficiente incorporamenti per tabelle di grandi dimensioni con milioni di righe.
- Configura e gestisci gli incorporamenti per più colonne nella stessa tabella chiamando le funzioni di gestione per ogni colonna di incorporamento.
Questa funzionalità semplifica lo sviluppo e la manutenzione delle applicazioni AI, eliminando la complessità della creazione e della manutenzione degli incorporamenti vettoriali.
Prima di iniziare
Prima di poter generare e gestire gli incorporamenti vettoriali per tabelle di grandi dimensioni, procedi nel seguente modo:
- Connettiti al database utilizzando
psqlo AlloyDB per PostgreSQL Studio come utentepostgres. - Verifica che l'estensione
google_ml_integrationsia installata. - Verifica che il flag google_ml_integration.enable_model_support sia impostato su
on. Verifica che l'estensione
google_ml_integrationsia la versione 1.5.2 o successive e che il flaggoogle_ml_integration.enable_faster_embedding_generationsia impostato suon.Per controllare la versione dell'estensione, esegui questo comando:
SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';Se devi aggiornare l'estensione, utilizza il comando
ALTER EXTENSION google_ml_integration UPDATE;.Prima di poter generare embedding da un database AlloyDB, devi configurare AlloyDB per funzionare con Vertex AI. Per saperne di più, consulta Integrare il database con Vertex AI.
Per la gestione e il monitoraggio della generazione di incorporamenti automatici, gli utenti hanno accesso
Selectalle tabellegoogle_ml.embed_gen_progressegoogle_ml.embed_gen_settingsper impostazione predefinita.Per consentire a un utente di gestire la generazione dell'incorporamento automatico, concedi le autorizzazioni
INSERT,UPDATEeDELETEnelle tabellegoogle_ml.embed_gen_progressegoogle_ml.embed_gen_settings:GRANT INSERT, UPDATE, DELETE ON google_ml.embed_gen_progress TO 'USER_NAME';Sostituisci quanto segue:
- USER_NAME: il nome dell'utente a cui vengono concessi i permessi.
Verifica che
AUTOCOMMITsia impostato suONnel client PostgreSQL che utilizzi.Verifica che il modello di incorporamento che utilizzi abbia una quota sufficiente per i vector embedding automatici. Una quota insufficiente può comportare un'operazione di incorporamento automatico lenta o non riuscita. Ad esempio, ecco i limiti per i modelli di embedding di Vertex AI:
- Limiti di embedding di testo: ogni richiesta può contenere fino a 250 testi di input che generano un embedding per ogni testo di input e 20.000 token per richiesta. Per calcolare gli incorporamenti vengono utilizzati solo i primi 2048 token di ogni testo di input.
-
- base_model : text-embedding : 1500
- base_model : gemini-embedding : 100000
Limite di token del modello Gemini Embedding: a differenza di altri modelli di embedding che erano principalmente limitati dalle quote RPM, la serie di modelli Gemini Embedding è limitata a 5.000.000 di token al minuto per progetto.
Inizializzare gli incorporamenti per una tabella
Le funzioni per la gestione degli incorporamenti vettoriali automatici sono disponibili nello schema ai. Questo schema fornisce un'interfaccia per le funzionalità di AI più recenti in AlloyDB.
Utilizza la funzione SQL ai.initialize_embeddings() per generare embedding per la colonna dei contenuti di una tabella. Questa è una chiamata di blocco:
- Se la funzione restituisce esito positivo, la creazione dell'incorporamento vettoriale è completata.
- La funzione tenta automaticamente di risolvere problemi temporanei come gli errori relativi alla quota del modello. Un errore ti viene restituito solo se questi tentativi di recupero non vanno a buon fine. Per problemi persistenti, ad esempio un
batch_sizeconfigurato in modo errato che causa il superamento dei limiti di dimensione della richiesta o se l'operazione è stata annullata manualmente, devi riemettere manualmente la chiamata.
Questa funzione supporta i modelli forniti da Google, ad esempio text-embedding-005 di Vertex AI, nonché i modelli personalizzati che hai registrato.
Prima di generare gli incorporamenti, crea una colonna content_embeddings nella tabella. Questa colonna in genere ha un tipo vector(DIMENSION) e un valore DEFAULT NULL.
ALTER TABLE user_reviews ADD COLUMN IF NOT EXISTS content_embeddings vector(768) DEFAULT NULL;
Esegui la generazione batch
Per impostazione predefinita, AlloyDB utilizza il batching per generare incorporamenti per più input di testo in un'unica richiesta, il che migliora l'efficienza. Se non fornisci una dimensione batch specifica, AlloyDB applica un valore predefinito determinato automaticamente.
Dimensione batch suggerimenti
Il parametro batch_size in ai.initialize_embeddings ti consente di guidare l'ottimizzatore di query di AlloyDB suggerendo una dimensione batch preferita per i modelli supportati direttamente. AlloyDB potrebbe ridurre dinamicamente questa dimensione in base ai limiti o alle quote del modello, ma il suggerimento contribuisce a influenzare il piano di esecuzione della query.
CALL ai.initialize_embeddings(
model_id => 'text-embedding-005',
table_name => 'user_reviews',
content_column => 'content',
embedding_column => 'content_embeddings',
batch_size => 50
);
Utilizzare un modello di incorporamento personalizzato con supporto batch
Se vuoi utilizzare un modello personalizzato o supportato esternamente che supporta il batching, definisci le funzioni di trasformazione batch e specificale come model_batch_in_transform_fn e model_batch_out_transform_fn quando crei un modello. Puoi anche specificare un batch_size nella chiamata initialize_embeddings. Per i modelli che supportano il batching, ti consigliamo di utilizzare un batch_size maggiore di 1 per ottenere prestazioni migliori.
Definisci le funzioni di input, output e trasformazione batch del modello personalizzato.
-- Scalar input transform functions CREATE OR REPLACE FUNCTION acme_text_input_transform(model_id TEXT, input TEXT) RETURNS JSON; CREATE OR REPLACE FUNCTION acme_text_output_transform(model_id TEXT, model_output JSON) RETURNS real[]; CREATE OR REPLACE FUNCTION acme_generate_headers(model_id TEXT, input TEXT) RETURNS JSON; -- Batch input transform functions CREATE OR REPLACE FUNCTION acme_text_batch_input_transform(model_id TEXT, input TEXT[]) RETURNS JSON; CREATE OR REPLACE FUNCTION acme_text_batch_output_transform(model_id TEXT, model_output JSON) RETURNS real[][];Per creare il modello, specifica le funzioni di trasformazione batch.
CALL ai.create_model( model_id => 'custom-embedding-model', model_request_url => 'https://acme.com/models/text/embeddings/v1', model_type => 'text_embedding', model_in_transform_fn => 'acme_text_input_transform', model_out_transform_fn => 'acme_text_output_transform', generate_headers_fn => 'acme_generate_headers', model_batch_in_transform_fn => 'acme_text_batch_input_transform', model_batch_out_transform_fn => 'acme_text_batch_output_transform' );Genera vector embedding con il tuo modello personalizzato.
CALL ai.initialize_embeddings( model_id => 'custom-embedding-model', table_name => 'user_reviews', content_column => 'content', embedding_column => 'content_embeddings', batch_size => 10 );
Puoi anche utilizzare la funzionalità di incorporamento automatico con modelli personalizzati che non supportano in modo nativo il batch. Per farlo, devi comunque definire le funzioni di trasformazione batch model_batch_in_transform_fn e model_batch_out_transform_fn. Per un modello non batch, definisci queste funzioni per elaborare un singolo input alla volta dall'array di input. Quando chiami ai.initialize_embeddings per questo modello, imposta batch_size su 1.
Aggiornare gli incorporamenti in modo incrementale
Quando aggiorni un incorporamento, questo viene rigenerato in base all'ultimo valore nella colonna dei contenuti di input.
Per darti il controllo su coerenza e prestazioni, AlloyDB supporta varie modalità per gli aggiornamenti incrementali dell'incorporamento. Puoi selezionare una modalità utilizzando l'argomento enum incremental_refresh_mode in ai.initialize_embeddings(). Di seguito è riportato un elenco delle possibili modalità:
transactional: gli embedding vengono aggiornati nell'ambito della transazione che aggiorna la colonna dei contenuti. Questo processo, che spesso utilizza un meccanismo simile a un trigger di database per generare automaticamente gli incorporamenti quando viene aggiornata la colonna dei contenuti, può introdurre un sovraccarico e rallentare le operazioni di aggiornamento. L'overhead introdotto è un compromesso per mantenere la semantica transazionale e garantire che gli incorporamenti siano sincronizzati con i contenuti. Questa modalità si basa sulle funzioni di trasformazione scalare del modello, pertanto devi definiremodel_in_transform_fnemodel_out_transform_fnquando crei il modello. Per utilizzare la modalitàtransactional, devi disporre del ruolo Proprietario nella tabella.CALL ai.initialize_embeddings( model_id => 'text-embedding-005', table_name => 'user_reviews', content_column => 'content', embedding_column => 'content_embeddings', batch_size => 10, incremental_refresh_mode => 'transactional' );none: questa è la modalità predefinita. In questa modalità, AlloyDB non aggiorna automaticamente gli incorporamenti. Non è previsto il monitoraggio delle modifiche incrementali, pertanto la chiamata della funzioneai.refresh_embeddings()rigenera gli incorporamenti per l'intera tabella. Questa modalità offre il controllo completo.
Aggiornare tutti gli incorporamenti per una tabella
Dopo aver eseguito correttamente ai.initialize_embeddings() per una tabella, puoi utilizzare la funzione ai.refresh_embeddings() per rigenerare gli incorporamenti. Puoi utilizzare un'operazione di aggiornamento per aggiornare gli incorporamenti per le righe modificate contemporaneamente durante la chiamata initialize_embeddings iniziale o per eseguire un aggiornamento completo periodico.
La funzione di aggiornamento riutilizza le impostazioni della chiamata iniziale, quindi devi specificare solo la tabella e la colonna di incorporamento. Puoi anche fornire un batch_size facoltativo per ignorare il valore predefinito.
CALL ai.refresh_embeddings(
table_name => 'user_reviews',
embedding_column => 'content_embeddings',
batch_size => 50 -- Optional override
);
Utilizzare i dati delle tabelle durante la creazione di vector embedding
Anche se ai.initialize_embeddings() è una chiamata di blocco per la sessione in cui viene eseguita, altre connessioni possono continuare a funzionare con la tabella. Il processo di incorporamento automatico dei vettori aggiorna le righe in batch, il che comporta il blocco standard a livello di riga. Ciò significa che le operazioni DML simultanee come UPDATE o DELETE vengono bloccate solo brevemente se tentano di modificare le stesse righe che il processo di incorporamento sta aggiornando. Le query di altre connessioni non vengono bloccate. Tieni presente che
initialize_embeddings ignora le righe modificate contemporaneamente. Se
incremental_refresh_mode è none, gli incorporamenti per queste righe modificate non vengono aggiornati fino a quando non viene chiamato un aggiornamento successivo.
-- connection1 (starts embedding generation)
SELECT
ai.initialize_embeddings(
model_id => 'text-embedding-005',
table_name => 'user_reviews',
content_column => 'content',
embedding_column => 'content_embeddings'
);
-- connection2 (performs DMLs/queries without blocking)
INSERT INTO user_reviews(id, review_time, is_edited, content)
VALUES (48290, now(), false, 'I really liked the product functionality, but wish it came in orange color');
UPDATE user_reviews
SET is_edited = TRUE, content = 'Changing to 5 star. My issue is resolved by the support'
WHERE id = 700;
Se annulli initialize_embeddings utilizzando pg_cancel o se initialize_embeddings non va a buon fine a causa di un errore interno, viene restituito uno stato di errore. Gli incorporamenti vettoriali creati correttamente non vengono sottoposti a rollback. Per eseguire il ripristino dall'errore e completare la creazione dell'incorporamento vettoriale, devi prima pulire la configurazione utilizzando la funzione ai.drop_embedding_config() e poi riemettere la chiamata ai.initialize_embeddings().
Per aggiornare gli incorporamenti per le righe modificate contemporaneamente, chiama ai.refresh_embeddings al termine della chiamata ai.initialize_embeddings. Questa chiamata di aggiornamento rigenera gli embedding per l'intera tabella.
Elimina le impostazioni di incorporamento automatico dei vettori
Se devi rimuovere la configurazione dell'incorporamento automatico di vettori per una combinazione specifica di tabella e colonna di incorporamento, utilizza la funzione ai.drop_embedding_config(). Questa funzione può essere utile per la pulizia o quando riconfiguri la gestione dell'incorporamento per una colonna.
CALL
ai.drop_embedding_config(
table_name => 'user_reviews',
embedding_column => 'content_embeddings');
Esempi di generazione di embedding in auto
Questa sezione fornisce esempi per la generazione automatica di embedding utilizzando gli endpoint del modello registrati.
Modello di embedding OpenAI
Per generare embedding utilizzando l'endpoint del modello text-embedding-3-small registrato fornito da OpenAI, esegui la seguente istruzione:
CALL ai.initialize_embeddings(
model_id => 'text-embedding-3-small',
table_name => 'user_reviews',
chunk_column => 'content',
embedding_column => 'content_embeddings'
);
Modelli di embedding personalizzati
Per i modelli di tua proprietà o supportati esternamente, devi definire le funzioni di trasformazione di input e output e registrarle con ai.create_model. Se prevedi di utilizzare la funzionalità di incorporamento automatico, devi specificare sia le funzioni di trasformazione scalare, ad esempio acme_text_input_transform, acme_text_output_transform, sia le funzioni di trasformazione batch, ad esempio acme_text_batch_input_transform, acme_text_batch_output_transform.
Passaggi successivi
- Esegui ricerche di similarità vettoriale.
- Scopri come creare un assistente per lo shopping intelligente con AlloyDB, pgvector e la gestione degli endpoint del modello.
- Crea indici e query di vettori.
- Scopri un esempio di workflow di incorporamento.