Questa pagina fornisce un esempio di flusso di lavoro che mostra come la
embedding()
funzione funziona
con i dati archiviati nelle tabelle e la
pgvector funzionalità di query.
L'esempio utilizza un input in testo normale per recuperare un risultato da un database che si affida all'analisi semantica del significato del testo basata su modello linguistico di grandi dimensioni (LLM).
Un esempio di scenario di un flusso di lavoro di embedding
Immagina un database in esecuzione su Cloud SQL per PostgreSQL con i seguenti aspetti:
Il database contiene una tabella:
items. Ogni riga di questa tabella descrive un articolo venduto dalla tua attività.La tabella
itemscontiene una colonna:complaints. Questa colonna memorizza i reclami degli acquirenti registrati su ogni articolo come testo normale.Il database si integra con il Vertex AI Model Garden, che gli consente di accedere all'LLM
gemini-embedding.
Anche se questo database memorizza i reclami sugli articoli, questi vengono memorizzati come testo normale, il che rende difficile eseguire query. Ad esempio, se vuoi vedere quali articoli hanno il maggior numero di reclami da parte dei clienti che hanno ricevuto il colore sbagliato della merce, puoi eseguire query SQL normali sulla tabella, cercando varie corrispondenze di parole chiave. Tuttavia, questo approccio corrisponde solo alle righe che contengono esattamente queste parole chiave.
Ad esempio, una query SQL di base come SELECT * FROM item WHERE complaints LIKE
"%wrong color%" non restituisce una riga in cui il campo complaints contiene solo
The picture shows a blue one, but the one I received was red.
Le query SQL che utilizzano gli embedding basati su LLM possono contribuire a colmare questa lacuna. Applicando gli embedding, puoi eseguire query sulla tabella in questo esempio per gli articoli in cui i reclami hanno una somiglianza semantica con un determinato prompt testuale, ad esempio "It was the wrong color".
I passaggi seguenti mostrano come abilitare questa funzionalità nello scenario di esempio descritto in precedenza.
Preparare la tabella
Prima di eseguire query basate su LLM sul contenuto della tabella items, devi preparare la tabella per archiviare e indicizzare gli embedding in base ai dati esistenti.
Creare una colonna per archiviare gli embedding
Aggiungi una colonna alla tabella per archiviare gli embedding.
sql
ALTER TABLE items ADD COLUMN complaint_embedding vector(3072);
Questo esempio specifica 3072 come argomento perché è il numero di dimensioni supportate dall'LLM gemini-embedding. Per ulteriori informazioni, vedi
Generare un embedding.
L'esempio applica il tipo di dati vector alla colonna per semplificare l'utilizzo di funzioni e operatori pgvector con i valori della colonna.
Compilare la nuova colonna
Utilizza la funzione embedding() per compilare questa nuova colonna con gli embedding in base al valore del testo di ogni riga visualizzato nella colonna complaints. In questo esempio, Cloud SQL genera gli embedding utilizzando l'LLM con l'ID gemini-embedding, versione 001.
UPDATE items SET complaint_embedding = embedding('gemini-embedding-001', complaints);
real[] di
embedding() in un valore vector per archiviare il valore nella colonna vector
creata in Creare una colonna per archiviare gli embedding.
Creare un indice
Per migliorare le prestazioni, aggiungi un indice alla tabella items.
CREATE INDEX complaint_embed_idx ON items
USING hnsw (complaint_embedding vector_cosine_ops);
Per ulteriori informazioni sulla creazione di questo tipo di indice, vedi Creare un indice di vicini più prossimi. Inoltre, per ulteriori informazioni sull'ottimizzazione dell'indice impostando i parametri, vedi Eseguire query e indicizzare gli embedding utilizzando pgvector.
Eseguire query basate su LLM con il testo fornito
Ora puoi eseguire query semantiche di vicini più prossimi sulla tabella items. La
query seguente utilizza l'operatore <-> fornito da pgvector
per completare le seguenti azioni:
- Ordina le righe della tabella in base alla prossimità semantica al testo di
It was the wrong color. - Restituisce i primi dieci reclami.
La query mostra i valori id e name della prima riga ordinata.
SELECT id, name FROM items
ORDER BY complaint_embedding
<-> embedding('gemini-embedding-001', 'It was the wrong color')::vector LIMIT 10;