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:
APPROX_COSINE_DISTANCE
in GoogleSQLAPPROX_EUCLIDEAN_DISTANCE
in GoogleSQLAPPROX_DOT_PRODUCT
in GoogleSQL
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 einentree_depth
von2
. Andernfalls führt eintree_depth
von3
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 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. Unter Umständen ist es schwieriger, für einige Abfragevektoren die nächsten Nachbarn finden, sodassnum_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:
- 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 Ihrnum_leaves_to_search
in der neuen Abfrage ein. - Löschen Sie den veralteten Vektorindex.
Nächste Schritte
Weitere Informationen zu den GoogleSQL-Funktionen
APPROXIMATE_COSINE_DISTANCE()
,APPROXIMATE_EUCLIDEAN_DISTANCE()
,APPROXIMATE_DOT_PRODUCT()