1. Einführung
In diesem Codelab erfahren Sie, wie Sie die KI-Integration von Cloud SQL for MySQL für die semantische Suche mit Einbettungen verwenden und die Leistung mit einem Index für die Vektordaten verbessern.

Voraussetzungen
- Grundlegende Kenntnisse von Google Cloud und der Google Cloud Console
- Grundkenntnisse der Befehlszeile und Cloud Shell
Lerninhalte
- Cloud SQL-Instanz für MySQL bereitstellen
- Datenbank erstellen und Cloud SQL AI-Integration aktivieren
- Daten in die Datenbank laden
- Cloud SQL Studio verwenden
- Vertex AI-Einbettungsmodell in Cloud SQL verwenden
- Agent Platform Studio verwenden
- Ergebnis mit einem Modell der Gemini Enterprise Agent Platform anreichern
- Leistung mit Vektorindex verbessern
Voraussetzungen
- Ein Google Cloud-Konto und ein Google Cloud-Projekt
- Ein Webbrowser wie Chrome
2. Einrichtung und Anforderungen
Projekteinrichtung
- Melden Sie sich in der Google Cloud Console an. Wenn Sie noch kein Gmail- oder Google Workspace-Konto haben, müssen Sie ein Google-Konto erstellen.
Verwenden Sie stattdessen ein privates Konto anstelle eines Kontos einer Bildungseinrichtung.
- Erstellen Sie ein neues Projekt oder verwenden Sie ein vorhandenes. Wenn Sie ein neues Projekt in der Google Cloud Console erstellen möchten, klicken Sie in der Symbolleiste auf Projekt auswählen.

Klicken Sie im Fenster „Projekt auswählen“ auf die Schaltfläche „Neues Projekt“, um ein Dialogfeld für das neue Projekt zu öffnen.

Geben Sie im Dialogfeld einen Projektnamen ein und wählen Sie den Standort aus.

- Der Projektname ist der Anzeigename für die Teilnehmer dieses Projekts. Der Projektname wird nicht von Google-APIs verwendet und kann jederzeit geändert werden.
- Die Projekt-ID ist für alle Google Cloud-Projekte eindeutig und unveränderlich. Sie kann also nicht mehr geändert werden, nachdem sie festgelegt wurde. In der Google Cloud Console wird automatisch eine eindeutige ID generiert, die Sie aber anpassen können. Wenn Ihnen die generierte ID nicht gefällt, können Sie eine weitere zufällige ID generieren oder eine eigene ID angeben, um die Verfügbarkeit zu prüfen. In den meisten Codelabs verweisen Sie auf Ihre Projekt-ID, die in der Regel mit dem Platzhalter
angegeben wird. - Zur Information: Es gibt einen dritten Wert, die Projektnummer, die von einigen APIs verwendet wird. Weitere Informationen zu diesen drei Werten finden Sie in der Dokumentation Projekte erstellen und verwalten.
Abrechnung aktivieren
Sie haben zwei Möglichkeiten, die Abrechnung zu aktivieren. Sie können entweder Ihr privates Abrechnungskonto verwenden oder Guthaben mit den folgenden Schritten einlösen.
Google Cloud-Guthaben einlösen (optional)
Für diesen Workshop benötigen Sie ein Rechnungskonto mit Guthaben. Verwenden Sie die Gutschriften, die von den Workshop-Organisatoren bereitgestellt werden, oder die im Banner oben in diesem Codelab angegeben sind, um loszulegen. Wenn Sie bereits mit einem Rechnungskonto verbunden sind, können Sie diesen Schritt überspringen.
Privates Rechnungskonto einrichten
Wenn Sie die Abrechnung mit Google Cloud-Guthaben eingerichtet haben, können Sie diesen Schritt überspringen.
Wenn Sie ein privates Rechnungskonto einrichten möchten, aktivieren Sie die Abrechnung in der Google Cloud Billing Console.
Hinweise:
- Die für dieses Lab anfallenden Kosten für Google Cloud-Ressourcen betragen weniger als 5 $.
- Folgen Sie den Schritten am Ende dieses Labs, um Ressourcen zu löschen und weitere Gebühren zu vermeiden.
- Neue Nutzer kommen für die kostenlose Testversion mit einem Guthaben von 300 $ infrage.
- Neue und bestehende Nutzer können mit Cloud SQL mit einer kostenlosen Cloud SQL-Testinstanz beginnen.
Cloud Shell starten
Sie können Google Cloud zwar remote von Ihrem Computer aus bedienen, in diesem Codelab verwenden Sie jedoch Google Cloud Shell, eine Befehlszeilenumgebung, die in der Cloud ausgeführt wird.
Klicken Sie in der Google Cloud Console in der Symbolleiste rechts oben auf das Cloud Shell-Symbol:

Alternativ können Sie in der Google Cloud Console die Tasten „g“ und dann „s“ drücken oder Cloud Shell öffnen.
Die Bereitstellung und Verbindung mit der Umgebung dauert nur wenige Augenblicke. Wenn der Vorgang abgeschlossen ist, sollte das verbundene Terminal angezeigt werden:

Auf dieser virtuellen Maschine sind alle erforderlichen Entwicklungstools installiert. Sie bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und läuft in Google Cloud, was die Netzwerkleistung und Authentifizierung verbessert. Alle Aufgaben in diesem Codelab können in einem Browser ausgeführt werden.
3. Hinweis
API aktivieren
Wenn Sie Cloud SQL, Compute Engine, Service Networking und die Gemini Enterprise Agent Platform verwenden möchten, müssen Sie die entsprechenden APIs in Ihrem Google Cloud-Projekt aktivieren.
Prüfen Sie im Cloud Shell-Terminal, ob Ihre Projekt-ID festgelegt ist:
gcloud config get project
Wenn eine leere Zeichenfolge zurückgegeben wird, legen Sie sie mit folgendem Befehl fest:
gcloud config set project [YOUR-PROJECT-ID]
Legen Sie die Umgebungsvariable PROJECT_ID fest:
PROJECT_ID=$(gcloud config get-value project)
Aktivieren Sie alle erforderlichen APIs:
gcloud services enable sqladmin.googleapis.com \
compute.googleapis.com \
cloudresourcemanager.googleapis.com \
servicenetworking.googleapis.com \
aiplatform.googleapis.com
Erwartete Ausgabe
student@cloudshell:~ (test-project-001-402417)$ gcloud config set project test-project-001-402417
Updated property [core/project].
student@cloudshell:~ (test-project-001-402417)$ PROJECT_ID=$(gcloud config get-value project)
Your active configuration is: [cloudshell-14650]
student@cloudshell:~ (test-project-001-402417)$
student@cloudshell:~ (test-project-001-402417)$ gcloud services enable sqladmin.googleapis.com \
compute.googleapis.com \
cloudresourcemanager.googleapis.com \
servicenetworking.googleapis.com \
aiplatform.googleapis.com
Operation "operations/acat.p2-4470404856-1f44ebd8-894e-4356-bea7-b84165a57442" finished successfully.
Informationen zu den einzelnen aktivierten APIs finden Sie in der Dokumentation.
4. Cloud SQL-Instanz erstellen
Erstellen Sie eine Cloud SQL-Instanz mit Gemini Enterprise Agent Platform-Datenbankintegration.
Datenbankpasswort erstellen
Legen Sie ein Passwort für den Standarddatenbanknutzer fest. Sie können ein eigenes Passwort festlegen oder eine Zufallsfunktion verwenden, um eines zu generieren:
export CLOUDSQL_PASSWORD=`openssl rand -hex 16`
Generierten Passwortwert anzeigen:
echo $CLOUDSQL_PASSWORD
Notieren Sie sich das generierte Passwort, damit Sie es später verwenden können.
Cloud SQL for MySQL-Instanz erstellen
Cloud SQL-Instanzen können mit verschiedenen Methoden erstellt werden, z. B. mit der Google Cloud Console, Terraform oder der Google Cloud CLI (gcloud). In diesem Codelab verwenden Sie gcloud. Informationen zum Erstellen einer Instanz mit anderen Tools finden Sie in der Dokumentation unter Instanzen erstellen.
Das Flag „cloudsql_vector“ kann beim Erstellen einer Instanz aktiviert werden. Die Vektorunterstützung ist für MySQL 8.0 R20241208.01_00 oder höher verfügbar.
Führen Sie in der Cloud Shell-Sitzung Folgendes aus:
gcloud sql instances create my-cloudsql-instance \
--database-version=MYSQL_8_4 \
--tier=db-custom-2-8192 \
--region=us-central1 \
--enable-google-ml-integration \
--edition=ENTERPRISE \
--root-password=$CLOUDSQL_PASSWORD
Stellen Sie mit gcloud sql connect eine Verbindung zur Instanz her. Geben Sie bei Aufforderung das Passwort ein:
gcloud sql connect my-cloudsql-instance --user=root
Erwartete Ausgabe:
$gcloud sql connect my-cloudsql-instance --user=root Allowlisting your IP for incoming connection for 5 minutes...done. Connecting to database with SQL user [root].Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 71 Server version: 8.4.4-google (Google) Copyright (c) 2000, 2025, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
Beenden Sie die mysql-Sitzung, indem Sie Strg + D drücken oder exit eingeben:
exit
Integration der Gemini Enterprise Agent Platform aktivieren
Weisen Sie dem Cloud SQL-Dienstkonto die erforderliche IAM-Rolle zu, um die Integration der Gemini Enterprise Agent Platform zu ermöglichen.
Rufen Sie die E‑Mail-Adresse des Cloud SQL-Dienstkontos ab und exportieren Sie sie als Umgebungsvariable:
SERVICE_ACCOUNT_EMAIL=$(gcloud sql instances describe my-cloudsql-instance --format="value(serviceAccountEmailAddress)")
echo $SERVICE_ACCOUNT_EMAIL
Weisen Sie dem Cloud SQL-Dienstkonto die Rolle roles/aiplatform.user zu:
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$SERVICE_ACCOUNT_EMAIL" \
--role="roles/aiplatform.user"
Weitere Informationen zum Erstellen und Konfigurieren von Instanzen finden Sie in der Cloud SQL-Dokumentation hier.
5. Datenbank vorbereiten
Erstellen Sie eine Datenbank und aktivieren Sie die Vektorunterstützung.
Datenbank erstellen
Erstellen Sie eine Datenbank mit dem Namen quickstart_db. Sie können Datenbanken mit Datenbankclients wie mysql, der Google Cloud CLI oder Cloud SQL Studio erstellen. Verwenden Sie in diesem Schritt gcloud.
Führen Sie in Cloud Shell den folgenden Befehl aus, um die Datenbank zu erstellen:
gcloud sql databases create quickstart_db --instance=my-cloudsql-instance
6. Daten laden
Erstellen Sie Tabellen in der Datenbank und laden Sie Daten mithilfe fiktiver Dataset-Dateien des Cymbal Store, die in einem öffentlichen Cloud Storage-Bucket im CSV-Format gespeichert sind.
Cloud Shell ist Ihre Hauptumgebung, um eine Verbindung zu einer Datenbank herzustellen, alle Objekte zu erstellen und die Daten zu laden.
Fügen Sie die öffentliche IP-Adresse von Cloud Shell der Liste der autorisierten Netzwerke für Ihre Cloud SQL-Instanz hinzu.
Führen Sie in Cloud Shell folgenden Befehl aus:
gcloud sql instances patch my-cloudsql-instance --authorized-networks=$(curl ifconfig.me)
Wenn Ihre Sitzung verloren geht, Sie sie zurücksetzen oder Sie mit einem anderen Tool arbeiten, exportieren Sie die Variable „CLOUDSQL_PASSWORD“ noch einmal:
export CLOUDSQL_PASSWORD=...your password defined for the instance...
Erstellen Sie die erforderlichen Datenbankobjekte. Verwenden Sie mysql zusammen mit curl, um das Schema aus der öffentlichen Quelle herunterzuladen und anzuwenden.
Führen Sie in Cloud Shell folgenden Befehl aus:
export INSTANCE_IP=$(gcloud sql instances describe my-cloudsql-instance --format="value(ipAddresses.ipAddress)")
curl -LJ https://raw.githubusercontent.com/GoogleCloudPlatform/devrel-demos/main/infrastructure/cymbal-store-embeddings/cymbal_mysql_schema.sql | mysql --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db
Aufschlüsselung des Befehls. Im vorherigen Schritt haben Sie eine Verbindung zu Ihrer Datenbank hergestellt und das SQL-Script ausgeführt, um Tabellen, Indexe und Sequenzen zu erstellen.
Füllen Sie als Nächstes die Datenbank mit cymbal_products-Daten, indem Sie curl und mysql ausführen:
curl -LJ https://raw.githubusercontent.com/GoogleCloudPlatform/devrel-demos/main/infrastructure/cymbal-store-embeddings/cymbal_products.csv | mysql --enable-local-infile --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db -e "LOAD DATA LOCAL INFILE '/dev/stdin' INTO TABLE cymbal_products FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n' IGNORE 1 LINES;"
Fahre mit cymbal_stores fort.
curl -LJ https://raw.githubusercontent.com/GoogleCloudPlatform/devrel-demos/main/infrastructure/cymbal-store-embeddings/cymbal_stores.csv | mysql --enable-local-infile --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db -e "LOAD DATA LOCAL INFILE '/dev/stdin' INTO TABLE cymbal_stores FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n' IGNORE 1 LINES;"
Vervollständigen Sie die Tabelle mit „cymbal_inventory“, in der die Anzahl der einzelnen Produkte in jedem Geschäft angegeben ist.
curl -LJ https://raw.githubusercontent.com/GoogleCloudPlatform/devrel-demos/main/infrastructure/cymbal-store-embeddings/cymbal_inventory.csv | mysql --enable-local-infile --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db -e "LOAD DATA LOCAL INFILE '/dev/stdin' INTO TABLE cymbal_inventory FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n' IGNORE 1 LINES;"
Optional: Wenn Sie ein eigenes Beispieldataset haben, können Sie stattdessen kompatible CSV-Dateien mit dem Importtool in der Google Cloud Console importieren.
7. Einbettungen erstellen
Erstellen Sie Einbettungen für die Produktbeschreibungen mit dem text-embedding-005-Modell aus der Gemini Enterprise Agent Platform und speichern Sie sie als Vektordaten.
Zum Speichern der Vektordaten müssen Sie die Vektorfunktionen in Ihrer Cloud SQL-Instanz aktivieren.
Führen Sie den folgenden Befehl in Cloud Shell aus:
gcloud sql instances patch my-cloudsql-instance \
--database-flags=cloudsql_vector=on
Stellen Sie eine Verbindung zur Datenbank her:
mysql --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db
Erstellen Sie in der Tabelle „cymbal_products“ mit der Einbettungsfunktion eine neue Spalte embedding. Diese neue Spalte enthält die Vektoreinbettungen, die auf dem Text in der Spalte product_description basieren:
ALTER TABLE cymbal_products ADD COLUMN embedding vector(768) using varbinary;
UPDATE cymbal_products SET embedding = mysql.ml_embedding('text-embedding-005', product_description);
Hinweis: Die Generierung von Einbettungen für 2.000 Zeilen dauert in der Regel weniger als 5 Minuten.
Beenden Sie die MySQL-Sitzung:
exit
8. Ähnlichkeitssuche ausführen
Führen Sie eine Ähnlichkeitssuche durch, indem Sie die für Produktbeschreibungen berechneten Vektoreinbettungen mit der Einbettung für eine Suchanfrage vergleichen.
Sie können SQL-Abfragen über die Befehlszeile oder über Cloud SQL Studio ausführen. Cloud SQL Studio bietet eine bequemere Möglichkeit, lange SQL-Anweisungen mit mehreren Ausgaberow zu bearbeiten und auszuführen.
MySQL-Nutzer für Cloud SQL Studio erstellen
Sie benötigen einen neuen Datenbanknutzer, der Cloud SQL Studio verwenden kann. Erstellen Sie einen Nutzer vom Typ „integriert“ student mit demselben Passwort, das Sie für den Root-Nutzer verwendet haben.
Führen Sie in Cloud Shell folgenden Befehl aus:
gcloud sql users create student --instance=my-cloudsql-instance --password=$CLOUDSQL_PASSWORD --host=%
Cloud SQL Studio starten
- Rufen Sie in der Google Cloud Console Cloud SQL-Instanzen auf und klicken Sie auf
my-cloudsql-instance.

- Klicken Sie im Navigationsmenü auf Cloud SQL Studio.

- Geben Sie im Authentifizierungsdialogfeld den Datenbanknamen und die Anmeldedaten ein:
- Datenbank:
quickstart_db - Nutzer:
student - Passwort:
- Datenbank:
- Klicken Sie auf Authentifizieren.

- Klicken Sie auf den Tab Unbenannte Abfrage, um den SQL-Editor zu öffnen.

Abfrage ausführen
Führen Sie eine Anfrage aus, um die fünf wichtigsten Produkte abzurufen, die für die Kundenanfrage Welche Obstbäume wachsen hier gut? relevant sind.
Abfrage mit cosine_distance für die KNN-Vektorsuche (exakt) ausführen
Hier ist die Abfrage, die Sie ausführen können, um mit der Funktion „cosine_distance“ die fünf Elemente auszuwählen, die am besten für unsere Anfrage geeignet sind:
SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
SELECT
cp.product_name,
left(cp.product_description,80) as description,
cp.sale_price,
cs.zip_code,
cosine_distance(cp.embedding ,@query_vector) as distance
FROM
cymbal_products cp
JOIN cymbal_inventory ci on
ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
cs.store_id=ci.store_id
AND ci.inventory>0
AND cs.store_id = 1583
ORDER BY
distance ASC
LIMIT 5;
Geben Sie die Abfrage in Cloud SQL Studio ein und klicken Sie auf Ausführen (oder führen Sie die Abfrage in Ihrer sql-Sitzung aus):

Die Abfrage gibt übereinstimmende Produkte zurück, die nach Kosinus-Distanz sortiert sind:
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+ | product_name | description | sale_price | zip_code | distance | +-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+ | Malus Domestica | Malus Domestica, the classic apple tree, brings beauty and delicious fruit to yo | 100.00 | 93230 | 0.37740096545831603 | | Cerasus | Cerasus: A beautiful cherry tree that brings delicious fruit and vibrant color t | 75.00 | 93230 | 0.405704177142419 | | Persica | Persica: Enjoy homegrown, delicious peaches with this beautiful peach tree. Reac | 150.00 | 93230 | 0.41031799106722877 | | Meyer Lemon | Grow your own juicy Meyer Lemons with this semi-dwarf tree, California's favorit | 34.00 | 93230 | 0.42823360959352186 | | Acer | Acer, the classic maple. Known for vibrant fall foliage in reds, oranges, and ye | 100.00 | 93230 | 0.42953897057301615 | +-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+ 5 rows in set (0.13 sec)
Die Ausführungszeit der Abfrage beträgt mit der Funktion „cosine_distance“ etwa 0,13 Sekunden.
Abfrage mit „approx_distance“ für die KNN-Vektorsuche (exakt) ausführen
Führen Sie dieselbe Abfrage aus, aber verwenden Sie die KNN-Suche mit der Funktion approx_distance. Wenn Sie keinen ANN-Index für Ihre Einbettungen haben, wird im Hintergrund automatisch auf die genaue Suche zurückgegriffen:
SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
SELECT
cp.product_name,
left(cp.product_description,80) as description,
cp.sale_price,
cs.zip_code,
approx_distance(cp.embedding ,@query_vector, 'distance_measure=cosine') as distance
FROM
cymbal_products cp
JOIN cymbal_inventory ci on
ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
cs.store_id=ci.store_id
AND ci.inventory>0
AND cs.store_id = 1583
ORDER BY
distance ASC
LIMIT 5;
Hier ist eine Liste der Produkte, die von der Abfrage zurückgegeben werden.
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+ | product_name | description | sale_price | zip_code | distance | +-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+ | Malus Domestica | Malus Domestica, the classic apple tree, brings beauty and delicious fruit to yo | 100.00 | 93230 | 0.37740096545831603 | | Cerasus | Cerasus: A beautiful cherry tree that brings delicious fruit and vibrant color t | 75.00 | 93230 | 0.405704177142419 | | Persica | Persica: Enjoy homegrown, delicious peaches with this beautiful peach tree. Reac | 150.00 | 93230 | 0.41031799106722877 | | Meyer Lemon | Grow your own juicy Meyer Lemons with this semi-dwarf tree, California's favorit | 34.00 | 93230 | 0.42823360959352186 | | Acer | Acer, the classic maple. Known for vibrant fall foliage in reds, oranges, and ye | 100.00 | 93230 | 0.42953897057301615 | +-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+ 5 rows in set, 1 warning (0.12 sec)
Die Ausführung der Abfrage hat nur 0,12 Sekunden gedauert. Wir haben die gleichen Ergebnisse wie für die Funktion „KNN exact cosine_distance“ erhalten.
Weitere Informationen zur Funktion finden Sie in der Cloud SQL for MySQL-Dokumentation.
9. LLM-Antwort mit abgerufenen Daten verbessern
Die Antwort der generativen KI auf eine Clientanwendung verbessern, indem Sie Abfrageergebnisse als fundierten Kontext in einem Prompt an ein Foundation-Language Model der Gemini Enterprise Agent Platform übergeben.
Gehen Sie dazu wie folgt vor:
- JSON-Nutzlast aus dem Vektorsuchergebnis in Cloud SQL generieren
- Testen Sie den Prompt in Agent Platform Studio.
- Führen Sie den End-to-End-Prompt direkt über SQL mit der
google_ml-Integration aus.
Ausgabe im JSON-Format generieren
Ändern Sie die Abfrage, um das Ergebnis als JSON zu formatieren und eine Zeile zurückzugeben:
SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
WITH trees as (
SELECT
cp.product_name,
left(cp.product_description,80) as description,
cp.sale_price,
cs.zip_code,
cp.uniq_id as product_id
FROM
cymbal_products cp
JOIN cymbal_inventory ci on
ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
cs.store_id=ci.store_id
AND ci.inventory>0
AND cs.store_id = 1583
ORDER BY
(approx_distance(cp.embedding ,@query_vector, 'distance_measure=cosine')) ASC
LIMIT 1)
SELECT json_arrayagg(json_object('product_name',product_name,'description',description,'sale_price',sale_price,'zip_code',zip_code,'product_id',product_id)) FROM trees;
Erwartete JSON-Ausgabe:
[{"zip_code": 93230, "product_id": "23e41a71d63d8bbc9bdfa1d118cfddc5", "sale_price": 100.00, "description": "Malus Domestica, the classic apple tree, brings beauty and delicious fruit to yo", "product_name": "Malus Domestica"}]
Prompt in Agent Platform Studio ausführen
Stellen Sie das generierte JSON als Kontext in einem Prompt für ein generatives Modell in Agent Platform Studio bereit.
- Öffnen Sie Agent Platform Studio in der Google Cloud Console.

- Geben Sie den folgenden Prompt in Agent Platform Studio ein:

You are a friendly advisor helping to find a product based on the customer's needs.
Based on the client request we have loaded a list of products closely related to search.
The list in JSON format with list of values like {"product_name":"name","description":"some description","sale_price":10,"zip_code": 10234, "produt_id": "02056727942aeb714dc9a2313654e1b0"}
Here is the list of products:
<JSON_OUTPUT>
The customer asked "What tree is growing the best here?"
You should give information about the product, price and some supplemental information.
Do not ask any additional questions and assume location based on the zip code provided in the list of products.
Ersetzen Sie durch die JSON-Antwort auf Ihre Anfrage:
You are a friendly advisor helping to find a product based on the customer's needs.
Based on the client request we have loaded a list of products closely related to search.
The list in JSON format with list of values like {"product_name":"name","description":"some description","sale_price":10,"zip_code": 10234, "produt_id": "02056727942aeb714dc9a2313654e1b0"}
Here is the list of products:
{"zip_code": 93230, "product_id": "23e41a71d63d8bbc9bdfa1d118cfddc5", "sale_price": 100.00, "description": "Malus Domestica, the classic apple tree, brings beauty and delicious fruit to yo", "product_name": "Malus Domestica"}
The customer asked "What tree is growing the best here?"
You should give information about the product, price and some supplemental information.
Do not ask any additional questions and assume location based on the zip code provided in the list of products.

- Führen Sie den Prompt aus.

Die Antwort enthält den Preis, die Beschreibung und zusätzliche Informationen, die das Modell aus externen Quellen auf Grundlage von Informationen zum Baum und zum Standort abruft.
Prompt in SQL ausführen
Sie können die Cloud SQL-KI-Integration auch mit der Gemini Enterprise Agent Platform verwenden, um Antworten von einem generativen Modell direkt in SQL zu erhalten.
Registrieren Sie zuerst das Modell.
- Registrieren Sie das
gemini-3.5-flash-Modell zum Generieren von Antworten (ersetzen Siedurch Ihre Projekt-ID):
CALL
mysql.ml_create_model_registration(
'gemini-3.5-flash',
'https://aiplatform.googleapis.com/v1/projects/<PROJECT_ID>/locations/global/publishers/google/models/gemini-3.5-flash:generateContent',
'google',
'GENERIC',
NULL,
'auth_type_cloudsql_service_agent_iam',
NULL, NULL, NULL, NULL);
Wir können auch die Cloud SQL-KI-Integration mit der Gemini Enterprise Agent Platform verwenden, um eine ähnliche Antwort von einem generativen Modell zu erhalten, indem wir SQL direkt in der Datenbank verwenden.
Jetzt können wir die generierte Unterabfrage mit JSON-Ergebnissen verwenden, um sie mit SQL als Teil des Prompts für das generative KI-Textmodell bereitzustellen.
Führen Sie die Abfrage in der MySQL- oder Cloud SQL Studio-Sitzung für die Datenbank aus.
SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
WITH trees AS (
SELECT
cp.product_name,
cp.product_description AS description,
cp.sale_price,
cs.zip_code,
cp.uniq_id AS product_id
FROM
cymbal_products cp
JOIN cymbal_inventory ci ON
ci.uniq_id = cp.uniq_id
JOIN cymbal_stores cs ON
cs.store_id = ci.store_id
AND ci.inventory>0
AND cs.store_id = 1583
ORDER BY
(approx_distance(cp.embedding ,@query_vector, 'distance_measure=cosine')) ASC
LIMIT 1),
prompt AS (
SELECT
CONCAT( 'You are a friendly advisor helping to find a product based on the customer''s needs.
Based on the client request we have loaded a list of products closely related to search.
The list in JSON format with list of values like {"product_name":"name","product_description":"some description","sale_price":10}
Here is the list of products:', json_arrayagg(json_object('product_name',trees.product_name,'description',trees.description,'sale_price',trees.sale_price,'zip_code',trees.zip_code,'product_id',trees.product_id)) , 'The customer asked "What kind of fruit trees grow well here?"
You should give information about the product, price and some supplemental information') AS prompt_text
FROM
trees),
response AS (
SELECT
mysql.ML_PREDICT_ROW('gemini-3.5-flash',
json_object('contents',
json_object('role',
'user',
'parts',
json_array(
json_object('text',
prompt_text))))) AS resp
FROM
prompt)
SELECT
JSON_EXTRACT(resp, '$.candidates[0].content.parts[0].text')
FROM
response;
Hier sehen Sie die Beispielausgabe. Ihre Ausgabe kann je nach Modellversion und Parametern unterschiedlich ausfallen:
"Hello there! I'd be happy to help you find the perfect fruit tree for your space. \n\nBased on your area, a wonderful option we currently have in stock is the **Malus Domestica** (the classic Apple Tree)!\n\nHere are the key details:\n\n* **Product Name:** Malus Domestica (Classic Apple Tree)\n* **Price:** $100.00\n\n### Why it's a great choice:\n* **Beautiful Seasonal Foliage:** It features vibrant green leaves during the summer that turn into gorgeous shades of red, orange, and yellow in the autumn. \n* **Shade & Size:** It grows to approximately 30 feet tall, making it a strong, durable tree that offers excellent shade for your yard alongside delicious fresh fruit.\n* **Growing Conditions:** It thrives best in cool, moist climates with well-draining, loamy soil and is ideal for USDA Hardiness Zones 4–8.\n\n### Supplemental Care Tips:\n* **Planting Location:** Choose a spot that gets full sunlight (at least 6 hours a day) to ensure maximum fruit production.\n* **Soil:** Make sure the soil is rich and loamy with good drainage so the roots stay healthy.\n* **Cross-Pollination:** Apple trees often produce a higher yield when planted near another compatible apple tree variety, so if you have extra space, adding a companion tree in the future can boost your harvest!\n\nLet me know if you have any questions about planting or care, or if you'd like help adding this to your cart!"
Die Ausgabe erfolgt im Markdown-Format.
10. Index für die nächsten Nachbarn erstellen
Bei großen Datasets mit Millionen von Vektoren kann die Vektorsuche erhebliche Rechenressourcen erfordern. Um die Abfrageleistung zu verbessern, erstellen Sie einen Index für die Vektoreinbettungen.
ScaNN-Index erstellen
Wir verwenden für unseren Test den ScaNN-Indextyp.
Um den Index für die Einbettungsspalte zu erstellen, müssen Sie die Distanzmessung für die Einbettungsspalte definieren. Eine detaillierte Beschreibung der Parameter finden Sie in der Dokumentation.
CREATE VECTOR INDEX cymbal_products_embedding_idx ON cymbal_products(embedding) USING SCANN DISTANCE_MEASURE=COSINE;
Antwort vergleichen
Führen Sie die Vektorsuchabfrage noch einmal aus und sehen Sie sich die Ergebnisse an:
SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
SELECT
cp.product_name,
left(cp.product_description,80) as description,
cp.sale_price,
cs.zip_code,
approx_distance(cp.embedding ,@query_vector, 'distance_measure=cosine') as distance
FROM
cymbal_products cp
JOIN cymbal_inventory ci on
ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
cs.store_id=ci.store_id
AND ci.inventory>0
AND cs.store_id = 1583
ORDER BY
distance ASC
LIMIT 5;
Erwartete Ausgabe:
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+ | product_name | description | sale_price | zip_code | distance | +-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+ | Malus Domestica | Malus Domestica, the classic apple tree, brings beauty and delicious fruit to yo | 100.00 | 93230 | 0.37740096545831603 | | Cerasus | Cerasus: A beautiful cherry tree that brings delicious fruit and vibrant color t | 75.00 | 93230 | 0.405704177142419 | | Persica | Persica: Enjoy homegrown, delicious peaches with this beautiful peach tree. Reac | 150.00 | 93230 | 0.41031799106722877 | | Meyer Lemon | Grow your own juicy Meyer Lemons with this semi-dwarf tree, California's favorit | 34.00 | 93230 | 0.42823360959352186 | | Acer | Acer, the classic maple. Known for vibrant fall foliage in reds, oranges, and ye | 100.00 | 93230 | 0.42953897057301615 | +-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+ 5 rows in set (0.08 sec)
Die Leistungssteigerungen sind nur geringfügig unterschiedlich, was bei einem so kleinen Dataset zu erwarten ist. Bei großen Datasets mit Millionen von Vektoren wäre es noch deutlicher erkennbar.
Prüfen Sie den Ausführungsplan mit dem EXPLAIN-Befehl:
SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
EXPLAIN ANALYZE SELECT
cp.product_name,
left(cp.product_description,80) as description,
cp.sale_price,
cs.zip_code,
approx_distance(cp.embedding ,@query_vector, 'distance_measure=cosine') as distance
FROM
cymbal_products cp
JOIN cymbal_inventory ci on
ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
cs.store_id=ci.store_id
AND ci.inventory>0
AND cs.store_id = 1583
ORDER BY
distance ASC
LIMIT 5;
Ausführungsplan (Ausschnitt):
...
-> Nested loop inner join (cost=443 rows=5) (actual time=1.14..1.18 rows=5 loops=1)
-> Vector index scan on cp (cost=441 rows=5) (actual time=1.1..1.1 rows=5 loops=1)
-> Single-row index lookup on cp using PRIMARY (uniq_id=cp.uniq_id) (cost=0.25 rows=1) (actual time=0.0152..0.0152 rows=1 loops=5)
...
Er zeigt einen Vektorindexscan für die Tabelle „cp“ (Alias für die Tabelle „cymbal_products“).
Probieren Sie die semantische Suche mit Ihren eigenen Daten aus oder testen Sie verschiedene Suchanfragen, um zu sehen, wie sie in MySQL funktioniert.
11. Umgebung bereinigen
Cloud SQL-Instanz löschen
Cloud SQL-Instanz löschen, wenn Sie das Lab abgeschlossen haben
Definieren Sie in der Cloud Shell die Projekt- und Umgebungsvariablen, wenn die Verbindung getrennt wurde und alle vorherigen Einstellungen verloren gegangen sind:
export INSTANCE_NAME=my-cloudsql-instance
export PROJECT_ID=$(gcloud config get-value project)
Löschen Sie die Instanz:
gcloud sql instances delete $INSTANCE_NAME --project=$PROJECT_ID
Erwartete Konsolenausgabe:
student@cloudshell:~$ gcloud sql instances delete $INSTANCE_NAME --project=$PROJECT_ID All of the instance data will be lost when the instance is deleted. Do you want to continue (Y/n)? y Deleting Cloud SQL instance...done. Deleted [https://sandbox.googleapis.com/v1beta4/projects/test-project-001-402417/instances/my-cloudsql-instance].
12. Glückwunsch
Herzlichen Glückwunsch zum Abschluss des Codelabs.
Google Cloud-Lernpfad
Dieses Lab ist Teil des Lernpfads „Produktionsreife KI mit Google Cloud“.
- Gesamten Lehrplan ansehen
- Teile deine Fortschritte mit dem Hashtag
#ProductionReadyAI.
Behandelte Themen
- Cloud SQL-Instanz für MySQL bereitstellen
- Datenbank erstellen und Cloud SQL AI-Integration aktivieren
- Daten in die Datenbank laden
- Cloud SQL Studio verwenden
- Vertex AI-Einbettungsmodell in Cloud SQL verwenden
- Agent Platform Studio verwenden
- Ergebnis mit einem Modell der Gemini Enterprise Agent Platform anreichern
- Leistung mit Vektorindex verbessern
Ähnliches Codelab für AlloyDB oder Codelab für Cloud SQL for Postgres ausprobieren
Umfrage
Ausgabe: