In diesem Dokument wird erläutert, wie Sie Vektoreinbettungen im Bulk generieren und auffüllen
für Textdaten (STRING
oder JSON
), die gespeichert sind in
Spanner mit SQL und Vertex AI textembedding-gecko
modellieren.
Vorbereitung
Sie müssen eine Tabelle in Ihrer Spanner-Datenbank haben, die
Textdaten (STRING
oder JSON
). Weitere Informationen zum Datenimport
finden Sie in der Übersicht zum Spanner-Import und -Export.
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 EinbettungsmodellsPROJECT
: das Projekt, das den Vertex AI-Endpunkt hostetLOCATION
: der Standort des Vertex AI-EndpunktsMODEL_VERSION
: die Version des Einbettungsmodellstextembedding-gecko
PostgreSQL
Im PostgreSQL-Dialekt muss das Modell nicht registriert werden.
Sie übergeben den Endpunktnamen direkt an den Funktionsaufruf spanner.ML_PREDICT_ROW
.
Berücksichtigen Sie dabei folgende Best Practices:
- Verwenden Sie zur Wahrung der Isolierung der Kontingente einen Endpunkt in einem anderen Projekt, generieren und Backfills als der Produktionsendpunkt. Reservieren Sie Produktionsendpunktes für den Produktionstraffic bereitgestellt.
- Achten Sie darauf, dass der Modellendpunkt den Wert von
default_batch_size
unterstützt. Sie könnendefault_batch_size
mit dem Abfragehinweis überschreiben@{remote_udf_max_rows_per_rpc=NEW_NUMBER}
. Weitere Informationen zumdefault_batch_size
-Limit für jede Region, siehe Texteinbettungen für ein Text-Snippet abrufen - Definieren Sie den Endpunkt mit einer bestimmten Modellversion (z.B.
@003
) statt mit@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 nicht unterstützt mit GoogleSQLML.PREDICT
und PostgreSQLspanner.ML_PREDICT_ROW
.
End-to-End-Integration des Einbettungsmodells testen
Sie können eine Abfrage ausführen, um zu testen, ob das Einbettungsmodell erfolgreich konfiguriert ist. und Einbettungen werden abgerufen. 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, das den Vertex AI-Endpunkt hostetLOCATION
: der Standort des Vertex AI-EndpunktsMODEL_VERSION
: die Version des Einbettungsmodellstextembedding-gecko
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 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
Führen Sie beispielsweise im Tabellenbeispiel 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, die das Modell verwendet. 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
Abschließend führen Sie die folgende UPDATE
-Anweisung mit partitionierter DML aus.
um Einbettungen für die Textdatenspalte zu generieren und die Einbettungen zu speichern
in Ihrer Datenbank. 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 TextdatenEMBEDDING_COLUMN_NAME
: der Name der Spalte, in die Sie generierte Einbettungen einfügen möchtenDATA_COLUMN_NAME
: der Name der Spalte mit den TextdatenMODEL_NAME
: der Name des EinbettungsmodellsMAX_ROWS
: die maximale Anzahl von Zeilen pro RPCEMBEDDING_VERSION_COLUMN
: die Spalte, die die Version des Einbettungsmodellstextembedding-gecko
verwaltet, das für den Backfill Ihrer Einbettungen verwendet wirdMODEL_VERSION
: die Version des Einbettungsmodellstextembedding-gecko
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 TextdatenEMBEDDING_COLUMN_NAME
: der Name der Spalte, in die Sie generierte Einbettungen einfügen möchtenDATA_COLUMN_NAME
: der Name der Spalte mit den TextdatenPROJECT
: das Projekt, das den Vertex AI-Endpunkt hostetLOCATION
: der Standort des Vertex AI-EndpunktsMODEL_VERSION
: die Version des Einbettungsmodellstextembedding-gecko
MAX_ROWS
: die maximale Anzahl von Zeilen pro RPCEMBEDDING_VERSION_COLUMN
: die Spalte, die die Version des Einbettungsmodellstextembedding-gecko
verwaltet, das für den Backfill Ihrer Einbettungen verwendet wirdFILTER_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;
Berücksichtigen Sie dabei folgende 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 andere 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 eine hohe Anzahl von Kontingentfehlern in
Vertex AI und anschließend das Kontingent für Vertex AI erhöhen.
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-Einbettungsmodell hat Limits für die maximale Anzahl von
Tokens für jede Texteingabe. Verschiedene Modellversionen haben unterschiedliche Tokens
Beschränkungen. 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 ein Fehler auftritt,
INVALID_ARGUMENT
-Fehler mit der Meldung „Anfrage ist zu groß“ sollten Sie versuchen,
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 durch eine Erhöhung dieses Limits die CPU-Leistung erhöht werden kann.
und Arbeitsspeichernutzung der Spanner-Instanz. Für GoogleSQL
Datenbanken, überschreibt mit diesem Abfragehinweis die konfigurierte default_batch_size
für Ihr Modell zu erstellen.
Backfill-Fortschritt überwachen
Sie können die Anzahl der Anfragen, Latenz und Netzwerkbyte überwachen, Vertex AI von Spanner mit dem Dashboard für Systemstatistiken.
Nächste Schritte
- Weitere Informationen zum Durchführen einer Ähnlichkeitsvektorsuche anhand des K-nächsten Vektors Nachbarn.
- Weitere Informationen zu maschinellem Lernen und Einbettungen finden Sie in unserem Crash-Kurs zu Einbettungen.