In diesem Dokument wird beschrieben, wie Sie Vektoreinbettungen für Textdaten (STRING
oder JSON
), die in Spanner gespeichert sind, mithilfe von SQL und den Vertex AI-Modellen für Texteinbettungen im Bulk generieren und nachfüllen.
Vorbereitung
Ihre Spanner-Datenbank muss eine Tabelle mit Textdaten (STRING
oder JSON
) enthalten. Weitere Informationen zum Importieren von Daten finden Sie in der Spanner-Übersicht zum Importieren und Exportieren.
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 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, Vektoreinbettungen für die Spalte description
in dieser Tabelle zu generieren, um ähnliche Artikel zu finden, die Kunden empfohlen werden können, um ihr Einkaufserlebnis mithilfe der Vektorsuche zu verbessern.
Einbettungsmodell registrieren
GoogleSQL
Registrieren Sie ein Modell für die Texteinbettung mit dem Vertex AI-Modellendpunkt 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/$MODEL_NAME',
default_batch_size = 5
)
Ersetzen Sie Folgendes:
MODEL_NAME
: Der Name des Vertex AI-Modells zur TexteinbettungPROJECT
: das Projekt, in dem der Vertex AI-Endpunkt gehostet wirdLOCATION
: der Standort des Vertex AI-Endpunkts
PostgreSQL
Im PostgreSQL-Dialekt ist keine Registrierung des Modells erforderlich.
Sie übergeben den Endpunktnamen direkt an den Funktionsaufruf spanner.ML_PREDICT_ROW
.
Beachten Sie die folgenden Best Practices:
- Um die Kontingente zu isolieren, verwenden Sie einen Endpunkt in einem anderen Projekt als den Produktionsendpunkt, um Einbettungen zu generieren und zu ergänzen. Reservieren Sie den Produktionsendpunkt, um Produktions-Traffic zu verarbeiten.
- Prüfen Sie, ob der Modellendpunkt den Wert von
default_batch_size
unterstützt. Sie könnendefault_batch_size
mit dem Abfragehinweis@{remote_udf_max_rows_per_rpc=NEW_NUMBER}
überschreiben. Informationen zumdefault_batch_size
-Limit für die einzelnen Regionen 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 Textabschnitt generierten Einbettungsvektoren je nach verwendeter Modellversion unterscheiden können. Daher sollten Sie vermeiden, verschiedene Modellversionen zum Generieren von Einbettungen im selben Dataset zu verwenden. Außerdem werden durch das Aktualisieren der Modellversion in der Modelldefinitionsanweisung die Einbettungen, die bereits mit diesem Modell generiert wurden, nicht aktualisiert. 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 Modelle für Texteinbettungen werden mit den GoogleSQL-Funktionen
ML.PREDICT
und PostgreSQL-Funktionenspanner.ML_PREDICT_ROW
nicht unterstützt.
End-to-End-Integration des Einbettungsmodells testen
Sie können eine Abfrage ausführen, um zu testen, ob das Einbettungsmodell erfolgreich konfiguriert wurde 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 Vertex AI-Modells zur Texteinbettung
PostgreSQL
SELECT spanner.ML_PREDICT_ROW(
'projects/PROJECT/locations/LOCATION/publishers/google/models/$MODEL_NAME',
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 wirdLOCATION
: der Standort des Vertex AI-EndpunktsMODEL_NAME
: Der Name des Vertex AI-Modells zur Texteinbettung
Quelltabelle aktualisieren, um zusätzliche Spalten zum Speichern der Einbettungen hinzuzufügen
Aktualisieren Sie als Nächstes das Schema der Quelltabelle, um eine zusätzliche Spalte vom Datentyp ARRAY<FLOAT32>
zum Speichern der generierten Einbettungen einzufügen:
GoogleSQL
ALTER TABLE TABLE_NAME
ADD COLUMN EMBEDDING_COLUMN_NAME ARRAY<FLOAT32>;
Ersetzen Sie Folgendes:
TABLE_NAME
: der Name der QuelltabelleEMBEDDING_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 QuelltabelleEMBEDDING_COLUMN_NAME
: Der Name der Spalte, in die Sie generierte Einbettungen einfügen möchten.
Wenn Sie beispielsweise die Tabelle products
verwenden, führen Sie 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 die Region erhöhen, in der das Texteinbettungsmodell verwendet wird. Informationen zum Anfordern einer Erhöhung finden Sie unter Kontingenterhöhungen für Vertex AI.
Weitere Informationen finden Sie unter Vertex AI-Kontingente und -Limits.
Backfill-Einbettungen
Führen Sie schließlich die folgende UPDATE
-Anweisung mit partitionierter DML aus, um Einbettungen für die Textdatenspalte zu generieren und die Einbettungen in Ihrer Datenbank zu speichern. Sie können die Modellversion zusammen mit den Einbettungen speichern. Wir empfehlen, diese Abfrage während eines Zeitraums mit geringem Traffic in Ihrer Datenbank 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 TextdatenEMBEDDING_COLUMN_NAME
: Der Name der Spalte, in die Sie generierte Einbettungen einfügen möchten.DATA_COLUMN_NAME
: der Name der Spalte mit den TextdatenMODEL_NAME
: Der Name des Vertex AI-Einbettungsmodells.MAX_ROWS
: die maximale Anzahl von Zeilen pro RPCEMBEDDING_VERSION_COLUMN
: Die Spalte, in der die Version des Einbettungsmodells verwaltet wird, mit der Ihre Einbettungen aufgefüllt werden.MODEL_VERSION
: die Version des Modelle für TexteinbettungenFILTER_CONDITION
: eine partitionierbare Filterbedingung, die Sie anwenden möchten
Wenn Sie SAFE.ML.PREDICT
verwenden, wird NULL
für fehlgeschlagene Anfragen zurückgegeben. Sie können SAFE.ML.PREDICT
auch in Kombination mit einem WHERE embedding_column IS NULL
-Filter verwenden, um Ihre 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/$MODEL_NAME',
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 TextdatenEMBEDDING_COLUMN_NAME
: Der Name der Spalte, in die Sie generierte Einbettungen einfügen möchten.DATA_COLUMN_NAME
: der Name der Spalte mit den TextdatenPROJECT
: das Projekt, in dem der Vertex AI-Endpunkt gehostet wirdLOCATION
: der Standort des Vertex AI-EndpunktsMODEL_NAME
: Der Name des Vertex AI-Einbettungsmodells.MODEL_VERSION
: die Version des Vertex AI-EinbettungsmodellsMAX_ROWS
: die maximale Anzahl von Zeilen pro RPCEMBEDDING_VERSION_COLUMN
: Die Spalte, in der die Version des Texteinbettungsmodells verwaltet wird, das zum Backfill 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 embedding_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/$MODEL_NAME',
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 Standard-gRPC-Zeitlimit für die Spanner API beträgt eine Stunde.
Je nach Anzahl der Embeddings, die Sie nachfüllen, müssen Sie dieses Zeitlimit möglicherweise erhöhen, damit die partitionierte DML für
UPDATE
ausreichend Zeit hat, um abgeschlossen zu werden. Weitere Informationen finden Sie unter Benutzerdefinierte Zeitüberschreitungen und Wiederholungsversuche konfigurieren.
Leistung und andere Aspekte
Berücksichtigen Sie Folgendes, um die Leistung beim Backfilling von Einbettungsdaten zu optimieren.
Anzahl der Knoten
Bei der partitionierten DML wird die angegebene DML-Anweisung parallel für verschiedene Partitionen ausgeführt. 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 Vertex AI API-Kontingentlimits gedrosselt werden, wiederholt Spanner diese Fehler im partitionierten DML-Transaktionsmodus maximal 20 Mal. Wenn Sie in Vertex AI eine hohe Anzahl von Kontingentfehlern feststellen, erhöhen Sie das Kontingent für Vertex AI.
Sie können die Parallelität auch mit dem Hinweis auf Anweisungsebene @{pdml_max_parallelism=DESIRED_NUMBER}
anpassen, wenn Sie GoogleSQL verwenden. Im folgenden Beispiel wird die Parallelität auf „5“ festgelegt:
GoogleSQL
@{pdml_max_parallelism=5} UPDATE products
SET products.desc_embed =(
SELECT embeddings.values
FROM SAFE.ML.PREDICT(MODEL embedding_model, (
SELECT products.value AS CONTENT
)
)
@{remote_udf_max_rows_per_rpc=200}
),
products.desc_embed_model_version = MODEL_VERSION
WHERE products.desc_embed IS NULL;
Größe des Texts in der Datenspalte
Für das Vertex AI-Embedding-Modell gilt eine Beschränkung für die maximale Anzahl von Tokens für jede Texteingabe. Für verschiedene Modellversionen gelten unterschiedliche Tokenlimits. Jede Vertex AI-Anfrage kann mehrere Eingabetextfelder enthalten. Es gibt jedoch ein Limit für die maximale Anzahl von Tokens in einer einzelnen Anfrage. Wenn in GoogleSQL-Datenbanken ein INVALID_ARGUMENT
-Fehler mit der Meldung „Request is too large“ (Anfrage ist zu groß) auftritt, versuchen Sie, die Batchgröße zu verringern, um den Fehler zu vermeiden. Dazu können Sie default_batch_size
konfigurieren oder den Hinweis @{remote_udf_max_outstanding_rpcs}
verwenden, wenn Sie das Modell registrieren.
Anzahl der API-Anfragen, die an Vertex AI gesendet wurden
Mit dem Hinweis @{remote_udf_max_outstanding_rpcs}
können Sie die Anzahl der Anfragen erhöhen oder verringern, die von Spanner an Vertex AI gesendet werden. Das Erhöhen dieses Limits kann die CPU- und Speichernutzung der Spanner-Instanz erhöhen. Bei GoogleSQL-Datenbanken wird durch die Verwendung dieses Abfragehinweises die für Ihr Modell konfigurierte default_batch_size
überschrieben.
Fortschritt des Backfills überwachen
Sie können die Anzahl der Anfragen, die Latenz und die an Vertex AI gesendeten Netzwerkbytes über das Dashboard für Systemstatistiken überwachen.
Nächste Schritte
- Informationen zum Ausführen einer Suche nach Ähnlichkeitsvektoren durch Suchen der K nächsten Nachbarn
- Weitere Informationen zu maschinellem Lernen und Einbettungen finden Sie in unserem Crashkurs zu Einbettungen.
- Weitere Informationen zu Vertex AI-Modellen für Texteinbettungen