Vektorsuche mit Spanner-Graph verwenden

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

  1. Erstellen Sie eine Instanz.
  2. Erstellen Sie eine Datenbank mit einem Spanner-Graph-Schema.
  3. 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:

  1. Fügen Sie der Eingabetabelle Account die neue Spalte nick_name_embeddings hinzu.

    ALTER TABLE Account
    ADD COLUMN nick_name_embeddings ARRAY<FLOAT32>(vector_length=>4);
    
  2. 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;
    
  3. Erstellen Sie Einbettungen für den Text in der Spalte nick_name und füllen Sie sie in die neue Spalte nick_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;
    
  4. Fügen Sie der Eingabetabelle AccountTransferAccount zwei neue Spalten hinzu: notes und notes_embeddings.

    ALTER TABLE AccountTransferAccount
    ADD COLUMN notes STRING(MAX);
    ALTER TABLE AccountTransferAccount
    ADD COLUMN notes_embeddings ARRAY<FLOAT32>(vector_length=>4);
    
  5. Erstellen Sie Einbettungen für den Text in der Spalte notes und füllen Sie sie in die Spalte notes_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;
    
  6. Nachdem Sie den Eingabetabellen Account und AccountTransferAccount 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