Auf dieser Seite wird beschrieben, wie Sie mit den ANN-Distanzfunktionen (Approximate Nearest Neighbor) Vektoreinbettungen finden und abfragen.
Bei einem kleinen Datensatz können Sie K-Nearest Neighbors (KNN) verwenden, um die genauen k-nächsten Vektoren zu finden. Mit zunehmender Größe des Datensatzes steigen jedoch auch die Latenz und die Kosten einer KNN-Suche. Mit ANN können Sie die ungefähren k-nächsten Nachbarn mit deutlich geringerer Latenz und geringeren Kosten finden.
Bei einer ANN-Suche sind die k zurückgegebenen Vektoren nicht die tatsächlichen k nächsten Nachbarn, da bei der ANN-Suche ungefähre Distanzen berechnet werden und möglicherweise nicht alle Vektoren im Datensatz berücksichtigt werden. Gelegentlich werden einige Vektoren zurückgegeben, die nicht zu den k nächsten Nachbarn gehören. Das wird als Recall-Verlust bezeichnet. Wie viel Trefferquotenverlust für Sie akzeptabel ist, hängt vom Anwendungsfall ab. In den meisten Fällen ist es jedoch ein akzeptabler Kompromiss, etwas Trefferquote im Gegenzug für eine verbesserte Datenbankleistung zu verlieren.
Weitere Informationen zu den in Spanner unterstützten Funktionen für die ungefähre Distanz finden Sie auf den folgenden GoogleSQL-Referenzseiten:
Vektoreinbettungen abfragen
Cloud Spanner beschleunigt ANN-Vektorsuchen (Approximate Nearest Neighbor) mithilfe eines Vektorindex. Sie können einen Vektorindex verwenden, um Vektoreinbettungen abzufragen. Wenn Sie Vektoreinbettungen abfragen möchten, müssen Sie zuerst einen Vektorindex erstellen. Anschließend können Sie eine der drei Funktionen für die ungefähre Distanz verwenden, um den ANN zu ermitteln.
Für die Verwendung der Näherungsfunktionen für die Distanz gelten die folgenden Einschränkungen:
- Die Funktion für die ungefähre Distanz muss die Distanz zwischen einer Spalte mit Einbettungen und einem konstanten Ausdruck (z. B. einem Parameter oder einem Literal) berechnen.
- Die Ausgabe der Funktion für die ungefähre Distanz muss in einer
ORDER BY
-Klausel als einziger Sortierschlüssel verwendet werden und nach derORDER BY
muss eineLIMIT
angegeben werden. - In der Abfrage müssen Zeilen, die nicht indexiert sind, explizit herausgefiltert werden. In den meisten Fällen muss die Abfrage eine
WHERE <column_name> IS NOT NULL
-Klausel enthalten, die der Vektorindexdefinition entspricht, es sei denn, die Spalte ist in der Tabellendefinition bereits alsNOT NULL
gekennzeichnet.
Eine detaillierte Liste der Einschränkungen finden Sie auf der Referenzseite zur Funktion für die ungefähre Distanz.
Beispiele
Angenommen, Sie haben eine Documents
-Tabelle mit einer DocEmbedding
-Spalte mit vorab berechneten Texteinbettungen aus der DocContents
-Spalte mit Byte-Daten und einer NullableDocEmbedding
-Spalte, die aus anderen Quellen stammt und möglicherweise Nullwerte enthält.
CREATE TABLE Documents (
UserId INT64 NOT NULL,
DocId INT64 NOT NULL,
Author STRING(1024),
DocContents BYTES(MAX),
DocEmbedding ARRAY<FLOAT32> NOT NULL,
NullableDocEmbedding ARRAY<FLOAT32>,
WordCount INT64
) PRIMARY KEY (UserId, DocId);
So suchen Sie nach den 100 Vektoren, die [1.0, 2.0, 3.0]
am nächsten sind:
SELECT DocId
FROM Documents
WHERE WordCount > 1000
ORDER BY APPROX_EUCLIDEAN_DISTANCE(
ARRAY<FLOAT32>[1.0, 2.0, 3.0], DocEmbedding,
options => JSON '{"num_leaves_to_search": 10}')
LIMIT 100
Wenn die Spalte für Einbettungen Nullwerte enthalten kann:
SELECT DocId
FROM Documents
WHERE NullableDocEmbedding IS NOT NULL AND WordCount > 1000
ORDER BY APPROX_EUCLIDEAN_DISTANCE(
ARRAY<FLOAT32>[1.0, 2.0, 3.0], NullableDocEmbedding,
options => JSON '{"num_leaves_to_search": 10}')
LIMIT 100
Nächste Schritte
Weitere Informationen zu
VECTOR INDEX
-Anweisungen in GoogleSQLErste Schritte mit der Spanner-Vektorsuche enthält ein Schritt-für-Schritt-Beispiel für die Verwendung von ANN.