Auf dieser Seite wird beschrieben, wie Sie die Vertex AI Text Embedding API verwenden, um Texteinbettungen für Daten zu generieren, zu speichern und zu aktualisieren, die in Spanner-Datenbanken mit GoogleSQL-Dialekt und Datenbanken mit PostgreSQL-Dialekt gespeichert sind.
Eine Texteinbettung ist eine Vektordarstellung von Textdaten, die auf vielfältige Weise verwendet werden, um ähnliche Elemente zu finden. Sie interagieren mit ihnen jedes Mal, wenn Sie eine Google Suche durchführen oder Empfehlungen beim Online-Shopping sehen. Wenn Sie Texteinbettungen erstellen, erhalten Sie Vektordarstellungen von natürlichem Text als Arrays von Gleitkommazahlen. Das bedeutet, dass Ihrem gesamten Eingabetext eine numerische Darstellung zugewiesen wird. Durch den Vergleich des numerischen Abstands zwischen den Vektordarstellungen von zwei Texten kann eine Anwendung die Ähnlichkeit zwischen dem Text oder den durch den Text dargestellten Objekten bestimmen.
Mit der Vertex AI Text-Embeddings API können Sie eine Texteinbettung mit generativer KI erstellen. In dieser Anleitung verwenden Sie das Vertex AI-Modell für die Texteinbettung, um Texteinbettungen für die in Spanner gespeicherten Daten zu generieren.
Weitere Informationen zu Texteinbettungen und unterstützten Modellen finden Sie unter Texteinbettungen abrufen.
Ziel
In dieser Anleitung erfahren Sie mehr über die folgenden Themen:
- Registrieren Sie ein Vertex AI-Modell für die Texteinbettung in einem Spanner-Schema mit DDL-Anweisungen.
- Verweisen Sie mit SQL-Abfragen auf das registrierte Modell, um Einbettungen aus Daten zu generieren, die in Spanner gespeichert sind.
Preise
In dieser Anleitung werden kostenpflichtige Komponenten von Google Cloudverwendet, darunter:
- Spanner
- Vertex AI
Weitere Informationen zu Spanner-Kosten finden Sie auf der Seite Spanner-Preise.
Weitere Informationen zu den Kosten für Vertex AI finden Sie auf der Seite Vertex AI-Preise.
Texteinbettungen generieren und speichern
Je nach verwendetem Modell kann das Generieren von Einbettungen einige Zeit in Anspruch nehmen. Bei Arbeitslasten, bei denen die Leistung eine wichtige Rolle spielt, sollten Sie keine Einbettungen in Lese-Schreib-Transaktionen generieren. Generieren Sie die Einbettungen stattdessen in einer schreibgeschützten Transaktion mit den folgenden SQL-Beispielen.
GoogleSQL
Texteinbettungsmodell in Spanner registrieren
In GoogleSQL müssen Sie ein Modell registrieren, bevor Sie es mit der Funktion ML.PREDICT verwenden können. So registrieren Sie das Vertex AI-Modell für Texteinbettungen in einer Spanner-Datenbank: Führen Sie die folgende DDL-Anweisung aus:
CREATE MODEL MODEL_NAME
INPUT(
content STRING(MAX),
-- Optional: For models that support specifying task type.
task_type STRING(MAX),
)
OUTPUT(
embeddings
STRUCT<
statistics STRUCT<truncated BOOL, token_count FLOAT64>,
values ARRAY<FLOAT64>>
)
REMOTE OPTIONS (
endpoint = '//aiplatform.googleapis.com/projects/PROJECT/locations/LOCATION/publishers/google/models/$MODEL_NAME'
);
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
Cloud Spanner gewährt automatisch die entsprechenden Berechtigungen. Wenn nicht, sehen Sie sich die Zugriffssteuerung für Modellendpunkte an.
Die Schemaerkennung und ‑validierung ist für generative KI-Modelle nicht verfügbar. Sie müssen INPUT- und OUTPUT-Klauseln angeben, die mit dem Schema des Modells übereinstimmen. Das vollständige Schema des Texteinbettungsmodells finden Sie unter Texteinbettungen abrufen.
Texteinbettungen generieren
Um Einbettungen zu generieren, übergeben Sie einen Text direkt an die Funktion ML.PREDICT mit dem folgenden SQL-Code:
SELECT embeddings.values
FROM ML.PREDICT(
MODEL MODEL_NAME,
(SELECT "A product description" as content)
);
Verwenden Sie den folgenden SQL-Code, um Einbettungen für Daten zu generieren, die in einer Tabelle gespeichert sind:
SELECT id, embeddings.values
FROM ML.PREDICT(
MODEL MODEL_NAME,
(SELECT id, description as content FROM Products)
);
So geben Sie den Aufgabentyp und die Ausgabedimensionen an:
UPDATE Products p
SET description_embedding = (
SELECT embeddings.values
FROM ML.PREDICT(
MODEL MODEL_NAME,
(SELECT p.description as content, "RETRIEVAL_DOCUMENT" as task_type),
STRUCT(768 AS outputDimensionality)
));
SELECT p.product_id, p.name, p.description, COSINE_DISTANCE(
p.description_embedding,
(
SELECT embeddings.values
FROM ML.PREDICT(
MODEL MODEL_NAME,
(SELECT @user_query as content, "RETRIEVAL_QUERY" as task_type),
STRUCT(768 AS outputDimensionality)
)
)
) AS distance
FROM Products p
ORDER BY distance
LIMIT 5;
Texteinbettungen speichern
Nachdem Sie die Einbettungen in einer schreibgeschützten Transaktion generiert haben, speichern Sie sie in Spanner, damit sie mit Ihren Betriebsdaten verwaltet werden können. Verwenden Sie eine Lese-Schreib-Transaktion, um die Einbettungen zu speichern.
Für Arbeitslasten, bei denen die Leistung weniger wichtig ist, können Sie Einbettungen mit dem folgenden SQL in einer Lese-/Schreibtransaktion generieren und einfügen:
CREATE TABLE Products(
id INT64 NOT NULL,
description STRING(MAX),
embeddings ARRAY<FLOAT32>,
) PRIMARY KEY(id);
INSERT INTO Products (id, description, embeddings)
SELECT @Id, @Description, embeddings.values
FROM ML.PREDICT(
MODEL MODEL_NAME,
(SELECT @Description as content)
);
PostgreSQL
Texteinbettungen generieren
Um Einbettungen zu generieren, übergeben Sie einen Text direkt an die Funktion spanner.ML_PREDICT_ROW mit dem folgenden SQL-Code:
SELECT
spanner.ML_PREDICT_ROW(
'projects/PROJECT/locations/LOCATION/publishers/google/models/$MODEL_NAME',
'{"instances": [{"content": "A product description"}]}'::jsonb
) ->'predictions'->0->'embeddings'->'values';
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
Verwenden Sie den folgenden SQL-Code, um Einbettungen für Daten zu generieren, die in einer Tabelle gespeichert sind:
SELECT id, 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))))
) -> 'predictions'->0->'embeddings'->'values'
FROM Products;
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
So geben Sie den Aufgabentyp und die Ausgabedimensionen an:
UPDATE Products p
SET description_embedding = spanner.float64_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', p.description,
'task_type', 'RETRIEVAL_DOCUMENT'
)
),
'parameters', JSONB_BUILD_OBJECT('outputDimensionality', 768)
)
)->'predictions'->0->'embeddings'->'values'
);
SELECT p.product_id, p.name, p.description, spanner.COSINE_DISTANCE(
p.description_embedding,
spanner.float64_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', $1,
'task_type', 'RETRIEVAL_QUERY'
)
),
'parameters', JSONB_BUILD_OBJECT('outputDimensionality', 768)
)
)->'predictions'->0->'embeddings'->'values'
)
) AS distance
FROM Products p
ORDER BY distance
LIMIT 5;
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
Texteinbettungen speichern
Nachdem Sie die Einbettungen in einer schreibgeschützten Transaktion generiert haben, speichern Sie sie in Spanner, damit sie mit Ihren Betriebsdaten verwaltet werden können. Verwenden Sie eine Lese-Schreib-Transaktion, um die Einbettungen zu speichern.
Für Arbeitslasten, bei denen die Leistung weniger wichtig ist, können Sie Einbettungen mit dem folgenden SQL in einer Lese-/Schreibtransaktion generieren und einfügen:
CREATE TABLE Products (
id INT8 NOT NULL,
description TEXT,
embeddings REAL[],
PRIMARY KEY(id)
);
INSERT INTO Products (id, description, embeddings)
SELECT @Id, @Description, 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)))
) -> 'predictions'->0->'embeddings'->'values'
));
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
Texteinbettungen aktualisieren
Verwenden Sie die UPDATE-Anweisung (GoogleSQL und PostgreSQL), um Ihre Einbettungen zu aktualisieren oder Daten in Echtzeit aufzunehmen.
Verwenden Sie den folgenden SQL-Code, um die Tabelle Products im vorherigen Beispiel zu aktualisieren:
GoogleSQL
UPDATE Products
SET
description = @description,
embeddings = (SELECT embeddings.values
FROM ML.PREDICT(MODEL MODEL_NAME, (SELECT @description as content))
)
WHERE id = @id;
Ersetzen Sie Folgendes:
MODEL_NAME: Der Name des Vertex AI-Modells zur Texteinbettung
PostgreSQL
UPDATE
Products
SET
description = $1,
embeddings = 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', $1)))
) -> 'predictions'->0->'embeddings'->'values')
WHERE
id = $2;
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
Nächste Schritte
- Informationen zur Verwendung der Vektorsuche in Vertex AI zum Suchen nach semantisch ähnlichen Elementen
- Weitere Informationen zu maschinellem Lernen und Einbettungen finden Sie in unserem Crashkurs zu Einbettungen.
- Weitere Informationen zu Vertex AI-Texteinbettungsmodellen