Mulai menggunakan Vector Embedding di Cloud SQL untuk MySQL

1. Pengantar

Dalam codelab ini, Anda akan mempelajari cara menggunakan integrasi AI Cloud SQL untuk MySQL untuk penelusuran semantik menggunakan embedding dan cara meningkatkan performa menggunakan indeks pada data vektor.

8aa6ba3bc12a1593.png

Prasyarat

  • Pemahaman dasar tentang Google Cloud dan konsol Google Cloud
  • Pengalaman dasar dengan antarmuka command line dan Cloud Shell

Yang akan Anda pelajari

  • Cara men-deploy instance Cloud SQL untuk MySQL
  • Cara membuat database dan mengaktifkan integrasi AI Cloud SQL
  • Cara memuat data ke database
  • Cara menggunakan Cloud SQL Studio
  • Cara menggunakan model embedding Vertex AI di Cloud SQL
  • Cara menggunakan Agent Platform Studio
  • Cara memperkaya hasil menggunakan model Gemini Enterprise Agent Platform
  • Cara meningkatkan performa menggunakan indeks vektor

Yang Anda butuhkan

  • Akun Google Cloud dan Project Google Cloud
  • Browser web seperti Chrome

2. Penyiapan dan Persyaratan

Penyiapan Project

  1. Login ke Konsol Google Cloud. Jika belum memiliki akun Gmail atau Google Workspace, Anda harus membuat Akun Google.

Gunakan akun pribadi, bukan akun kantor atau sekolah.

  1. Buat project baru atau gunakan kembali project yang sudah ada. Untuk membuat project baru di Konsol Google Cloud, klik Select a project di toolbar.

295004821bab6a87.png

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

37d264871000675d.png

Dalam dialog, masukkan Project name dan pilih Location.

96d86d3d5655cdbe.png

  • 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 merujuk project ID, yang biasanya diidentifikasi dengan placeholder .
  • Sebagai informasi, ada nilai ketiga, Project Number, yang digunakan oleh beberapa API. Pelajari lebih lanjut ketiga nilai ini di dokumentasi Membuat dan mengelola project.

Aktifkan Penagihan

Untuk mengaktifkan penagihan, Anda memiliki dua opsi. Anda dapat menggunakan akun penagihan pribadi atau menukarkan kredit dengan langkah-langkah berikut.

Menukarkan kredit Google Cloud (opsional)

Untuk menjalankan workshop ini, Anda memerlukan akun penagihan dengan kredit. Gunakan kredit yang disediakan oleh penyelenggara workshop atau jika disediakan di banner di bagian atas codelab ini untuk memulai. Jika sudah terhubung ke akun penagihan, Anda dapat melewati langkah ini.

Menyiapkan akun penagihan pribadi

Jika Anda menyiapkan penagihan menggunakan kredit Google Cloud, Anda dapat melewati langkah ini.

Untuk menyiapkan akun penagihan pribadi, aktifkan penagihan di konsol Penagihan Google Cloud.

Catatan:

  • Menyelesaikan lab ini memerlukan biaya kurang dari $5 USD untuk resource Google Cloud.
  • Ikuti langkah-langkah di akhir lab ini untuk menghapus resource dan menghindari biaya lebih lanjut.
  • Pengguna baru memenuhi syarat untuk mengikuti Uji Coba Gratis senilai$300 USD.
  • Pengguna baru dan lama dapat mulai menggunakan Cloud SQL dengan instance uji coba gratis Cloud SQL

Mulai Cloud Shell

Meskipun Anda dapat mengoperasikan Google Cloud dari jarak jauh menggunakan komputer, dalam codelab ini Anda akan menggunakan Google Cloud Shell, lingkungan command line yang berjalan di cloud.

Di Konsol Google Cloud, klik ikon Cloud Shell di toolbar kanan atas:

Mengaktifkan Cloud Shell

Atau, tekan g, lalu s di dalam konsol Google Cloud, atau buka Cloud Shell.

Proses penyediaan dan koneksi ke lingkungan hanya memerlukan waktu beberapa saat. Setelah selesai, Anda akan melihat terminal yang terhubung:

Screenshot terminal Google Cloud Shell yang menunjukkan bahwa lingkungan telah terhubung

Virtual machine ini dilengkapi semua alat pengembangan yang Anda perlukan. Layanan ini menawarkan direktori beranda tetap sebesar 5 GB dan beroperasi di Google Cloud, sehingga meningkatkan performa dan autentikasi jaringan. Semua pekerjaan Anda dalam codelab ini dapat dilakukan di browser.

3. Sebelum memulai

Aktifkan API

Untuk menggunakan Cloud SQL, Compute Engine, Service Networking, dan Gemini Enterprise Agent Platform, aktifkan API masing-masing di project Google Cloud Anda.

Di terminal Cloud Shell, pastikan project ID Anda sudah ditetapkan:

gcloud config get project

Jika menampilkan string kosong, tetapkan dengan:

gcloud config set project [YOUR-PROJECT-ID]

Tetapkan variabel lingkungan PROJECT_ID:

PROJECT_ID=$(gcloud config get-value project)

Aktifkan semua API 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.

Anda dapat membaca tentang setiap API yang diaktifkan dalam dokumentasi.

4. Membuat instance Cloud SQL

Buat instance Cloud SQL dengan integrasi database Gemini Enterprise Agent Platform.

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 16`

Tampilkan nilai sandi yang dibuat:

echo $CLOUDSQL_PASSWORD

Catat sandi yang dibuat untuk menggunakannya nanti.

Membuat Instance Cloud SQL untuk MySQL

Instance Cloud SQL dapat dibuat menggunakan beberapa metode, termasuk konsol Google Cloud, Terraform, atau Google Cloud CLI (gcloud). Dalam codelab ini, Anda akan menggunakan gcloud. Untuk mempelajari cara membuat instance dengan alat lain, lihat dokumentasi Membuat instance.

Flag cloudsql_vector dapat diaktifkan saat membuat instance. Dukungan vektor 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

Hubungkan ke instance menggunakan gcloud sql connect. Saat diminta, masukkan sandi:

gcloud sql connect my-cloudsql-instance --user=root

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 dengan menekan Ctrl+D atau memasukkan exit:

exit

Mengaktifkan integrasi Gemini Enterprise Agent Platform

Berikan peran IAM yang diperlukan ke akun layanan Cloud SQL untuk mengaktifkan integrasi Gemini Enterprise Agent Platform.

Ambil email akun layanan Cloud SQL dan ekspor sebagai variabel lingkungan:

SERVICE_ACCOUNT_EMAIL=$(gcloud sql instances describe my-cloudsql-instance --format="value(serviceAccountEmailAddress)")
echo $SERVICE_ACCOUNT_EMAIL

Berikan peran roles/aiplatform.user ke 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

Buat database dan aktifkan dukungan vektor.

Buat Database

Buat database bernama quickstart_db. Anda dapat membuat database menggunakan klien database (seperti mysql), Google Cloud CLI, atau Cloud SQL Studio. Pada langkah ini, gunakan gcloud.

Di Cloud Shell, jalankan perintah berikut untuk membuat database:

gcloud sql databases create quickstart_db --instance=my-cloudsql-instance

6. Muat Data

Buat tabel dalam database dan muat data menggunakan file set data Cymbal Store fiktif yang disimpan dalam bucket Cloud Storage publik dalam format CSV.

Cloud Shell akan menjadi lingkungan utama Anda untuk terhubung ke database, membuat semua objek, dan memuat data.

Tambahkan IP publik Cloud Shell Anda ke daftar jaringan yang diizinkan untuk instance Cloud SQL kami.

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...

Buat objek database yang diperlukan. Gunakan mysql bersama dengan curl untuk mendownload dan menerapkan skema 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

Perincian perintah. Pada langkah sebelumnya, Anda terhubung ke database dan menjalankan skrip SQL untuk membuat tabel, indeks, dan urutan.

Selanjutnya, isi database dengan data cymbal_products dengan menjalankan curl dan mysql:

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;"

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;"

Opsional: Jika memiliki set data sampel sendiri, Anda dapat mengimpor file CSV yang kompatibel menggunakan alat Impor di konsol Google Cloud.

7. Membuat Embedding

Buat embedding untuk deskripsi produk menggunakan model text-embedding-005 dari Gemini Enterprise Agent Platform dan simpan sebagai data vektor.

Untuk menyimpan data vektor, Anda harus 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 baru embedding 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);

Catatan: Pembuatan penyematan untuk 2.000 baris biasanya selesai dalam waktu kurang dari 5 menit.

Keluar dari sesi mysql:

exit

8. Menjalankan Penelusuran Kemiripan

Menjalankan penelusuran kemiripan dengan membandingkan embedding vektor yang dihitung untuk deskripsi produk dengan embedding untuk kueri penelusuran.

Anda dapat menjalankan kueri SQL dari command line atau dari Cloud SQL Studio. Studio Cloud SQL menyediakan cara yang lebih mudah untuk mengedit dan menjalankan pernyataan SQL panjang dengan beberapa baris dalam output.

Membuat pengguna MySQL untuk Cloud SQL Studio

Anda memerlukan pengguna database baru yang dapat menggunakan Cloud SQL Studio. Buat pengguna jenis bawaan student dengan sandi yang sama seperti yang Anda 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

  1. Di konsol Google Cloud, buka Instance Cloud SQL, lalu klik my-cloudsql-instance.

Daftar instance Cloud SQL di konsol Google Cloud

  1. Di menu navigasi, klik Cloud SQL Studio.

Item menu Cloud SQL Studio

  1. Di dialog autentikasi, masukkan nama dan kredensial database:
    • Database: quickstart_db
    • Pengguna: student
    • Password:
  2. Klik Autentikasikan.

Dialog autentikasi Cloud SQL Studio

  1. Klik tab Untitled query untuk membuka Editor SQL.

Tab editor SQL Cloud SQL Studio

Jalankan Kueri

Jalankan kueri untuk mengambil 5 produk teratas yang paling relevan dengan kueri pelanggan: "Jenis pohon buah apa yang tumbuh dengan baik di sini?"

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;

Di Cloud SQL Studio, masukkan kueri dan klik Run (atau jalankan kueri di sesi sql Anda):

Menjalankan kueri SQL di Cloud SQL Studio

Kueri akan menampilkan produk yang cocok yang diurutkan berdasarkan jarak kosinus:

+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| 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)

Waktu eksekusi kueri sekitar 0,13 detik dengan fungsi cosine_distance.

Jalankan kueri yang sama, tetapi menggunakan penelusuran KNN dengan fungsi approx_distance. Jika Anda 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 yang tepat KNN.

Baca selengkapnya tentang fungsi ini di dokumentasi Cloud SQL untuk MySQL

9. Meningkatkan Kualitas Respons LLM Menggunakan Data yang Diambil

Meningkatkan kualitas respons AI generatif ke aplikasi klien dengan meneruskan hasil kueri sebagai konteks yang di-grounding dalam perintah ke model bahasa dasar Gemini Enterprise Agent Platform.

Untuk melakukan hal ini:

  1. Buat payload JSON dari hasil penelusuran vektor di Cloud SQL.
  2. Uji perintah di Agent Platform Studio.
  3. Jalankan perintah end-to-end langsung dari SQL menggunakan integrasi google_ml.

Membuat output dalam format JSON

Ubah kueri untuk memformat hasil sebagai JSON dan menampilkan satu baris:

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;

Output JSON yang diharapkan:

[{"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 Agent Platform Studio

Berikan JSON yang dihasilkan sebagai konteks dalam perintah ke model generatif di Agent Platform Studio.

  1. Di konsol Google Cloud, buka Agent Platform Studio.

Navigasi Agent Platform Studio

  1. Masukkan perintah berikut di Agent Platform Studio:

Memasukkan perintah di Agent Platform Studio

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.

Ganti dengan respons JSON dari kueri Anda:

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.

Perintah di Agent Platform Studio

  1. Jalankan perintah.

Hasil perintah di Agent Platform Studio

Jawaban mencakup harga, deskripsi, dan informasi tambahan yang diperoleh model dari sumber eksternal berdasarkan informasi tentang pohon dan lokasi.

Menjalankan perintah di SQL

Anda juga dapat menggunakan integrasi AI Cloud SQL dengan Gemini Enterprise Agent Platform untuk mendapatkan respons dari model generatif langsung dalam SQL.

Pertama, daftarkan model.

  1. Daftarkan model gemini-3.5-flash untuk membuat respons (ganti dengan project ID Anda):
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);

Kita juga dapat menggunakan integrasi AI Cloud SQL dengan Gemini Enterprise Agent Platform 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('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;

Berikut adalah contoh output-nya. Output Anda mungkin berbeda, bergantung pada versi dan parameter model:

"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!"

Output diberikan dalam format Markdown.

10. Membuat indeks tetangga terdekat

Untuk set data besar dengan jutaan vektor, penelusuran vektor dapat memerlukan resource komputasi yang signifikan. Untuk meningkatkan performa kueri, buat indeks pada penyematan vektor.

Membuat indeks ScaNN

Kita akan mencoba jenis indeks ScaNN untuk pengujian.

Untuk membuat indeks kolom sematan, Anda perlu menentukan pengukuran jarak untuk kolom sematan. Anda dapat membaca parameter secara mendetail dalam dokumentasi.

CREATE VECTOR INDEX cymbal_products_embedding_idx ON cymbal_products(embedding) USING SCANN DISTANCE_MEASURE=COSINE;

Bandingkan Respons

Jalankan kueri penelusuran vektor lagi dan lihat 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)

Peningkatan performa hanya sedikit berbeda, tetapi hal ini wajar untuk set data yang kecil. Hal ini akan lebih terasa untuk set data besar dengan jutaan vektor.

Periksa 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)

...

Kueri ini menampilkan pemindaian indeks vektor pada tabel cp(alias untuk tabel cymbal_products).

Coba dengan data Anda sendiri atau uji kueri penelusuran yang berbeda 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 Anda bahas

  • Cara men-deploy instance Cloud SQL untuk MySQL
  • Cara membuat database dan mengaktifkan integrasi AI Cloud SQL
  • Cara memuat data ke database
  • Cara menggunakan Cloud SQL Studio
  • Cara menggunakan model embedding Vertex AI di Cloud SQL
  • Cara menggunakan Agent Platform Studio
  • Cara memperkaya hasil menggunakan model Gemini Enterprise Agent Platform
  • Cara meningkatkan performa menggunakan indeks vektor

Coba codelab serupa untuk AlloyDB atau codelab untuk Cloud SQL untuk Postgres

Survei

Output:

Bagaimana Anda akan menggunakan tutorial ini?

Hanya membacanya Membaca dan menyelesaikan latihannya