Questa pagina descrive come utilizzare la ricerca vettoriale in Spanner Graph per trovare i K-Nearest Neighbor (KNN) e gli Approximate Nearest Neighbor (ANN). Puoi utilizzare le funzioni di distanza vettoriale per eseguire la ricerca vettoriale KNN e ANN per casi d'uso come la ricerca di somiglianze o la Retrieval-Augmented Generation per applicazioni di AI generativa.
Spanner Graph supporta le seguenti funzioni di distanza per eseguire la ricerca di similarità vettoriale KNN:
COSINE_DISTANCE(): misura la distanza più breve tra due vettori.EUCLIDEAN_DISTANCE(): misura il coseno dell'angolo tra due vettori.DOT_PRODUCT(): calcola il coseno dell'angolo moltiplicato per il prodotto delle magnitudo dei vettori corrispondenti. Se sai che tutti i vector embedding nel tuo set di dati sono normalizzati, puoi utilizzareDOT_PRODUCT()come funzione di distanza.
Per saperne di più, consulta Eseguire la ricerca di similarità vettoriale in Spanner trovando i K vicini più prossimi.
Spanner Graph supporta anche le seguenti funzioni di distanza approssimativa per eseguire la ricerca di similarità vettoriale ANN:
APPROX_COSINE_DISTANCE: misura la distanza più breve approssimativa tra due vettori.APPROX_EUCLIDEAN_DISTANCE: misura il coseno approssimativo dell'angolo tra due vettori.APPROX_DOT_PRODUCT: calcola il coseno approssimativo dell'angolo moltiplicato per il prodotto delle magnitudini dei vettori corrispondenti. Se sai che tutti i vector embedding nel tuo set di dati sono normalizzati, puoi utilizzareDOT_PRODUCT()come funzione di distanza.
Per saperne di più, consulta la sezione Trovare i vicini più prossimi approssimativi, creare un indice vettoriale ed eseguire query sugli embedding vettoriali.
Prima di iniziare
Per eseguire gli esempi in questo documento, devi prima seguire i passaggi descritti in Configurare ed eseguire query su Spanner Graph per svolgere le seguenti operazioni:
- Crea un'istanza.
- Crea un database con uno schema Spanner Graph.
- Inserisci i dati essenziali del grafico.
Dopo aver inserito i dati essenziali del grafico, apporta i seguenti aggiornamenti al database.
Inserisci altri dati vettoriali nel database del grafico
Per apportare gli aggiornamenti necessari al database del grafico:
Aggiungi una nuova colonna,
nick_name_embeddings, alla tabella di inputAccount.ALTER TABLE Account ADD COLUMN nick_name_embeddings ARRAY<FLOAT32>(vector_length=>4);Aggiungi dati alla colonna
nick_name.UPDATE Account SET nick_name = "Fund for a refreshing tropical vacation" WHERE id = 7; UPDATE Account SET nick_name = "Fund for a rainy day!" WHERE id = 16; UPDATE Account SET nick_name = "Saving up for travel" WHERE id = 20;Crea incorporamenti per il testo nella colonna
nick_namee inseriscili nella nuova colonnanick_name_embeddings.Per generare incorporamenti di Gemini Enterprise Agent Platform per i tuoi dati operativi in Spanner Graph, consulta Ottenere incorporamenti di testo di Agent Platform.
A scopo illustrativo, i nostri esempi utilizzano valori vettoriali artificiali a bassa dimensionalità.
UPDATE Account SET nick_name_embeddings = ARRAY<FLOAT32>[0.3, 0.5, 0.8, 0.7] WHERE id = 7; UPDATE Account SET nick_name_embeddings = ARRAY<FLOAT32>[0.4, 0.9, 0.7, 0.1] WHERE id = 16; UPDATE Account SET nick_name_embeddings = ARRAY<FLOAT32>[0.2, 0.5, 0.6, 0.6] WHERE id = 20;Aggiungi due nuove colonne alla tabella di input
AccountTransferAccount:notesenotes_embeddings.ALTER TABLE AccountTransferAccount ADD COLUMN notes STRING(MAX); ALTER TABLE AccountTransferAccount ADD COLUMN notes_embeddings ARRAY<FLOAT32>(vector_length=>4);Crea incorporamenti per il testo nella colonna
notese inseriscili nella colonnanotes_embeddings.Per generare incorporamenti di Agent Platform per i tuoi dati operativi in Spanner Graph, consulta Recuperare gli incorporamenti di testo di Agent Platform.
A scopo illustrativo, i nostri esempi utilizzano valori vettoriali artificiali a bassa dimensionalità.
UPDATE AccountTransferAccount SET notes = "for shared cost of dinner", notes_embeddings = ARRAY<FLOAT32>[0.3, 0.5, 0.8, 0.7] WHERE id = 16 AND to_id = 20; UPDATE AccountTransferAccount SET notes = "fees for tuition", notes_embeddings = ARRAY<FLOAT32>[0.1, 0.9, 0.1, 0.7] WHERE id = 20 AND to_id = 7; UPDATE AccountTransferAccount SET notes = 'loved the lunch', notes_embeddings = ARRAY<FLOAT32>[0.4, 0.5, 0.7, 0.9] WHERE id = 20 AND to_id = 16;Dopo aver aggiunto nuove colonne alle tabelle di input
AccounteAccountTransferAccount, aggiorna la definizione del grafico delle proprietà utilizzando le seguenti istruzioni. Per ulteriori informazioni, consulta Aggiornare le definizioni di nodi o archi esistenti.CREATE OR REPLACE PROPERTY GRAPH FinGraph NODE TABLES (Account, Person) EDGE TABLES ( PersonOwnAccount SOURCE KEY (id) REFERENCES Person (id) DESTINATION KEY (account_id) REFERENCES Account (id) LABEL Owns, AccountTransferAccount SOURCE KEY (id) REFERENCES Account (id) DESTINATION KEY (to_id) REFERENCES Account (id) LABEL Transfers );
Trovare i vicini più prossimi K
Nell'esempio seguente, utilizza la funzione EUCLIDEAN_DISTANCE() per eseguire la ricerca vettoriale KNN
sui nodi e sugli archi del database del grafico.
Esegui la ricerca vettoriale KNN sui nodi del grafico
Puoi eseguire una ricerca vettoriale KNN sulla proprietà nick_name_embeddings del nodo Account. Questa ricerca vettoriale KNN restituisce name
del proprietario dell'account e nick_name dell'account. Nell'esempio seguente, il risultato mostra i due vicini più vicini per account per viaggi di piacere e vacanze, rappresentati dal vector embedding [0.2, 0.4, 0.9, 0.6].
GRAPH FinGraph
MATCH (p:Person)-[:Owns]->(a:Account)
RETURN p.name, a.nick_name
ORDER BY EUCLIDEAN_DISTANCE(a.nick_name_embeddings,
-- An illustrative embedding for 'accounts for leisure travel and vacation'
ARRAY<FLOAT32>[0.2, 0.4, 0.9, 0.6])
LIMIT 2;
Risultati
| nome | nick_name |
|---|---|
| Alex | Fondi per una vacanza tropicale rigenerante |
| Dana | Risparmiare per viaggiare |
Esegui la ricerca vettoriale KNN sugli archi del grafico
Puoi eseguire una ricerca vettoriale KNN sulla proprietà notes_embeddings del bordo Owns. Questa ricerca vettoriale KNN restituisce name del proprietario dell'account e notes del trasferimento. Nell'esempio seguente, il risultato mostra i due vicini più prossimi per spese alimentari, rappresentate dall'incorporamento del vettore [0.2, 0.4, 0.9, 0.6].
GRAPH FinGraph
MATCH (p:Person)-[:Owns]->(:Account)-[t:Transfers]->(:Account)
WHERE t.notes_embeddings IS NOT NULL
RETURN p.name, t.notes
ORDER BY EUCLIDEAN_DISTANCE(t.notes_embeddings,
-- An illustrative vector embedding for 'food expenses'
ARRAY<FLOAT32>[0.2, 0.4, 0.9, 0.6])
LIMIT 2;
Risultati
| nome | sugli appunti |
|---|---|
| Lee | per la cena a costo condiviso |
| Dana | Mi è piaciuto molto il pranzo. |
Crea un indice vettoriale e trova i vicini più prossimi approssimati
Per eseguire una ricerca ANN, devi creare un indice vettoriale specializzato
che Spanner Graph utilizza per accelerare la ricerca vettoriale. L'indice
vettoriale deve utilizzare una metrica di distanza specifica. Puoi scegliere la metrica di distanza
più adatta al tuo caso d'uso impostando il parametro distance_type su
COSINE, DOT_PRODUCT o EUCLIDEAN. Per saperne di più, consulta la sezione
Istruzioni VECTOR INDEX.
Nell'esempio seguente, crei un indice vettoriale utilizzando il tipo di distanza euclidea
nella colonna nick_name_embedding della tabella di input Account:
CREATE VECTOR INDEX NickNameEmbeddingIndex
ON Account(nick_name_embeddings)
WHERE nick_name_embeddings IS NOT NULL
OPTIONS (distance_type = 'EUCLIDEAN', tree_depth = 2, num_leaves = 1000);
Esegui la ricerca vettoriale ANN sui nodi del grafico
Dopo aver creato un indice vettoriale, puoi eseguire una ricerca vettoriale ANN sulla proprietà
nick_name del nodo Account. La ricerca vettoriale ANN restituisce il
name del proprietario dell'account e il nick_name dell'account. Nell'esempio seguente, il risultato mostra i due vicini più prossimi approssimati per account per viaggi di piacere e vacanze, rappresentati dall'incorporamento del vettore [0.2, 0.4, 0.9, 0.6].
Il suggerimento del grafico impone allo strumento di ottimizzazione delle query di utilizzare l'indice vettoriale specificato nel piano di esecuzione della query.
GRAPH FinGraph
MATCH (@{FORCE_INDEX=NickNameEmbeddingIndex} a:Account)
WHERE a.nick_name_embeddings IS NOT NULL
RETURN a, APPROX_EUCLIDEAN_DISTANCE(a.nick_name_embeddings,
-- An illustrative embedding for 'accounts for leisure travel and vacation'
ARRAY<FLOAT32>[0.2, 0.4, 0.9, 0.6],
options => JSON '{"num_leaves_to_search": 10}') AS distance
ORDER BY distance
LIMIT 2
NEXT
MATCH (p:Person)-[:Owns]->(a)
RETURN p.name, a.nick_name;
Risultati
| nome | nick_name |
|---|---|
| Alex | Fondi per una vacanza tropicale rigenerante |
| Dana | Risparmiare per viaggiare |
Passaggi successivi
- Esegui la ricerca di similarità vettoriale in Spanner trovando i K-Nearest Neighbors.
- Trova i vicini più prossimi approssimati, crea un indice vettoriale ed esegui query sugli incorporamenti vettoriali.
- Ottieni text embedding di Agent Platform
- Scopri di più sulle query Spanner Graph.
- Scopri le best practice per l'ottimizzazione delle query.