Mithilfe von partitionierter DML Bulk-Vektoreinbettungen für Textdaten generieren

In diesem Dokument wird erläutert, wie Sie Vektor-Embeddings im Bulk-Verfahren für Textdaten (STRING oder JSON) generieren und mithilfe von SQL und dem Vertex AI-textembedding-gecko-Modell in Spanner zurückfüllen.

Vorbereitung

In Ihrer Spanner-Datenbank muss eine Tabelle mit Textdaten (STRING oder JSON) vorhanden sein. Weitere Informationen zum Importieren von Daten finden Sie unter Spanner-Import- und ‑Export – Übersicht.

Anwendungsbeispiel

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

GoogleSQL

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

PostgreSQL

CREATE TABLE Products (
  product_id INT8 NOT NULL,
  name TEXT,
  description TEXT,
  PRIMARY KEY(product_id)
);

Ihr Ziel ist es, hier Vektoreinbettungen für die Spalte description zu generieren Tabelle, um ähnliche Artikel zu finden und Kunden zu empfehlen, um ihre Einkaufsmöglichkeiten zu verbessern mit der Vektorsuche.

Einbettungsmodell registrieren

GoogleSQL

Einbettungsmodell bei Vertex AI registrieren Endpunkt textembedding-gecko in Ihrer Spanner-Datenbank:

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, das den Vertex AI-Endpunkt hostet
  • LOCATION: der Standort des Vertex AI-Endpunkts
  • MODEL_VERSION: die Version des textembedding-gecko-Embedding-Modells

PostgreSQL

Im PostgreSQL-Dialekt muss das Modell nicht registriert werden. Sie übergeben den Endpunktnamen direkt an den Funktionsaufruf spanner.ML_PREDICT_ROW.

Beachten Sie die folgenden Best Practices:

  • Verwenden Sie zum Isolieren von Kontingenten einen anderen Endpunkt in einem anderen Projekt, um Einbettungen zu generieren und zu ergänzen als den Produktionsendpunkt. Reserviere den Produktionsendpunkt, um Produktionstraffic zu verarbeiten.
  • Der Modellendpunkt muss den Wert von default_batch_size unterstützen. Sie können default_batch_size mit dem Abfragehinweis überschreiben @{remote_udf_max_rows_per_rpc=NEW_NUMBER}. Informationen zum default_batch_size-Limit 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 die Einbettungsvektoren, die für dasselbe Stück Der Text kann sich je nach Version des verwendeten Modells unterscheiden. welche sollten Sie keine verschiedenen Modellversionen zum Generieren von Einbettungen verwenden, im selben Dataset. Außerdem wird die Modellversion im Modell aktualisiert, Die Definitionsanweisung aktualisiert die bereits generierten Einbettungen nicht. mit diesem Modell. Eine Möglichkeit, die Modellversion für Einbettungen zu verwalten, besteht darin, Erstellen Sie eine zusätzliche Spalte in der Tabelle, in der die Modellversion gespeichert ist.
  • Benutzerdefiniert abgestimmte textembedding-gecko-Modelle werden von den GoogleSQL-Funktionen ML.PREDICT und PostgreSQL spanner.ML_PREDICT_ROW nicht unterstützt.

End-to-End-Integration des Einbettungsmodells testen

Sie können eine Abfrage ausführen, um zu prüfen, ob das Einbettungsmodell richtig konfiguriert ist und 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

PostgreSQL

SELECT spanner.ML_PREDICT_ROW(
    'projects/PROJECT/locations/LOCATION/publishers/google/models/textembedding-gecko$MODEL_VERSION',
    JSONB_BUILD_OBJECT('instances', JSONB_BUILD_ARRAY(JSONB_BUILD_OBJECT('content', description))))
FROM Products
LIMIT 10;

Ersetzen Sie Folgendes:

  • 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-Embedding-Modells

Quelltabelle mit zusätzlichen Spalten zum Speichern der Einbettungen aktualisieren

Als Nächstes aktualisieren Sie das Quelltabellenschema, um eine zusätzliche Spalte des Datentyp ARRAY<FLOAT32> zum Speichern der generierten Einbettungen:

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, in die Sie generierte Einbettungen einfügen möchten

PostgreSQL

ALTER TABLE TABLE_NAME
ADD COLUMN EMBEDDING_COLUMN_NAME real[];

Ersetzen Sie Folgendes:

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

Führen Sie beispielsweise für die Tabelle products Folgendes aus:

GoogleSQL

ALTER TABLE Products
ADD COLUMN desc_embed ARRAY<FLOAT32>;

PostgreSQL

ALTER TABLE Products
ADD COLUMN desc_embed real[];

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;

PostgreSQL

ALTER TABLE Products
ADD COLUMN desc_embed_model_version INT8;

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. Bis Fordern Sie eine Erhöhung an. Siehe Vertex AI-Kontingenterhöhungen.

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

Backfill-Einbettungen

Führen Sie abschließend die folgende UPDATE-Anweisung mit partitionierter DML aus, um Einbettungen für die Spalte mit Textdaten zu generieren und in Ihrer Datenbank zu speichern. Sie können die Modellversion zusammen mit den Einbettungen speichern. Mi. empfehlen, diese Abfrage in einem Zeitfenster mit geringem Traffic in Ihrem Datenbank.

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, in 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, in der die Version des textembedding-gecko-Embedding-Modells verwaltet wird, das zum Backfillen Ihrer Einbettungen verwendet wird
  • MODEL_VERSION: die Version des textembedding-gecko-Embedding-Modells
  • FILTER_CONDITION: eine partitionierbare Filterbedingung, die Sie anwenden möchten

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

PostgreSQL

UPDATE TABLE_NAME
SET 
  EMBEDDING_COLUMN_NAME = spanner.FLOAT32_ARRAY(spanner.ML_PREDICT_ROW(
    'projects/PROJECT/locations/LOCATION/publishers/google/models/textembedding-gecko$MODEL_VERSION', 
    JSONB_BUILD_OBJECT('instances', JSONB_BUILD_ARRAY(JSONB_BUILD_OBJECT('content', DATA_COLUMN_NAME)))
  ) /*@ remote_udf_max_rows_per_rpc=MAX_ROWS */ ->'predictions'->0->'embeddings'->'values'),
  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, in der Sie generierte Einbettungen hinzufügen möchten
  • DATA_COLUMN_NAME: der Name der Spalte mit den Textdaten
  • 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-Embedding-Modells
  • MAX_ROWS: die maximale Anzahl von Zeilen pro RPC
  • EMBEDDING_VERSION_COLUMN: die Spalte, in der die Version des textembedding-gecko-Embedding-Modells verwaltet wird, das zum Backfillen Ihrer Einbettungen verwendet wird
  • FILTER_CONDITION: eine partitionierbare Filterbedingung, die Sie anwenden möchten

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.description AS content)
    ) @{remote_udf_max_rows_per_rpc=200}
  ),
  products.desc_embed_model_version = 3
WHERE products.desc_embed IS NULL;

PostgreSQL

UPDATE products
SET
  desc_embed = spanner.FLOAT32_ARRAY(spanner.ML_PREDICT_ROW(
    'projects/PROJECT/locations/LOCATION/publishers/google/models/textembedding-gecko@003', 
    JSONB_BUILD_OBJECT('instances', JSONB_BUILD_ARRAY(JSONB_BUILD_OBJECT('content', description)))
  ) /*@ remote_udf_max_rows_per_rpc=200 */ ->'predictions'->0->'embeddings'->'values'),
  desc_embed_model_version = 3
WHERE desc_embed IS NULL;

Beachten Sie die folgenden Best Practices:

  • Das standardmäßige gRPC-Zeitlimit für die Spanner API beträgt eine Stunde. Je nach Anzahl der Einbettungen, für die ein Backfill ausgeführt wird, müssen Sie möglicherweise Erhöhen Sie dieses Zeitlimit, damit die nach UPDATE partitionierte DML ausreichend Zeit zur Verfügung. Weitere Informationen finden Sie unter Benutzerdefinierte Zeitlimits und Wiederholungsversuche konfigurieren

Leistung und weitere Aspekte

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

Anzahl von Knoten

Partitionierte DML führt die angegebene DML-Anweisung auf verschiedenen Partitionen in parallel. Bei Instanzen mit einer hohen Anzahl von Knoten gilt möglicherweise ein bestimmtes Kontingent Fehler bei der Ausführung der partitionierten DML. Wenn Vertex AI API-Anfragen werden aufgrund von Kontingentlimits für Vertex AI gedrosselt. wiederholt Spanner diese Fehler unter der Partitionierter DML-Transaktionsmodus maximal 20-mal. Wenn Sie in Vertex AI häufig Kontingentfehler feststellen, erhöhen Sie das Kontingent für Vertex AI. Sie können die Parallelität auch mit dem Hinweis auf Anweisungsebene abstimmen. @{pdml_max_parallelism=DESIRED_NUMBER} während der Nutzung von Google SQL. Die folgenden wird die Parallelität auf '5' gesetzt:

GoogleSQL

@{pdml_max_parallelism=5} 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;

Größe des Textes in der Datenspalte

Das Vertex AI-Embedding-Modell hat Limits für die maximale Anzahl von Tokens für jede Texteingabe. Verschiedene Modellversionen haben unterschiedliche Tokens Limits. Jede Vertex AI-Anfrage kann mehrere Eingabetexte haben -Felder, es gibt jedoch ein Limit für die maximale Anzahl von Tokens, die vorhanden sind. in einer einzelnen Anfrage. Wenn bei GoogleSQL-Datenbanken der Fehler INVALID_ARGUMENT mit der Meldung „Anfrage ist zu groß“ auftritt, reduzieren Sie die Batchgröße, um den Fehler zu vermeiden. Dazu können Sie default_batch_size konfigurieren Oder verwenden Sie beim Registrieren des Modells den Abfragehinweis @{remote_udf_max_outstanding_rpcs}.

Anzahl der an Vertex AI gesendeten API-Anfragen

Mit dem Abfragehinweis @{remote_udf_max_outstanding_rpcs} können Sie die Anzahl der Anfragen verringern, die von Spanner. Beachten Sie, dass sich durch eine Erhöhung dieses Limits die CPU- und Arbeitsspeichernutzung der Spanner-Instanz erhöhen kann. Für GoogleSQL Datenbanken, überschreibt mit diesem Abfragehinweis die konfigurierte default_batch_size für Ihr Modell zu erstellen.

Fortschritt des Backfills im Blick behalten

Sie können die Anzahl der Anfragen, Latenz und Netzwerkbyte überwachen, Vertex AI von Spanner mit der Dashboard für Systemstatistiken.

Nächste Schritte