Vektorsuche mit Spanner Graph verwenden

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

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

  1. Fügen Sie der Eingabetabelle Account eine 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ügen Sie sie in die neue Spalte nick_name_embeddings ein.

    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;
    
  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ügen Sie sie in die Spalte notes_embeddings ein.

    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;
    
  6. Nachdem Sie den Eingabetabellen Account und AccountTransferAccount neue 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