Mulai menggunakan Vector Embedding di Cloud SQL untuk MySQL

Mulai menggunakan Vector Embedding di Cloud SQL untuk MySQL

Tentang codelab ini

subjectTerakhir diperbarui Apr 22, 2025
account_circleDitulis oleh Gleb Otochkin

1. Pengantar

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

30b7c4dcdd8bb68f.png

  • Pemahaman dasar tentang Google Cloud, konsol
  • Keterampilan dasar dalam antarmuka command line dan Cloud Shell
  • Cara men-deploy instance Cloud SQL untuk MySQL
  • Cara membuat database dan mengaktifkan integrasi Cloud SQL AI
  • Cara memuat data ke database
  • Cara menggunakan model penyematan Vertex AI di Cloud SQL
  • 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 lingkungan mandiri

  1. Login ke Google Cloud Console dan buat project baru atau gunakan kembali project yang sudah ada. Jika belum memiliki akun Gmail atau Google Workspace, Anda harus membuatnya.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Project name adalah nama tampilan untuk peserta project ini. String ini adalah string karakter yang tidak digunakan oleh Google API. Anda dapat memperbaruinya kapan saja.
  • Project ID bersifat unik di semua project Google Cloud dan tidak dapat diubah (tidak dapat diubah setelah ditetapkan). Cloud Console otomatis membuat string unik; biasanya Anda tidak mementingkan kata-katanya. Di sebagian besar codelab, Anda harus merujuk Project ID-nya (umumnya diidentifikasi sebagai PROJECT_ID). Jika tidak suka dengan ID yang dibuat, Anda dapat membuat ID acak lainnya. Atau, Anda dapat mencobanya sendiri, dan lihat apakah ID tersebut tersedia. ID tidak dapat diubah setelah langkah ini dan tersedia selama durasi project.
  • Sebagai informasi, ada nilai ketiga, Project Number, yang digunakan oleh beberapa API. Pelajari lebih lanjut ketiga nilai ini di dokumentasi.
  1. Selanjutnya, Anda harus mengaktifkan penagihan di Konsol Cloud untuk menggunakan resource/API Cloud. Menjalankan operasi dalam codelab ini tidak akan memakan banyak biaya, bahkan mungkin tidak sama sekali. Guna mematikan resource agar tidak menimbulkan penagihan di luar tutorial ini, Anda dapat menghapus resource yang dibuat atau menghapus project-nya. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program 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:

55efc1aaa7a4d3ad.png

Hanya perlu waktu beberapa saat untuk penyediaan dan terhubung ke lingkungan. Jika sudah selesai, Anda akan melihat tampilan seperti ini:

7ffe5cbb04455448.png

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

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

4. Membuat instance Cloud SQL

Membuat instance Cloud SQL dengan integrasi database dengan Vertex AI.

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

Perhatikan 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 yang dijalankan 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>

Mengaktifkan Integrasi Vertex AI

Berikan hak istimewa yang diperlukan ke akun layanan cloud sql internal agar dapat menggunakan integrasi Vertex AI.

Cari tahu 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

Berikan akses ke Vertex AI 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

Sekarang kita perlu membuat database dan mengaktifkan dukungan vektor.

Buat Database

Buat database dengan nama quickstart_db .Untuk melakukannya, kita memiliki opsi yang berbeda 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 Cymbal Store 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 kembali variabel CLOUDSQL_PASSWORD:

export CLOUDSQL_PASSWORD=...your password defined for the instance...

Sekarang kita dapat membuat semua objek yang diperlukan di database. Untuk melakukannya, kita akan menggunakan utilitas mysql MySQL yang dikombinasikan dengan utilitas curl yang mendapatkan 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 sebenarnya kita lakukan dalam perintah sebelumnya? Kita terhubung ke database dan menjalankan kode SQL yang didownload yang membuat tabel, indeks, dan urutan.

Langkah berikutnya adalah memuat data cymbal_products. Kami 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;"

Dan 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 memiliki data contoh sendiri dan file CSV yang kompatibel dengan alat impor Cloud SQL yang tersedia dari Cloud Console, Anda dapat menggunakannya, bukan pendekatan yang disajikan.

7. Membuat Embedding

Langkah berikutnya adalah membuat penyematan 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

Menghubungkan ke database:

mysql --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db

Dan buat penyematan kolom virtual di tabel cymbal_products menggunakan fungsi penyematan.

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 penyematan vektor untuk 2.000 baris biasanya memerlukan waktu kurang dari 5 menit, tetapi terkadang bisa sedikit lebih lama, dan sering kali selesai jauh 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 penyematan yang sama.

Kueri SQL dapat dieksekusi dari antarmuka command line yang sama atau, sebagai alternatif, dari Cloud SQL Studio. Kueri multibaris dan kompleks sebaiknya 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=%

Memulai Cloud SQL Studio

Di konsol, klik instance Cloud SQL yang telah kita buat sebelumnya.

667b658dbf98eb0b.png

Saat terbuka di panel kanan, kita dapat melihat Cloud SQL Studio. Klik tombol tersebut.

a879e8ac914a8ce9.png

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

Lalu klik tombol "AUTHENTICATE".

36e6036847333d18.png

Tindakan ini akan membuka jendela berikutnya tempat Anda mengklik tab "Editor" di sisi kanan untuk membuka SQL Editor.

d803b7b6a798094f.png

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 vektor terdengar seperti "Jenis pohon buah apa yang tumbuh dengan baik di sini?"

Berikut adalah 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 "JALANKAN" atau tempelkan di sesi command line yang terhubung ke database quickstart_db.

dffc70835901cf03.png

Berikut adalah daftar produk yang dipilih yang 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.

Sekarang kita menjalankan kueri yang sama, tetapi menggunakan penelusuran KNN menggunakan fungsi approx_distance. Jika tidak memiliki indeks ANN untuk penyematan, penelusuran 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 Respons LLM Menggunakan Data yang Diambil

Kita dapat meningkatkan respons LLM AI Generatif ke aplikasi klien menggunakan hasil kueri yang dieksekusi dan menyiapkan output yang bermakna menggunakan hasil kueri yang disediakan 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 dihasilkan sebagai tambahan 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 yang 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"}]

Menjalankan 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 Vertex AI Studio Prompt di konsol cloud.

411ffb9d164ac140.png

Anda mungkin diminta untuk mengaktifkan API tambahan, tetapi Anda dapat mengabaikan permintaan tersebut. Kita tidak memerlukan API tambahan untuk menyelesaikan lab.

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

Dan 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.0-flash:

9839af512686130d.png

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 PSQL

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 yang dihasilkan dalam subkueri dengan hasil JSON untuk menyediakannya sebagai bagian dari perintah ke model teks AI generatif menggunakan SQL.

Dalam 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 model dan parameter.:

"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 disediakan dalam format markdown.

10. Membuat indeks tetangga terdekat

Set data kami relatif kecil dan waktu responsnya terutama bergantung pada interaksi dengan model AI. Namun, jika Anda memiliki jutaan vektor, penelusuran vektor dapat menghabiskan sebagian besar waktu respons kami dan membebani sistem secara tinggi. Untuk meningkatkannya, kita dapat membuat indeks di atas vektor.

Membuat indeks ScANN

Kita akan mencoba jenis indeks ScANN untuk pengujian.

Untuk membuat indeks kolom penyematan, kita perlu menentukan pengukuran jarak untuk kolom penyematan. 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. Hal ini akan jauh lebih terlihat untuk set data besar dengan jutaan vektor.

Dan 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 (cuplikan):

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

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

Yang telah kita bahas

  • Cara men-deploy instance Cloud SQL untuk MySQL
  • Cara membuat database dan mengaktifkan integrasi Cloud SQL AI
  • Cara memuat data ke database
  • Cara menggunakan model penyematan Vertex AI di Cloud SQL
  • Cara memperkaya hasil menggunakan model generatif Vertex AI
  • Cara meningkatkan performa menggunakan indeks vektor

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

13. Survei

Output:

Bagaimana Anda akan menggunakan tutorial ini?