Auf dieser Seite werden die verschiedenen Möglichkeiten zum Abfragen von Vektoreinbettungen beschrieben. Eine Übersicht über ANN- und KNN-Ähnlichkeitssuchen finden Sie unter Vektorsuchen.
Ungefähre nächste Nachbarn (ANN) suchen
Verwenden Sie zum Ausführen einer ANN-Suche die Funktion approx_distance
in einer SELECT
- und einer ORDER BY
-Klausel. Sie müssen eine LIMIT
-Klausel in einer ANN-Suche verwenden. Sie können den Distanzwert auch abrufen, indem Sie approx_distance
in eine SELECT
-Liste einfügen.
Verwenden Sie die folgende Syntax für ANN-Abfragen:
# 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 mit Vektoreinbettungen aus der Basistabelle.string_to_vector
odervector_to_string
: Konvertiert einen Vektor in einen String und einen String in einen Vektor, um den Vektor menschenlesbar zu machen.distance_measure
: Gibt das Distanzmaß an, das für die Suche nach Vektorähnlichkeit 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 untersucht werden sollen. Wenn Sie die Anzahl der Blätter nicht angeben, verwendet Cloud SQL einen Wert, der auf der Grundlage 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
aufrufen. Wir empfehlen,num_leaves_to_search
abzustimmen, um das beste Gleichgewicht zwischen Suchqualität und Leistung für Ihre spezifische Arbeitslast zu erzielen. 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 dem Distanzmesswert 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 von approx_distance-Abfragen filtern
Sie können die Funktion approx_distance
mit WHERE
-Bedingungen verwenden, um Abfrageergebnisse mit einem nicht vektorbasierten Prädikat zu filtern. Die Funktion approx_distance
wird vor dem Anwenden des Filters ausgewertet. Das bedeutet, dass die Anzahl der zurückgegebenen Ergebnisse nicht deterministisch ist.
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 Anfragevektors unabhängig vom Preis zurück. Beim Post-Filtering werden die Produkte mit einem Preis unter 100 € ausgewählt. Es ist möglich, dass alle nächsten Nachbarn einen Preis unter 100 € haben. In diesem Fall gibt es 11 Ergebnisse für die Anfrage. 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, kann eine genaue Suche (KNN) eine bessere Option sein, um sicherzustellen, dass eine ausreichende Anzahl von Zeilen zurückgegeben wird.
Fallback-Status bei ANN-Suchanfragen prüfen
In bestimmten Fällen wird bei einer ANN-Suche auf eine KNN-Suche zurückgegriffen. Dazu gehören:
- Für die Basistabelle ist kein Vektorindex vorhanden.
- Die Basistabelle enthält einen Vektorindex, für den jedoch ein anderes Distanzmaß als für den Parameter
distance_measure
in den Suchoptionen fürapprox_distance
verwendet wird. - Der Vektorindex ist beschädigt oder für die aktuelle Transaktion nicht sichtbar.
- Der angegebene
LIMIT
ist größer als 10.000. - Es ist kein
LIMIT
angegeben. - Die aktuelle Abfrage umfasst 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 dem Kunden eine Warnung angezeigt, dass eine genaue Suche durchgeführt wurde und warum.
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, aber auf KNN zurückgegriffen wird, kann die Ausführung der Anfrage länger dauern. Sie sollten den Grund für das Fallback herausfinden und prüfen, ob Sie Änderungen vornehmen möchten, damit stattdessen ANN verwendet wird.
Beispiel: Vektorindex erstellen und ANN-Abfrage ausführen
Im folgenden Beispiel werden die Schritte zum Erstellen eines Vektorindex und zum Ausführen einer ANN-Abfrage in Cloud SQL beschrieben.
- Vektoreinbettungen generieren Sie können Vektoreinbettungen manuell erstellen oder eine Texteinbettungs-API Ihrer Wahl verwenden. Ein Beispiel, in dem Vertex AI 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 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
LIMIT
= 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 Distanzmessung und einer Vektorkonvertierungsfunktion (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 diese Abfrage mit der Funktion cosine_distance
und der Vektor-Konvertierungsfunktion 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 Distanz 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 Distanz 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 abrufen
Verwenden Sie die Cloud SQL-Funktion l2_squared_distance
, um die Entfernung mit dem Quadrat der L2-Norm 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
- Vektoreinbettungen generieren
- Vektorindexe erstellen
- Informationen zum Suchen nach Vektoreinbettungen