Auf dieser Seite werden die verschiedenen Möglichkeiten zum Abfragen von Vektoreinbettungen beschrieben. Eine Übersicht über ANN- und KNN-Ähnlichkeitssuchen finden Sie unter Vektorsuchen.
Suche nach ungefähren nächsten Nachbarn (ANN)
Verwenden Sie die
approx_distance Funktion
in einer SELECT und ORDER BY Klausel, um eine ANN-Suche durchzuführen. Bei einer ANN-Suche müssen Sie eine LIMIT-Klausel verwenden. Sie können den Distanzwert auch abrufen, indem Sie approx_distance in eine SELECT-Liste einfügen.
Verwenden Sie für ANN-Abfragen die folgende Syntax:
# Ordering by distance
SELECT title
FROM books
ORDER BY approx_distance(embedding, string_to_vector('[1,2,3]'), 'distance_measure=l2_squared')
LIMIT 4;
# Selecting the distance value
SELECT
approx_distance(
embedding_name,
string_to_vector('[1,2,3]'),
'distance_measure=cosine,num_leaves_to_search=3')
dist
FROM table
ORDER BY dist
LIMIT limit_value;
Die Funktion approx_distance verwendet die folgenden Optionen:
embedding: verwendet den Namen der Spalte für Vektoreinbettungen aus der Basistabelle.string_to_vectorodervector_to_string: konvertiert einen Vektor in einen String und einen String in einen Vektor, damit der Vektor für Menschen lesbar ist.distance_measure: gibt das Distanzmaß an, das für eine Vektorähnlichkeitssuche verwendet werden soll. Dieser Wert muss mit dem Wert übereinstimmen, den Sie beim Erstellen des Index im Parameterdistance_measurefestgelegt haben. Dieser Parameter ist erforderlich. Mögliche Werte für diesen Parameter sind:COSINEL2_SQUAREDDOT_PRODUCT
num_leaves_to_search: optional. Gibt die Anzahl der Blätter an, die für eine ANN-Vektorähnlichkeitssuche untersucht werden sollen. Wenn Sie die Anzahl der Blätter nicht angeben, verwendet Cloud SQL einen Wert, der auf der Größe der Tabelle, der Anzahl der Blätter im Vektorindex und anderen Faktoren basiert. Sie können diesen Wert ininformation_schema.innodb_vector_indexesansehen. Wir empfehlen,num_leaves_to_searchso zu optimieren, dass das beste Verhältnis zwischen Suchqualität und Leistung für Ihre spezifische Arbeitslast erzielt wird. Wenn der Wert erhöht wird, wirkt sich das auf die Leistung aus, verbessert aber den Recall.
Im folgenden Beispiel wird gezeigt, wie Sie mit approx_distance die K nächsten Zeilen mit der geringsten Distanz mithilfe des Distanzmaßes l2_squared finden und die Ergebnisse nach Distanz sortieren.
# Ordering by distance
SELECT title
FROM books
ORDER BY approx_distance(embedding, string_to_vector('[1,2,3]'),
'distance_measure=l2_squared')
LIMIT 4;
# Selecting the distance value
SELECT
approx_distance
(embedding, string_to_vector('[1,2,3]'),
'distance_measure=l2_squared') dist
FROM table
ORDER BY dist
LIMIT 4;
Ergebnisse aus approx_distance-Abfragen filtern
Sie können die Funktion approx_distance mit WHERE-Bedingungen verwenden, die Abfrageergebnisse mit einem Nicht-Vektor-Prädikat filtern, um eine Nachfilterung durchzuführen. Die Funktion approx_distance wird ausgewertet, bevor der Filter angewendet wird. Das bedeutet, dass die Anzahl der zurückgegebenen Ergebnisse nicht deterministisch ist.
Beispiel für die folgende Abfrage:
SELECT id FROM products WHERE price < 100
ORDER BY approx_distance(embedding, @query_vector,'distance_measure=cosine')
LIMIT 11;
Die Funktion approx_distance gibt die 11 nächsten Nachbarn des Abfragevektors unabhängig vom Preis zurück. Bei der Nachfilterung werden die Produkte mit einem Preis von weniger als 100 ausgewählt. Es ist möglich, dass alle nächsten Nachbarn einen Preis von weniger als 100 haben. In diesem Fall gibt die Abfrage 11 Ergebnisse zurück. Wenn keiner der nächsten Nachbarn einen Preis von weniger als 100 hat, werden 0 Zeilen zurückgegeben.
Wenn Sie davon ausgehen, dass Ihr Filter in der WHERE-Bedingung sehr selektiv ist, ist eine genaue Suche (KNN) eine Option, um sicherzustellen, dass eine ausreichende Anzahl von Zeilen zurückgegeben wird.
Eine weitere Möglichkeit ist die Verwendung von iterativer Filterung , um einen größeren Teil des ANN-Suchindex zu scannen.
Iterative Filterung verwenden, um die Anzahl der ANN-Suchergebnisse zu erhöhen
Sie können die iterative Filterung verwenden, wenn die selektiven Filter der WHERE-Anweisung in Ihrer ANN-Suchabfrage weniger Ergebnisse liefern als die Anzahl der Ergebnisse, die in Ihrer LIMIT-Anweisung angegeben sind.
Wenn Sie beispielsweise in der folgenden Abfrage die iterative Filterung aktivieren, wird ein größerer Teil des Vektorindex gescannt, abzüglich der ersten Gruppe gefilterter Ergebnisse.
EXPLAIN FORMAT=TREE
SELECT * FROM t1 WHERE next_id BETWEEN 15 AND 100
ORDER BY approx_distance(embedding, string_to_vector('[1,2,3]'), 'distance_measure=l2_squared')
LIMIT 10;
EXPLAIN
-> Limit: 10 row(s) (rows=10)
-> Vector index loop with iterative filtering
-> Vector index scan on t1
-> Filter: (t1.next_id between 15 and 100)
-> Single-row index lookup on t1 using PRIMARY (id=t1.id)
Sie rufen iterativ weitere Nachbarn aus dem Suchvektorindex ab, bis das konfigurierte Maximum (cloudsql_vector_iterative_filtering_max_neighbors) erreicht ist. Alle Filterübereinstimmungen werden auf LIMIT angerechnet und aus den zusätzlichen Vektorindexscans entfernt.
Iterative Filterung aktivieren
Die iterative Filterung ist standardmäßig für alle Sitzungen und Cloud SQL-Instanzen deaktiviert.
Verwenden Sie die folgende SQL-Anweisung, um die iterative Filterung für eine vorhandene Sitzung zu aktivieren.
SET SESSION cloudsql_vector_iterative_filtering=on;
Sie können die iterative Filterung auch global für alle Clientsitzungen aktivieren, die eine Verbindung zur Instanz herstellen, indem Sie das Flag für die Instanz festlegen. Informationen zum Festlegen eines Flags für eine Instanz finden Sie unter Datenbank-Flag festlegen.
Weitere Informationen zum Festlegen von Systemvariablen auf Sitzungs- oder globaler Ebene finden Sie Using System Variables in der MySQL-Dokumentation.
Iterative Filterung optimieren
Mit der Sitzungs- oder globalen Systemvariable cloudsql_vector_iterative_filtering_max_neighbors können Sie festlegen, wie viele nächste Nachbarn für eine ANN-Suchabfrage mit aktivierter iterativer Filterung zurückgegeben werden.
Mit dieser Konfiguration können Sie die Anzahl der angeforderten nächsten Nachbarn erhöhen. Um zu vermeiden, dass zu viele Ergebnisse im Arbeitsspeicher gespeichert werden, ist das Maximum für diese Variable jedoch 1000.
Verwenden Sie die folgende SQL-Anweisung, um diese Variable für eine Sitzung festzulegen:
SET cloudsql_vector_iterative_filtering_max_neighbors=600;
Der Standardwert ist 500 und der Mindestwert ist 10.
Beschränkungen
Die Verwendung der iterativen Filterung unterliegt folgenden Einschränkungen:
Keine Garantie: Wenn Sie die iterative Filterung verwenden, versucht Cloud SQL, die in der
LIMITKlausel angegebene Anzahl von Ergebnissen zu finden, garantiert aber nicht, dass diese Anzahl gefunden wird. Das kann passieren, wenn die maximale Anzahl von Nachbarn (cloudsql_vector_iterative_filtering_max_neighbors) erreicht wird, bevorLIMITerfüllt ist, oder wenn nicht genügend Zeilen in der Tabelle vorhanden sind, die dem Filter entsprechen.Komplexe Abfragen: Die iterative Filterung funktioniert nur, wenn Filterprädikate an den Zugriffspfad der Basistabelle weitergegeben werden. Sie wird nicht für Filter für temporäre Tabellen unterstützt, z. B. Tabellen, die eine
HAVING-Klausel verwenden. Bei Unterabfragen werden nur Filter für die Basistabelle innerhalb der Unterabfrage selbst für die iterative Filterung berücksichtigt.
Fallback-Status bei ANN-Suchen prüfen
In bestimmten Fällen wird bei einer ANN-Suche auf eine KNN-Suche zurückgegriffen. Dazu gehören die folgenden Fälle:
- Es ist kein Vektorindex für die Basistabelle vorhanden.
- Es ist ein Vektorindex für die Basistabelle vorhanden, aber er verwendet ein anderes Distanzmaß als der Parameter
distance_measurein den Suchoptionen vonapprox_distance. - Der Vektorindex ist beschädigt oder für die aktuelle Transaktion nicht sichtbar.
- Der angegebene
LIMIT-Wert ist größer als 10.000. - Es ist kein
LIMIT-Wert angegeben. - Die aktuelle Abfrage enthält mehr als einen
approx_distance-Aufruf für dieselbe Basistabelle. - Das Optimierungsprogramm berechnet, dass die Verwendung von KNN effizienter ist.
In all diesen Fällen wird eine Warnung an den Client gesendet, die angibt, dass eine genaue Suche durchgeführt wurde, und den Grund dafür nennt.
Verwenden Sie den folgenden Befehl im MySQL-Client, um den Fallback-Status aufzurufen:
SHOW global status LIKE '%cloudsql_vector_knn_fallback%';
Wenn Sie ANN verwenden möchten und auf KNN zurückgegriffen wird, kann die Abfrage langsamer ausgeführt werden. Sie sollten den Grund für den Fallback ermitteln und prüfen, ob Änderungen vorgenommen werden müssen, damit stattdessen ANN verwendet wird.
Beispiel: Vektorindex erstellen und ANN-Abfrage ausführen
Die folgende Schritt-für-Schritt-Anleitung zeigt, wie Sie einen Vektorindex erstellen und eine ANN-Abfrage in Cloud SQL ausführen.
- Generieren Sie Vektoreinbettungen. Sie können Vektoreinbettungen manuell erstellen oder eine Text Embedding API Ihrer Wahl verwenden. Ein Beispiel, bei dem die Agent Platform verwendet wird, finden Sie unter Vektoreinbettungen basierend auf Zeilendaten generieren.
Erstellen Sie in Cloud SQL eine Tabelle mit einer Spalte für Vektoreinbettungen mit drei Dimensionen.
CREATE TABLE books( id INTEGER PRIMARY KEY AUTO_INCREMENT, title VARCHAR(60), embedding VECTOR(3) USING VARBINARY);Fügen Sie eine Vektoreinbettung in die Spalte ein.
INSERT INTO books VALUES ((1, 'book title', string_to_vector('[1,2,3]')));Führen Sie zum Übernehmen der Änderungen ein Commit durch.
commit;Erstellen Sie den Vektorindex mit der Funktion
L2_squared, um die Distanz zu messen.CREATE VECTOR INDEX vectorIndex ON dbname.books(embeddings) USING SCANN QUANTIZER = SQ8 DISTANCE_MEASURE = l2_squared;Verwenden Sie die folgende Syntax, um eine ANN-Suche mit einem
LIMIT-Wert von 4 Suchergebnissen durchzuführen:SELECT title FROM books ORDER BY approx_distance(embedding, string_to_vector('[1,2,3]'), 'distance_measure=l2_squared') LIMIT 4; SELECT approx_distance(embedding, string_to_vector('[1,2,3]'), 'distance_measure=cosine') dist FROM books ORDER BY dist LIMIT 4;
Suche nach K-nächsten Nachbarn (KNN)
Verwenden Sie die
vector_distance Funktion
mit einer Option für das Distanzmaß und einer Funktion zur Vektorkonvertierung
(string_to_vector oder vector_to_string) in einer SELECT-Anweisung, um eine Suche nach den K-nächsten Nachbarn durchzuführen. Verwenden Sie die folgende Syntax:
SELECT vector_distance(string_to_vector('[1,2,3]'),
string_to_vector('[1,2,3]'),
'Distance_Measure=dot_product');
Ersetzen Sie die Werte [1,2,3] durch die Einbettungswerte Ihrer Daten.
Im folgenden Beispiel wird gezeigt, wie Sie diese Abfrage mit der Funktion cosine_distance und der Funktion zur Vektorkonvertierung string_to_vector verwenden.
SELECT id,cosine_distance(embedding, string_to_vector('[1,2,3]')) dist
FROM books
ORDER BY distance
LIMIT 10;
Kosinusdistanz in einer KNN-Abfrage abrufen
Verwenden Sie die Cloud SQL
cosine_distance Funktion
, um die Distanz mithilfe des Kosinus zu berechnen.
SELECT cosine_distance(embedding, string_to_vector('[3,1,2]')) AS distance FROM books WHERE id = 10;
Punktproduktdistanz in einer KNN-Abfrage abrufen
Verwenden Sie die Cloud SQL
dot_product Funktion
um die Distanz mithilfe des Punktprodukts zu berechnen.
SELECT dot_product(embedding, string_to_vector('[3,1,2]')) AS distance FROM books WHERE id = 10;
Quadrierte euklidische Distanz in einer KNN-Abfrage abrufen
Verwenden Sie die Cloud SQL
l2_squared_distance Funktion
um die Distanz mithilfe der quadrierten euklidischen Distanz zu berechnen.
SELECT
l2_squared_distance(embedding, string_to_vector('[3,1,2]'))
AS distance
FROM books
WHERE id = 10;
Nächste Schritte
- Lesen Sie die Übersicht zur Vektorsuche in Cloud SQL.
- Informationen zum Aktivieren und Deaktivieren von Vektoreinbettungen in Ihrer Instanz.
- Informationen zum Generieren von Vektoreinbettungen.
- Informationen zum Erstellen von Vektorindexen.
- Informationen zum Ausführen von Suchen in Vektoreinbettungen.