Vektoreinbettungen für Textdaten im Bulk mit partitionierter DML generieren

In diesem Dokument wird erläutert, wie Sie Vektoreinbettungen im Bulk-Verfahren für Textdaten (STRING oder JSON), die in Spanner mit SQL und dem textembedding-gecko-Modell von Vertex AI gespeichert werden, generieren und rückwirkend auffüllen können.

Vorbereitung

Die Spanner-Datenbank muss eine Tabelle mit Textdaten (STRING oder JSON) enthalten. Weitere Informationen zum Importieren von Daten finden Sie in der Übersicht zum Import und Export von Spanner.

Anwendungsbeispiel

Angenommen, Sie haben eine Tabelle in Spanner mit dem folgenden Schema. Diese Tabelle enthält Millionen von Datensätzen.

GoogleSQL

CREATE TABLE Products (
  product_id INT64,
  name STRING(MAX),
  description STRING(MAX)
) PRIMARY KEY(product_id);

Ihr Ziel ist es, Vektoreinbettungen für die Spalte description in dieser Tabelle zu generieren, um ähnliche Artikel zu finden, die Sie Kunden empfehlen können, um das Einkaufserlebnis mithilfe der Vektorsuche zu verbessern.

Einbettungsmodell registrieren

Zuerst müssen Sie ein Einbettungsmodell beim textembedding-gecko-Endpunkt von Vertex AI in Ihrer Spanner-Datenbank registrieren:

GoogleSQL

CREATE MODEL MODEL_NAME
INPUT(
  content STRING(MAX)
)
OUTPUT(
  embeddings STRUCT<values ARRAY<FLOAT32>>
)
REMOTE OPTIONS(
    endpoint = '//aiplatform.googleapis.com/projects/PROJECT/locations/LOCATION/publishers/google/models/textembedding-gecko$MODEL_VERSION',
  default_batch_size = 5
)

Ersetzen Sie Folgendes:

  • MODEL_NAME: der Name des Einbettungsmodells
  • PROJECT: das Projekt, in dem der Vertex AI-Endpunkt gehostet wird
  • LOCATION: der Standort des Vertex AI-Endpunkts
  • MODEL_VERSION: die Version des textembedding-gecko-Einbettungsmodells

Best Practices:

  • Damit die Kontingente weiterhin isoliert bleiben, sollten Sie einen Endpunkt in einem anderen Projekt verwenden, um Einbettungen zu generieren und Backfills durchzuführen als der Produktionsendpunkt. Reservieren Sie den Produktionsendpunkt, um den Produktionstraffic bereitzustellen.
  • Achten Sie darauf, dass der Modellendpunkt den Wert von default_batch_size unterstützt. Sie können default_batch_size mit dem Abfragehinweis @{remote_udf_max_rows_per_rpc=NEW_NUMBER} überschreiben. Informationen zum Limit default_batch_size für jede Region finden Sie unter Texteinbettungen für ein Text-Snippet abrufen.
  • Definieren Sie den Endpunkt mit einer bestimmten Modellversion (z.B. @003) anstelle von @latest. Das liegt daran, dass sich die für denselben Text generierten Einbettungsvektoren je nach verwendeter Modellversion unterscheiden können. Aus diesem Grund sollten Sie es vermeiden, verschiedene Modellversionen zu verwenden, um Einbettungen in demselben Dataset zu generieren. Außerdem werden durch das Aktualisieren der Modellversion in der Modelldefinitionsanweisung nicht die Einbettungen aktualisiert, die bereits mit diesem Modell generiert wurden. Eine Möglichkeit, die Modellversion für Einbettungen zu verwalten, besteht darin, eine zusätzliche Spalte in der Tabelle zu erstellen, in der die Modellversion gespeichert wird.
  • Benutzerdefinierte abgestimmte textembedding-gecko-Modelle werden von der GoogleSQL-Funktion ML.PREDICT nicht unterstützt.

End-to-End-Integration des Einbettungsmodells testen

Nachdem Sie ein Einbettungsmodell registriert haben, können Sie eine Abfrage mit dem definierten textembedding-gecko-Modell mit ML.PREDICT ausführen, um zu testen, ob das Einbettungsmodell erfolgreich konfiguriert wurde und die Einbettungen abgerufen werden. Führen Sie beispielsweise die folgende Abfrage aus:

GoogleSQL

SELECT embeddings.values
FROM SAFE.ML.PREDICT(
      MODEL MODEL_NAME, (
        SELECT description AS CONTENT FROM products LIMIT 10)
      );

Ersetzen Sie Folgendes:

  • MODEL_NAME: der Name des Einbettungsmodells

Quelltabelle aktualisieren, um zusätzliche Spalten zum Speichern der Einbettungen einzubeziehen

Aktualisieren Sie als Nächstes das Schema der Quelltabelle, um eine zusätzliche Spalte mit dem Datentyp ARRAY<FLOAT32> hinzuzufügen, um die generierten Einbettungen zu speichern:

GoogleSQL

ALTER TABLE TABLE_NAME
ADD COLUMN EMBEDDING_COLUMN_NAME ARRAY<FLOAT32>;

Ersetzen Sie Folgendes:

  • TABLE_NAME: der Name der Quelltabelle
  • EMBEDDING_COLUMN_NAME: der Name der Spalte, der Sie generierte Einbettungen hinzufügen möchten

Führen Sie beispielsweise im Beispiel der Tabelle products folgenden Befehl aus:

GoogleSQL

ALTER TABLE Products
ADD COLUMN desc_embed ARRAY<FLOAT32>;

Sie können eine weitere Spalte hinzufügen, um die Version des Einbettungsmodells zu verwalten.

GoogleSQL

ALTER TABLE Products
ADD COLUMN desc_embed_model_version INT64;

Kontingent für Vertex AI erhöhen

Möglicherweise müssen Sie das Vertex AI API-Kontingent für textembedding-gecko in der Region erhöhen, in der das Modell verwendet wird. Informationen zum Anfordern einer Erhöhung finden Sie unter Kontingenterhöhungen für Vertex AI.

Weitere Informationen finden Sie unter Kontingente und Limits für Vertex AI.

Backfill-Einbettungen

Führen Sie schließlich die folgende UPDATE-Anweisung mit partitionierter DML aus, um Einbettungen für die Textdatenspalte zu generieren und in Ihrer Datenbank zu speichern. Sie können die Modellversion zusammen mit den Einbettungen speichern. Wir empfehlen, diese Abfrage in einer Datenbank mit geringem Traffic auszuführen.

GoogleSQL

UPDATE TABLE_NAME
SET TABLE_NAME.EMBEDDING_COLUMN_NAME =(
      SELECT embeddings.values
      FROM SAFE.ML.PREDICT(MODEL MODEL_NAME, (
            SELECT TABLE_NAME.DATA_COLUMN_NAME AS CONTENT)
            )
          @{remote_udf_max_rows_per_rpc=MAX_ROWS}
),
TABLE_NAME.EMBEDDING_VERSION_COLUMN = MODEL_VERSION
WHERE FILTER_CONDITION;

Ersetzen Sie Folgendes:

  • TABLE_NAME: der Name der Tabelle mit den Textdaten
  • EMBEDDING_COLUMN_NAME: der Name der Spalte, der Sie generierte Einbettungen hinzufügen möchten
  • DATA_COLUMN_NAME: der Name der Spalte mit den Textdaten
  • MODEL_NAME: der Name des Einbettungsmodells
  • MAX_ROWS: die maximale Anzahl von Zeilen pro RPC
  • EMBEDDING_VERSION_COLUMN: die Spalte, die die Version des textembedding-gecko-Einbettungsmodells verwaltet, das zum Backfill Ihrer Einbettungen verwendet wird
  • MODEL_VERSION: die Version des textembedding-gecko-Einbettungsmodells
  • FILTER_CONDITION: eine partitionierbare Filterbedingung, die Sie anwenden möchten

Bei Verwendung von SAFE.ML.PREDICT wird für fehlgeschlagene Anfragen NULL zurückgegeben. Sie können SAFE.ML.PREDICT auch in Kombination mit einem WHERE embedding_column IS NULL-Filter verwenden, um die Abfrage noch einmal auszuführen, ohne die Einbettungen für die bereits berechneten Felder zu berechnen.

Beispiel für eine Backfill-Abfrage für die Tabelle products:

GoogleSQL

UPDATE products
SET products.desc_embed =(
  SELECT embeddings.values
  FROM SAFE.ML.PREDICT(MODEL gecko_model, (
        SELECT products.value AS CONTENT
        )
  )
      @{remote_udf_max_rows_per_rpc=200}
),
products.desc_embed_model_version = 003
WHERE products.desc_embed IS NULL;

Best Practices:

  • Das standardmäßige gRPC-Zeitlimit für die Spanner API beträgt eine Stunde. Je nach Anzahl der Einbettungen, für die Sie einen Backfill durchführen, müssen Sie dieses Zeitlimit möglicherweise erhöhen, damit die UPDATE-partitionierte DML genügend Zeit zum Ausführen hat. Weitere Informationen finden Sie unter Benutzerdefinierte Zeitlimits und Wiederholungsversuche konfigurieren.
  • Sie können partitionierte DML nur verwenden, um generierte Einbettungen in derselben Tabelle wie die Quelldatentabelle zu speichern.

Leistung und andere Aspekte

Beachten Sie Folgendes, um die Leistung beim Backfill von Einbettungsdaten zu optimieren.

Anzahl von Knoten

Partitionierte DML führt die angegebene DML-Anweisung parallel in verschiedenen Partitionen aus. Bei Instanzen mit einer hohen Anzahl von Knoten können während der Ausführung von partitionierter DML Kontingentfehler auftreten. Wenn die Vertex AI API-Anfragen aufgrund von Kontingentlimits der Vertex AI API gedrosselt werden, wiederholt Spanner diese Fehler im partitionierten DML-Transaktionsmodus maximal 20-mal. Wenn Sie eine hohe Rate von Kontingentfehlern in Vertex AI feststellen, erhöhen Sie das Kontingent für Vertex AI.

Größe des Textes in der Datenspalte

Im Vertex AI-Einbettungsmodell gibt es Limits für die maximale Anzahl von Tokens pro Texteingabe. Verschiedene Modellversionen haben unterschiedliche Tokenlimits. Jede Vertex AI-Anfrage kann mehrere Eingabetextfelder haben, allerdings gibt es ein Limit für die maximale Anzahl von Tokens, die in einer einzelnen Anfrage vorhanden sind. Wenn bei GoogleSQL-Datenbanken der Fehler INVALID_ARGUMENT mit der Meldung „Anfrage ist zu groß“ auftritt, versuchen Sie, die Batchgröße zu reduzieren, um den Fehler zu vermeiden. Dazu können Sie default_batch_size konfigurieren oder beim Registrieren des Modells den Abfragehinweis remote_udf_max_rows_per_rpc verwenden.

Anzahl der an Vertex AI gesendeten API-Anfragen

Mit dem Abfragehinweis @{remote_udf_max_outstanding_rpcs} können Sie die Anzahl der Anfragen erhöhen oder verringern, die von Spanner an Vertex AI gesendet werden. Beachten Sie, dass eine Erhöhung dieses Limits die CPU- und Arbeitsspeichernutzung der Spanner-Instanz erhöhen kann. Bei GoogleSQL-Datenbanken wird mit diesem Abfragehinweis der für Ihr Modell konfigurierte default_batch_size überschrieben.

Fortschritt des Backfills überwachen

Mit dem Dashboard für Systemstatistiken können Sie die Anzahl der Anfragen, Latenz und Netzwerkbyte, die von Spanner an Vertex AI gesendet werden, überwachen.

Nächste Schritte