1. Pengantar
Dalam codelab ini, Anda akan mempelajari cara menggunakan AlloyDB AI dengan menggabungkan penelusuran vektor dengan embedding Vertex AI. Lab ini adalah bagian dari kumpulan lab yang dikhususkan untuk fitur AI AlloyDB. Anda dapat membaca selengkapnya di halaman AlloyDB AI dalam dokumentasi.

Prasyarat
- Pemahaman dasar tentang Google Cloud, konsol
- Keterampilan dasar menggunakan antarmuka command line dan Cloud Shell
Yang akan Anda pelajari
- Cara men-deploy cluster dan instance utama AlloyDB
- Cara menghubungkan ke AlloyDB dari VM Google Compute Engine
- Cara membuat database dan mengaktifkan AlloyDB AI
- Cara memuat data ke database
- Cara menggunakan AlloyDB Studio
- Cara menggunakan model penyematan Gemini Enterprise Agent Platform di AlloyDB
- Cara menggunakan Gemini Enterprise Agent Platform Studio
- Cara memperkaya hasil menggunakan model generatif 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
- 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
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 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:

Atau, Anda dapat menekan G, lalu S. Urutan ini akan mengaktifkan Cloud Shell jika Anda berada di 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
Output:
Untuk menggunakan AlloyDB, Compute Engine, Layanan jaringan, dan Gemini Enterprise Agent Platform, Anda harus mengaktifkan masing-masing API di project Google Cloud Anda.
Mengaktifkan API
Di dalam Cloud Shell di terminal, 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 API yang diperlukan:
gcloud services enable alloydb.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 alloydb.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. Men-deploy AlloyDB
Sebelum membuat cluster AlloyDB, alokasikan rentang IP pribadi yang tersedia di VPC Anda untuk digunakan oleh instance AlloyDB mendatang. Jika Anda belum memilikinya, Anda harus membuatnya, menetapkannya untuk digunakan oleh layanan Google internal, dan setelah itu Anda dapat membuat cluster dan instance.
Buat rentang IP pribadi
Anda perlu mengonfigurasi konfigurasi Akses Layanan Pribadi di VPC untuk AlloyDB. Asumsinya di sini adalah Anda memiliki jaringan VPC "default" dalam project dan jaringan tersebut akan digunakan untuk semua tindakan.
Buat rentang IP pribadi:
gcloud compute addresses create psa-range \
--global \
--purpose=VPC_PEERING \
--prefix-length=24 \
--description="VPC private service access" \
--network=default
Buat koneksi pribadi menggunakan rentang IP yang dialokasikan:
gcloud services vpc-peerings connect \
--service=servicenetworking.googleapis.com \
--ranges=psa-range \
--network=default
Output konsol yang diharapkan:
student@cloudshell:~ (test-project-402417)$ gcloud compute addresses create psa-range \
--global \
--purpose=VPC_PEERING \
--prefix-length=24 \
--description="VPC private service access" \
--network=default
Created [https://www.googleapis.com/compute/v1/projects/test-project-402417/global/addresses/psa-range].
student@cloudshell:~ (test-project-402417)$ gcloud services vpc-peerings connect \
--service=servicenetworking.googleapis.com \
--ranges=psa-range \
--network=default
Operation "operations/pssn.p24-4470404856-595e209f-19b7-4669-8a71-cbd45de8ba66" finished successfully.
student@cloudshell:~ (test-project-402417)$
Buat Cluster AlloyDB
Buat cluster AlloyDB di region us-central1
Tentukan sandi untuk pengguna postgres. Anda dapat menentukan sandi Anda sendiri atau menggunakan fungsi acak untuk membuatnya
export PGPASSWORD=`openssl rand -hex 16`
Output konsol yang diharapkan:
student@cloudshell:~ (test-project-402417)$ export PGPASSWORD=`openssl rand -hex 12`
Catat sandi PostgreSQL untuk penggunaan berikutnya:
echo $PGPASSWORD
Anda akan memerlukan sandi tersebut pada masa mendatang untuk terhubung ke instance sebagai pengguna postgres. Simpan sandi ini untuk digunakan pada langkah berikutnya.
Output konsol yang diharapkan:
student@cloudshell:~ (test-project-402417)$ echo $PGPASSWORD bbefbfde7601985b0dee5723 (Note: Yours will be different!)
Membuat Cluster Uji Coba Gratis
Jika belum pernah menggunakan AlloyDB sebelumnya, Anda dapat membuat cluster uji coba gratis:
Tetapkan variabel lingkungan untuk region dan nama cluster:
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
Jalankan perintah untuk membuat cluster:
gcloud alloydb clusters create $ADBCLUSTER \
--password=$PGPASSWORD \
--network=default \
--region=$REGION \
--subscription-type=TRIAL
Output konsol yang diharapkan:
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
gcloud alloydb clusters create $ADBCLUSTER \
--password=$PGPASSWORD \
--network=default \
--region=$REGION \
--subscription-type=TRIAL
Operation ID: operation-1697655441138-6080235852277-9e7f04f5-2012fce4
Creating cluster...done.
Buat instance utama AlloyDB untuk cluster Anda di sesi Cloud Shell yang sama. Jika koneksi terputus, Anda harus menentukan variabel lingkungan nama cluster dan region lagi.
gcloud alloydb instances create $ADBCLUSTER-pr \
--instance-type=PRIMARY \
--cpu-count=8 \
--region=$REGION \
--cluster=$ADBCLUSTER
Output konsol yang diharapkan:
student@cloudshell:~ (test-project-402417)$ gcloud alloydb instances create $ADBCLUSTER-pr \
--instance-type=PRIMARY \
--cpu-count=8 \
--region=$REGION \
--availability-type ZONAL \
--cluster=$ADBCLUSTER
Operation ID: operation-1697659203545-6080315c6e8ee-391805db-25852721
Creating instance...done.
Buat Cluster Standar AlloyDB
Jika ini bukan cluster AlloyDB pertama Anda dalam project, lanjutkan pembuatan cluster standar. Jika Anda telah membuat cluster uji coba gratis, lewati langkah ini.
Tetapkan variabel lingkungan untuk region dan nama cluster:
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
Jalankan perintah untuk membuat cluster:
gcloud alloydb clusters create $ADBCLUSTER \
--password=$PGPASSWORD \
--network=default \
--region=$REGION
Output konsol yang diharapkan:
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
gcloud alloydb clusters create $ADBCLUSTER \
--password=$PGPASSWORD \
--network=default \
--region=$REGION
Operation ID: operation-1697655441138-6080235852277-9e7f04f5-2012fce4
Creating cluster...done.
Buat instance utama AlloyDB untuk cluster Anda di sesi Cloud Shell yang sama. Jika koneksi terputus, Anda harus menentukan variabel lingkungan nama cluster dan region lagi.
gcloud alloydb instances create $ADBCLUSTER-pr \
--instance-type=PRIMARY \
--cpu-count=2 \
--region=$REGION \
--cluster=$ADBCLUSTER
Output konsol yang diharapkan:
student@cloudshell:~ (test-project-402417)$ gcloud alloydb instances create $ADBCLUSTER-pr \
--instance-type=PRIMARY \
--cpu-count=2 \
--region=$REGION \
--availability-type ZONAL \
--cluster=$ADBCLUSTER
Operation ID: operation-1697659203545-6080315c6e8ee-391805db-25852721
Creating instance...done.
5. Membuat koneksi ke AlloyDB
AlloyDB di-deploy menggunakan koneksi khusus pribadi, jadi Anda memerlukan VM Compute Engine dengan klien PostgreSQL yang diinstal untuk menggunakan database.
Deploy VM GCE
Buat VM GCE di region dan VPC yang sama dengan cluster AlloyDB.
Di Cloud Shell, jalankan:
export ZONE=us-central1-a
gcloud compute instances create instance-1 \
--zone=$ZONE \
--create-disk=auto-delete=yes,boot=yes,image=projects/debian-cloud/global/images/$(gcloud compute images list --filter="family=debian-13 AND family!=debian-13-arm64" --format="value(name)") \
--scopes=https://www.googleapis.com/auth/cloud-platform
Output konsol yang diharapkan:
student@cloudshell:~ (test-project-402417)$ export ZONE=us-central1-a
gcloud compute instances create instance-1 \
--zone=$ZONE \
--create-disk=auto-delete=yes,boot=yes,image=projects/debian-cloud/global/images/$(gcloud compute images list --filter="family=debian-13 AND family!=debian-13-arm64" --format="value(name)") \
--scopes=https://www.googleapis.com/auth/cloud-platform
Created [https://www.googleapis.com/compute/v1/projects/test-project-402417/zones/us-central1-a/instances/instance-1].
NAME: instance-1
ZONE: us-central1-a
MACHINE_TYPE: n1-standard-1
PREEMPTIBLE:
INTERNAL_IP: 10.128.0.2
EXTERNAL_IP: 34.71.192.233
STATUS: RUNNING
Instal Klien Postgres
Instal software klien PostgreSQL pada VM yang di-deploy
Hubungkan ke VM:
gcloud compute ssh instance-1 --zone=us-central1-a
Output konsol yang diharapkan:
student@cloudshell:~ (test-project-402417)$ gcloud compute ssh instance-1 --zone=us-central1-a Updating project ssh metadata...working..Updated [https://www.googleapis.com/compute/v1/projects/test-project-402417]. Updating project ssh metadata...done. Waiting for SSH key to propagate. Warning: Permanently added 'compute.5110295539541121102' (ECDSA) to the list of known hosts. Linux instance-1 6.12.101+deb13-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.101-1 (2026-08-05) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. student@instance-1:~$
Instal software yang menjalankan perintah dalam VM:
sudo apt-get update
sudo apt-get install --yes postgresql-client
Output konsol yang diharapkan:
student@instance-1:~$ sudo apt-get update sudo apt-get install --yes postgresql-client Get:1 file:/etc/apt/mirrors/debian.list Mirrorlist [30 B] Get:2 file:/etc/apt/mirrors/debian-security.list Mirrorlist [39 B] Hit:3 https://deb.debian.org/debian trixie InRelease Get:4 https://deb.debian.org/debian trixie-updates InRelease [47.3 kB] Get:5 https://deb.debian.org/debian trixie-backports InRelease [54.0 kB] Get:6 https://deb.debian.org/debian-security trixie-security InRelease [43.4 kB] Hit:10 https://packages.cloud.google.com/apt google-compute-engine-trixie-stable InRelease ...redacted... update-alternatives: using /usr/share/postgresql/17/man/man1/psql.1.gz to provide /usr/share/man/man1/psql.1.gz (psql.1.gz) in auto mode Setting up postgresql-client (17+278) ... Processing triggers for man-db (2.13.1-1) ... Processing triggers for libc-bin (2.41-12+deb13u3) ...
Hubungkan ke Instance
Hubungkan ke instance utama dari VM menggunakan psql.
Di tab Cloud Shell yang sama dengan sesi SSH yang dibuka ke VM instance-1 Anda.
Gunakan nilai sandi AlloyDB (PGPASSWORD) yang dicatat dan ID cluster AlloyDB untuk terhubung ke AlloyDB dari VM GCE:
export PGPASSWORD=<Noted password>
export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
export INSTANCE_IP=$(gcloud alloydb instances describe $ADBCLUSTER-pr --cluster=$ADBCLUSTER --region=$REGION --format="value(ipAddress)")
psql "host=$INSTANCE_IP user=postgres sslmode=require"
Output konsol yang diharapkan:
student@instance-1:~$ export PGPASSWORD=CQhOi5OygD4ps6ty student@instance-1:~$ export PROJECT_ID=$(gcloud config get-value project) export REGION=us-central1 export ADBCLUSTER=alloydb-aip-01 export INSTANCE_IP=$(gcloud alloydb instances describe $ADBCLUSTER-pr --cluster=$ADBCLUSTER --region=$REGION --format="value(ipAddress)") psql "host=$INSTANCE_IP user=postgres sslmode=require" psql (17.10 (Debian 17.10-0+deb13u1), server 17.9) SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off, ALPN: postgresql) Type "help" for help. postgres=>
Tutup sesi psql:
exit
6. Menyiapkan Database
Buat database, aktifkan integrasi AI Agent Platform, buat objek database, dan impor data.
Memberikan Izin yang Diperlukan ke AlloyDB
Tambahkan izin Gemini Enterprise Agent Platform ke agen layanan AlloyDB.
Buka tab Cloud Shell lain menggunakan tanda "+" di bagian atas.

Di tab Cloud Shell baru, jalankan:
PROJECT_ID=$(gcloud config get-value project)
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"
Output konsol yang diharapkan:
student@cloudshell:~ (test-project-001-402417)$ PROJECT_ID=$(gcloud config get-value project) Your active configuration is: [cloudshell-11039] student@cloudshell:~ (test-project-001-402417)$ gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \ --role="roles/aiplatform.user" Updated IAM policy for project [test-project-001-402417]. bindings: - members: - serviceAccount:service-4470404856@gcp-sa-alloydb.iam.gserviceaccount.com role: roles/aiplatform.user - members: ... etag: BwYIEbe_Z3U= version: 1
Tutup tab dengan menjalankan perintah "exit" di tab:
exit
Buat Database
Mulai cepat pembuatan database.
Dalam sesi VM GCE, jalankan:
Buat database:
psql "host=$INSTANCE_IP user=postgres" -c "CREATE DATABASE quickstart_db"
Output konsol yang diharapkan:
student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres" -c "CREATE DATABASE quickstart_db" CREATE DATABASE student@instance-1:~$
Mengaktifkan Integrasi Vertex AI
Aktifkan integrasi Vertex AI dan ekstensi pgvector di database.
Di VM GCE, jalankan:
psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE"
psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "CREATE EXTENSION IF NOT EXISTS vector"
Output konsol yang diharapkan:
student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE" psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "CREATE EXTENSION IF NOT EXISTS vector" CREATE EXTENSION CREATE EXTENSION student@instance-1:~$
Impor Data
Download data yang telah disiapkan dan impor ke database baru.
Di VM GCE, jalankan:
gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_demo_schema.sql |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"
gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_products.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_products from stdin csv header"
gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_inventory.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_inventory from stdin csv header"
gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_stores.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_stores from stdin csv header"
Output konsol yang diharapkan:
student@instance-1:~$ gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_demo_schema.sql |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" SET SET SET SET SET set_config ------------ (1 row) SET SET SET SET SET SET CREATE TABLE ALTER TABLE CREATE TABLE ALTER TABLE CREATE TABLE ALTER TABLE CREATE TABLE ALTER TABLE CREATE SEQUENCE ALTER TABLE ALTER SEQUENCE ALTER TABLE ALTER TABLE ALTER TABLE student@instance-1:~$ gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_products.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_products from stdin csv header" COPY 941 student@instance-1:~$ gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_inventory.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_inventory from stdin csv header" COPY 263861 student@instance-1:~$ gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_stores.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_stores from stdin csv header" COPY 4654 student@instance-1:~$
7. Menghitung embedding
Setelah mengimpor data, Anda akan memiliki data produk di tabel cymbal_products, inventaris yang menunjukkan jumlah produk yang tersedia di setiap toko dalam tabel cymbal_inventory, dan daftar toko dalam tabel cymbal_stores. Anda perlu menghitung data vektor berdasarkan deskripsi produk dan Anda dapat menggunakan fungsi seperti google_ml.embedding untuk itu. Baca selengkapnya teknologi yang digunakan dalam dokumentasi.
Membuat embedding untuk beberapa baris itu mudah, tetapi bagaimana cara membuatnya efisien jika kita memiliki ribuan baris? Bagian ini menjelaskan cara membuat dan mengelola sematan untuk tabel besar. Baca selengkapnya tentang berbagai opsi dan teknik dalam panduan.
Aktifkan Pembuatan Penyematan Cepat
Hubungkan ke database menggunakan psql dari VM Anda menggunakan IP instance AlloyDB dan sandi postgres:
psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"
Verifikasi versi ekstensi google_ml_integration.
SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';
Versinya harus 1.5.2 atau yang lebih tinggi. Berikut adalah contoh output-nya:
quickstart_db=> SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration'; extversion ------------ 1.6 (1 row)
Versi default harus 1.6 atau yang lebih tinggi, tetapi jika instance Anda menampilkan versi yang lebih lama, kemungkinan perlu diupdate. Periksa apakah pemeliharaan dinonaktifkan untuk instance.
Pastikan flag database google_ml_integration.enable_faster_embedding_generation disetel ke aktif. Dalam sesi psql yang sama, periksa nilai untuk tanda:
show google_ml_integration.enable_faster_embedding_generation;
Jika tanda berada di posisi yang benar, output yang diharapkan akan terlihat seperti ini:
quickstart_db=> show google_ml_integration.enable_faster_embedding_generation; google_ml_integration.enable_faster_embedding_generation ---------------------------------------------------------- on (1 row)
Jika nilai tanda menunjukkan "off", Anda harus memperbarui instance. Lakukan menggunakan konsol web atau perintah gcloud seperti yang dijelaskan dalam dokumentasi.
Keluar dari sesi psql:
exit;
Untuk memperbarui tanda menggunakan gcloud, jalankan:
export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
gcloud beta alloydb instances update $ADBCLUSTER-pr \
--database-flags google_ml_integration.enable_faster_embedding_generation=on \
--region=$REGION \
--cluster=$ADBCLUSTER \
--project=$PROJECT_ID \
--update-mode=FORCE_APPLY
Mungkin perlu waktu beberapa menit, tetapi pada akhirnya nilai tanda akan diubah menjadi "aktif". Setelah itu, Anda dapat melanjutkan ke langkah berikutnya.
Membuat kolom embedding
Hubungkan ke database menggunakan psql dan buat kolom virtual dengan jenis data vektor yang akan digunakan oleh fungsi embedding di tabel cymbal_products.
psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"
Dalam sesi psql setelah terhubung ke database, jalankan:
ALTER TABLE cymbal_products ADD COLUMN embedding vector(768);
Perintah ini membuat kolom virtual untuk sematan mendatang.
Output konsol yang diharapkan:
quickstart_db=> ALTER TABLE cymbal_products ADD COLUMN embedding vector(768); ALTER TABLE quickstart_db=>
Buat embedding dalam batch 50 baris. Dalam sesi psql yang sama, jalankan:
Aktifkan pengaturan waktu untuk mengukur berapa lama waktu yang dibutuhkan:
\timing
Jalankan perintah:
CALL ai.initialize_embeddings(
model_id => 'text-embedding-005',
table_name => 'cymbal_products',
content_column => 'product_description',
embedding_column => 'embedding',
batch_size => 50
);
Output konsol menunjukkan waktu kurang dari 2 detik untuk pembuatan penyematan:
quickstart_db=> CALL ai.initialize_embeddings(
model_id => 'text-embedding-005',
table_name => 'cymbal_products',
content_column => 'product_description',
embedding_column => 'embedding',
batch_size => 50
);
NOTICE: Initialize embedding completed successfully for table cymbal_products
CALL
Time: 1458.704 ms (00:01.459)
quickstart_db=>
Anda dapat bereksperimen dengan berbagai ukuran batch dan melihat apakah hal itu mengubah waktu eksekusi.
Secara default, sematan tidak diperbarui jika kolom product_description yang sesuai diperbarui atau seluruh baris baru dimasukkan. Namun, Anda dapat melakukannya dengan menyetel parameter incremental_refresh_mode.
Buat kolom "product_embeddings" dan perbarui secara otomatis:
ALTER TABLE cymbal_products ADD COLUMN product_embedding vector(768);
CALL ai.initialize_embeddings(
model_id => 'text-embedding-005',
table_name => 'cymbal_products',
content_column => 'product_description',
embedding_column => 'product_embedding',
batch_size => 50,
incremental_refresh_mode => 'transactional'
);
Sisipkan baris baru ke tabel.
INSERT INTO "cymbal_products" ("uniq_id", "crawl_timestamp", "product_url", "product_name", "product_description", "list_price", "sale_price", "brand", "item_number", "gtin", "package_size", "category", "postal_code", "available", "product_embedding", "embedding") VALUES ('fd604542e04b470f9e6348e640cff794', NOW(), 'https://example.com/new_product', 'New Cymbal Product', 'This is a new cymbal product description.', 199.99, 149.99, 'Example Brand', 'EB123', '1234567890', 'Single', 'Cymbals', '12345', TRUE, NULL, NULL);
Kueri tabel untuk membandingkan dua kolom penyematan:
SELECT uniq_id,embedding, (product_embedding::real[])[1:5] as product_embedding FROM cymbal_products WHERE uniq_id='fd604542e04b470f9e6348e640cff794';
Output menunjukkan bahwa product_embedding diisi secara otomatis, sedangkan embedding tetap kosong:
quickstart_db=> SELECT uniq_id,embedding, (product_embedding::real[])[1:5] as product_embedding FROM cymbal_products WHERE uniq_id='fd604542e04b470f9e6348e640cff794';
uniq_id | embedding | product_embedding
----------------------------------+-----------+---------------------------------------------------------------
fd604542e04b470f9e6348e640cff794 | | {0.015003494,-0.005349732,-0.059790313,-0.0087091,-0.0271452}
(1 row)
Time: 3.295 ms
8. Menjalankan Penelusuran Kemiripan
Jalankan penelusuran kemiripan berdasarkan embedding vektor yang dihasilkan menggunakan AlloyDB AI.
Kueri SQL dapat dijalankan dari antarmuka command line psql yang sama atau, sebagai alternatif, dari AlloyDB Studio. Output multi-baris dan kompleks akan berfungsi lebih baik di AlloyDB Studio.
Menghubungkan ke AlloyDB Studio
Untuk membuka AlloyDB Studio, lakukan langkah-langkah berikut:
- Di Konsol Google Cloud, buka halaman Cluster untuk AlloyDB untuk PostgreSQL.
- Pilih instance utama Anda untuk membuka antarmuka web-nya.
3. Kemudian, klik AlloyDB Studio di sebelah kiri:

- Pilih database
quickstart_db, pengguna postgres, berikan sandi yang tercatat, lalu klik Authenticate.

Tindakan ini akan membuka antarmuka AlloyDB Studio.
- Pilih tab Untitled Query untuk membuka editor SQL.

Tindakan ini akan membuka editor tempat Anda dapat menjalankan perintah SQL, seperti yang ditunjukkan pada gambar berikut:

Jika Anda lebih suka menggunakan psql command line, ikuti rute alternatif dan hubungkan ke database dari sesi SSH VM Anda seperti yang telah dijelaskan di bab sebelumnya.
Menjalankan Penelusuran Kemiripan
Jalankan kueri untuk mendapatkan daftar produk yang tersedia dan paling terkait dengan permintaan klien. Frasa penelusuran yang diteruskan ke model embedding di Gemini Enterprise Agent Platform (sama dengan yang kita gunakan untuk membuat embedding produk kita) untuk mendapatkan nilai vektor "What kind of fruit trees grow well here?" (Jenis pohon buah apa yang tumbuh dengan baik di sini?)
Jalankan kueri:
SELECT
cp.product_name,
left(cp.product_description,80) as description,
cp.sale_price,
cs.zip_code,
(cp.embedding <=> embedding('text-embedding-005','What kind of fruit trees grow well here?')::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 10;
Berikut output yang diharapkan:
quickstart_db=> SELECT
cp.product_name,
left(cp.product_description,80) as description,
cp.sale_price,
cs.zip_code,
(cp.embedding <=> embedding('text-embedding-005','What kind of fruit trees grow well here?')::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 10;
product_name | description | sale_price | zip_code | distance
-------------------------+----------------------------------------------------------------------------------+------------+----------+---------------------
Cherry Tree | This is a beautiful cherry tree that will produce delicious cherries. It is an d | 75.00 | 93230 | 0.43922018972266397
Meyer Lemon Tree | Meyer Lemon trees are California's favorite lemon tree! Grow your own lemons by | 34 | 93230 | 0.4685112926118228
Toyon | This is a beautiful toyon tree that can grow to be over 20 feet tall. It is an e | 10.00 | 93230 | 0.4835677149651668
California Lilac | This is a beautiful lilac tree that can grow to be over 10 feet tall. It is an d | 5.00 | 93230 | 0.4947204525907498
California Peppertree | This is a beautiful peppertree that can grow to be over 30 feet tall. It is an e | 25.00 | 93230 | 0.5054166905547247
California Black Walnut | This is a beautiful walnut tree that can grow to be over 80 feet tall. It is a d | 100.00 | 93230 | 0.5084219510932597
California Sycamore | This is a beautiful sycamore tree that can grow to be over 100 feet tall. It is | 300.00 | 93230 | 0.5140519790508755
Coast Live Oak | This is a beautiful oak tree that can grow to be over 100 feet tall. It is an ev | 500.00 | 93230 | 0.5143126438081371
Fremont Cottonwood | This is a beautiful cottonwood tree that can grow to be over 100 feet tall. It i | 200.00 | 93230 | 0.5174774727252058
Madrone | This is a beautiful madrona tree that can grow to be over 80 feet tall. It is an | 50.00 | 93230 | 0.5227400803389093
Anda akan mendapatkan 10 produk dengan deskripsi yang secara semantik dekat dengan frasa penelusuran yang diurutkan berdasarkan jarak dengan yang paling mirip di bagian atas.
9. Tingkatkan Kualitas Respons
Anda dapat meningkatkan kualitas respons ke aplikasi klien menggunakan hasil kueri dan menyiapkan output yang bermakna menggunakan hasil kueri yang diberikan sebagai bagian dari perintah ke model bahasa generatif dasar.
Untuk mencapainya, Anda membuat JSON dengan hasil teratas dari penelusuran vektor, lalu menggunakan JSON yang dibuat tersebut sebagai tambahan pada perintah ke model AI Generatif di Agent Platform untuk membuat output yang bermakna. Langkah pertama menghasilkan JSON, lalu diuji di Agent Platform Studio, dan langkah terakhir menggabungkan semuanya ke dalam satu 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 Agent Platform
Jalankan kueri:
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
(cp.embedding <=> embedding('text-embedding-005','What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1)
SELECT json_agg(trees) FROM trees;
JSON dalam output:
[{"product_name":"Cherry Tree","description":"This is a beautiful cherry tree that will produce delicious cherries. It is an d","sale_price":75.00,"zip_code":93230,"product_id":"d536e9e823296a2eba198e52dd23e712"}]
Jalankan perintah di Vertex AI Studio
Gunakan JSON yang dihasilkan untuk menyediakannya sebagai bagian dari perintah ke model AI generatif di Vertex AI Studio
Buka Gemini Enterprise Agent Platform Studio di konsol Google Cloud.

Tulis perintah Anda di antarmuka:

Masukkan perintah berikut:
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:
{"product_name":"Cherry Tree","description":"This is a beautiful cherry tree that will produce delicious cherries. It is an d","sale_price":75.00,"zip_code":93230,"product_id":"d536e9e823296a2eba198e52dd23e712"}
The customer asked "What tree is growing the best here?"
You should give information about the product, price and some supplemental information

Berikut adalah hasilnya saat kita menjalankan perintah :

Jawaban mencakup harga, deskripsi, dan informasi tambahan yang diperoleh model dari sumber eksternal berdasarkan informasi tentang pohon dan lokasi.
Jalankan perintah di PSQL
Hasil serupa dapat dicapai dengan menjalankan Gunakan integrasi AlloyDB AI dengan Gemini Enterprise Agent Platform untuk mendapatkan respons yang sama dari model generatif menggunakan SQL langsung di database. Sebelum dapat menggunakan model gemini-3.6-flash, Anda harus mendaftarkannya.
Mendaftarkan model gemini-3.6-flash:
Di AlloyDB Studio, jalankan:
CALL google_ml.create_model(
model_id => 'gemini-3.6-flash',
model_request_url => 'https://aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/global/publishers/google/models/gemini-3.6-flash:generateContent',
model_provider => 'google',
model_type => 'llm'
);
Anda selalu dapat memverifikasi daftar model terdaftar dengan memilih informasi dari google_ml.model_info_view.
SELECT model_id,model_type FROM google_ml.model_info_view WHERE model_id ILIKE '%flash%';
Berikut contoh output
quickstart_db=> SELECT model_id,model_type FROM google_ml.model_info_view WHERE model_id ILIKE '%flash%';
model_id | model_type
-----------------------+------------
gemini-3.6-flash | llm
gemini-2.0-flash | llm
gemini-2.5-flash | llm
gemini-2.0-flash-lite | llm
gemini-2.5-flash-lite | llm
(5 rows)
Sekarang Anda dapat menggunakan JSON yang dihasilkan dalam subkueri sebagai bagian dari perintah untuk model gemini-3.6-flash menggunakan SQL.
Dalam sesi psql atau AlloyDB Studio Anda, jalankan kueri berikut:
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
(cp.embedding <=> embedding('text-embedding-005',
'What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1),
prompt AS (
SELECT
'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_agg(trees) || '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
google_ml.predict_row( model_id =>'gemini-3.6-flash',
request_body => json_build_object('contents',
json_build_object('role',
'user',
'parts',
json_build_object('text',
prompt_text))))->'candidates'->0->'content'->'parts'->0->'text' AS resp
FROM
prompt)
SELECT
REPLACE(resp::text, '\n', CHR(10))
FROM
response;
Berikut adalah output yang diharapkan. Output mungkin berbeda karena sifat model AI generatif yang non-deterministik:
"Hello there! I'd be delighted to help you pick out a wonderful fruit tree for your space. Based on our local selection, a fantastic option that grows very well is the **Cherry Tree**! Here are the details on this beautiful tree: * **Product:** Cherry Tree * **Price:** $75.00 ### Why it's a great choice: * **Delicious Harvest:** It produces tasty, fresh cherries right in your backyard. * **Size & Benefits:** It's a deciduous tree that grows to about 15 feet tall, making it ideal for providing both lovely shade and a bit of privacy. * **Year-Round Beauty:** It features lush, dark green leaves throughout the summer that transform into a stunning red in the autumn. * **Growing Requirements:** Cherry trees thrive best in cool, moist climates with sandy soil, and are perfectly suited for USDA hardiness zones 4 through 9. Please let me know if you have any questions about planting or if you'd like help adding this to your order!"
10. Membuat indeks vektor
Karena set data ini kecil, waktu respons terutama bergantung pada interaksi dengan model di Gemini Enterprise Agent Platform. Namun, saat Anda membuat kueri jutaan vektor, penelusuran vektor itu sendiri dapat menggunakan sebagian besar waktu respons dan meningkatkan beban pada database Anda. Untuk meningkatkan performa penelusuran, Anda dapat membuat indeks vektor.
Buat indeks ScaNN
Untuk membuat indeks ScaNN, Anda harus mengaktifkan ekstensi tambahan. Ekstensi alloydb_scann menyediakan antarmuka untuk bekerja dengan indeks vektor Approximate Nearest Neighbor (ANN) menggunakan algoritma ScaNN Google.
Menjalankan di AlloyDB Studio:
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
Indeks dapat dibuat dalam mode MANUAL atau AUTO. Mode MANUAL diaktifkan secara default dan Anda dapat membuat indeks serta mempertahankannya seperti indeks lainnya. Namun, jika Anda mengaktifkan mode OTOMATIS, Anda dapat membuat indeks yang tidak memerlukan pemeliharaan apa pun dari pihak Anda. Anda dapat membaca semua opsi secara mendetail dalam dokumentasi. Kami tidak memiliki baris yang cukup untuk membuat indeks dalam mode OTOMATIS - jadi Anda akan membuatnya sebagai MANUAL.
Menjalankan di AlloyDB Studio:
CREATE INDEX cymbal_products_embeddings_scann ON cymbal_products
USING scann (embedding cosine)
WITH (num_leaves=10, max_num_levels = 1);
Anda dapat membaca tentang penyesuaian parameter indeks dalam dokumentasi.
Output yang diharapkan:
quickstart_db=> CREATE INDEX cymbal_products_embeddings_scann ON cymbal_products USING scann (embedding cosine) WITH (num_leaves=10, max_num_levels = 1); CREATE INDEX quickstart_db=>
Bandingkan Respons
Ulangi kueri yang kita gunakan untuk mendapatkan nilai teratas dalam penelusuran semantik:
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
(cp.embedding <=> embedding('text-embedding-005','What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1)
SELECT json_agg(trees) FROM trees;
Output yang diharapkan:
[{"product_name":"Cherry Tree","description":"This is a beautiful cherry tree that will produce delicious cherries. It is an d","sale_price":75.00,"zip_code":93230,"product_id":"d536e9e823296a2eba198e52dd23e712"}]
"Cherry Tree" yang sama dalam output.
Verifikasi penggunaan indeks:
EXPLAIN (analyze)
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
(cp.embedding <=> embedding('text-embedding-005','What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1)
SELECT json_agg(trees) FROM trees;
Output yang diharapkan (disamarkan agar lebih jelas):
...
Aggregate (cost=27.24..27.25 rows=1 width=32) (actual time=0.964..0.965 rows=1 loops=1)
-> Subquery Scan on trees (cost=18.91..27.23 rows=1 width=142) (actual time=0.953..0.954 rows=1 loops=1)
-> Limit (cost=18.91..27.22 rows=1 width=158) (actual time=0.948..0.949 rows=1 loops=1)
-> Nested Loop (cost=18.91..7126.86 rows=855 width=158) (actual time=0.948..0.948 rows=1 loops=1)
-> Nested Loop (cost=18.63..7103.59 rows=855 width=907) (actual time=0.931..0.931 rows=1 loops=1)
-> Index Scan using cymbal_products_embeddings_scann on cymbal_products cp (cost=18.21..343.15 rows=942 width=903) (actual time=0.906..0.908 rows=2 loops=1)
Order By: (embedding <=> '[-0.106554024,0.035774965,-0.027267234,-0.045653425,-0.03286045,0.02124319...
Dari output, Anda dapat melihat bahwa kueri menggunakan "Index Scan using cymbal_products_embeddings_scann on cymbal_products".
Kueri akan menampilkan pohon Ceri yang sama yang muncul di bagian atas hasil penelusuran Anda sebelum Anda membuat indeks. Karena indeks tetangga terdekat (ANN) mengorbankan akurasi absolut demi kecepatan penelusuran, kueri berbasis indeks terkadang dapat menampilkan hasil teratas yang sedikit berbeda dengan penelusuran persis yang tidak diindeks. Namun, indeks vektor memberikan peningkatan performa yang signifikan sekaligus mempertahankan akurasi yang tinggi.
Untuk menjelajahi lebih lanjut, Anda dapat mencoba jenis indeks vektor lainnya, atau menemukan lebih banyak lab dan contoh dengan integrasi LangChain di halaman dokumentasi.
11. Membersihkan lingkungan
Hancurkan instance dan cluster AlloyDB setelah Anda selesai mengerjakan lab.
Hapus cluster AlloyDB dan semua instance
Cluster tersebut dihancurkan dengan opsi force yang juga akan menghapus semua instance milik cluster tersebut.
Jika terminal Anda terputus, hubungkan kembali dan tentukan variabel project dan lingkungan di Cloud Shell:
gcloud config set project <YOUR_PROJECT_ID>
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
export PROJECT_ID=$(gcloud config get-value project)
Hapus cluster:
gcloud alloydb clusters delete $ADBCLUSTER --region=$REGION --force
Output konsol yang diharapkan:
student@cloudshell:~ (test-project-001-402417)$ gcloud alloydb clusters delete $ADBCLUSTER --region=$REGION --force All of the cluster data will be lost when the cluster is deleted. Do you want to continue (Y/n)? Y Operation ID: operation-1697820178429-6082890a0b570-4a72f7e4-4c5df36f Deleting cluster...done.
Hapus Cadangan AlloyDB
Hapus semua cadangan AlloyDB untuk cluster:
for i in $(gcloud alloydb backups list \
--filter="CLUSTER_NAME: projects/$PROJECT_ID/locations/$REGION/clusters/$ADBCLUSTER" \
--format="value(name)" \
--sort-by=~createTime) ; do \
gcloud alloydb backups delete $(basename $i) --region $REGION --quiet; done
Output konsol yang diharapkan:
student@cloudshell:~ (test-project-001-402417)$ for i in $(gcloud alloydb backups list --filter="CLUSTER_NAME: projects/$PROJECT_ID/locations/$REGION/clusters/$ADBCLUSTER" --format="value(name)" --sort-by=~createTime) ; do gcloud alloydb backups delete $(basename $i) --region $REGION --quiet; done Operation ID: operation-1697826266108-60829fb7b5258-7f99dc0b-99f3c35f Deleting backup...done.
Sekarang kita bisa menghancurkan VM
Hapus VM GCE
Di Cloud Shell, jalankan:
export GCEVM=instance-1
export ZONE=us-central1-a
gcloud compute instances delete $GCEVM \
--zone=$ZONE \
--quiet
Output konsol yang diharapkan:
student@cloudshell:~ (test-project-001-402417)$ export GCEVM=instance-1
export ZONE=us-central1-a
gcloud compute instances delete $GCEVM \
--zone=$ZONE \
--quiet
Deleted
12. Selamat
Selamat, Anda telah menyelesaikan codelab.
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 cluster dan instance utama AlloyDB
- Cara terhubung ke AlloyDB dari VM Google Compute Engine
- Cara membuat database dan mengaktifkan AlloyDB AI
- Cara memuat data ke database
- Cara menggunakan AlloyDB Studio
- Cara menggunakan model penyematan Gemini Enterprise Agent Platform di AlloyDB
- Cara menggunakan Gemini Enterprise Agent Platform Studio
- Cara memperkaya hasil menggunakan model generatif Gemini Enterprise Agent Platform
- Cara meningkatkan performa menggunakan indeks vektor
13. Survei
Output: