Auf dieser Seite wird beschrieben, wie Sie die Vektorsuche in Spanner Graph verwenden, um KNN (K-Nearest Neighbor) und ANN (Approximate Nearest Neighbor) zu finden. Sie können Vektordistanzfunktionen verwenden, um KNN- und ANN-Vektorsuchen für Anwendungsfälle wie Ähnlichkeitssuche oder Retrieval-Augmented Generation für Anwendungen mit generativer KI durchzuführen.
Spanner Graph unterstützt die folgenden Distanzfunktionen für die KNN-Vektorähnlichkeitssuche:
COSINE_DISTANCE()
: ermittlet die kürzeste Entfernung zwischen zwei Vektoren.EUCLIDEAN_DISTANCE()
: Mit diesem Maß wird der Kosinus des Winkels zwischen zwei Vektoren gemessen.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 durch Ermittlung der K-nächsten Nachbarn durchführen.
Spanner Graph unterstützt außerdem die folgenden Funktionen für ungefähre Entfernungen, um eine ANN-Vektorähnlichkeitssuche durchzuführen:
APPROX_COSINE_DISTANCE
: ermittlet die ungefähre kürzeste Entfernung zwischen zwei Vektoren.APPROX_EUCLIDEAN_DISTANCE
: misst den 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 Entfernungsfunktion verwenden.
Weitere Informationen finden Sie unter Ungefähre nächste Nachbarn ermitteln, Vektorindex erstellen und Vektoreinbettungen abfragen.
Hinweise
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:
- Erstellen Sie eine Instanz.
- Erstellen Sie eine Datenbank mit einem Spanner-Graph-Schema.
- Fügen Sie wichtige Diagrammdaten ein.
Nachdem Sie die erforderlichen Diagrammdaten eingefügt haben, nehmen Sie die folgenden Änderungen 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
Account
die neue Spaltenick_name_embeddings
hinzu.ALTER TABLE Account ADD COLUMN nick_name_embeddings ARRAY<FLOAT32>(vector_length=>4);
Fügen Sie der Spalte
nick_name
Daten 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_name
und füllen Sie sie in die neue Spaltenick_name_embeddings
ein.Informationen zum Generieren von Vertex AI-Embeddings für Ihre Betriebsdaten in Spanner Graph finden Sie unter Vertex AI-Text-Embeddings abrufen.
Zur Veranschaulichung werden in unseren Beispielen 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
AccountTransferAccount
zwei neue Spalten hinzu:notes
undnotes_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
notes
und füllen Sie sie in die Spaltenotes_embeddings
ein.Informationen zum Generieren von Vertex AI-Embeddings für Ihre Betriebsdaten in Spanner Graph finden Sie unter Vertex AI-Text-Embeddings abrufen.
Zur Veranschaulichung werden in unseren Beispielen 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
Account
undAccountTransferAccount
neue Spalten hinzugefügt haben, aktualisieren Sie die Property-Graph-Definition 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 auf den Knoten und Kanten Ihrer Graphdatenbank durchzuführen.
KNN-Vektorsuche auf Graphknoten durchführen
Sie können eine KNN-Vektorsuche für die nick_name_embeddings
-Eigenschaft des Account
-Knotens ausführen. Bei dieser KNN-Vektorsuche werden die name
des Kontoinhabers und die nick_name
des Kontos zurückgegeben. Im folgenden Beispiel sind die beiden nächsten Nachbarn für Konten für Freizeitreisen und Urlaub zu sehen, die durch die [0.2, 0.4, 0.9, 0.6]
-Vektor-Embedding 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 | Für einen erfrischenden Urlaub in den Tropen sparen |
Dana | Für Reisen sparen |
KNN-Vektorsuche auf Graphkanten ausführen
Sie können eine KNN-Vektorsuche für das notes_embeddings
-Attribut des Owns
-Ecks ausführen. Bei dieser KNN-Vektorsuche werden die name
des Kontoinhabers und die notes
der Übertragung zurückgegeben. Im folgenden Beispiel sind die beiden nächsten Nachbarn für Essensausgaben zu sehen, die durch die [0.2, 0.4, 0.9, 0.6]
-Vektor-Embedding 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 | Hinweise |
---|---|
Lee | für die Kosten des gemeinsamen Abendessens |
Dana | das Mittagessen war sehr gut |
Vektorindex erstellen und ungefähre nächste Nachbarn ermitteln
Wenn Sie eine ANN-Suche ausführen möchten, müssen Sie einen spezialisierten Vektorindex erstellen, mit dem Spanner Graph die Vektorsuche beschleunigt. Für den Vektorindex muss ein bestimmter Entfernungsmesswert verwendet werden. Sie können den für Ihren Anwendungsfall am besten geeigneten Entfernungsmesswert auswählen, indem Sie den Parameter distance_type
auf einen der Werte COSINE
, DOT_PRODUCT
oder EUCLIDEAN
festlegen. Weitere Informationen finden Sie unter VECTOR INDEX-Anweisungen.
Im folgenden Beispiel wird ein Vektorindex mit dem euklidischen Abstandstyp 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 Graphknoten ausführen
Nachdem Sie einen Vektorindex erstellt haben, können Sie eine ANN-Vektorsuche für die nick_name
-Eigenschaft des Account
-Knotens ausführen. Die ANN-Vektorsuche gibt die name
des Kontoinhabers und die nick_name
des Kontos zurück. Im folgenden Beispiel sind die beiden ungefähren nächsten Nachbarn für Konten für Freizeitreisen und Urlaub zu sehen, die durch die [0.2, 0.4, 0.9, 0.6]
-Vektoreinbettung dargestellt werden.
Mit dem Graph-Hinweis wird der Abfrageoptimierer gezwungen, den angegebenen Vektorindex im Abfrage-Ausfü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 | Für einen erfrischenden Urlaub in den Tropen sparen |
Dana | Für Reisen sparen |
Nächste Schritte
- Durchführen einer Vektorähnlichkeitssuche in Spanner, indem die K-nächsten Nachbarn ermittelt werden
- Ungefähre nächste Nachbarn finden, Vektorindex erstellen und Vektoreinbettungen abfragen
- Vertex AI-Texteinbettungen abrufen
- Weitere Informationen zu Spanner-Graphabfragen
- Best Practices für die Abfrageoptimierung