Auf dieser Seite werden die verschiedenen Möglichkeiten beschrieben, wie Sie Vektor-Embeddings abfragen können. Eine Übersicht über ANN- und KNN-Ähnlichkeitssuchen finden Sie unter Vektorsuchen.
Suche nach ungefähren Nachbarn (ANN)
Verwenden Sie die Funktion approx_distance
in einer SELECT
- und ORDER BY
-Klausel, um eine ANN-Suche durchzuführen. Sie müssen in einer ANN-Suche eine LIMIT
-Klausel verwenden. Sie können den Entfernungswert 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
hat die folgenden Optionen:
embedding
: Es wird der Name der Spalte für die Vektor-Embeddings aus der Basistabelle verwendet.string_to_vector
odervector_to_string
: Wandelt einen Vektor in einen String und einen String in einen Vektor um, um den Vektor menschenlesbar zu machen.distance_measure
: Gibt das Maß für die Entfernung 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_measure
festgelegt haben. Dieser Parameter ist erforderlich. Mögliche Werte für diesen Parameter sind:COSINE
L2_SQUARED
DOT_PRODUCT
num_leaves_to_search
: Optional. Gibt die Anzahl der Blätter an, die für eine ANN-Vektorähnlichkeitssuche geprüft werden sollen. Wenn Sie die Anzahl der Blätter nicht angeben, verwendet Cloud SQL einen Wert, der anhand der Größe der Tabelle, der Anzahl der Blätter im Vektorindex und anderer Faktoren generiert wird. Sie können diesen Wert ininformation_schema.innodb_vector_indexes
einsehen. Wir empfehlen,num_leaves_to_search
so anzupassen, dass für Ihre spezifische Arbeitslast das optimale Gleichgewicht zwischen Suchqualität und Leistung erreicht wird. Wenn Sie die Anzahl erhöhen, wirkt sich das auf die Leistung aus, verbessert aber die Erinnerung.
Im folgenden Beispiel wird gezeigt, wie Sie mit approx_distance
die K nächsten Zeilen mithilfe des Abstandsmaßes l2_squared
ermitteln und die Ergebnisse nach dem Abstand 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 von Abfragen mit approx_distance filtern
Sie können die Funktion approx_distance
mit WHERE
-Bedingungen verwenden, um Abfrageergebnisse mit einem nicht vektorbasierten Prädikat zu filtern und eine Nachfilterung durchzuführen. Die Funktion approx_distance
wird vor dem Anwenden des Filters ausgewertet. Die Anzahl der zurückgegebenen Ergebnisse ist also nicht deterministisch.
Beispiel:
SELECT id FROM products WHERE price < 100
ORDER BY approx(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. Beim Filtern nach dem Ausführen werden die Produkte mit einem Preis unter 100 € ausgewählt. Es ist möglich, dass alle nächsten Nachbarn einen Preis von unter 100 € haben. In diesem Fall gibt es 11 Ergebnisse für die Abfrage. Wenn keiner der nächsten Nachbarn einen Preis unter 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) möglicherweise die bessere Option, um sicherzustellen, dass eine ausreichende Anzahl von Zeilen zurückgegeben wird.
Fallback-Status bei ANN-Suchanfragen prüfen
In bestimmten Fällen greift die ANN-Suche auf eine KNN-Suche zurück. Dazu gehören:
- Für die Basistabelle gibt es keinen Vektorindex.
- In der Basistabelle gibt es einen Vektorindex, der jedoch ein anderes Entfernungsmaß als der Parameter
distance_measure
in den Suchoptionenapprox_distance
verwendet. - Der Vektorindex ist beschädigt oder für die aktuelle Transaktion nicht sichtbar.
- Die angegebene
LIMIT
ist größer als 10.000. LIMIT
ist nicht angegeben.- Die aktuelle Abfrage umfasst mehr als einen
approx_distance
-Aufruf für dieselbe Basistabelle. - Der Optimierer berechnet, dass die Verwendung von KNN effizienter ist.
In allen diesen Fällen wird dem Kunden eine Warnung gesendet, in der darauf hingewiesen wird, dass eine genaue Suche durchgeführt wurde, und der Grund dafür angegeben wird.
Verwenden Sie den folgenden Befehl im mysql-Client, um den Fallback-Status aufzurufen:
SHOW global status LIKE '%cloudsql_vector_knn_fallback%';
Wenn Sie eine ANN verwenden möchten und stattdessen KNN verwendet wird, ist die Abfrage möglicherweise langsamer. Sie sollten den Grund für die Umstellung ermitteln und prüfen, ob Sie Änderungen vornehmen sollten, damit stattdessen die ANN verwendet wird.
Beispiel: Vektorindex erstellen und ANN-Abfrage ausführen
In der folgenden Beispielanleitung wird beschrieben, wie Sie einen Vektorindex erstellen und eine ANN-Abfrage in Cloud SQL ausführen.
- Vektoreinbettungen generieren. Sie können Vektoreinbettungen manuell erstellen oder eine beliebige Texteinbettungs-API verwenden. Ein Beispiel für die Verwendung von Vertex AI finden Sie unter Vektoreinbettungen basierend auf Zeilendaten generieren.
Erstellen Sie eine Tabelle in Cloud SQL 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 Vektor-Embedding 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 Entfernung 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 einer
LIMIT
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;
K-nächstgelegene Nachbarn (KNN) suchen
Verwenden Sie die Funktion vector_distance
mit einer Option für die Entfernungsmessung und einer Vektorumwandlungsfunktion (string_to_vector
oder vector_to_string
) in einer SELECT
-Anweisung, um eine Suche nach dem K‑Nearest-Neighbor 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 Werte für die Einbettung Ihrer Daten.
Im folgenden Beispiel wird veranschaulicht, wie diese Abfrage mit der Funktion cosine_distance
und der Vektorkonvertierungsfunktion string_to_vector
verwendet wird.
SELECT id,cosine_distance(embedding, string_to_vector('[1,2,3]')) dist
FROM books
ORDER BY distance
LIMIT 10;
Kosinus-Entfernung in einer KNN-Abfrage abrufen
Verwenden Sie die Cloud SQL-Funktion cosine_distance
, um die Entfernung mithilfe des Kosinus zu berechnen.
SELECT cosine_distance(embedding, string_to_vector('[3,1,2]')) AS distance FROM books WHERE id = 10;
Punktprodukt-Distanz in einer KNN-Abfrage abrufen
Verwenden Sie die Cloud SQL-Funktion dot_product
, um die Entfernung mithilfe des Skalarprodukts 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 ermitteln
Verwenden Sie die Cloud SQL-Funktion l2_squared_distance
, um die Entfernung mit L2 Quadrat zu berechnen.
SELECT
l2_squared_distance(embedding, string_to_vector('[3,1,2]'))
AS distance
FROM books
WHERE id = 10;
Nächste Schritte
- Übersicht über die Vektorsuche in Cloud SQL
- Informationen zum Aktivieren und Deaktivieren von Vektoreinbettungen in Ihrer Instanz
- Weitere Informationen zum Generieren von Vektoreinbettungen
- Weitere Informationen zum Erstellen von Vektorindexen
- Weitere Informationen zum Suchen in Vektoreinbettungen