Ziel
In dieser Anleitung erfahren Sie mehr über die folgenden Themen:
- Verwenden Sie von Google bereitgestellte Vertex AI-Modelle für generative KI in einer Spanner-Datenbank.
- Generative AI verwenden, um personalisierte Produktempfehlungen in einer Beispiel-E-Commerce-Anwendung bereitzustellen
Kosten
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.
E‑Commerce-Website-Schema erstellen
In dieser Anleitung verwenden wir das folgende Schema und die folgenden Daten:
CREATE TABLE Products (
id INT64,
name STRING(MAX),
description STRING(MAX),
category_id INT64,
) PRIMARY KEY(id);
CREATE TABLE Categories (
id INT64,
name STRING(MAX)
) PRIMARY KEY(id);
CREATE TABLE Users (
id INT64,
age INT64,
likes STRING(MAX)
) PRIMARY KEY(id);
INSERT INTO Categories (id, name) VALUES
(1, "Toys"),
(2, "Tools");
INSERT INTO Products (id, name, description, category_id) VALUES
(1, "Plush Bear", "Really fluffy. Safe for infants.", 1),
(2, "Bike", "Bike for teenagers.", 1),
(3, "Drill", "Cordless.", 2);
INSERT INTO Users (id, age, likes) VALUES
(1, 30, "DIY"),
(2, 14, "Toys");
Generative AI-Modell in einem Spanner-Schema registrieren
In dieser Anleitung verwenden wir das Vertex AI-Modell text-bison, um Endkunden personalisierte Produktempfehlungen zu geben. Um dieses Modell in einer Spanner-Datenbank zu registrieren, führen Sie die folgende DDL-Anweisung aus:
CREATE MODEL TextBison
INPUT (prompt STRING(MAX))
OUTPUT (content STRING(MAX))
REMOTE
OPTIONS (
endpoint = '//aiplatform.googleapis.com/projects/PROJECT/locations/LOCATION/publishers/google/models/text-bison'
);
Ersetzen Sie Folgendes:
PROJECT
: die Projekt-IDLOCATION
: Die Region, in der Sie Vertex AI verwenden.
Die Schemaerkennung und ‑validierung ist für generative KI-Modelle nicht verfügbar. Daher müssen Sie INPUT
- und OUTPUT
-Klauseln angeben, die dem Schema des Modells entsprechen. Das vollständige Schema des Modells text-bison
finden Sie auf der Seite Vertex AI Model API-Referenz.
Solange sich sowohl die Datenbank als auch die Endpunkte im selben Projekt befinden, sollten die entsprechenden Berechtigungen automatisch von Spanner gewährt werden. Andernfalls lesen Sie den Abschnitt Zugriffssteuerung für Modellendpunkte auf der CREATE MODEL
-Referenzseite.
Wenn Sie prüfen möchten, ob das Modell richtig registriert wurde, fragen Sie es mit der Funktion ML.PREDICT ab. Das Modell erwartet eine einzelne STRING
-Spalte mit dem Namen prompt
. Sie können eine Spanner-Unterabfrage verwenden, um die Spalte prompt
zu generieren. Für das Modell TextBison
müssen Sie einen Modellparameter maxOutputTokens
angeben.
Andere Parameter sind optional. Das Vertex AI-Modell text-bison
unterstützt keine Batchverarbeitung. Sie müssen daher den Parameter @{remote_udf_max_rows_per_rpc=1}
verwenden, um die Batchgröße auf 1 festzulegen.
SELECT content
FROM ML.PREDICT(
MODEL TextBison,
(SELECT "Is 13 prime?" AS prompt),
STRUCT(256 AS maxOutputTokens, 0.2 AS temperature, 40 as topK, 0.95 AS topP)
) @{remote_udf_max_rows_per_rpc=1};
+--------------------+
| content |
+--------------------+
| "Yes, 13 is prime" |
+--------------------+
TextBison
-Modell zum Beantworten von Kundenfragen verwenden
Generative KI-Textmodelle können eine Vielzahl von Problemen lösen.
Ein Nutzer auf einer E-Commerce-Website sucht beispielsweise nach Produkten, die für Säuglinge geeignet sind. Mit einer einzigen Anfrage können wir ihre Frage an das TextBison
-Modell weiterleiten. Wir müssen lediglich relevanten Kontext für die Frage bereitstellen, indem wir Produktdetails aus der Datenbank abrufen.
HINWEIS: Einige Modellantworten wurden aus Gründen der Übersichtlichkeit gekürzt.
SELECT product_id, product_name, content
FROM ML.PREDICT(
MODEL TextBison,
(SELECT
product.id as product_id,
product.name as product_name,
CONCAT("Is this product safe for infants?", "\n",
"Product Name: ", product.name, "\n",
"Category Name: ", category.name, "\n",
"Product Description:", product.description) AS prompt
FROM
Products AS product JOIN Categories AS category
ON product.category_id = category.id),
STRUCT(100 AS maxOutputTokens)
) @{remote_udf_max_rows_per_rpc=1};
-- The model correctly recommends a Plush Bear as safe for infants.
-- Other products are not safe and the model provides justification why.
+------------+-----------------+--------------------------------------------------------------------------------------------------+
| product_id | product_name | content |
+------------+-----------------+--------------------------------------------------------------------------------------------------+
| 1 | "Plush Bear" | "Yes, this product is infant safe. [...] " |
| | | "The product description says that the product is safe for infants. [...]" |
+------------+-----------------+--------------------------------------------------------------------------------------------------+
| 2 | "Bike" | "No, this product is not infant safe. [...] " |
| | | "It is not safe for infants because it is too big and heavy for them to use. [...]" |
+------------+-----------------+--------------------------------------------------------------------------------------------------+
| 3 | "Drill" | "No, this product is not infant safe. [...]" |
| | | " If an infant were to grab the drill, they could pull it on themselves and cause injury. [...]" |
+------------+-----------------+--------------------------------------------------------------------------------------------------+
Sie können das Frage-Literal durch einen Abfrageparameter wie @UserQuestion
ersetzen, wenn Sie den Parameter direkt mit einer Kundenfrage füllen möchten. So erhalten Kunden ein KI-gestütztes Online-Shoppingerlebnis.
Kunden personalisierte Produktempfehlungen geben
Zusätzlich zu den Produktdetails können wir auch Informationen zum Kunden in die prompt
aufnehmen. So kann das Modell Nutzerpräferenzen berücksichtigen und vollständig personalisierte Produktempfehlungen geben.
SELECT product_id, product_name, content
FROM ML.PREDICT(
MODEL TextBison,
(SELECT
product.id as product_id,
product.name as product_name,
CONCAT(
"Answer with YES or NO only: Is this a good fit for me?",
"My age:", CAST(user.age AS STRING), "\n",
"I like:", user.likes, "\n",
"Product name: ", product.name, "\n",
"Category mame: ", category.name, "\n",
"Product description:", product.description) AS prompt,
FROM
Products AS product
JOIN Categories AS category ON product.category_id = category.id
JOIN Users AS user ON user.id = 1),
STRUCT(256 AS maxOutputTokens)
) @{remote_udf_max_rows_per_rpc=1};
-- The model correctly guessed that the user might be interested in a Drill
-- as they are interested in DIY.
+------------+-----------------+-------------+
| product_id | product_name | content |
+------------+-----------------+-------------+
| 1 | "Plush Bear" | "NO" |
+------------+-----------------+-------------+
| 2 | "Bike" | "NO" |
+------------+-----------------+-------------+
| 3 | "Drill" | "YES" |
+------------+-----------------+-------------+
Wenn der Nutzer ein Geschenk für sein Kind sucht, kann er ein Profil für seinen Teenager erstellen und eine andere Liste mit Empfehlungen aufrufen:
SELECT product_id, product_name, content
FROM ML.PREDICT(
MODEL TextBison,
(SELECT
product.id as product_id,
product.name as product_name,
CONCAT(
"Answer with YES or NO only: Is this a good fit for me?",
"\nMy's age:", CAST(user.age AS STRING),
"\nI like:", user.likes,
"\nProduct Name: ", product.name,
"\nCategory Name: ", category.name,
"\nProduct Description:", product.description) AS prompt,
FROM
Products AS product
JOIN Categories AS category ON product.category_id = category.id
JOIN Users AS user ON user.id = 2),
STRUCT(40 AS maxOutputTokens)
) @{remote_udf_max_rows_per_rpc=1};
-- The model correctly guesses that a teenager is interested in a Bike,
-- but not a plush bear for infants or spicy peppers.
+------------+-----------------+---------+
| product_id | product_name | content |
+------------+-----------------+---------+
| 1 | "Plush Bear" | "NO" |
+------------+-----------------+---------+
| 2 | "Bike" | "YES" |
+------------+-----------------+---------+
| 3 | "Spicy peppers" | "NO" |
+------------+-----------------+---------+
Sie können dem Prompt den Kaufverlauf oder andere relevante Details hinzufügen, um dem Kunden ein individuelleres Erlebnis zu bieten.
Mit der Einbindung von Spanner Vertex AI können Sie komplexe Prompts mit Live-Daten erstellen und damit KI-basierte Anwendungen entwickeln.