Mit Vektoreinbettungen arbeiten

Auf dieser Seite erfahren Sie, wie Sie mit Cloud SQL interagieren können, um Anwendungen zu erstellen, die Vektoreinbettungen verwenden.

Cloud SQL for MySQL unterstützt das Speichern von Vektoreinbettungen. Anschließend können Sie Vektorsuchindexe erstellen und Ähnlichkeitssuchen für diese Vektoreinbettungen sowie für die restlichen Daten ausführen, die Sie in Cloud SQL speichern.

Speicher für Vektoreinbettungen

Sie können Vektoreinbettungen mit Cloud SQL for MySQL speichern, indem Sie in einer Tabelle eine Spalte für Vektoreinbettungen erstellen. Die spezielle Spalte für die Vektor-Embeddings wird dem Datentyp VARBINARY zugeordnet. Wie bei anderen relationalen Daten in der Tabelle können Sie mit bestehenden Transaktionsgarantien auf Vektor-Embeddings in der Tabelle zugreifen. Eine Tabelle mit einer Spalte für die Vektoreinbettung ist eine reguläre InnoDB-Tabelle und entspricht daher den ACID-Eigenschaften (Atomarität, Konsistenz, Isolation und Dauerhaftigkeit). ACID-Eigenschaften weichen nur bei Indexabfragen der Vektorsuche ab.

Sie können in einer Tabelle eine Vektor-Embedding-Spalte und einen Vektorsuchindex pro Tabelle erstellen. Jede in derselben Spalte gespeicherte Vektor-Embedding-Funktion muss genau dieselben Dimensionen haben, die Sie bei der Definition der Spalte angegeben haben. Eine Vektoreinbettung hat eine Obergrenze von 16.000 Dimensionen. Wenn Sie genügend Speicherplatz und Arbeitsspeicher haben, können Sie in derselben Instanz separate Tabellen mit unterschiedlichen Spalten für Vektoreinbettungen und Vektorsuchindexe verwenden.

Die Anzahl der Vektoreinbettungen, die Sie in einer Tabelle speichern können, ist zwar nicht begrenzt, aber Vektorsuchindexe erfordern Arbeitsspeicher. Aus diesem Grund empfehlen wir, nicht mehr als 10 Millionen Vektor-Ebenen in einer Tabelle zu speichern.

Die Replikation funktioniert für die Spalte mit der Vektor-Embedding-Funktion genauso wie für andere MySQL-InnoDB-Spalten.

Cloud SQL unterstützt die Ähnlichkeitssuche sowohl mit KNN- (K-Nearest Neighbor) als auch mit ANN-Suchanfragen (Approximate Nearest Neighbor). Sie können beide Arten von Vektorsuchen in Ihren Cloud SQL-Instanzen verwenden. Sie können einen Index für die Vektorsuche für ANN-Suchen erstellen.

Cloud SQL unterstützt Abfragen mit der KNN-Vektorsuche, die auch als Suche nach dem genauen nächsten Nachbarn bezeichnet wird. Eine KNN-Vektorsuche bietet eine perfekte Wiedererkennung. Sie können KNN-Suchen ausführen, ohne einen Index für die Vektorsuche erstellen zu müssen. Die KNN-Suche basiert auf der Ausführung eines Tabellensuchalgorithmus.

Für die KNN-Suche unterstützt Cloud SQL außerdem die folgenden Funktionen für die Suche nach Vektorabständen:

  • Kosinus
  • Skalarprodukt
  • Quadrierte euklidische Distanz

Weitere Informationen zur Verwendung von Abstandsfunktionen für die Vektorsuche finden Sie unter Abstand einer Vektoreinbettung abfragen.

Cloud SQL unterstützt das Erstellen und Abfragen von ANN-Suchanfragen durch das Erstellen von Vektorsuchindexen. Mit einem ANN-Vektorsuchindex können Sie die Leistung optimieren, anstatt auf eine perfekte Wiedergabe zu achten. Für die ANN-Suche unterstützt Cloud SQL die folgenden Indextypen:

  • BRUTE_FORCE: Der Standardindextyp für die Vektorsuche für eine Basistabelle mit weniger als 10.000 Zeilen. Dieser Typ eignet sich am besten für Suchanfragen in einer kleineren Teilmenge eines ursprünglichen Datensatzes. Der vom Index verwendete Arbeitsspeicher entspricht der Größe des Datensatzes. Dieser Indextyp wird nicht auf dem Laufwerk gespeichert.
  • TREE_SQ: Der Standardindextyp für die Vektorsuche für eine Basistabelle mit mindestens 10.000 Zeilen. Dieser Typ benötigt den geringsten Arbeitsspeicher oder etwa 25% der Größe des Datasets. TREE_SQ-Indexe werden auf dem Laufwerk gespeichert.
  • TREE_AH: Ein Vektorsuchindextyp, der einen Algorithmus für die Suche mit asymmetrischem Hashing bietet. In Cloud SQL ist dieser Indextyp nicht für den Arbeitsspeicher optimiert und wird nicht gespeichert.

Vektorsuchindizes aktualisieren

Cloud SQL for MySQL aktualisiert Vektorsuchindexe in Echtzeit. Bei jeder Transaktion, bei der DML-Vorgänge (Data Manipulation Language) auf der Basistabelle ausgeführt werden, werden Änderungen auch an die zugehörigen Vektorsuchindexe weitergegeben. Die Änderungen in einem Index für die Vektorsuche sind für alle anderen Transaktionen sofort sichtbar. Das entspricht einer Isolationsebene von READ_UNCOMMITTED.

Wenn Sie eine Transaktion rückgängig machen, werden die entsprechenden Rollback-Änderungen auch im Vektorsuchindex vorgenommen.

Replikation von Vektorsuchindexen

Cloud SQL for MySQL repliziert Vektorsuchindexe auf alle Lesereplikate. Replikationsfilter und die Replikation von Vektorsuchindexen in kaskadierende Replikate werden nicht unterstützt.

Instanz für die Unterstützung von Vektoreinbettungen konfigurieren

In diesem Abschnitt wird beschrieben, wie Sie Ihre Cloud SQL-Instanz so konfigurieren, dass das Speichern, Indexieren und Abfragen von Vektoreinbettungen unterstützt wird.

Sowohl Cloud SQL Enterprise- als auch Cloud SQL Enterprise Plus-Instanzen unterstützen Vektor-Embeddings.

Hinweise

  • Auf Ihrer Instanz muss Cloud SQL for MySQL-MySQL-Version 8.0.36.R20240401.03_00 oder höher ausgeführt werden.
  • Ihre Instanz muss genügend Speicherplatz und Arbeitsspeicher haben, um Arbeitsspeicher für die Gesamtzahl der Vektor-Embeddings auf der Instanz zuzuweisen.

Unterstützung für Vektoreinbettungen aktivieren

Wenn Sie die Unterstützung für Vektor-Embeddings aktivieren möchten, müssen Sie MySQL-Datenbank-Flags konfigurieren.

gcloud sql instances patch INSTANCE_NAME \
  --database-flags=FLAGS

Ersetzen Sie INSTANCE_NAME durch den Namen der Instanz, für die Sie die Unterstützung für Vektor-Embeddings aktivieren möchten.

Konfigurieren Sie in FLAGS die folgenden MySQL-Flags für Ihre Instanz:

  • cloudsql_vector: Legen Sie dieses Flag auf on fest, um die Unterstützung für die Speicherung und Suche von Vektoreinbettungen zu aktivieren. Sie können neue Spalten für die Vektoreinbettung und Vektorsuchindexe in der Instanz erstellen.
  • cloudsql_vector_max_mem_size: Optional. Geben Sie die maximale Arbeitsspeicherzuweisung in Byte für alle Vektorsuchindexe in der Instanz an. Wenn Sie dieses Flag nicht angeben, beträgt die Standardarbeitsspeicherzuweisung 1 GB, was der Mindestarbeitsspeicherzuweisung entspricht. Weitere Informationen zum Berechnen der anzugebenden Menge finden Sie unter Speicherzuweisung für Vektorsuchindexe konfigurieren.

    Dieser spezielle Arbeitsspeicher stammt aus dem Arbeitsspeicher, der Ihrer innodb_buffer_pool_size zugewiesen ist. Der verfügbare Pufferpool wird um denselben Betrag reduziert. Der maximal zulässige Wert für dieses Flag beträgt 50% des Gesamtwerts von innodb_buffer_pool_size.

    Wenn Sie einen Wert angeben, der über 50% Ihrer gesamten innodb_buffer_pool_size liegt, reduziert Cloud SQL den effektiven Wert auf 50% der verfügbaren Größe und protokolliert eine Warnmeldung für die Instanz.

Nachdem Sie die Flags konfiguriert haben, könnte Ihr Befehl in etwa so aussehen:

gcloud sql instances patch my-instance \
  --database-flags=cloudsql_vector=on,cloudsql_vector_max_mem_size=4294967296

Die Flags zur Konfiguration der Unterstützung von Vektoreinbettungen in Cloud SQL for MySQL sind statisch. Nachdem Sie die Instanz mit den Flags aktualisiert haben, wird sie automatisch neu gestartet, damit die Konfigurationsänderungen wirksam werden.

Weitere Informationen zum Konfigurieren von Datenbank-Flags für MySQL finden Sie unter Datenbank-Flags konfigurieren.

Unterstützung für Vektoreinbettungen deaktivieren

Wenn Sie die Unterstützung für Vektoreinbettungen deaktivieren möchten, setzen Sie das Flag cloudsql_vector auf off.

Beispiel:

gcloud sql instances patch INSTANCE_NAME \
  --database-flags=cloudsql_vector=off

Ersetzen Sie INSTANCE_NAME durch den Namen der Instanz, für die Sie die Unterstützung für Vektor-Embeddings deaktivieren möchten.

Wenn Sie cloudsql_vector auf off festlegen, können Sie keine neuen Spalten für die Vektoreinbettung und keine Vektorsuchindexe mehr erstellen. Nachdem Sie dieses statische Flag konfiguriert haben, wird die Instanz automatisch neu gestartet, damit die Konfigurationsänderung wirksam wird.

Nach dem Neustart der Instanz führt Cloud SQL for MySQL die folgenden Schritte aus:

  • Entfernt alle persistenten TREE_SQ-Vektorsuchindexe vom persistenten Laufwerk.
  • Hier werden die Tabelleneinträge des Datenwörterbuchs für die erstellten Vektorsuchindexe aufbewahrt. In Cloud SQL for MySQL werden die Indexe jedoch nicht neu erstellt und alle Suchanfragen an diese Indexe geben einen Fehler zurück.
  • Die Vektoreinbettungen werden weiterhin in den Basistabellen gespeichert. Die Vektoreinbettungen sind weiterhin verfügbar.

Wenn Sie das Flag cloudsql_vector für die Instanz später wieder aktivieren, versucht Cloud SQL, die Indexe anhand der Einträge in der Tabelle des Datenwörterbuchs neu zu erstellen, während die Instanz neu gestartet wird.

Speicherzuweisung für Vektorsuchindizes konfigurieren

Cloud SQL erstellt und verwaltet Vektorsuchindexe im Arbeitsspeicher. Der Indextyp TREE_SQ bleibt bei einem ordnungsgemäßen Herunterfahren erhalten und wird nach dem Neustart der Instanz neu geladen. Während der Laufzeit müssen alle Vektorsuchindexe im Arbeitsspeicher bleiben.

Damit in Cloud SQL genügend Arbeitsspeicher für alle Vektorsuchindexe verfügbar ist, konfigurieren Sie die Cloud SQL-Instanz mit dem Datenbank-Flag cloudsql_vector_max_mem_size. cloudsql_vector_max_mem_size legt fest, wie viel Arbeitsspeicher die Cloud SQL-Instanz für Vektorsuchindexe reserviert. Beachten Sie Folgendes, wenn Sie den Wert für das Flag konfigurieren:

  • Der Standard- und Mindestwert ist 1 GB. Die Obergrenze liegt bei 50% der Größe des Pufferpools.
  • Nachdem Sie dieses Flag festgelegt haben, wird Ihre Instanz automatisch neu gestartet, damit die Konfigurationsänderung wirksam wird.
  • Wenn Ihre Instanz den gesamten konfigurierten Arbeitsspeicher belegt hat, können Sie keine Vektorsuchindexe erstellen oder ändern.

Wenn Sie den für Vektorsuchindexe auf der Instanz zugewiesenen Arbeitsspeicher aktualisieren möchten, ändern Sie den Wert des Flags cloudsql_vector_max_mem_size.

gcloud sql instances patch INSTANCE_NAME \
  --database-flags= cloudsql_vector_max_mem_size=NEW_MEMORY_VALUE

Ersetzen Sie Folgendes:

  • INSTANCE_NAME: der Name der Instanz, für die Sie die Speicherzuweisung ändern.
  • NEW_MEMORY_VALUE: die aktualisierte Speicherzuweisung in Byte für Ihre Vektorsuchindexe

Dadurch wird Ihre Instanz automatisch neu gestartet, damit die Änderung wirksam wird.

Erforderlichen Arbeitsspeicher berechnen

Die benötigte Speichermenge für einen Index hängt vom Indextyp, der Anzahl der Vektoreinbettungen und der Dimensionalität der Einbettungen ab. Es gibt zwei Speicheranforderungen:

  • Build-Zeitspeicher: Der während des Index-Builds erforderliche Arbeitsspeicher
  • Indexspeicher: Der Arbeitsspeicher, den der Index nach dem Erstellen belegt

Die Datensatzgröße eines bestimmten Index entspricht dem Arbeitsspeicher, der zum Lesen aller Vektoreinbettungen im Arbeitsspeicher erforderlich ist. Da jede Dimension durch ein Float dargestellt wird, das 4 Byte Arbeitsspeicher belegt, können Sie die dataset_size so bestimmen:

dataset_size = <num_embeddings> * (4 * <dimensions>)

Wenn Sie beispielsweise 1 Million Einbettungen mit 768 Dimensionen haben, beträgt Ihre dataset_size 3 GB.

Basierend auf dem vorherigen Beispiel sind die Speicheranforderungen für die verschiedenen Indextypen wie folgt:

Indextyp Build-Zeit-Speicher Indexspeicher
TREE_SQ 4 GB 1 GB
TREE_AH 3,5 GB 3,5 GB
BRUTE_FORCE 3 GB 3 GB

Wenn Sie TREE_SQ-Vektorsuchindexe verwenden, müssen Sie auch den für die Persistenz bei Laufzeit erforderlichen Arbeitsspeicher berücksichtigen. Fügen Sie der Gesamtmenge des Arbeitsspeichers in Ihrer Konfiguration den Indexspeicher hinzu, der vom größten aktiven TREE_SQ-Vektorsuchindex verwendet wird.

Jedes Mal, wenn die Basistabelle, in der die Vektoreinbettungen gespeichert sind, DML-Vorgänge durchläuft, wird der Index der Vektorsuche in Echtzeit aktualisiert. Diese Aktualisierungen ändern den Arbeitsspeicherbedarf des Index, der sich je nach DML-Vorgang verkleinern oder vergrößern kann. Sie können den Speicherbedarf eines Index überwachen, indem Sie die Tabelle information_schema.innodb_vector_indexes abfragen. Informationen zum Überwachen der Größe Ihres Vektorsuchindexes finden Sie unter Vektorsuchindexe überwachen.

Lesereplikatkonfiguration

Wenn die Instanz die Kriterien für die Wartungsversion und die Aktivierung des Flags erfüllt, werden Vektor-Embeddings in Cloud SQL vollständig auf einem Lesereplikat unterstützt.

Wenn Sie ein Replikat aus einer primären Instanz erstellen, für die die Unterstützung von Vektor-Embedding aktiviert ist, werden die Einstellungen für die Unterstützung von Vektor-Embedding von der primären Instanz übernommen. Sie müssen die Unterstützung für die Vektor-Embeddings für bereits vorhandene Lesereplikate einzeln aktivieren.

Was die Auswirkungen auf die Replikationsverzögerung angeht, funktioniert das Erstellen und Verwalten von Indexen für die Vektorsuche genauso wie bei regulären MySQL-Indexen.

Vektorsuchindexe werden für kaskadierende Replikate nicht unterstützt.

Beispiel: Ein einfacher ANN-Vektorsuchindex und eine Abfrage

In der folgenden Beispielanleitung wird beschrieben, wie Sie einen ANN-basierten Vektorsuchindex und eine Abfrage in Cloud SQL erstellen.

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

  2. Erstellen Sie in Cloud SQL for MySQL eine Tabelle mit einer Vektoreinbettungsspalte 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 Vektor-Embedding 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 Vektorsuchindex. Wenn Sie einen TREE_SQ- oder TREE_AH-Index erstellen, muss Ihre Tabelle mindestens 1.000 Zeilen enthalten.

    CALL mysql.create_vector_index('vectorIndex',
                                   'dbname.books',
                                   'embedding',
                                   'index_type=BRUTE_FORCE, distance_measure=L2_SQUARED'
                                   );
    
  6. Nächste Nachbarn abrufen

    SELECT title FROM books
    WHERE
    NEAREST(embedding) TO (string_to_vector('[1,2,3]'));
    

Vektoreinbettungen basierend auf Zeilendaten generieren

Sie können mithilfe einer Texteinbettungs-API wie Vertex AI oder OpenAI eine Vektoreinbettung für die Daten einer bestimmten Zeile generieren. Sie können jede Text-Einbettungs-API mit Cloud SQL-Vektoreinbettungen verwenden. Sie müssen jedoch dieselbe Text-Einbettungs-API für die Generierung von Suchstringvektoren verwenden. Sie können verschiedene APIs für Quelldaten und die Vektorisierung von Abfragen nicht kombinieren.

So können Sie beispielsweise eine Vektoreinbettung aus Vertex AI generieren:

from vertexai.language_models import TextEmbeddingModel

def text_embedding() -> list:
    """Text embedding with a Large Language Model."""
    model = TextEmbeddingModel.from_pretrained("text-embedding-004")
    embeddings = model.get_embeddings(["What is life?"])
    for embedding in embeddings:
        vector = embedding.values
        print(f"Length of Embedding Vector: {len(vector)}")
    return vector

if __name__ == "__main__":
    text_embedding()

Vektoreinbettungen speichern

Dieser Abschnitt enthält Beispielanweisungen zum Speichern von Vektoreinbettungen in Cloud SQL.

Neue Tabelle mit einer Spalte für die Vektor-Embeddings erstellen

CREATE TABLE books (
  id INTEGER PRIMARY KEY AUTO_INCREMENT,
  title VARCHAR(60),
  embedding VECTOR(3) USING VARBINARY
  );

Einer vorhandenen Tabelle eine Spalte für die Vektoreinbettung hinzufügen

ALTER TABLE books
ADD COLUMN embedding
VECTOR(3) USING VARBINARY;

Vektoreinbettung einfügen

INSERT INTO books (
  title,
  embedding
  ) VALUES (
    'book title',
    string_to_vector('[1,2,3]')
);

Mehrere Vektoreinbettungen einfügen

INSERT INTO books (
  title,
  embedding
  ) VALUES (
    'book title',
    string_to_vector('[1,2,3]')),
     ('book title', string_to_vector('[4,5,6]')
);

Vektoreinbettung einfügen und aktualisieren

INSERT INTO books (
  id,
  title,
  embedding
  ) VALUES (
    1,
    'book title',
     string_to_vector('[1,2,3]')
     )
ON DUPLICATE KEY UPDATE embedding = string_to_vector('[1,2,3]');

Vektoreinbettung aktualisieren

UPDATE books
SET embedding = string_to_vector('[1,2,3]')
WHERE id = 1;

Vektoreinbettung löschen

DELETE FROM books
WHERE embedding = string_to_vector('[1,2,3]');

Mit Vektorsuchindexen arbeiten

Standardmäßig können Sie die Suche nach dem genauen nächsten Nachbarn ausführen, was zu einem perfekten Abruf führt. Sie können auch einen Index hinzufügen, um die ANN-Suche zu verwenden. Dabei wird ein gewisser Recall gegen Geschwindigkeit eingetauscht. Im Gegensatz zu herkömmlichen Indexen sehen Sie nach dem Hinzufügen eines ungefähren Index unterschiedliche Ergebnisse für Abfragen.

Empfehlungen

Dieser Abschnitt enthält Best Practices für die Arbeit mit Vektorsuchindexen. Jede Arbeitslast ist anders und Sie müssen sie möglicherweise entsprechend anpassen.

  • Bevor Sie einen Index für die Vektorsuche erstellen, müssen Sie Daten in die Tabelle laden. Die Basistabelle muss mindestens 1.000 Zeilen enthalten. Diese Anforderungen gelten nur für die Suchindextypen TREE_SQ und TREE_AH. Je mehr Datenpunkte verfügbar sind, desto besser können Indexpartitionierung und -training erfolgen.
  • Arbeitsspeichernutzung von Indexen überwachen Wenn der Arbeitsspeicher der Instanz aufgebraucht ist, können keine Indexe erstellt oder erstellt werden. Bei vorhandenen Indexen schreibt Cloud SQL nach Erreichen des Grenzwerts regelmäßig Warnungen in das MySQL-Fehlerprotokoll. Die Speichernutzung wird in der Tabelle information_schema.innodb_vector_indexes angezeigt.
  • Wenn die zugrunde liegende Basistabelle größere DML-Änderungen erfahren hat, müssen Sie die Vektorsuchindexe neu erstellen. Wenn Sie die ursprüngliche Größe des Index zum Zeitpunkt der Erstellung und die aktuelle Größe des Index abrufen möchten, fragen Sie die Tabelle information_schema.innodb_vector_indexes ab.
  • Im Allgemeinen ist es in Ordnung, die Anzahl der Partitionen intern berechnen zu lassen. Wenn Sie die Anzahl der Partitionen angeben möchten, müssen Sie mindestens 100 Datenpunkte pro Partition haben.

Schreibgeschützte Basistabelle während Indexvorgängen der Vektorsuche

Während der Dauer der drei Vektorsuchindexvorgänge (Erstellen, Ändern und Löschen) wird die Basistabelle in den schreibgeschützten Modus versetzt. Während dieser Vorgänge sind keine DMLs für die Basistabelle zulässig.

Persistenz, Herunterfahren und Auswirkungen auf die Wartung

Nur Vektorsuchindexe vom Typ TREE_SQ werden bei einem sauberen Herunterfahren einer Instanz auf dem Laufwerk gespeichert. Vektorsuchindexe, die die Typen TREE_AH und BRUTE_FORCE verwenden, sind nur im Arbeitsspeicher verfügbar.

Nach einem ordnungsgemäßen Herunterfahren einer Instanz werden die Vektorsuchindexe von Cloud SQL beim Neustart der Instanz neu geladen. Nach einem Absturz oder einem nicht ordnungsgemäßen Herunterfahren müssen die Vektorsuchindexe jedoch in Cloud SQL neu erstellt werden. Jedes Mal, wenn Ihre Instanz durch die Sicherung und Wiederherstellung, die Wiederherstellung zu einem bestimmten Zeitpunkt (Point-In-Time Recovery, PITR) oder ein Hochverfügbarkeits-Failover (HA) abstürzt, erstellt Cloud SQL die Vektorsuchindexe neu. Bei diesen Ereignissen geschieht Folgendes:

  • Der Neuaufbau erfolgt automatisch im Hintergrund.
  • Während des Neuaufbaus ist die Basistabelle im Lesemodus.
  • Wenn beim automatischen Neuaufbau innerhalb eines bestimmten Zeitlimits keine Sperre für die Tabelle erhalten werden kann, schlägt der Neuaufbau fehl. Möglicherweise müssen Sie den Index stattdessen manuell neu erstellen.

Die Zeit, die für den Neuaufbau eines Index benötigt wird, kann die Zeit für das Herunterfahren verlängern. Dies kann auch die Wartungs- und Aktualisierungszeit einer Instanz verlängern.

Vektorsuchindex erstellen

Die Anweisung zum Erstellen eines Index für die Vektorsuche hat folgende Syntax:

CALL mysql.create_vector_index('INDEX_NAME',
                                'DB_NAME.TABLE_NAME',
                                'COLUMN_NAME',
                                'PARAMETERS'
                              );

Beispiel:

CALL mysql.create_vector_index('vectorIndex',
                                'db.books',
                                'embedding',
                                'index_type=TREE_SQ, distance_measure=l2_squared'
                               );

Der angegebene Indexname muss innerhalb der Datenbank eindeutig sein.

Parameter für Vektorsuchindexe

Die Funktionen „create_search_index“ und „alter_search_index“ unterstützen mehrere Parameter, die Sie mit durch Kommas getrennten Schlüssel/Wert-Paaren angeben können. Alle Parameter der Funktion zum Erstellen von Suchindexen sind optional. Wenn Sie eine leere Zeichenfolge oder NULL angeben, werden die Standardparameterwerte für den Index konfiguriert.

  • distance_measure: Unterstützte Werte: L2_SQUARED, COSINE und DOT_PRODUCT. Standardmäßig ist L2_SQUARED ausgewählt.
  • num_neighbors: Die Anzahl der Nachbarn, die standardmäßig bei ANN-Abfragen zurückgegeben werden. Sie können diesen Parameter auch überschreiben, wenn Sie die Suchanfrage ausführen. Der Standardwert ist 10.
  • index_type: Gibt den Typ des zu erstellenden Index an. Gültige Werte sind BRUTE_FORCE, TREE_SQ und TREE_AH.

    • BRUTE_FORCE ist die Standardeinstellung für Tabellen mit weniger als 10.000 Zeilen.
    • TREE_SQ ist der Standardwert für Tabellen mit mindestens 10.000 Zeilen.

    Wenn Sie den Indextyp TREE_AH oder TREE_SQ angeben möchten, muss die Basistabelle mehr als 1.000 Zeilen enthalten.

  • num_parititions: Gibt an, wie viele K-Means-Cluster erstellt werden sollen. Dieser Parameter ist nur zulässig, wenn Sie eine index_type konfiguriert haben. Diese Option ist für BRUTE_FORCE nicht verfügbar. Wenn Sie den Indextyp TREE_SQ oder TREE_AH angeben, muss die Größe der Basistabelle mindestens num_partitions * 100 betragen.

Vektorsuchindex ändern

CALL mysql.alter_vector_index('DB_NAME.INDEX_NAME', 'PARAMETERS');

Die Funktion alter_vector_index wird explizit verwendet, um einen Vektorsuchindex neu zu erstellen. Damit Sie diese Funktion verwenden können, muss der Index bereits vorhanden sein. Sie können einen Index in folgenden Fällen neu erstellen:

  • Sie möchten den Index mit anderen Optionen neu erstellen. Beispielsweise können Sie einen anderen Indextyp oder eine andere Entfernungsmessung verwenden.
  • Sie möchten den Index neu erstellen, da die Basistabelle erhebliche DML-Änderungen erfahren hat. Beispielsweise müssen Sie den Vektorsuchindex anhand der aktuellen Daten in der Basistabelle neu trainieren.

Alle Parameter zum Neuaufbau des Index sind mit denen identisch, die auch beim Erstellen des Index verfügbar sind. Sie sind ebenfalls optional. Wenn Sie beim Neuerstellen des Index einen leeren String oder NULL angeben, wird der Index anhand der Parameter neu erstellt, die beim Erstellen des Index angegeben wurden. Wenn beim Erstellen des Index keine Parameter angegeben werden, werden die Standardparameterwerte verwendet.

Der vorhandene Index für die Vektorsuche ist während des Änderungsvorgangs verfügbar. Sie können weiterhin Suchanfragen im Index ausführen.

Vektorsuchindex löschen

Sie können keine DDL-Vorgänge auf einer Tabelle mit einem Vektorsuchindex ausführen. Bevor Sie den DDL-Vorgang für die Tabelle ausführen, müssen Sie den Vektorsuchindex löschen.

CALL mysql.drop_vector_index('DB_NAME.INDEX_NAME');

Vektoreinbettungen abfragen

In diesem Abschnitt finden Sie Beispiele für die verschiedenen Möglichkeiten, Vektor-Embeddings abzufragen.

Vektoreinbettungen ansehen

SELECT vector_to_string(embedding) FROM books;

Exakte Suche nach dem nächsten Nachbarn für eine Vektoreinbettung abrufen

SELECT id,cosine_distance(embedding,
   string_to_vector('[1,2,3]')) dist
FROM books
ORDER BY dist
LIMIT 10;

Ungefähre Suche nach Nachbarn für eine Vektoreinbettung abrufen

SELECT title FROM books
WHERE
NEAREST(embedding) TO (string_to_vector('[1,2,3]'), 'num_neighbors=10');

Für die Durchführung einer ANN-Suche werden zwei Parameter unterstützt. Beides ist optional.

  • num_partitions: Gibt die Anzahl der Partitionen an, die für eine ANN-Vektorsuche geprüft werden sollen. Wenn Sie die Anzahl der Partitionen nicht angeben, wird für die Suche ein Wert verwendet, der anhand der Größe der Tabelle, der Anzahl der Partitionen im Vektorsuchindex und anderer Faktoren generiert wird.
  • num_neighbors: Gibt die Anzahl der Nachbarn an, die zurückgegeben werden sollen. Dieser Wert überschreibt den Wert, der beim Erstellen des Vektorsuchindexes festgelegt wurde.

Vektoreinbettungen filtern

Verwenden Sie zusätzliche Spalten als Prädikate, um die Filterung der Ergebnisse Ihrer Vektor-Embedding-Abfrage zu optimieren. Wenn Sie beispielsweise eine Spalte vom Typ printyear hinzufügen, können Sie Ihrer Abfrage einen bestimmten Jahreswert als Filter hinzufügen.

SELECT title FROM books
WHERE
NEAREST(embedding) TO (string_to_vector('[1,2,3]'))
AND printyear > 1991;

Abstand einer Vektoreinbettung abfragen

Dieser Abschnitt enthält Beispiele für Vektordistanzfunktionen, die für die KNN-Suche verfügbar sind.

Kosinus-Distanz abrufen

SELECT cosine_distance(embedding, string_to_vector('[3,1,2]'))
AS distance FROM books WHERE id=10;

Punktprodukt-Distanz abrufen

SELECT dot_product(embedding, string_to_vector('[3,1,2]'))
AS distance FROM books WHERE id=10;

Quadrierte euklidische Distanz ermitteln

SELECT l2_squared_distance(embedding, string_to_vector('[3,1,2]'))
AS distance FROM books WHERE id=10;

Zeilen innerhalb einer bestimmten Entfernung abrufen

SELECT * FROM books
WHERE l2_squared_distance(embedding, string_to_vector('[1,2,3]')) < 10;

Kann mit ORDER BY und LIMIT kombiniert werden

SELECT id, vector_to_string(embedding),
       l2_squared_distance(embedding, string_to_vector('[1,2,3]')) dist
FROM books ORDER BY dist LIMIT 10;

Vektorsuchindexe beobachten

Echtzeitinformationen zu allen Vektorsuchindexen in der Instanz finden Sie in der Tabelle information_schema.innodb_vector_indexes.

Führen Sie den folgenden Befehl aus, um die Tabelle aufzurufen:

SELECT * FROM information_schema.innodb_vector_indexes;

Eine Beispielausgabe könnte so aussehen:

*************************** 1. row ***************************
       INDEX_NAME: test.t4_index
       TABLE_NAME: test.t4_bf
       INDEX_TYPE: BRUTE_FORCE
     DIST_MEASURE: SquaredL2Distance
           STATUS: Ready
            STATE: INDEX_READY_TO_USE
       PARTITIONS: 0
SEARCH_PARTITIONS: 0
     INITIAL_SIZE: 40000
     CURRENT_SIZE: 40000
          QUERIES: 0
        MUTATIONS: 0
     INDEX_MEMORY: 160000
   DATASET_MEMORY: 0

In der Tabelle information_schema.innodb_vector_indexes sehen Sie Folgendes:

  • Die Optionen, die möglicherweise generiert werden. Mit anderen Worten: num_partitions oder die Anzahl der Partitionen, die für eine Abfrage geprüft werden sollen.
  • In den Spalten STATE und STATUS sehen Sie den aktuellen Status des Index. Während der Build-Phase gibt die Statusspalte Aufschluss darüber, in welcher Phase der Index für die Vektorsuche sich befindet.
  • Die Spalte INITIAL_SIZE gibt die Tabellengröße während der Indexerstellung an. Sie können diese Größe mit CURRENT_SIZE vergleichen, um zu sehen, wie stark sich der Index seit seiner Erstellung aufgrund von DMLs in der Basistabelle verändert hat.
  • In den Spalten QUERIES und MUTATIONS sehen Sie in Echtzeit, wie ausgelastet der Index ist.
  • Die Spalten INDEX_MEMORY und DATASET_MEMORY enthalten Informationen zum Arbeitsspeicherverbrauch des Index. INDEX_MEMORY

    gibt an, wie viel Arbeitsspeicher vom Index belegt wird, und DATASET_MEMORY gibt an, wie viel zusätzlicher Arbeitsspeicher während des Builds belegt wird.

Eine Liste der Suchvektorindexe, die in der Instanz erstellt wurden, finden Sie in der Tabelle mysql.vector_indexes des Datenwörterbuchs.

Führen Sie den folgenden Befehl aus, um die Tabelle aufzurufen:

SELECT * FROM mysql.vector_indexes;

Beispielausgabe:

*************************** 1. row ***************************
   index_name: test.index1
   table_name: test.t1
  column_name: j
index_options: index_type=BRUTE_FORCE, distance_measure=L2_SQUARED
       status: ACTIVE
  create_time: 2024-04-08 22:46:21
  update_time: 2024-04-08 22:46:21
1 row in set (0.00 sec)

Beschränkungen

  1. Pro Tabelle kann nur eine Spalte für die Vektor-Embeddings vorhanden sein.
  2. Pro Tabelle kann nur ein Index für die Vektorsuche vorhanden sein.
  3. Ein Vektor-Embedding kann bis zu 16.000 Dimensionen haben.
  4. Die InnoDB-Partitionierung auf Tabellenebene für Tabellen mit Spalten für Vektor-Embeddings wird nicht unterstützt.
  5. Wenn die Instanz nach einem nicht ordnungsgemäßen Herunterfahren neu gestartet wird, erstellt Cloud SQL den Index für die Vektorsuche automatisch neu.
    1. Während der Vektorsuchindex neu erstellt wird, ist die Basistabelle schreibgeschützt.
    2. Wenn Cloud SQL innerhalb des angegebenen Zeitraums keine Sperre für die Tabelle erwerben kann, schlägt der automatische Neuaufbau des Index möglicherweise fehl.
    3. Wenn der Index nicht automatisch neu erstellt werden kann, müssen Sie dies manuell tun.
  6. Damit eine Spalte für die Vektor-Embedding-Funktion hinzugefügt werden kann, muss die Tabelle einen Primärschlüssel haben. Cloud SQL unterstützt keine Primärschlüssel vom Typ BIT, BINARY, VARBINARY, JSON, BLOB, TEXT oder räumliche Datentypen. Zusammengesetzte Primärschlüssel dürfen keine dieser Spaltentypen enthalten.
  7. Wenn für eine Tabelle ein Vektorsuchindex vorhanden ist, sind DDL-Vorgänge nicht zulässig. Der Vektorsuchindex muss gelöscht werden, bevor DDL-Vorgänge auf der Basistabelle ausgeführt werden.
  8. Vektoreinbettungen werden für Tabellen, die nicht InnoDB sind, und für temporäre Tabellen nicht unterstützt.
  9. Die Spalte für die Vektoreinbettung darf keine generierte Spalte sein.
  10. Das Prädikat NEAREST..TO kann mit anderen skalaren Prädikaten kombiniert werden, indem AND oder OR verwendet wird. Die Skalarprädikate in der Tabelle werden nach der Anwendung der Vektorprädikate ausgewertet.
  11. Das NEAREST..TO-Prädikat wird nur in einer SELECT-Anweisung unterstützt. Andere DML-Anweisungen unterstützen NEAREST..TO nicht.
  12. Unterabfragen werden von NEAREST..TO nicht unterstützt. Dem Primärschlüssel der Basistabelle kann keine Einschränkung hinzugefügt werden, wenn ein Vektorsuchindex vorhanden ist.
  13. Vorabfilterungen sind nur mithilfe von Entfernungsfunktionen und durch die Verwendung von ORDER BY mit LIMIT möglich.

    Angenommen, Sie erstellen die folgende Tabelle:

    CREATE TABLE books
    (
    bookid          INT PRIMARY KEY,
    title           VARCHAR(1000),
    author          VARCHAR(100),
    printyear       int,
    country         VARCHAR(100),
    bvector         VECTOR(1536) USING VARBINARY
    //bvector is embedding vector of book's plot,genre,reviews etc
    );

    Dann können Sie die folgende Abfrage verwenden, um eine Vorabfilterung vorzunehmen.

    //select query to obtain books by specific author and having similar plot-genre-reviews
    SELECT bookid, title, author,l2_squared_distance(bvector, qvector) dist
    FROM books where author='cloudsql' ORDER BY dist LIMIT 10

    Der Nachfilter wird mit NEAREST..TO und Entfernungsfunktionen unterstützt.

Fehlerbehebung

Bei einem Absturz wird der Index automatisch neu erstellt. Während eines Neuaufbaus gelten zwei Einschränkungen:

  1. Während der Indexerstellung ist die Basistabelle im Lesemodus.
  2. Während der Index neu erstellt wird, schlagen ANN-Abfragen gegen vorhandene Indexe fehl.

Nächste Schritte