Ungefähre nächste Nachbarn finden, um Vektoreinbettungen in Spanner zu indexieren und abzufragen

Auf dieser Seite wird beschrieben, wie Sie einen Vektorindex erstellen und Vektoreinbettungen anhand unter Verwendung der ungefähren Kosinus-Distanz, der ungefähren euklidischen Distanz und ungefähren Punktproduktvektorfunktionen. Sie können diese können Sie die ungefähren nächsten Nachbarn (ANN) in Spanner ermitteln. Wenn ein Dataset klein ist, können Sie K-nächste Nachbarn (KNN) verwenden. um die genauen k-nächsten Vektoren zu finden. Wenn Ihr Dataset jedoch wächst, erhöht sich die Latenz und die Kosten einer KNN-Suche steigen ebenfalls. Mit ANN können Sie die ungefähre Anzahl k-nächstgelegene Nachbarn mit deutlich reduzierter Latenz und geringeren Kosten.

Ungefähre k-nächste Nachbarn

Bei einer ANN-Suche sind die k-zurückgegebenen Vektoren nicht die wirklichen obersten k-nächsten Vektoren. und Nachbarn. Gelegentlich können einige Vektoren, die nicht zu den obersten k-nächstgelegenen Nachbarn zurückgegeben. Das wird als Rückrufverlust bezeichnet. Wie groß ist der Verlust der Erinnerung für Sie akzeptabel ist, hängt vom Anwendungsfall ab, aber in den meisten Fällen im Gegenzug für eine verbesserte Datenbankleistung Kompromisse eingehen.

Weitere Informationen zu den Spanner-Funktionen für die ungefähre Entfernung Siehe:

Vektorindex

Spanner beschleunigt die ANN-Vektorsuche mithilfe einer Vektorindex. Dieser Index basiert auf dem skalierbaren nächstgelegenen Nachbar (ScaNN) hocheffizienter Algorithmus für den nächsten Nachbarn.

Der Vektorindex verwendet eine baumbasierte Struktur, um Daten zu partitionieren und schnellere Suchen. Spanner bietet sowohl zwei- als auch dreistufige Baumkonfigurationen:

  • Baumkonfiguration auf zwei Ebenen: Blattknoten (num_leaves) enthalten Gruppen von eng verwandte Vektoren und ihren entsprechenden Schwerpunkt. Der Stamm aus den Schwerpunkten aller Blattknoten.
  • Baumkonfiguration auf drei Ebenen: Dies ähnelt dem Konzept einer zweistufigen Baumstruktur, während Eine zusätzliche Zweigebene (num_branches) wird eingeführt, von welchem Blattknoten aus Schwerpunkte werden weiter partitioniert, um die Stammebene (num_leaves) zu bilden.

Darüber hinaus müssen Sie Ihren Vektorindex mit einem bestimmten Entfernungsmesswert erstellen. Sie können den für Ihren Anwendungsfall am besten geeigneten Messwert für die Entfernung auswählen, indem Sie den distance_type in COSINE, DOT_PRODUCT oder EUCLIDEAN.

Weitere Informationen findest du unter VECTOR INDEX-Anweisungen.

Beschränkungen

Für den Spanner-Vektorindex gelten die folgenden Einschränkungen:

  • ALTER VECTOR INDEX wird nicht unterstützt.

Vektorindex erstellen

Zur Optimierung des Vektorindex für eine gute Trefferquote und Leistung empfehlen wir dass Sie Ihren Vektorindex erstellen, nachdem die meisten Zeilen mit Einbettungen in Ihre Datenbank geschrieben. Möglicherweise müssen Sie auch regelmäßig den Vektorindex neu zu erstellen, nachdem Sie neue Daten eingefügt haben. Weitere Informationen finden Sie unter Erstellen Sie den Vektorindex neu.

Um einen Vektorindex mit einer zweistufigen Baumstruktur und 1000 Blattknoten auf einem Die Tabelle Documents mit einer Einbettungsspalte DocEmbedding unter Verwendung des Kosinus Entfernung:

CREATE VECTOR INDEX DocEmbeddingIndex
  ON Documents(DocEmbedding),
  OPTIONS (distance_type = 'COSINE', tree_depth = 2, num_leaves = 1000);

So erstellen Sie einen Vektorindex mit einer Baumstruktur mit drei Ebenen und 1.000.000 Blattknoten:

CREATE VECTOR INDEX DocEmbeddingIndex
  ON Documents(NullableDocEmbedding)
  WHERE NullableDocEmbedding IS NOT NULL
  OPTIONS (distance_type = 'COSINE', tree_depth = 3, num_branches=1000, num_leaves = 1000000);

Wenn für die Einbettungsspalte Nullwerte zulässig sind, müssen Sie sie mit einem WHERE column_name IS NOT NULL-Klausel:

CREATE VECTOR INDEX DocEmbeddingIndex
  ON Documents(NullableDocEmbedding)
  WHERE NullableDocEmbedding IS NOT NULL
  OPTIONS (distance_type = 'COSINE', tree_depth = 2, num_leaves = 1000);

Vektoreinbettungen abfragen

Verwenden Sie zum Abfragen eines Vektorindex eine der drei ungefähren Entfernungsfunktionen:

  • APPROX_COSINE_DISTANCE
  • APPROX_EUCLIDEAN_DISTANCE
  • APPROX_DOT_PRODUCT

Zu den Einschränkungen bei der Verwendung der Funktionen für ungefähre Entfernungen gehören: Folgendes:

  • Sie müssen einen Abfragehinweis angeben, um den Vektorindex zu verwenden.
  • Sie müssen einen konstanten Ausdruck als ein Argument der Entfernungsfunktion verwenden. (z. B. ein Parameter oder ein Literal).
  • Die Abfrage oder Unterabfrage, in der die Funktion für die ungefähre Entfernung verwendet wird, muss eine bestimmte Form annehmen: Die Entfernungsfunktion muss die einzige ORDER BY-Taste sein, und ein Limit muss angegeben werden.

Eine detaillierte Liste der Einschränkungen finden Sie in der Referenzseite für die Funktion „Ungefähre Entfernung“.

Beispiel

So suchen Sie nach den nächsten 100 Vektoren, die [1.0, 2.0, 3.0] entsprechen:

SELECT DocId
FROM Documents@{FORCE_INDEX=DocEmbeddingIndex}
ORDER BY APPROX_EUCLIDEAN_DISTANCE(
  ARRAY<FLOAT32>[1.0, 2.0, 3.0], DocEmbedding,
  options => JSON '{"num_leaves_to_search": 10}')
LIMIT 100

Wenn für die Einbettungsspalte Nullwerte zulässig sind:

SELECT DocId
FROM Documents@{FORCE_INDEX=DocEmbeddingIndex}
WHERE NullableDocEmbedding IS NOT NULL
ORDER BY APPROX_EUCLIDEAN_DISTANCE(
  ARRAY<FLOAT32>[1.0, 2.0, 3.0], NullableDocEmbedding,
  options => JSON '{"num_leaves_to_search": 10}')
LIMIT 100

Best Practices

Befolgen Sie diese Best Practices, um Ihre Vektorindexe zu optimieren und die Abfrage zu verbessern Ergebnisse.

Optionen für die Vektorsuche anpassen

Der optimale Wert für die Vektorsuche hängt vom Anwendungsfall, vom Vektor Dataset und Abfragevektoren. Möglicherweise müssen Sie eine iterative Abstimmung durchführen, die besten Werte für Ihre spezifische Arbeitslast zu finden.

Hier sind einige hilfreiche Richtlinien, die Sie bei der Auswahl geeigneter Werte beachten sollten:

  • tree_depth (Baumebene): Wenn die indexierte Tabelle weniger als 10 Millionen Zeilen verwenden, verwenden Sie einen tree_depth von 2. Andernfalls führt ein tree_depth von 3 unterstützt Tabellen mit bis zu 10 Milliarden Zeilen.

  • num_leaves: Verwendet die Quadratwurzel der Zeilenanzahl im Dataset. A kann ein größerer Wert die Erstellungszeit für den Vektorindex erhöhen. num_leaves nicht festlegen größer als table_row_count/1000, da dies zu kleinen Blättern und schlechte Leistung.

  • num_leaves_to_search: Diese Option gibt an, wie viele Blattknoten des Index vorhanden sind. nach denen gesucht wird. Erhöhe num_leaves_to_search verbessert die Erinnerung, aber auch erhöht die Latenz und die Kosten. Wir empfehlen, eine Zahl zu verwenden, die 1% der Gesamtzahl entspricht Anzahl der Blätter, die in der CREATE VECTOR INDEX-Anweisung als Wert definiert sind für num_leaves_to_search. Wenn Sie eine Filterklausel verwenden, um die Suche zu erweitern.

Wenn eine akzeptable Recall erreicht wird, die Abfrage aber zu hoch ist, zu einer niedrigen maximalen Anzahl von Abfragen pro Sekunde führen. Erhöhen Sie den num_leaves, indem Sie Schritte:

  1. Legen Sie num_leaves auf einige mehrere k seines ursprünglichen Werts fest (z. B. 2 * sqrt(table_row_count)).
  2. Legen Sie für num_leaves_to_search das gleiche Vielfache der k-Werte des ursprünglichen Werts fest.
  3. Probieren Sie, num_leaves_to_search zu reduzieren, um Kosten und Abfragen pro Sekunde zu verbessern und gleichzeitig die Recall-Funktion aufrechterhalten.

Erinnerung verbessern

Es gibt mehrere Möglichkeiten für eine Verschlechterung der Erinnerung, darunter:

  • num_leaves_to_search ist zu klein. Unter Umständen ist es schwieriger, für einige Abfragevektoren die nächsten Nachbarn finden, sodass num_leaves_to_search, um nach weiteren Blättern zu suchen, kann dazu beitragen, die Erinnerung zu verbessern. Letzte Abfragen möglicherweise umgeschwenkt haben, um mehr dieser anspruchsvollen Vektoren einzubeziehen.

  • Der Vektorindex muss neu erstellt werden: Die Baumstruktur des Vektorindex ist optimiert für das Dataset zum Zeitpunkt der Erstellung und danach statisch. Werden deutlich unterschiedliche Vektoren hinzugefügt, nachdem der Vektorindex ist, ist die Baumstruktur möglicherweise nicht optimal, sodass eine schlechtere Trefferquote.

Vektorindex neu erstellen

So erstellen Sie Ihren Vektorindex ohne Ausfallzeit neu:

  1. Erstellen Sie einen neuen Vektorindex in derselben Einbettungsspalte wie der aktuelle Vektor. Index erstellen und Parameter (z. B. OPTIONS) nach Bedarf aktualisieren.
  2. Ändern Sie nach Abschluss der Indexerstellung den FORCE_INDEX-Hinweis. , um auf den neuen Index zu verweisen und die Vektorsuchabfrage zu aktualisieren. Dadurch wird sichergestellt, dass die Abfrage den neuen Vektorindex verwendet. (Möglicherweise müssen Sie Ihr num_leaves_to_search in der neuen Abfrage ein.
  3. Löschen Sie den veralteten Vektorindex.

Nächste Schritte