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 mit 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 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ür approx_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.

  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 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