Utilizzare la ricerca vettoriale con Spanner Graph

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 utilizzare DOT_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 utilizzare DOT_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:

  1. Crea un'istanza.
  2. Crea un database con uno schema Spanner Graph.
  3. 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:

  1. Aggiungi una nuova colonna, nick_name_embeddings, alla tabella di input Account.

    ALTER TABLE Account
    ADD COLUMN nick_name_embeddings ARRAY<FLOAT32>(vector_length=>4);
    
  2. 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;
    
  3. Crea incorporamenti per il testo nella colonna nick_name e inseriscili nella nuova colonna nick_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;
    
  4. Aggiungi due nuove colonne alla tabella di input AccountTransferAccount: notes e notes_embeddings.

    ALTER TABLE AccountTransferAccount
    ADD COLUMN notes STRING(MAX);
    ALTER TABLE AccountTransferAccount
    ADD COLUMN notes_embeddings ARRAY<FLOAT32>(vector_length=>4);
    
  5. Crea incorporamenti per il testo nella colonna notes e inseriscili nella colonna notes_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;
    
  6. Dopo aver aggiunto nuove colonne alle tabelle di input Account e AccountTransferAccount, 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