Mit Vektoreinbettungen suchen und filtern

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 für Vektoreinbettungen aus der Basistabelle.
  • string_to_vector oder vector_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 Parameter distance_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 in information_schema.innodb_vector_indexes aufrufen. Wir empfehlen, num_leaves_to_search abzustimmen, um für Ihre spezifische Arbeitslast das beste Gleichgewicht zwischen Suchqualität und Leistung 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 am nächsten liegenden 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_distance(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. Bei der Nachfilterung 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, können Sie eine genaue Suche (KNN) verwenden, um sicherzustellen, dass eine ausreichende Anzahl von Zeilen zurückgegeben wird.

Eine weitere Option ist die Verwendung von iterativem Filtern, um einen größeren Teil des ANN-Suchindex zu scannen.

Iteratives Filtern verwenden, um die ANN-Suchergebnisse zu verbessern

Sie können iteratives Filtern verwenden, wenn die selektiven Filter der WHERE-Klausel in Ihrer ANN-Suchanfrage weniger Ergebnisse liefern als die Anzahl der Ergebnisse, die in Ihrer LIMIT-Klausel angegeben sind.

Wenn Sie beispielsweise in der folgenden Abfrage die iterative Filterung aktivieren, wird der Vektorindex mit Ausnahme der ersten Gruppe gefilterter Ergebnisse durchsucht.

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.

Iteratives Filtern aktivieren

Standardmäßig ist die iterative Filterung für alle Sitzungen und Cloud SQL-Instanzen deaktiviert.

Verwenden Sie die folgende SQL-Anweisung, um das iterative Filtern 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. Setzen Sie dazu das Flag für die Instanz. 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 in der MySQL-Dokumentation unter Systemvariablen verwenden.

Iteratives Filtern optimieren

Mit der Sitzungs- oder globalen Systemvariablen cloudsql_vector_iterative_filtering_max_neighbors können Sie festlegen, wie viele nächste Nachbarn für eine ANN-Suchanfrage mit aktivierter iterativer Filterung zurückgegeben werden. Mit dieser Konfiguration können Sie die Anzahl der angeforderten nächsten Nachbarn erhöhen. Um jedoch zu vermeiden, dass zu viele Ergebnisse im Arbeitsspeicher gespeichert werden, liegt das Maximum für diese Variable bei 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 die Mindestanzahl ist 10.

Beschränkungen

Die Verwendung der iterativen Filterung unterliegt den folgenden Einschränkungen:

  • Keine Garantie: Wenn Sie die iterative Filterung verwenden, versucht Cloud SQL, die in der LIMIT-Klausel angegebene Anzahl von Ergebnissen zu finden. Es wird jedoch nicht garantiert, dass die Anzahl gefunden wird. Das kann passieren, wenn die maximale Anzahl von Nachbarn (cloudsql_vector_iterative_filtering_max_neighbors) erreicht wird, bevor die LIMIT erfüllt ist, oder wenn es in der Tabelle nicht genügend Zeilen gibt, die dem Filter entsprechen.

  • Komplexe Abfragen: Iteratives Filtern funktioniert nur, wenn Filterprädikate an den Zugriffspfad der Basistabelle weitergeleitet werden. Sie wird nicht für Filter für temporäre Tabellen unterstützt, z. B. Tabellen, die eine HAVING-Klausel verwenden. In Unterabfragen werden für das iterative Filtern nur Filter für die Basistabelle innerhalb der Unterabfrage selbst berücksichtigt.

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:

  • Die Basistabelle hat keinen Vektorindex.
  • Es gibt einen Vektorindex für die Basistabelle, aber er verwendet ein anderes Distanzmaß als der Parameter distance_measure in den Suchoptionen für approx_distance.
  • 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.

  1. 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.
  2. 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);
    
  3. Fügen Sie eine Vektoreinbettung in die Spalte ein.

    INSERT INTO books VALUES ((1, 'book title', string_to_vector('[1,2,3]')));
    
  4. Führen Sie zum Übernehmen der Änderungen ein Commit durch.

    commit;
    
  5. 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;
    
  6. Verwenden Sie die folgende Syntax, um eine ANN-Suche mit einem LIMIT von vier 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 den K-nächstgelegenen Nachbarn (KNN)

Verwenden Sie zum Ausführen einer Suche nach den k-nächsten Nachbarn 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. 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-Distanz 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;

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