Auf dieser Seite wird beschrieben, wie Sie in Spanner nach Ähnlichkeitsvektoren suchen. Dazu werden die Vektorfunktionen für Kosinus-Distanz, euklidische Entfernung und Punktprodukt verwendet, um die nächsten K-Nachbarn zu finden. Bevor Sie diese Seite lesen, ist es wichtig, dass Sie die folgenden Konzepte verstehen:
- euklidische Entfernung: misst die kürzeste Entfernung zwischen zwei Vektoren.
- Kosinus-Distanz: Misst den Kosinus des Winkels zwischen zwei Vektoren.
- Punktprodukt: Berechnet den Kosinus des Winkels multipliziert mit dem Produkt der entsprechenden Vektorgrößen. Wenn Sie wissen, dass alle Vektoreinbettungen in Ihrem Dataset normalisiert sind, können Sie
DOT_PRODUCT()
als Entfernungsfunktion verwenden. - K-Nearest Nachbarn (KNN): Ein Algorithmus für überwachtes maschinelles Lernen, der zur Lösung von Klassifizierungs- oder Regressionsproblemen verwendet wird.
Sie können Vektor-Entfernungsfunktionen verwenden, um KNN-Vektoren (K-Nearest Nearest Vektors) für Anwendungsfälle wie Ähnlichkeitssuche oder Abruf-augmented-Generierung durchzuführen. Spanner unterstützt die Funktionen COSINE_DISTANCE()
, EUCLIDEAN_DISTANCE()
und DOT_PRODUCT()
, die mit Vektoreinbettungen arbeiten. So können Sie den KNN der Eingabeeinbettung ermitteln.
Nachdem Sie beispielsweise Ihre operativen Spanner-Daten als Vektoreinbettungen generiert und gespeichert haben, können Sie diese Vektoreinbettungen als Eingabeparameter in Ihre Abfrage einbinden, um die nächstgelegenen Vektoren im n-dimensionalen Bereich zu finden und nach semantisch ähnlichen oder verwandten Elementen zu suchen.
Alle drei Distanzfunktionen verwenden die Argumente vector1
und vector2
vom Typ array<>
, die dieselben Dimensionen und dieselbe Länge haben müssen. Weitere Informationen zu diesen Funktionen finden Sie unter:
COSINE_DISTANCE()
in GoogleSQLEUCLIDEAN_DISTANCE()
in GoogleSQLDOT_PRODUCT()
in GoogleSQL- Mathematische Funktionen in PostgreSQL (
spanner.cosine_distance()
,spanner.euclidean_distance()
undspanner.dot_product()
) - Wählen Sie eine der Vektor-Distanzfunktionen aus, um die Ähnlichkeit von Vektoreinbettungen zu messen.
Beispiele
Die folgenden Beispiele zeigen die KNN-Suche, die KNN-Suche in partitionierten Daten und die Verwendung eines sekundären Index mit KNN.
In allen Beispielen wird EUCLIDEAN_DISTANCE()
verwendet. Sie können auch COSINE_DISTANCE()
verwenden. Wenn alle Vektoreinbettungen im Dataset normalisiert sind, können Sie außerdem DOT_PRODUCT()
als Entfernungsfunktion verwenden.
Beispiel 1: KNN-Suche
Nehmen wir als Beispiel eine Documents
-Tabelle mit einer Spalte (DocEmbedding
) mit vorausberechneten Texteinbettungen aus der Spalte DocContents
Byte.
GoogleSQL
CREATE TABLE Documents (
UserId INT64 NOT NULL,
DocId INT64 NOT NULL,
Author STRING(1024),
DocContents BYTES,
DocEmbedding ARRAY<FLOAT32>
) PRIMARY KEY (UserId, DocId);
PostgreSQL
CREATE TABLE Documents (
UserId bigint primary key,
DocId bigint primary key,
Author varchar(1024),
DocContents bytea,
DocEmbedding float4[]
);
Angenommen, eine Eingabeeinbettung für „Baseball, aber kein Profi-Baseball“ ist das Array [0.3, 0.3, 0.7, 0.7]
. Mit der folgenden Abfrage können Sie die fünf nächsten übereinstimmenden Dokumente ermitteln:
GoogleSQL
SELECT DocId, DocEmbedding FROM Documents
ORDER BY EUCLIDEAN_DISTANCE(DocEmbedding,
ARRAY<FLOAT32>[0.3, 0.3, 0.7, 0.8])
LIMIT 5;
PostgreSQL
SELECT DocId, DocEmbedding FROM Documents
ORDER BY spanner.euclidean_distance(DocEmbedding,
'{0.3, 0.3, 0.7, 0.8}'::float4[])
LIMIT 5;
Die erwarteten Ergebnisse in diesem Beispiel:
Documents
+---------------------------+-----------------+
| DocId | DocEmbedding |
+---------------------------+-----------------+
| 24 | [8, ...] |
+---------------------------+-----------------+
| 25 | [6, ...] |
+---------------------------+-----------------+
| 26 | [3.2, ...] |
+---------------------------+-----------------+
| 27 | [38, ...] |
+---------------------------+-----------------+
| 14229 | [1.6, ...] |
+---------------------------+-----------------+
Beispiel 2: KNN-Suche in partitionierten Daten
Sie können die Abfrage im vorherigen Beispiel ändern, indem Sie der WHERE
-Klausel Bedingungen hinzufügen, um die Vektorsuche auf eine Teilmenge Ihrer Daten zu beschränken. Eine häufige Anwendung hierfür ist die Suche in partitionierten Daten, z. B. in Zeilen, die zu einer bestimmten UserId
gehören.
GoogleSQL
SELECT UserId, DocId, DocEmbedding FROM Documents
WHERE UserId=18
ORDER BY EUCLIDEAN_DISTANCE(DocEmbedding,
ARRAY<FLOAT32>[0.3, 0.3, 0.7, 0.8])
LIMIT 5;
PostgreSQL
SELECT UserId, DocId, DocEmbedding FROM Documents
WHERE UserId=18
ORDER BY spanner.euclidean_distance(DocEmbedding,
'{0.3, 0.3, 0.7, 0.8}'::float4[])
LIMIT 5;
Die erwarteten Ergebnisse in diesem Beispiel:
Documents
+-----------+-----------------+-----------------+
| UserId | DocId | DocEmbedding |
+-----------+-----------------+-----------------+
| 18 | 234 | [12, ...] |
+-----------+-----------------+-----------------+
| 18 | 12 | [1.6, ...] |
+-----------+-----------------+-----------------+
| 18 | 321 | [22, ...] |
+-----------+-----------------+-----------------+
| 18 | 432 | [3, ...] |
+-----------+-----------------+-----------------+
Beispiel 3: KNN-Suche über sekundäre Indexbereiche
Wenn der von Ihnen verwendete Filter der WHERE
-Klausel nicht zum Primärschlüssel der Tabelle gehört, können Sie einen sekundären Index erstellen, um den Vorgang mit einem Nur-Index-Scan zu beschleunigen.
GoogleSQL
CREATE INDEX DocsByAuthor
ON Documents(Author)
STORING (DocEmbedding);
SELECT Author, DocId, DocEmbedding FROM Documents
WHERE Author="Mark Twain"
ORDER BY EUCLIDEAN_DISTANCE(DocEmbedding,
<embeddings for "book about the time traveling American">)
LIMIT 5;
PostgreSQL
CREATE INDEX DocsByAuthor
ON Documents(Author)
INCLUDE (DocEmbedding);
SELECT Author, DocId, DocEmbedding FROM Documents
WHERE Author="Mark Twain"
ORDER BY spanner.euclidean_distance(DocEmbedding,
<embeddings for "that book about the time traveling American">)
LIMIT 5;
Die erwarteten Ergebnisse in diesem Beispiel:
Documents
+------------+-----------------+-----------------+
| Author | DocId | DocEmbedding |
+------------+-----------------+-----------------+
| Mark Twain | 234 | [12, ...] |
+------------+-----------------+-----------------+
| Mark Twain | 12 | [1.6, ...] |
+------------+-----------------+-----------------+
| Mark Twain | 321 | [22, ...] |
+------------+-----------------+-----------------+
| Mark Twain | 432 | [3, ...] |
+------------+-----------------+-----------------+
| Mark Twain | 375 | [9, ...] |
+------------+-----------------+-----------------+
Nächste Schritte
Weitere Informationen zu den Funktionen von GoogleSQL
COSINE_DISTANCE()
,EUCLIDEAN_DISTANCE()
,DOT_PRODUCT()
Weitere Informationen zu den PostgreSQL-Funktionen
spanner.cosine_distance()
,spanner.euclidean_distance()
undspanner.dot_product()