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 ein paar 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:
APPROX_COSINE_DISTANCE
in GoogleSQLAPPROX_EUCLIDEAN_DISTANCE
in GoogleSQLAPPROX_DOT_PRODUCT
in GoogleSQL
Vektorindex
Spanner beschleunigt die ANN-Vektorsuche mithilfe einer Vektorindex. Dieser Index nutzt den Scalable Nearest Neighbor (ScaNN) von Google Research, einen hocheffizienten Algorithmus für die Suche nach dem 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 Entfernungsmesswert auswählen, indem Sie distance_type
auf einen der Werte COSINE
, DOT_PRODUCT
oder EUCLIDEAN
festlegen.
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
Um den Vektorindex für eine gute Wiedererkennung und Leistung zu optimieren, empfehlen wir, ihn zu erstellen, nachdem die meisten Zeilen mit Einbettungen in Ihre Datenbank geschrieben wurden. Möglicherweise müssen Sie den Vektorindex auch regelmäßig neu 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 als Argument der Entfernungsfunktion einen konstanten Ausdruck verwenden, z. B. einen 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 100 nächsten Vektoren zu [1.0, 2.0, 3.0]
:
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 die Spalte für die Einbettung Nullwerte enthalten kann:
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 abstimmen
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 für die Auswahl geeigneter Werte:
tree_depth
(Baumebene): Wenn die indexierte Tabelle weniger als 10 Millionen Zeilen verwenden, verwenden Sie einentree_depth
von2
. Andernfalls werden mit einemtree_depth
von3
Tabellen mit bis zu etwa 10 Milliarden Zeilen unterstützt.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 alstable_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öhenum_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 derCREATE VECTOR INDEX
-Anweisung als Wert definiert sind fürnum_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:
- Legen Sie
num_leaves
auf einige mehrere k seines ursprünglichen Werts fest (z. B.2 * sqrt(table_row_count)
). - Legen Sie für
num_leaves_to_search
das gleiche Vielfache der k-Werte des ursprünglichen Werts fest. - 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: Bei einigen Abfragevektoren ist es möglicherweise schwieriger, die nächsten Nachbarn zu finden. Wenn Sienum_leaves_to_search
erhöhen, um mehr Blätter zu durchsuchen, kann dies die Trefferquote 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. Wenn also nach dem Erstellen des ersten Vektorindexes deutlich unterschiedliche Vektoren hinzugefügt werden, ist die Baumstruktur möglicherweise nicht optimal, was zu einer schlechteren Erkennung führt.
Vektorindex neu erstellen
So erstellen Sie Ihren Vektorindex ohne Ausfallzeit neu:
- Erstellen Sie einen neuen Vektorindex in derselben Einbettungsspalte wie der aktuelle Vektor.
Index erstellen und Parameter (z. B.
OPTIONS
) nach Bedarf aktualisieren. - Ä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 auchnum_leaves_to_search
in Ihrer neuen Abfrage neu anpassen. - Löschen Sie den veralteten Vektorindex.
Nächste Schritte
Weitere Informationen zu den GoogleSQL-Funktionen
APPROXIMATE_COSINE_DISTANCE()
,APPROXIMATE_EUCLIDEAN_DISTANCE()
,APPROXIMATE_DOT_PRODUCT()