Spanner Omni-Vektorsuche – Übersicht

Die Vektorsuche in Spanner Omni ist eine leistungsstarke, integrierte Funktion, die semantische Suche und Ähnlichkeitsabgleich für hochdimensionale Vektordaten ermöglicht. Durch das Speichern und Indexieren von Vektoreinbettungen direkt in Ihrer Transaktionsdatenbank macht Spanner Omni separate Vektordatenbanken und komplexe ETL-Pipelines (Extrahieren, Transformieren, Laden) überflüssig.

Die Themen in diesem Dokument gelten für Spanner Omni genauso wie für Spanner.

Mit der Vektorsuche können Sie semantisch ähnliche Elemente finden, indem Sie Daten als numerische Vektoren (Einbettungen) darstellen. Spanner Omni unterstützt zwei primäre Suchmethoden:

  • K-Nearest Neighbors (KNN): Führt eine exakte Suche durch, indem die Distanz zwischen der Anfrage und jedem Vektor im Dataset berechnet wird. Sie bietet den höchsten Recall, kann aber bei großen Datasets rechenintensiv sein.

  • Approximate Nearest Neighbors (ANN): Verwendet einen Vektorindex, um schnell Übereinstimmungen in großen Datasets zu finden. Dabei wird ein geringer Verlust an Genauigkeit (Recall) in Kauf genommen, um die Geschwindigkeit und Skalierbarkeit zu verbessern.

Die Vektorsuche ist besonders leistungsstark, wenn sie mit anderen Funktionen kombiniert wird:

Kombination Vorteil
Vektorsuche mit SQL-Filterung Vektorsuche effizient mit Filtern kombinieren (z. B. „Ähnliche Bilder finden, bei denen category = ‚shoes‘ und price < 100“).
Vektorsuche + Volltextsuche Kombinieren Sie die semantische Ähnlichkeit mit der Stichwortgenauigkeit, indem Sie Reciprocal Rank Fusion (RRF) verwenden, um die Suchrelevanz zu verbessern.
Vektor + Diagramm Mit der Vektorsuche können Sie relevante Einstiegspunkte (Knoten) in einem Property Graph finden und dann komplexe Beziehungen durchlaufen.

Weitere Informationen finden Sie in der Spanner-Dokumentation unter Übersicht über die Vektorsuche in Spanner.

Spanner Omni unterstützt die Suche nach K-Nearest Neighbors (KNN) mithilfe integrierter Distanzfunktionen. Sie können eine Vektoreinbettung als Eingabeparameter angeben, um die nächstgelegenen Vektoren im N-dimensionalen Raum zu finden.

Die folgenden Distanzfunktionen sind verfügbar:

  • COSINE_DISTANCE(): Misst den Kosinus des Winkels zwischen zwei Vektoren.

  • EUCLIDEAN_DISTANCE(): Misst die kürzeste Luftlinie zwischen zwei Vektoren.

  • DOT_PRODUCT(): Berechnet den Kosinus des Winkels multipliziert mit dem Produkt der Vektormagnituden (ideal für normalisierte Daten).

Weitere Informationen finden Sie in der Spanner-Dokumentation unter Vektorähnlichkeitssuche durchführen, indem die K nächsten Nachbarn ermittelt werden.

Die beste Vektordistanzfunktion auswählen

Die Auswahl der geeigneten Distanzfunktion hängt von Ihren Daten und dem Modell ab, das zum Generieren von Einbettungen verwendet wird.

Funktion Beschreibung Beziehung zur zunehmenden Ähnlichkeit
Skalarprodukt Berechnet den Kosinus des Winkels multipliziert mit dem Produkt der entsprechenden Vektormagnituden. Zunahme
Kosinus-Distanz Misst den Kosinus des Winkels zwischen zwei Vektoren (1 – Kosinus-Ähnlichkeit). Abnahme
Euklidischer Abstand Misst die Luftlinie zwischen zwei Vektoren. Abnahme

Wenn Ihre Einbettungen normalisiert sind (Magnitude = 1,0), ist DOT_PRODUCT() in der Regel eine effiziente Wahl. Bei nicht normalisierten Daten sollten Sie mit COSINE_DISTANCE() oder EUCLIDEAN_DISTANCE() experimentieren, um herauszufinden, welche Methode für Ihren Anwendungsfall bessere Ergebnisse liefert.

Weitere Informationen finden Sie in der Spanner-Dokumentation unter Vektordistanzfunktionen auswählen.

Approximate Nearest Neighbors (ANN)

Die ANN-Suche ist für sehr große Datasets konzipiert, bei denen die exakte KNN-Suche zu langsam oder zu teuer wird. Dabei wird ein Vektorindex verwendet, um schnelle Ergebnisse zu liefern, wobei die Trefferquote nur geringfügig beeinträchtigt wird.

Ohne dedizierte Compute-Worker unterstützt die ANN-Suche in Spanner Omni Datasets mit bis zu 1 Million Vektoren für Vektoren mit bis zu 128 Dimensionen. Wenn Ihre Vektoren mehr Dimensionen haben, verringert sich die unterstützte Anzahl von Vektoren proportional. Spanner Omni unterstützt größere Tabellen, wenn Sie Worker zum Erstellen Ihrer Vektorindexe bereitstellen. Weitere Informationen finden Sie unter Vektorindizes erstellen und verwalten.

Verwenden Sie für die ANN-Suche ungefähre Distanzfunktionen wie APPROX_COSINE_DISTANCE(), APPROX_EUCLIDEAN_DISTANCE() oder APPROX_DOT_PRODUCT(). Für diese Funktionen sind folgende Voraussetzungen erforderlich:

  • Ein vorhandener Vektorindex für die Einbettungsspalte.

  • Eine ORDER BY-Klausel mit der ungefähren Distanzfunktion.

  • Eine LIMIT-Klausel, um die Anzahl der Ergebnisse anzugeben.

Weitere Informationen finden Sie unter Ungefähre nächste Nachbarn (Approximate Nearest Neighbors, ANN) finden und Vektoreinbettungen abfragen in der Spanner-Dokumentation.

Vektorindexe erstellen und verwalten

Geben Sie beim Erstellen eines Vektorindex die vector_length Ihrer Einbettungsspalte an und verwenden Sie die STORING-Klausel, um zusätzliche Spalten für eine schnellere Filterung einzufügen.

Im Folgenden finden Sie ein Beispiel für das Erstellen eines Vektorindex:

CREATE VECTOR INDEX INDEX_NAME
  ON TABLE_NAME(EMBEDDING_COLUMN)
  OPTIONS (distance_type = 'DISTANCE_TYPE', tree_depth = 2, num_leaves = 1000);

Weitere Informationen finden Sie in der Spanner-Dokumentation unter Vektorindexe erstellen und verwalten.

Wenn Sie Vektorindexe für große Tabellen erstellen, die die Grenzwerte unter Approximate Nearest Neighbors (ANN) überschreiten, sind dedizierte Compute-Worker erforderlich, um die Verarbeitung von Ihren Spanner Omni-Servern auszulagern. Weitere Informationen finden Sie unter Worker bereitstellen und verwalten.

Sampling beim Erstellen eines Vektorindex verwenden

Bei großen Datasets, z. B. Tabellen mit mehreren zehn Millionen Zeilen oder mehr, können Sie die Erstellungszeit für den Vektorindex verkürzen, indem Sie einen Prozentsatz für die Stichprobenerhebung angeben. Verwenden Sie die Option clustering_sampling_percentage in der Anweisung CREATE VECTOR INDEX, um beim Erstellen des ersten Indexbaums eine Teilmenge des Datasets zu verwenden.

Als allgemeine Richtlinie gilt, dass mindestens 50 Stichprobenzeilen pro Blatt vorhanden sein sollten. Bei einem Dataset mit 10 Millionen Zeilen und 10.000 Blättern werden bei einer Stichprobenrate von 5 % (clustering_sampling_percentage = 5) 500.000 Zeilen oder 50 Zeilen pro Blatt ausgewählt, wie im folgenden Beispiel zu sehen ist:

CREATE VECTOR INDEX VectorIndex
  ON BaseTable(Embedding)
  WHERE Embedding IS NOT NULL
  OPTIONS (
    tree_depth = 3,
    num_leaves = 10000,
    num_branches = 100,
    leaf_scatter_factor = 32,
    distance_type = 'COSINE',
    min_branch_splits = 10,
    min_leaf_splits = 10,
    clustering_sampling_percentage = 5
  );

Im Vergleich zum Erstellen eines Index für den vollständigen Datensatz ohne Sampling erhöht das Sampling die Abfragelatenz und die CPU-Nutzung pro Abfrage für denselben Ziel-Recall. Wenn Sie den Prozentsatz für das Sampling erhöhen, verlängert sich die Indexerstellungszeit, die Abfragelatenz und die CPU-Kosten pro Abfrage werden jedoch reduziert. Wählen Sie einen Prozentsatz für die Stichprobenerhebung aus, der die Zeit für die Indexerstellung und die Abfrageleistung auf Grundlage der für die Indexerstellung verfügbaren Rechenressourcen in Einklang bringt.

Best Practices für die Vektorindexierung

So sorgen Sie für eine hohe Suchleistung und ‑abdeckung:

  • Indexoptionen optimieren: Passen Sie num_leaves und num_leaves_to_search an Ihre Datengröße und Leistungsanforderungen an.

  • Regelmäßig neu erstellen: Erstellen Sie den Index neu, wenn sich die Verteilung Ihrer Vektoren im Laufe der Zeit erheblich ändert.

  • Filter effektiv einsetzen: Speichern Sie häufig gefilterte Spalten im Index, um die Sucheffizienz zu verbessern.

Weitere Informationen finden Sie in der Spanner-Dokumentation unter Best Practices für die Vektorindexierung.