Mulai menggunakan Penyematan Vektor di Cloud SQL untuk PostgreSQL

1. Pengantar

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

8aa6ba3bc12a1593.png

Prasyarat

  • Pemahaman dasar tentang Google Cloud, konsol
  • Keterampilan dasar dalam antarmuka command line dan Cloud Shell

Yang akan Anda pelajari

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

Yang Anda butuhkan

  • Akun Google Cloud dan Project Google Cloud
  • Browser web seperti Chrome yang mendukung Konsol Google Cloud dan Cloud Shell

2. Penyiapan dan Persyaratan

Penyiapan Project

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

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, di header, klik tombol Pilih project yang akan membuka jendela pop-up.

295004821bab6a87.png

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

37d264871000675d.png

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

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

Aktifkan Penagihan

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

Tukarkan kredit Google Cloud senilai $5 (opsional)

Untuk menjalankan workshop ini, Anda memerlukan Akun Penagihan dengan sejumlah kredit. Jika Anda berencana menggunakan penagihan sendiri, Anda dapat melewati langkah ini.

  1. Klik link ini dan login dengan Akun Google pribadi.
  2. Anda akan melihat sesuatu seperti ini:

f54628965f465486.png

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

20e88842cf2a732e.png

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

cdc87f1c57777951.png

Menyiapkan akun penagihan pribadi

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

Untuk menyiapkan akun penagihan pribadi, buka di sini untuk mengaktifkan penagihan di Cloud Console.

Beberapa Catatan:

  • Menyelesaikan lab ini akan dikenai biaya kurang dari $3 USD untuk resource Cloud.
  • Anda dapat mengikuti langkah-langkah di akhir lab ini untuk menghapus resource agar tidak dikenai biaya lebih lanjut.
  • Pengguna baru memenuhi syarat untuk mengikuti Uji Coba Gratis senilai$300 USD.

Mulai Cloud Shell

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

Dari Google Cloud Console, klik ikon Cloud Shell di toolbar kanan atas:

Mengaktifkan Cloud Shell

Atau, Anda dapat menekan G, lalu S. Urutan ini akan mengaktifkan Cloud Shell jika Anda berada dalam Konsol Google Cloud atau menggunakan link ini.

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

Screenshot terminal Google Cloud Shell yang menunjukkan bahwa lingkungan telah terhubung

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 Cloud SQL, Compute Engine, Layanan jaringan, dan Vertex AI, Anda harus mengaktifkan API masing-masing di project Google Cloud Anda.

Di dalam terminal Cloud Shell, pastikan project ID Anda sudah disiapkan:

gcloud config set project [YOUR-PROJECT-ID]

Tetapkan variabel lingkungan PROJECT_ID:

PROJECT_ID=$(gcloud config get-value project)

Aktifkan semua layanan yang diperlukan:

gcloud services enable sqladmin.googleapis.com \
                       compute.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       servicenetworking.googleapis.com \
                       aiplatform.googleapis.com

Output yang diharapkan

student@cloudshell:~ (test-project-001-402417)$ gcloud config set project test-project-001-402417
Updated property [core/project].
student@cloudshell:~ (test-project-001-402417)$ PROJECT_ID=$(gcloud config get-value project)
Your active configuration is: [cloudshell-14650]
student@cloudshell:~ (test-project-001-402417)$ 
student@cloudshell:~ (test-project-001-402417)$ gcloud services enable sqladmin.googleapis.com \
                       compute.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       servicenetworking.googleapis.com \
                       aiplatform.googleapis.com
Operation "operations/acat.p2-4470404856-1f44ebd8-894e-4356-bea7-b84165a57442" finished successfully.

Memperkenalkan API

  • Cloud SQL Admin API (sqladmin.googleapis.com) memungkinkan Anda membuat, mengonfigurasi, dan mengelola instance Cloud SQL secara terprogram. Layanan ini menyediakan bidang kontrol untuk layanan database relasional terkelola sepenuhnya Google (mendukung MySQL, PostgreSQL, dan SQL Server), yang menangani tugas seperti penyediaan, pencadangan, ketersediaan tinggi, dan penskalaan.
  • Compute Engine API (compute.googleapis.com) memungkinkan Anda membuat dan mengelola mesin virtual (VM), persistent disk, dan setelan jaringan. Layanan ini menyediakan fondasi Infrastructure-as-a-Service (IaaS) inti yang diperlukan untuk menjalankan beban kerja Anda dan menghosting infrastruktur yang mendasarinya untuk banyak layanan terkelola.
  • Cloud Resource Manager API (cloudresourcemanager.googleapis.com) memungkinkan Anda mengelola metadata dan konfigurasi project Google Cloud secara terprogram. Dengan demikian, Anda dapat mengatur resource, menangani kebijakan Identity and Access Management (IAM), dan memvalidasi izin di seluruh hierarki project.
  • Service Networking API (servicenetworking.googleapis.com) memungkinkan Anda mengotomatiskan penyiapan konektivitas pribadi antara jaringan Virtual Private Cloud (VPC) dan layanan terkelola Google. Hal ini secara khusus diperlukan untuk membuat akses IP pribadi bagi layanan seperti AlloyDB agar dapat berkomunikasi dengan aman dengan resource Anda yang lain.
  • Vertex AI API (aiplatform.googleapis.com) memungkinkan aplikasi Anda membangun, men-deploy, dan menskalakan model machine learning. Vertex AI menyediakan antarmuka terpadu untuk semua layanan AI Google Cloud, termasuk akses ke model AI Generatif (seperti Gemini) dan pelatihan model kustom.

4. Membuat instance Cloud SQL

Buat instance Cloud SQL dengan integrasi database dengan Vertex AI.

Buat Sandi database

Tentukan sandi untuk pengguna database default. Anda dapat menentukan sandi Anda sendiri atau menggunakan fungsi acak untuk membuatnya:

export CLOUDSQL_PASSWORD=`openssl rand -hex 12`

Catat nilai yang dihasilkan untuk sandi:

echo $CLOUDSQL_PASSWORD

Membuat Instance Cloud SQL untuk PostgreSQL

Instance Cloud SQL dapat dibuat dengan berbagai cara seperti konsol Google Cloud, alat otomatisasi seperti terraform, atau Google Cloud SDK. Dalam lab ini, kita akan menggunakan alat gcloud Google Cloud SDK. Anda dapat membaca di dokumentasi cara membuat instance menggunakan alat lain.

Dalam sesi Cloud Shell, jalankan:

gcloud sql instances create my-cloudsql-instance \
--database-version=POSTGRES_17 \
--tier=db-custom-1-3840 \
--region=us-central1 \
--edition=ENTERPRISE \
--enable-google-ml-integration \
--database-flags cloudsql.enable_google_ml_integration=on

Setelah membuat instance, kita perlu menyetel sandi untuk pengguna default di instance dan memverifikasi apakah kita dapat terhubung dengan sandi tersebut.

gcloud sql users set-password postgres \
    --instance=my-cloudsql-instance \
    --password=$CLOUDSQL_PASSWORD

Jalankan perintah "gcloud sql connect" seperti yang ditampilkan di kotak dan masukkan sandi Anda di perintah saat siap terhubung.

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

Keluar dari sesi psql untuk saat ini menggunakan pintasan keyboard ctrl+d atau menjalankan perintah keluar

exit

Mengaktifkan Integrasi Vertex AI

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

Temukan email akun layanan internal Cloud SQL dan ekspor sebagai variabel.

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

Memberikan akses ke Vertex AI untuk akun layanan Cloud SQL:

PROJECT_ID=$(gcloud config get-value project)
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$SERVICE_ACCOUNT_EMAIL" \
  --role="roles/aiplatform.user"

Baca selengkapnya tentang pembuatan dan konfigurasi instance di dokumentasi Cloud SQL di sini.

5. Menyiapkan Database

Sekarang kita perlu membuat database dan mengaktifkan dukungan vektor.

Buat Database

Buat database dengan nama quickstart_db .Untuk melakukannya, kita memiliki berbagai opsi seperti klien database command line seperti psql untuk PostgreSQL, SDK, atau Cloud SQL Studio. Kita akan menggunakan SDK (gcloud) untuk membuat database dan menghubungkan ke instance.

Di Cloud Shell, jalankan perintah untuk membuat database

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

Mengaktifkan Ekstensi

Untuk dapat menggunakan Vertex AI dan vektor, kita perlu mengaktifkan dua ekstensi di database yang dibuat.

Di Cloud Shell, jalankan perintah untuk terhubung ke database yang dibuat (Anda harus memberikan sandi)

gcloud sql connect my-cloudsql-instance --database quickstart_db --user=postgres

Kemudian, setelah koneksi berhasil, di sesi sql, Anda perlu menjalankan dua perintah:

CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector CASCADE;

Keluar dari sesi SQL:

exit;

6. Muat Data

Sekarang kita perlu membuat objek di database dan memuat data. Kita akan menggunakan data Toko Cymbal fiktif. Data tersedia di bucket Google Storage publik dalam format CSV.

Pertama, kita perlu membuat semua objek yang diperlukan di database. Untuk melakukannya, kita akan menggunakan perintah gcloud sql connect dan gcloud storage yang sudah dikenal untuk mendownload dan mengimpor objek skema ke database kita.

Di Cloud Shell, jalankan dan berikan sandi yang dicatat saat kita membuat instance:

gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_demo_schema.sql |gcloud sql connect my-cloudsql-instance --database quickstart_db --user=postgres

Apa yang kita lakukan tepatnya dalam perintah sebelumnya? Kita terhubung ke database dan menjalankan kode SQL yang didownload yang membuat tabel, indeks, dan urutan.

Langkah berikutnya adalah memuat data dan untuk melakukannya, kita perlu mendownload file CSV dari Google Cloud Storage.

gcloud storage cp gs://cloud-training/gcc/gcc-tech-004/cymbal_products.csv .
gcloud storage cp gs://cloud-training/gcc/gcc-tech-004/cymbal_inventory.csv .
gcloud storage cp gs://cloud-training/gcc/gcc-tech-004/cymbal_stores.csv .

Kemudian, kita perlu terhubung ke database.

gcloud sql connect my-cloudsql-instance --database quickstart_db --user=postgres

Lalu, impor data dari file CSV kami.

\copy cymbal_products from 'cymbal_products.csv' csv header
\copy cymbal_inventory from 'cymbal_inventory.csv' csv header
\copy cymbal_stores from 'cymbal_stores.csv' csv header

Jika Anda memiliki data sendiri dan file CSV Anda kompatibel dengan alat impor Cloud SQL yang tersedia dari Konsol Cloud, Anda dapat menggunakannya, bukan menggunakan pendekatan command line.

7. Membuat Embedding

Langkah berikutnya adalah membuat embedding untuk deskripsi produk menggunakan model textembedding-004 dari Google Vertex AI dan menyimpannya sebagai data vektor.

Hubungkan ke database (jika Anda keluar atau sesi sebelumnya terputus):

gcloud sql connect my-cloudsql-instance --database quickstart_db --user=postgres

Buat kolom virtual embedding di tabel cymbal_products menggunakan fungsi embedding. Perintah ini membuat kolom virtual "embedding" yang akan menyimpan vektor dengan embedding yang dihasilkan berdasarkan kolom "product_description". Selain itu, embedding dibuat untuk semua baris yang ada dalam tabel. Model ditentukan sebagai parameter pertama untuk fungsi penyematan dan data sumber sebagai parameter kedua.

ALTER TABLE cymbal_products ADD COLUMN embedding vector(768) GENERATED ALWAYS AS (embedding('text-embedding-005',product_description)) STORED;

Proses ini mungkin memerlukan waktu beberapa saat, tetapi untuk 900-1000 baris, prosesnya tidak akan memakan waktu lebih dari 5 menit dan biasanya jauh lebih cepat.

Saat kita menyisipkan baris baru ke tabel atau memperbarui product_description untuk baris yang ada, data kolom virtual untuk kolom "embedding" akan dibuat ulang berdasarkan "product_description".

8. Menjalankan Penelusuran Kemiripan

Sekarang kita dapat menjalankan penelusuran menggunakan penelusuran kemiripan berdasarkan nilai vektor yang dihitung untuk deskripsi dan nilai vektor yang kita dapatkan untuk permintaan kita.

Kueri SQL dapat dieksekusi dari antarmuka command line yang sama menggunakan gcloud sql connect atau, sebagai alternatif, dari Cloud SQL Studio. Kueri multi-baris dan kompleks lebih baik dikelola di Cloud SQL Studio.

Mulai Cloud SQL Studio

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

903eeb9bbaf4a419.png

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

7874a11b28519b71.png

Tindakan ini akan membuka dialog tempat Anda memberikan nama database dan kredensial Anda:

  • Database: quickstart_db
  • Pengguna: postgres
  • Sandi: sandi yang Anda catat untuk pengguna database utama

Kemudian, klik tombol "AUTHENTICATE".

d5ee9e56dfef3905.png

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

19a6ebd18ef6ae34.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 vektornya adalah "Jenis pohon buah apa yang tumbuh dengan baik di sini?"

Berikut kueri yang dapat Anda jalankan untuk memilih 10 item pertama yang paling sesuai untuk permintaan kami:

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;

Salin dan tempel kueri ke editor Cloud SQL Studio, lalu tekan tombol "RUN" atau tempelkan di sesi command line yang terhubung ke database quickstart_db.

a8a2f83593aa5f37.png

Berikut daftar produk yang dipilih dan cocok dengan kueri.

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
(10 rows)

9. Meningkatkan Kualitas Respons LLM Menggunakan Data yang Diambil

Kita dapat meningkatkan respons LLM AI Generatif ke aplikasi klien menggunakan hasil kueri yang dijalankan dan menyiapkan output yang bermakna menggunakan hasil kueri yang diberikan sebagai bagian dari perintah ke model bahasa dasar generatif Vertex AI.

Untuk mencapainya, kita perlu membuat JSON dengan hasil dari penelusuran vektor, lalu menggunakan JSON yang dibuat tersebut sebagai tambahan pada perintah untuk model LLM di Vertex AI guna membuat output yang bermakna. Pada langkah pertama, kita membuat JSON, lalu mengujinya di Vertex AI Studio, dan pada langkah terakhir, kita menggabungkannya ke dalam pernyataan SQL yang dapat digunakan dalam aplikasi.

Membuat output dalam format JSON

Ubah kueri untuk menghasilkan output dalam format JSON dan hanya menampilkan satu baris untuk diteruskan ke Vertex AI

Cloud SQL untuk PostgreSQL

Berikut adalah contoh kuerinya:

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;

Berikut adalah JSON yang diharapkan 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

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 di konsol cloud.

d48549b1b0f449b4.png

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

Masukkan perintah di Studio.

2a6f5a338fefd229.png

Berikut perintah yang akan kita gunakan:

You are a friendly advisor helping to find a product based on the customer's needs.
Based on the client request we have loaded a list of products closely related to search.
The list in JSON format with list of values like {"product_name":"name","description":"some description","sale_price":10,"zip_code": 10234, "produt_id": "02056727942aeb714dc9a2313654e1b0"}
Here is the list of products:
[place your JSON here]
The customer asked "What tree is growing the best here?"
You should give information about the product, price and some supplemental information.
Do not ask any additional questions and assume location based on the zip code provided in the list of products.

Berikut tampilannya saat kita mengganti placeholder JSON dengan respons dari kueri:

You are a friendly advisor helping to find a product based on the customer's needs.
Based on the client request we have loaded a list of products closely related to search.
The list in JSON format with list of values like {"product_name":"name","description":"some description","sale_price":10,"zip_code": 10234, "produt_id": "02056727942aeb714dc9a2313654e1b0"}
Here is the list of products:
[{"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.
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 kita:

a0f7ead40d0a1d62.png

Jawaban yang kita dapatkan dari model dalam contoh ini adalah sebagai berikut. Perhatikan bahwa jawaban Anda mungkin berbeda karena perubahan model dan parameter dari waktu ke waktu:

"Berdasarkan kode pos yang diberikan dalam daftar produk kami (93230), sepertinya Anda berada di area Hanford, California.1346 Wilayah ini, yang terletak di San Joaquin Valley, sebenarnya merupakan salah satu lokasi utama di negara ini untuk menanam buah berbiji keras.

Untuk menjawab pertanyaan Anda, pohon terbaik yang tumbuh di area Anda dari pilihan kami adalah Pohon Ceri.

Berikut detailnya untuk Anda:

Produk: Pohon Ceri

Harga: Rp1.000.000

Deskripsi: Ini adalah pohon ceri indah yang akan menghasilkan ceri lezat.2

Alasan mengapa pohon ini tumbuh paling baik di sini: Iklim San Joaquin Valley menawarkan kondisi spesifik yang dibutuhkan ceri untuk tumbuh subur: hari-hari musim panas yang panjang dan hangat untuk perkembangan buah serta malam yang sejuk.5 Karena Hanford berada di pusat pertanian utama yang dikenal dengan produksi buah berbiji kerasnya, Anda dapat mengharapkan pohon ini sangat produktif di tanah lokal Anda. Pastikan untuk menanamnya di tempat yang terkena sinar matahari penuh dan tanah yang memiliki drainase baik untuk mendapatkan hasil panen terbaik"

Jalankan 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. Namun, untuk menggunakan model gemini-2.0-flash-exp, kita harus mendaftarkannya terlebih dahulu.

Menjalankan di Cloud SQL untuk PostgreSQL

Upgrade ekstensi ke versi 1.4.2 atau yang lebih tinggi (jika versi saat ini lebih rendah). Hubungkan ke database quickstart_db dari gcloud sql connect seperti yang telah ditunjukkan sebelumnya (atau gunakan Cloud SQL Studio) dan jalankan:

SELECT extversion from pg_extension where extname='google_ml_integration';

Jika nilai yang ditampilkan kurang dari 1.4.3, jalankan:

ALTER EXTENSION google_ml_integration UPDATE TO '1.4.3';

Kemudian, kita perlu menyetel tanda database google_ml_integration.enable_model_support ke "on". Untuk memverifikasi setelan saat ini, jalankan.

show google_ml_integration.enable_model_support;

Output yang diharapkan dari sesi psql adalah "on":

quickstart_db => show google_ml_integration.enable_model_support;
 google_ml_integration.enable_model_support 
--------------------------------------------
 on
(1 row)

Jika menunjukkan "nonaktif", kita perlu memperbarui tanda database. Untuk melakukannya, Anda dapat menggunakan antarmuka konsol web atau menjalankan perintah gcloud berikut.

gcloud sql instances patch my-cloudsql-instance \
--database-flags google_ml_integration.enable_model_support=on,cloudsql.enable_google_ml_integration=on

Perintah ini memerlukan waktu sekitar 1-3 menit untuk dijalankan di latar belakang. Kemudian, Anda dapat memverifikasi flag baru di sesi psql atau menggunakan Cloud SQL Studio yang terhubung ke database quickstart_db.

show google_ml_integration.enable_model_support;

Output yang diharapkan dari sesi psql adalah "on":

quickstart_db => show google_ml_integration.enable_model_support;
 google_ml_integration.enable_model_support 
--------------------------------------------
 on
(1 row)

Kemudian, kita perlu mendaftarkan dua model. Yang pertama adalah model text-embedding-005 yang sudah digunakan. Model ini harus didaftarkan karena kita mengaktifkan kemampuan pendaftaran model.

Untuk mendaftarkan eksekusi model di psql atau Cloud SQL Studio, gunakan kode berikut:

CALL
  google_ml.create_model(
    model_id => 'text-embedding-005',
    model_provider => 'google',
    model_qualified_name => 'text-embedding-005',
    model_type => 'text_embedding',
    model_auth_type => 'cloudsql_service_agent_iam',
    model_in_transform_fn => 'google_ml.vertexai_text_embedding_input_transform',
    model_out_transform_fn => 'google_ml.vertexai_text_embedding_output_transform');

Model berikutnya yang perlu kita daftarkan adalah gemini-2.0-flash-001 yang akan digunakan untuk menghasilkan output yang mudah digunakan.

CALL
  google_ml.create_model(
    model_id => 'gemini-2.5-flash',
    model_request_url => 'https://us-central1-aiplatform.googleapis.com/v1/projects/$PROJECT_ID/locations/us-central1/publishers/google/models/gemini-2.5-flash:streamGenerateContent',
    model_provider => 'google',
    model_auth_type => 'cloudsql_service_agent_iam');

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;

Berikut contoh output

quickstart_db=> select model_id,model_type from google_ml.model_info_view;
               model_id               |   model_type   
--------------------------------------+----------------
 textembedding-gecko                  | text_embedding
 textembedding-gecko@001              | text_embedding
 gemini-1.5-pro:streamGenerateContent | generic
 gemini-1.5-pro:generateContent       | generic
 gemini-1.0-pro:generateContent       | generic
 text-embedding-005                   | text_embedding
 gemini-2.5-flash                     | generic

Sekarang kita dapat menggunakan JSON yang dihasilkan dalam subkueri untuk menyediakannya sebagai bagian dari perintah ke model teks AI generatif menggunakan SQL.

Di sesi psql atau Cloud SQL Studio ke database, jalankan kueri

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 <=> google_ml.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
        json_array_elements(google_ml.predict_row( model_id =>'gemini-2.5-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
        string_agg(resp::text,
        ' ')
FROM
        response;

Berikut adalah output yang diharapkan. Output Anda mungkin berbeda bergantung pada versi dan parameter model.:

"That's a great question! It sounds like you're looking to add some delicious fruit to your garden.\n\nBased on the products we have that are closely related to your search, I can tell you about a fantastic option:\n\n**Cherry Tree**" "\n* **Description:** This beautiful deciduous tree will produce delicious cherries. It grows to be about 15 feet tall, with dark green leaves in summer that turn a beautiful red in the fall. Cherry trees are known for their beauty, shade, and privacy. They prefer a cool, moist climate and sandy soil." "\n* **Price:** $75.00\n* **Grows well in:** USDA Zones 4-9.\n\nTo confirm if this Cherry Tree will thrive in your specific location, you might want to check which USDA Hardiness Zone your area falls into. If you're in zones 4-9, this" " could be a wonderful addition to your yard!"

10. Membuat indeks tetangga terdekat

Set data kami cukup kecil dan waktu respons terutama bergantung pada interaksi dengan model AI. Namun, jika Anda memiliki jutaan vektor, penelusuran vektor dapat memakan sebagian besar waktu respons kami dan memberikan beban yang tinggi pada sistem. Untuk meningkatkan kualitasnya, kita dapat membuat indeks di atas vektor.

Buat indeks HNSW

Kita akan mencoba jenis indeks HNSW untuk pengujian. HNSW adalah singkatan dari Hierarchical Navigable Small World dan merepresentasikan indeks grafik multi-layer.

Untuk membuat indeks kolom penyematan, kita perlu menentukan kolom penyematan, fungsi jarak, dan secara opsional parameter seperti m atau ef_constructions. Anda dapat membaca parameter secara mendetail di dokumentasi.

CREATE INDEX cymbal_products_embeddings_hnsw ON cymbal_products
  USING hnsw (embedding vector_cosine_ops)
  WITH (m = 16, ef_construction = 64);

Output yang diharapkan:

quickstart_db=> CREATE INDEX cymbal_products_embeddings_hnsw ON cymbal_products
  USING hnsw (embedding vector_cosine_ops)
  WITH (m = 16, ef_construction = 64);
CREATE INDEX
quickstart_db=>

Bandingkan Respons

Sekarang kita dapat menjalankan kueri penelusuran vektor dalam mode EXPLAIN dan memverifikasi apakah indeks telah digunakan.

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:

 Aggregate  (cost=779.12..779.13 rows=1 width=32) (actual time=1.066..1.069 rows=1 loops=1)
   ->  Subquery Scan on trees  (cost=769.05..779.12 rows=1 width=142) (actual time=1.038..1.041 rows=1 loops=1)
         ->  Limit  (cost=769.05..779.11 rows=1 width=158) (actual time=1.022..1.024 rows=1 loops=1)
               ->  Nested Loop  (cost=769.05..9339.69 rows=852 width=158) (actual time=1.020..1.021 rows=1 loops=1)
                     ->  Nested Loop  (cost=768.77..9316.48 rows=852 width=945) (actual time=0.858..0.859 rows=1 loops=1)
                           ->  Index Scan using cymbal_products_embeddings_hnsw on cymbal_products cp  (cost=768.34..2572.47 rows=941 width=941) (actual time=0.532..0.539 rows=3 loops=1)
                                 Order By: (embedding <=> '[0.008864171,0.03693164,-0.024245683,...
<redacted>
...,0.017593635,-0.040275685,-0.03914233,-0.018452475,0.00826032,-0.07372604
]'::vector)
                           ->  Index Scan using product_inventory_pkey on cymbal_inventory ci  (cost=0.42..7.17 rows=1 width=37) (actual time=0.104..0.104 rows=0 loops=3)
                                 Index Cond: ((store_id = 1583) AND (uniq_id = (cp.uniq_id)::text))
                                 Filter: (inventory > 0)
                                 Rows Removed by Filter: 1
                     ->  Materialize  (cost=0.28..8.31 rows=1 width=8) (actual time=0.133..0.134 rows=1 loops=1)
                           ->  Index Scan using product_stores_pkey on cymbal_stores cs  (cost=0.28..8.30 rows=1 width=8) (actual time=0.129..0.129 rows=1 loops=1)
                                 Index Cond: (store_id = 1583)
 Planning Time: 112.398 ms
 Execution Time: 1.221 ms

Dari output, kita dapat dengan jelas melihat bahwa kueri menggunakan "Index Scan using cymbal_products_embeddings_hnsw".

Dan jika kita menjalankan kueri tanpa explain:

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 (output dapat berbeda berdasarkan model dan indeks):

[{"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"}]

Kita dapat melihat bahwa hasilnya sama dan menampilkan pohon Ceri yang sama yang berada di bagian atas penelusuran kami tanpa indeks. Bergantung pada parameter dan jenis indeks, hasilnya mungkin sedikit berbeda dan menampilkan rekaman teratas yang berbeda untuk hierarki. Selama pengujian, kueri yang diindeks menampilkan hasil dalam 131.301 md vs 167.631 md tanpa indeks, tetapi kami menangani dataset yang sangat kecil dan perbedaannya akan lebih besar pada data yang lebih besar.

Anda dapat mencoba berbagai indeks yang tersedia untuk vektor serta lab dan contoh lainnya dengan integrasi langchain yang tersedia dalam dokumentasi.

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.

Lab ini merupakan bagian dari Alur Pembelajaran AI Siap Produksi dengan Google Cloud.

  • Jelajahi kurikulum lengkap untuk menjembatani kesenjangan dari prototipe hingga produksi.
  • Bagikan progres Anda dengan hashtag #ProductionReadyAI.

Yang telah kita bahas

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

Coba codelab serupa untuk AlloyDB dengan indeks ScaNN, bukan HNSW

13. Survei

Output:

Bagaimana Anda akan menggunakan tutorial ini?

Hanya membacanya Membaca dan menyelesaikan latihannya