Auf dieser Seite wird beschrieben, wie Sie die Vektorsuche in Spanner Graph verwenden, um die K-nächsten Nachbarn (K-Nearest Neighbors, KNN) und die ungefähren nächsten Nachbarn (Approximate Nearest Neighbors, ANN) zu finden. Sie können Vektordistanzfunktionen verwenden, um KNN- und ANN-Vektorsuchen für Anwendungsfälle wie die Ähnlichkeitssuche oder Retrieval-Augmented Generation für generative KI-Anwendungen durchzuführen.
Spanner Graph unterstützt die folgenden Distanzfunktionen für die KNN-Vektorähnlichkeitssuche:
COSINE_DISTANCE(): Misst die kürzeste Distanz zwischen zwei Vektoren.EUCLIDEAN_DISTANCE(): entspricht dem Kosinus des Winkels zwischen zwei Vektoren.DOT_PRODUCT(): Berechnet den Kosinus des Winkels multipliziert mit dem Produkt der entsprechenden Vektormagnituden. Wenn Sie wissen, dass alle Vektoreinbettungen in Ihrem Dataset normalisiert sind, können SieDOT_PRODUCT()als Distanzfunktion verwenden.
Weitere Informationen finden Sie unter Vektorähnlichkeitssuche in Spanner durchführen, indem die K-nächsten Nachbarn ermittelt werden.
Spanner Graph unterstützt auch die folgenden Funktionen für die ungefähre Distanz, um ANN-Vektorähnlichkeitssuchen durchzuführen:
APPROX_COSINE_DISTANCE: Misst die ungefähre kürzeste Distanz zwischen zwei Vektoren.APPROX_EUCLIDEAN_DISTANCE: entspricht dem ungefähren Kosinus des Winkels zwischen zwei Vektoren.APPROX_DOT_PRODUCT: Berechnet den ungefähren Kosinus des Winkels multipliziert mit dem Produkt der entsprechenden Vektormagnituden. Wenn Sie wissen, dass alle Vektoreinbettungen in Ihrem Datensatz normalisiert sind, können SieDOT_PRODUCT()als Distanzfunktion verwenden.
Weitere Informationen finden Sie unter Ungefähre nächste Nachbarn finden, Vektorindex erstellen und Vektoreinbettungen abfragen.
Hinweis
Wenn Sie die Beispiele in diesem Dokument ausführen möchten, müssen Sie zuerst die Schritte unter Spanner Graph einrichten und abfragen ausführen, um Folgendes zu tun:
- Instanz erstellen
- Datenbank mit einem Spanner Graph-Schema erstellen
- Wichtige Diagrammdaten einfügen:
Nachdem Sie die wichtigsten Diagrammdaten eingefügt haben, nehmen Sie die folgenden Aktualisierungen an Ihrer Datenbank vor.
Zusätzliche Vektordaten in die Graphdatenbank einfügen
So nehmen Sie die erforderlichen Änderungen an Ihrer Graphdatenbank vor:
Fügen Sie der Eingabetabelle
Accounteine neue Spaltenick_name_embeddingshinzu.ALTER TABLE Account ADD COLUMN nick_name_embeddings ARRAY<FLOAT32>(vector_length=>4);Fügen Sie der Spalte
nick_nameDaten hinzu.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;Erstellen Sie Einbettungen für den Text in der Spalte
nick_nameund fügen Sie sie in die neue Spaltenick_name_embeddingsein.Informationen zum Generieren von Gemini Enterprise Agent Platform-Einbettungen für Ihre Betriebsdaten in Spanner Graph finden Sie unter Agent Platform-Texteinbettungen abrufen.
In unseren Beispielen werden künstliche, niedrigdimensionale Vektorwerte verwendet.
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;Fügen Sie der Eingabetabelle
AccountTransferAccountzwei neue Spalten hinzu:notesundnotes_embeddings.ALTER TABLE AccountTransferAccount ADD COLUMN notes STRING(MAX); ALTER TABLE AccountTransferAccount ADD COLUMN notes_embeddings ARRAY<FLOAT32>(vector_length=>4);Erstellen Sie Einbettungen für den Text in der Spalte
notesund fügen Sie sie in die Spaltenotes_embeddingsein.Informationen zum Generieren von Agent Platform-Einbettungen für Ihre Betriebsdaten in Spanner Graph finden Sie unter Agent Platform-Texteinbettungen abrufen.
In unseren Beispielen werden künstliche, niedrigdimensionale Vektorwerte verwendet.
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;Nachdem Sie den Eingabetabellen
AccountundAccountTransferAccountneue Spalten hinzugefügt haben, aktualisieren Sie die Definition des Eigenschaftsgraphen mit den folgenden Anweisungen. Weitere Informationen finden Sie unter Vorhandene Knoten- oder Kantendefinitionen aktualisieren.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 );
K-nächstgelegene Nachbarn finden
Im folgenden Beispiel wird die Funktion EUCLIDEAN_DISTANCE() verwendet, um eine KNN-Vektorsuche für die Knoten und Kanten Ihrer Graphdatenbank durchzuführen.
KNN-Vektorsuche für Grafikknoten ausführen
Sie können eine KNN-Vektorsuche für die nick_name_embeddings-Property des Account-Knotens durchführen. Bei dieser KNN-Vektorsuche werden die name des Kontoinhabers und die nick_name des Kontos zurückgegeben. Im folgenden Beispiel sehen Sie die beiden ähnlichsten Nachbarn für Konten für Freizeit und Urlaub, die durch die [0.2, 0.4, 0.9, 0.6]-Vektoreinbettung dargestellt werden.
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;
Ergebnisse
| Name | nick_name |
|---|---|
| Alex | Fonds für einen erfrischenden tropischen Urlaub |
| Dana | Für Reisen sparen |
KNN-Vektorsuche für Grafkanten durchführen
Sie können eine KNN-Vektorsuche für die notes_embeddings-Property der Owns-Kante durchführen. Bei dieser KNN-Vektorsuche werden die name des Kontoinhabers und die notes der Übertragung zurückgegeben. Im folgenden Beispiel werden die beiden nächsten K-Nachbarn für food expenses (Lebensmittelkosten) angezeigt, die durch die [0.2, 0.4, 0.9, 0.6] Vektoreinbettung dargestellt werden.
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;
Ergebnisse
| Name | Notizenerstellung |
|---|---|
| Lee | für die geteilten Kosten des Abendessens |
| Dana | Das Mittagessen hat mir sehr gut geschmeckt. |
Vektorindex erstellen und ungefähre nächste Nachbarn finden
Für eine ANN-Suche müssen Sie einen speziellen Vektorindex erstellen, mit dem Spanner Graph die Vektorsuche beschleunigt. Für den Vektorindex muss ein bestimmter Distanzmesswert verwendet werden. Sie können den für Ihren Anwendungsfall am besten geeigneten Distanzmesswert auswählen, indem Sie den Parameter distance_type auf COSINE, DOT_PRODUCT oder EUCLIDEAN festlegen. Weitere Informationen finden Sie unter VECTOR INDEX-Anweisungen.
Im folgenden Beispiel wird ein Vektorindex mit dem Typ „Euklidischer Abstand“ für die Spalte nick_name_embedding der Eingabetabelle Account erstellt:
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);
ANN-Vektorsuche für Grafknoten ausführen
Nachdem Sie einen Vektorindex erstellt haben, können Sie eine ANN-Vektorsuche für die nick_name-Eigenschaft des Account-Knotens durchführen. Die ANN-Vektorsuche gibt die name des Kontoinhabers und die nick_name des Kontos zurück. Im folgenden Beispiel werden die beiden besten ungefähren nächsten Nachbarn für Konten für Freizeit- und Urlaubsreisen angezeigt, die durch die [0.2, 0.4, 0.9, 0.6]-Vektoreinbettung dargestellt werden.
Mit dem Graph-Hinweis wird die Abfrageoptimierung gezwungen, den angegebenen Vektorindex im Abfrageausführungsplan zu verwenden.
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;
Ergebnisse
| Name | nick_name |
|---|---|
| Alex | Fonds für einen erfrischenden tropischen Urlaub |
| Dana | Für Reisen sparen |
Nächste Schritte
- Vektorsuche nach Ähnlichkeit in Spanner durchführen, indem die K-nächsten Nachbarn ermittelt werden.
- Ungefähre nächste Nachbarn finden, Vektorindex erstellen und Vektoreinbettungen abfragen.
- Texteinbettungen für die Agent Platform abrufen
- Weitere Informationen zu Spanner Graph-Abfragen
- Best Practices für das Optimieren von Anfragen