1. Pengantar
Dalam codelab ini, Anda akan mempelajari cara menggunakan integrasi Vertex AI Cloud SQL untuk MySQL dengan menggabungkan penelusuran vektor dengan embedding Vertex AI.

Prasyarat
- Pemahaman dasar tentang Google Cloud, konsol
- Keterampilan dasar dalam antarmuka command line dan Cloud Shell
Yang akan Anda pelajari
- Cara men-deploy instance Cloud SQL untuk PostgreSQL
- Cara membuat database dan mengaktifkan integrasi AI Cloud SQL
- Cara memuat data ke database
- Cara menggunakan Cloud SQL Studio
- Cara menggunakan model penyematan Vertex AI di Cloud SQL
- Cara menggunakan Vertex AI Studio
- Cara memperkaya hasil menggunakan model generatif Vertex AI
- Cara meningkatkan performa menggunakan indeks vektor
Yang Anda butuhkan
- Akun Google Cloud dan Project Google Cloud
- Browser web seperti Chrome yang mendukung Konsol Google Cloud dan Cloud Shell
2. Penyiapan dan Persyaratan
Penyiapan Project
- Login ke Konsol Google Cloud. Jika belum memiliki akun Gmail atau Google Workspace, Anda harus membuatnya.
Gunakan akun pribadi, bukan akun kantor atau sekolah.
- Buat project baru atau gunakan kembali project yang sudah ada. Untuk membuat project baru di konsol Google Cloud, di header, klik tombol Pilih project yang akan membuka jendela pop-up.

Di jendela Select a project, tekan tombol New Project yang akan membuka kotak dialog untuk project baru.

Di kotak dialog, masukkan Nama project yang Anda inginkan dan pilih lokasi.

- Project name adalah nama tampilan untuk peserta project ini. Nama project tidak digunakan oleh Google API, dan dapat diubah kapan saja.
- Project ID bersifat unik di semua project Google Cloud dan tidak dapat diubah (tidak dapat diubah setelah ditetapkan). Konsol Google Cloud otomatis membuat ID unik, tetapi Anda dapat menyesuaikannya. Jika tidak menyukai ID yang dibuat, Anda dapat membuat ID acak lain atau memberikan ID Anda sendiri untuk memeriksa ketersediaannya. Di sebagian besar codelab, Anda harus merujuk project ID Anda, yang biasanya diidentifikasi dengan placeholder PROJECT_ID.
- Sebagai informasi, ada nilai ketiga, Project Number, yang digunakan oleh beberapa API. Pelajari lebih lanjut ketiga nilai ini di dokumentasi.
Aktifkan Penagihan
Untuk mengaktifkan penagihan, Anda memiliki dua opsi. Anda dapat menggunakan akun penagihan pribadi atau menukarkan kredit dengan langkah-langkah berikut.
Tukarkan kredit Google Cloud senilai $5 (opsional)
Untuk menjalankan workshop ini, Anda memerlukan Akun Penagihan dengan sejumlah kredit. Jika Anda berencana menggunakan penagihan sendiri, Anda dapat melewati langkah ini.
- Klik link ini dan login dengan Akun Google pribadi.
- Anda akan melihat sesuatu seperti ini:

- Klik tombol KLIK DI SINI UNTUK MENGAKSES KREDIT ANDA. Anda akan diarahkan ke halaman untuk menyiapkan profil penagihan. Jika Anda melihat layar pendaftaran uji coba gratis, klik batal dan lanjutkan untuk menautkan penagihan.

- Klik Confirm. Anda kini terhubung ke Akun Penagihan Uji Coba Google Cloud Platform.

Menyiapkan akun penagihan pribadi
Jika menyiapkan penagihan menggunakan kredit Google Cloud, Anda dapat melewati langkah ini.
Untuk menyiapkan akun penagihan pribadi, buka di sini untuk mengaktifkan penagihan di Cloud Console.
Beberapa Catatan:
- Menyelesaikan lab ini akan dikenai biaya kurang dari $3 USD untuk resource Cloud.
- Anda dapat mengikuti langkah-langkah di akhir lab ini untuk menghapus resource agar tidak dikenai biaya lebih lanjut.
- Pengguna baru memenuhi syarat untuk mengikuti Uji Coba Gratis senilai$300 USD.
Mulai Cloud Shell
Meskipun Google Cloud dapat dioperasikan dari jarak jauh menggunakan laptop Anda, dalam codelab ini, Anda akan menggunakan Google Cloud Shell, lingkungan command line yang berjalan di Cloud.
Dari Google Cloud Console, klik ikon Cloud Shell di toolbar kanan atas:

Atau, Anda dapat menekan G, lalu S. Urutan ini akan mengaktifkan Cloud Shell jika Anda berada dalam Konsol Google Cloud atau menggunakan link ini.
Hanya perlu waktu beberapa saat untuk penyediaan dan terhubung ke lingkungan. Jika sudah selesai, Anda akan melihat tampilan seperti ini:

Mesin virtual ini berisi semua alat pengembangan yang Anda perlukan. Layanan ini menawarkan direktori beranda tetap sebesar 5 GB dan beroperasi di Google Cloud, sehingga sangat meningkatkan performa dan autentikasi jaringan. Semua pekerjaan Anda dalam codelab ini dapat dilakukan di browser. Anda tidak perlu menginstal apa pun.
3. Sebelum memulai
Aktifkan API
Untuk menggunakan Cloud SQL, Compute Engine, Layanan jaringan, dan Vertex AI, Anda harus mengaktifkan API masing-masing di project Google Cloud Anda.
Di dalam terminal Cloud Shell, pastikan project ID Anda sudah disiapkan:
gcloud config set project [YOUR-PROJECT-ID]
Tetapkan variabel lingkungan PROJECT_ID:
PROJECT_ID=$(gcloud config get-value project)
Aktifkan semua layanan yang diperlukan:
gcloud services enable sqladmin.googleapis.com \
compute.googleapis.com \
cloudresourcemanager.googleapis.com \
servicenetworking.googleapis.com \
aiplatform.googleapis.com
Output yang diharapkan
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.
Memperkenalkan API
- Cloud SQL Admin API (
sqladmin.googleapis.com) memungkinkan Anda membuat, mengonfigurasi, dan mengelola instance Cloud SQL secara terprogram. Layanan ini menyediakan bidang kontrol untuk layanan database relasional terkelola sepenuhnya Google (mendukung MySQL, PostgreSQL, dan SQL Server), yang menangani tugas seperti penyediaan, pencadangan, ketersediaan tinggi, dan penskalaan. - Compute Engine API (
compute.googleapis.com) memungkinkan Anda membuat dan mengelola mesin virtual (VM), persistent disk, dan setelan jaringan. Layanan ini menyediakan fondasi Infrastructure-as-a-Service (IaaS) inti yang diperlukan untuk menjalankan beban kerja Anda dan menghosting infrastruktur yang mendasarinya untuk banyak layanan terkelola. - Cloud Resource Manager API (
cloudresourcemanager.googleapis.com) memungkinkan Anda mengelola metadata dan konfigurasi project Google Cloud secara terprogram. Dengan demikian, Anda dapat mengatur resource, menangani kebijakan Identity and Access Management (IAM), dan memvalidasi izin di seluruh hierarki project. - Service Networking API (
servicenetworking.googleapis.com) memungkinkan Anda mengotomatiskan penyiapan konektivitas pribadi antara jaringan Virtual Private Cloud (VPC) dan layanan terkelola Google. Hal ini secara khusus diperlukan untuk membuat akses IP pribadi bagi layanan seperti AlloyDB agar dapat berkomunikasi dengan aman dengan resource Anda yang lain. - Vertex AI API (
aiplatform.googleapis.com) memungkinkan aplikasi Anda membangun, men-deploy, dan menskalakan model machine learning. Vertex AI menyediakan antarmuka terpadu untuk semua layanan AI Google Cloud, termasuk akses ke model AI Generatif (seperti Gemini) dan pelatihan model kustom.
4. Membuat instance Cloud SQL
Buat instance Cloud SQL dengan integrasi database dengan Vertex AI.
Buat Sandi database
Tentukan sandi untuk pengguna database default. Anda dapat menentukan sandi Anda sendiri atau menggunakan fungsi acak untuk membuatnya:
export CLOUDSQL_PASSWORD=`openssl rand -hex 12`
Catat nilai yang dihasilkan untuk sandi:
echo $CLOUDSQL_PASSWORD
Membuat Instance Cloud SQL untuk MySQL
Flag cloudsql_vector dapat diaktifkan saat membuat instance. Dukungan vektor saat ini tersedia untuk MySQL 8.0 R20241208.01_00 atau yang lebih baru
Dalam sesi Cloud Shell, jalankan:
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
Kita dapat memverifikasi koneksi dengan menjalankan perintah dari Cloud Shell
gcloud sql connect my-cloudsql-instance --user=root
Jalankan perintah dan masukkan sandi Anda di perintah saat siap terhubung.
Output yang diharapkan:
$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>
Keluar dari sesi mysql untuk saat ini menggunakan pintasan keyboard ctrl+d atau menjalankan perintah keluar
exit
Mengaktifkan Integrasi Vertex AI
Berikan hak istimewa yang diperlukan ke akun layanan Cloud SQL internal agar dapat menggunakan integrasi Vertex AI.
Temukan email akun layanan internal Cloud SQL dan ekspor sebagai variabel.
SERVICE_ACCOUNT_EMAIL=$(gcloud sql instances describe my-cloudsql-instance --format="value(serviceAccountEmailAddress)")
echo $SERVICE_ACCOUNT_EMAIL
Memberikan akses ke Vertex AI untuk akun layanan Cloud SQL:
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$SERVICE_ACCOUNT_EMAIL" \
--role="roles/aiplatform.user"
Baca selengkapnya tentang pembuatan dan konfigurasi instance di dokumentasi Cloud SQL di sini.
5. Menyiapkan Database
Sekarang kita perlu membuat database dan mengaktifkan dukungan vektor.
Buat Database
Buat database dengan nama quickstart_db .Untuk melakukannya, kita memiliki berbagai opsi seperti klien database command line seperti mysql untuk mySQL, SDK, atau Cloud SQL Studio. Kita akan menggunakan SDK (gcloud) untuk membuat database.
Di Cloud Shell, jalankan perintah untuk membuat database
gcloud sql databases create quickstart_db --instance=my-cloudsql-instance
6. Muat Data
Sekarang kita perlu membuat objek di database dan memuat data. Kita akan menggunakan data Toko Cymbal fiktif. Data tersedia dalam format SQL (untuk skema) dan CSV (untuk data).
Cloud Shell akan menjadi lingkungan utama kita untuk terhubung ke database, membuat semua objek, dan memuat data.
Pertama, kita perlu menambahkan IP publik Cloud Shell ke daftar jaringan yang diizinkan untuk instance Cloud SQL. Di Cloud Shell, jalankan:
gcloud sql instances patch my-cloudsql-instance --authorized-networks=$(curl ifconfig.me)
Jika sesi Anda hilang, direset, atau Anda bekerja dari alat lain, ekspor variabel CLOUDSQL_PASSWORD Anda lagi:
export CLOUDSQL_PASSWORD=...your password defined for the instance...
Sekarang kita dapat membuat semua objek yang diperlukan dalam database. Untuk melakukannya, kita akan menggunakan utilitas mysql MySQL bersama dengan utilitas curl yang mengambil data dari sumber publik.
Di Cloud Shell, jalankan:
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
Apa yang kita lakukan tepatnya dalam perintah sebelumnya? Kita terhubung ke database dan menjalankan kode SQL yang didownload yang membuat tabel, indeks, dan urutan.
Langkah selanjutnya adalah memuat data cymbal_products. Kita menggunakan utilitas curl dan mysql yang sama.
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;"
Kemudian, kita lanjutkan dengan cymbal_stores.
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;"
Lengkapi dengan cymbal_inventory yang memiliki jumlah setiap produk di setiap toko.
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;"
Jika Anda memiliki data sampel sendiri dan file CSV yang kompatibel dengan alat impor Cloud SQL yang tersedia dari Konsol Cloud, Anda dapat menggunakannya, bukan pendekatan yang disajikan.
7. Membuat Embedding
Langkah berikutnya adalah membuat embedding untuk deskripsi produk menggunakan model textembedding-005 dari Google Vertex AI dan menyimpannya di kolom baru dalam tabel cymbal_products.
Untuk menyimpan data vektor, kita perlu mengaktifkan fungsi vektor di instance Cloud SQL. Jalankan di Cloud Shell:
gcloud sql instances patch my-cloudsql-instance \
--database-flags=cloudsql_vector=on
Hubungkan ke database:
mysql --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db
Buat kolom embedding baru di tabel cymbal_products menggunakan fungsi embedding. Kolom baru tersebut akan menyimpan embedding vektor berdasarkan teks di kolom product_description.
ALTER TABLE cymbal_products ADD COLUMN embedding vector(768) using varbinary;
UPDATE cymbal_products SET embedding = mysql.ml_embedding('text-embedding-005', product_description);
Membuat sematan vektor untuk 2.000 baris biasanya memerlukan waktu kurang dari 5 menit, tetapi terkadang bisa sedikit lebih lama, dan sering kali selesai lebih cepat.
8. Menjalankan Penelusuran Kemiripan
Sekarang kita dapat menjalankan penelusuran menggunakan penelusuran kemiripan berdasarkan nilai vektor yang dihitung untuk deskripsi dan nilai vektor yang kita buat untuk permintaan menggunakan model embedding yang sama.
Kueri SQL dapat dieksekusi dari antarmuka command line yang sama atau, sebagai alternatif, dari Cloud SQL Studio. Kueri multi-baris dan kompleks lebih baik dikelola di Cloud SQL Studio.
Membuat Pengguna
Kita memerlukan pengguna baru yang dapat menggunakan Cloud SQL Studio. Kita akan membuat siswa pengguna jenis bawaan dengan sandi yang sama seperti yang telah kita gunakan untuk pengguna root.
Di Cloud Shell, jalankan:
gcloud sql users create student --instance=my-cloudsql-instance --password=$CLOUDSQL_PASSWORD --host=%
Mulai Cloud SQL Studio
Di konsol, klik instance Cloud SQL yang telah kita buat sebelumnya.

Saat dibuka di panel kanan, kita dapat melihat Cloud SQL Studio. Klik tab tersebut.

Tindakan ini akan membuka dialog tempat Anda memberikan nama database dan kredensial Anda:
- Database: quickstart_db
- Pengguna: student
- Sandi: sandi yang Anda catat untuk pengguna
Kemudian, klik tombol "AUTHENTICATE".

Jendela berikutnya akan terbuka dan Anda dapat mengklik tab "Editor" di sisi kanan untuk membuka Editor SQL.

Sekarang kita siap menjalankan kueri.
Jalankan Kueri
Jalankan kueri untuk mendapatkan daftar produk yang tersedia dan paling terkait dengan permintaan klien. Permintaan yang akan kita teruskan ke Vertex AI untuk mendapatkan nilai vektornya adalah "Jenis pohon buah apa yang tumbuh dengan baik di sini?"
Menjalankan kueri dengan cosine_distance untuk penelusuran vektor KNN (tepat)
Berikut kueri yang dapat Anda jalankan untuk memilih 5 item pertama yang paling sesuai untuk permintaan kita menggunakan fungsi cosine_distance:
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;
Salin dan tempel kueri ke editor Cloud SQL Studio, lalu tekan tombol "RUN" atau tempelkan di sesi command line yang terhubung ke database quickstart_db.

Berikut daftar produk yang dipilih dan cocok dengan kueri.
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| 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)
Eksekusi kueri memerlukan waktu 0,13 detik dengan fungsi cosine_distance.
Menjalankan kueri dengan approx_distance untuk penelusuran vektor KNN (tepat)
Sekarang kita menjalankan kueri yang sama, tetapi menggunakan penelusuran KNN dengan fungsi approx_distance. Jika kami tidak memiliki indeks ANN untuk penyematan, indeks tersebut akan otomatis kembali ke penelusuran persis di balik layar:
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;
Berikut adalah daftar produk yang ditampilkan oleh kueri.
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| 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)
Eksekusi kueri hanya memerlukan waktu 0,12 detik. Kita mendapatkan hasil yang sama seperti untuk fungsi cosine_distance.
9. Meningkatkan Kualitas Respons LLM Menggunakan Data yang Diambil
Kita dapat meningkatkan respons LLM AI Generatif ke aplikasi klien menggunakan hasil kueri yang dijalankan dan menyiapkan output yang bermakna menggunakan hasil kueri yang diberikan sebagai bagian dari perintah ke model bahasa dasar generatif Vertex AI.
Untuk mencapainya, kita perlu membuat JSON dengan hasil dari penelusuran vektor, lalu menggunakan JSON yang dibuat tersebut sebagai tambahan pada perintah untuk model LLM di Vertex AI guna membuat output yang bermakna. Pada langkah pertama, kita membuat JSON, lalu mengujinya di Vertex AI Studio, dan pada langkah terakhir, kita menggabungkannya ke dalam pernyataan SQL yang dapat digunakan dalam aplikasi.
Membuat output dalam format JSON
Ubah kueri untuk menghasilkan output dalam format JSON dan hanya menampilkan satu baris untuk diteruskan ke Vertex AI
Berikut adalah contoh kueri menggunakan penelusuran ANN:
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;
Berikut adalah JSON yang diharapkan dalam output:
[{"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"}]
Jalankan perintah di Vertex AI Studio
Kita dapat menggunakan JSON yang dihasilkan untuk menyediakannya sebagai bagian dari perintah ke model teks AI generatif di Vertex AI Studio
Buka Perintah Vertex AI Studio di konsol cloud.

Aplikasi ini mungkin meminta Anda mengaktifkan API tambahan, tetapi Anda dapat mengabaikan permintaan tersebut. Kita tidak memerlukan API tambahan untuk menyelesaikan lab ini.
Masukkan perintah di Studio.

Berikut perintah yang akan kita gunakan:
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:
[place your JSON here]
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.
Berikut tampilannya saat kita mengganti placeholder JSON dengan respons dari kueri:
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.
Berikut adalah hasilnya saat kita menjalankan perintah dengan nilai JSON dan menggunakan model gemini-2.5-flash:

Jawaban yang kami dapatkan dari model dalam contoh ini mengikuti penggunaan hasil penelusuran semantik dan produk yang paling cocok yang tersedia di kode pos yang disebutkan.
Menjalankan perintah di SQL
Kita juga dapat menggunakan integrasi AI Cloud SQL dengan Vertex AI untuk mendapatkan respons serupa dari model generatif menggunakan SQL langsung di database.
Sekarang kita dapat menggunakan hasil JSON yang dihasilkan dalam subkueri untuk menyediakannya sebagai bagian dari perintah ke model teks AI generatif menggunakan SQL.
Di sesi mysql atau Cloud SQL Studio ke database, jalankan kueri
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('publishers/google/models/gemini-2.0-flash-001:generateContent',
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;
Berikut adalah contoh output-nya. Output Anda mungkin berbeda bergantung pada versi dan parameter model.:
"Okay, I see you're looking for fruit trees that grow well in your area. Based on the available product, the **Malus Domestica** (Apple Tree) is a great option to consider!\n\n* **Product:** Malus Domestica (Apple Tree)\n* **Description:** This classic apple tree grows to about 30 feet tall and provides beautiful seasonal color with green leaves in summer and fiery colors in the fall. It's known for its strength and provides good shade. Most importantly, it produces delicious apples!\n* **Price:** \\$100.00\n* **Growing Zones:** This particular apple tree is well-suited for USDA zones 4-8. Since your zip code is 93230, you are likely in USDA zone 9a or 9b. While this specific tree is rated for zones 4-8, with proper care and variety selection, apple trees can still thrive in slightly warmer climates. You may need to provide extra care during heat waves.\n\n**Recommendation:** I would recommend investigating varieties of Malus Domestica suited to slightly warmer climates or contacting a local nursery/arborist to verify if it is a good fit for your local climate conditions.\n"
Output diberikan dalam format markdown.
10. Membuat indeks tetangga terdekat
Set data kami relatif kecil dan waktu respons terutama bergantung pada interaksi dengan model AI. Namun, jika Anda memiliki jutaan vektor, penelusuran vektor dapat memakan sebagian besar waktu respons kami dan memberikan beban yang tinggi pada sistem. Untuk meningkatkan kualitasnya, kita dapat membuat indeks di atas vektor.
Buat indeks ScANN
Kita akan mencoba jenis indeks ScANN untuk pengujian.
Untuk membuat indeks kolom sematan, kita perlu menentukan pengukuran jarak untuk kolom sematan. Anda dapat membaca parameter secara mendetail di dokumentasi.
CREATE VECTOR INDEX cymbal_products_embedding_idx ON cymbal_products(embedding) USING SCANN DISTANCE_MEASURE=COSINE;
Bandingkan Respons
Sekarang kita dapat menjalankan kueri penelusuran vektor lagi dan melihat hasilnya
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;
Output yang diharapkan:
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+ | 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)
Kita dapat melihat bahwa waktu eksekusi hanya sedikit berbeda, tetapi hal ini wajar untuk set data yang kecil. Perbedaannya akan lebih terasa untuk set data besar dengan jutaan vektor.
Kita dapat melihat rencana eksekusi menggunakan perintah EXPLAIN:
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;
Rencana eksekusi (kutipan):
...
-> 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)
...
Kita dapat melihat bahwa kueri tersebut menggunakan pemindaian indeks vektor pada cp (alias untuk tabel cymbal_products).
Anda dapat bereksperimen dengan data Anda sendiri atau menguji berbagai kueri penelusuran untuk melihat cara kerja penelusuran semantik di MySQL.
11. Membersihkan lingkungan
Hapus instance Cloud SQL
Hancurkan instance Cloud SQL setelah Anda selesai mengerjakan lab
Di Cloud Shell, tentukan variabel project dan lingkungan jika koneksi Anda terputus dan semua setelan sebelumnya hilang:
export INSTANCE_NAME=my-cloudsql-instance
export PROJECT_ID=$(gcloud config get-value project)
Hapus instance:
gcloud sql instances delete $INSTANCE_NAME --project=$PROJECT_ID
Output konsol yang diharapkan:
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. Selamat
Selamat, Anda telah menyelesaikan codelab.
Jalur Pembelajaran Google Cloud
Lab ini merupakan bagian dari Alur Pembelajaran AI Siap Produksi dengan Google Cloud.
- Jelajahi kurikulum lengkap untuk menjembatani kesenjangan dari prototipe hingga produksi.
- Bagikan progres Anda dengan hashtag
#ProductionReadyAI.
Yang telah kita bahas
- Cara men-deploy instance Cloud SQL untuk PostgreSQL
- Cara membuat database dan mengaktifkan integrasi AI Cloud SQL
- Cara memuat data ke database
- Cara menggunakan Cloud SQL Studio
- Cara menggunakan model penyematan Vertex AI di Cloud SQL
- Cara menggunakan Vertex AI Studio
- Cara memperkaya hasil menggunakan model generatif Vertex AI
- Cara meningkatkan performa menggunakan indeks vektor
Coba codelab serupa untuk AlloyDB atau codelab untuk Cloud SQL untuk Postgres
13. Survei
Output: