Membangun Mesin Surplus Real-Time dengan Gemini 3 Flash & Cloud SQL

1. Ringkasan

Dalam codelab ini, Anda akan membuat Neighbor Loop, aplikasi berbagi kelebihan yang berkelanjutan yang memperlakukan kecerdasan sebagai bagian penting dari lapisan data.

Dengan mengintegrasikan Gemini 3.0 Flash dan integrasi ML Cloud SQL, Anda akan melampaui penyimpanan dasar ke ranah In-Database Intelligence. Anda akan mempelajari cara melakukan analisis item multimodal dan penemuan semantik langsung dalam SQL.

645daa545b0e46a6.png

Yang akan Anda build

Aplikasi web "geser untuk mencocokkan" berperforma tinggi untuk berbagi kelebihan persediaan komunitas.

Yang akan Anda pelajari

  • Penyediaan Sekali Klik: Cara menyiapkan Cloud SQL dan instance yang dirancang untuk beban kerja AI.
  • Embedding Dalam Database: Membuat vektor text-embedding-005 langsung dalam pernyataan INSERT.
  • Penalaran Multimodal: Menggunakan Gemini 3.0 Flash untuk "melihat" item dan membuat bio bergaya kencan yang cerdas secara otomatis.
  • Penemuan Semantik: Melakukan "pengecekan suasana" berbasis logika di dalam kueri SQL menggunakan fungsi ai.if() untuk memfilter hasil berdasarkan konteks, bukan hanya matematika.

Arsitektur

Neighbor Loop melewati hambatan lapisan aplikasi tradisional. Daripada menarik data untuk diproses, kita menggunakan:

  1. Integrasi Cloud SQL + ML: Untuk membuat dan menyimpan vektor secara real-time.
  2. Google Cloud Storage: Untuk menyimpan gambar
  3. Gemini 3.0 Flash: Untuk melakukan penalaran dalam waktu kurang dari satu detik pada data gambar dan teks secara langsung melalui SQL.
  4. Cloud Run: Untuk menghosting backend Flask satu file yang ringan.

Persyaratan

  • Browser, seperti Chrome atau Firefox.
  • Project Google Cloud yang mengaktifkan penagihan.
  • Pemahaman dasar tentang SQL dan Python.

2. Sebelum memulai

Membuat project

  1. Di Konsol Google Cloud, di halaman pemilih project, pilih atau buat project Google Cloud.
  2. Pastikan penagihan diaktifkan untuk project Cloud Anda. Pelajari cara memeriksa apakah penagihan telah diaktifkan pada suatu project.
  1. Anda akan menggunakan Cloud Shell, lingkungan command line yang berjalan di Google Cloud. Klik Activate Cloud Shell di bagian atas konsol Google Cloud.

Gambar tombol Activate Cloud Shell

  1. Setelah terhubung ke Cloud Shell, Anda dapat memeriksa bahwa Anda sudah diautentikasi dan project sudah ditetapkan ke project ID Anda menggunakan perintah berikut:
gcloud auth list
  1. Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa perintah gcloud mengetahui project Anda.
gcloud config list project
  1. Jika project Anda belum ditetapkan, gunakan perintah berikut untuk menetapkannya:
gcloud config set project <YOUR_PROJECT_ID>
  1. Aktifkan API yang diperlukan: Ikuti link dan aktifkan API.

Atau, Anda dapat menggunakan perintah gcloud untuk melakukannya. Baca dokumentasi untuk mempelajari perintah gcloud dan penggunaannya.

Gotcha & Pemecahan Masalah

Sindrom "Project Hantu"

Anda menjalankan gcloud config set project, tetapi sebenarnya Anda melihat project lain di UI Konsol. Periksa project ID di dropdown kiri atas.

Penghalang Penagihan

Anda mengaktifkan project, tetapi lupa akun penagihan. Cloud SQL tidak akan dimulai jika penagihan kosong.

Keterlambatan Penyebaran API

Anda mengklik "Aktifkan API", tetapi command line masih menampilkan Service Not Enabled. Tunggu 60 detik. Cloud memerlukan waktu sejenak untuk mengaktifkan neuronnya.

3. Penyiapan database

Di lab ini, kita akan menggunakan Cloud SQL untuk PostgreSQL sebagai database untuk data pengujian.

Mari kita buat instance Cloud SQL tempat set data pengujian akan dimuat.

  1. Klik tombol atau Salin link di bawah ke browser tempat Anda login sebagai pengguna Konsol Google Cloud.

  1. Setelah langkah ini selesai, repo akan di-clone ke editor Cloud Shell lokal Anda dan Anda akan dapat menjalankan perintah di bawah dari folder project (penting untuk memastikan Anda berada di direktori project):
sh run.sh
  1. Sekarang gunakan UI (dengan mengklik link di terminal atau mengklik link "preview on web" di terminal.
  2. Masukkan detail Anda untuk ID project dan nama instance untuk memulai.
  3. Pergilah minum kopi sambil melihat log yang bergulir dan Anda dapat membaca tentang cara kerjanya di balik layar di sini.

Gotcha & Pemecahan Masalah

Ketidakcocokan Region

Jika Anda mengaktifkan API di us-central1 tetapi mencoba menyediakan cluster di asia-south1, Anda mungkin mengalami masalah kuota atau penundaan izin Akun Layanan. Tetap gunakan satu region untuk seluruh lab.

Waktu Tunggu Cloud Shell

Jika istirahat kopi Anda berlangsung selama 30 menit, Cloud Shell mungkin akan memasuki mode tidur dan menghentikan proses sh run.sh. Biarkan tab tetap aktif.

4. Penyediaan Skema

Setelah instance Cloud SQL Anda berjalan, buka editor SQL Cloud SQL Studio untuk mengaktifkan ekstensi AI dan menyediakan skema.

5a835906362f7609.png

Anda mungkin perlu menunggu hingga instance selesai dibuat. Setelah itu, login ke instance Cloud SQL menggunakan kredensial yang Anda buat saat membuatnya. Gunakan data berikut untuk melakukan autentikasi ke PostgreSQL:

  • Nama pengguna : "postgres"
  • Database : "postgres"
  • Sandi : "cloudsql" (atau apa pun yang Anda tetapkan pada saat pembuatan)

Setelah Anda berhasil diautentikasi ke Cloud SQL Studio, perintah SQL dimasukkan di Editor. Anda dapat menambahkan beberapa jendela Editor menggunakan tanda plus di sebelah kanan jendela terakhir.

9408d708b7dac90c.png

Anda akan memasukkan perintah untuk Cloud SQL di jendela editor, menggunakan opsi Jalankan, Format, dan Hapus sesuai kebutuhan.

Mengaktifkan Ekstensi

Untuk membangun aplikasi ini, kita akan menggunakan ekstensi pgvector dan google_ml_integration. Ekstensi pgvector memungkinkan Anda menyimpan dan menelusuri embedding vektor. Ekstensi google_ml_integration menyediakan fungsi yang Anda gunakan untuk mengakses endpoint prediksi Vertex AI guna mendapatkan prediksi di SQL. Aktifkan ekstensi ini dengan menjalankan DDL berikut:

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

Membuat tabel

Anda dapat membuat tabel menggunakan pernyataan DDL di bawah ini di Cloud SQL Studio:

-- Items Table (The "Profile" you swipe on)
CREATE TABLE items (
   item_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
   owner_id UUID,
   provider_name TEXT,
   provider_phone TEXT,
   title TEXT,
   bio TEXT,
   category TEXT,
   image_url TEXT,
   item_vector VECTOR(768),
   status TEXT DEFAULT 'available',
   created_at TIMESTAMP DEFAULT NOW()
);

-- Swipes Table (The Interaction)
CREATE TABLE swipes (
   swipe_id SERIAL PRIMARY KEY,
   swiper_id UUID,
   item_id UUID REFERENCES items(item_id),
   direction TEXT CHECK (direction IN ('left', 'right')),
   is_match BOOLEAN DEFAULT FALSE,
   created_at TIMESTAMP DEFAULT NOW()
);

Kolom item_vector akan memungkinkan penyimpanan untuk nilai vektor teks.

Berikan Izin

Jalankan pernyataan di bawah untuk memberikan izin eksekusi pada fungsi "embedding":

GRANT EXECUTE ON FUNCTION embedding TO postgres;

Mengaktifkan Integrasi ML

Untuk memanfaatkan fitur machine learning langsung dalam database, Anda harus mengaktifkan tanda integrasi ML.

Anda dapat menjalankan perintah di bawah dari Terminal Cloud Shell:

INSTANCE_NAME="<<The name of your Cloud SQL Instance>>"

gcloud sql instances patch $INSTANCE_NAME --tier=db-custom-1-3840

gcloud sql instances patch $INSTANCE_NAME \
    --database-flags=cloudsql.enable_google_ml_integration=on

gcloud sql instances patch $INSTANCE_NAME --enable-google-ml-integration

Memberikan PERAN Vertex AI User ke akun layanan Cloud SQL

Dari konsol IAM Google Cloud, berikan akses ke akun layanan Cloud SQL (yang terlihat seperti ini: service-<<PROJECT_NUMBER>>@cp-sa-cloud-sql.iam.gserviceaccount.com) ke peran "Pengguna Vertex AI". PROJECT_NUMBER akan memiliki nomor project Anda.

Atau, Anda dapat menjalankan perintah di bawah dari Terminal Cloud Shell:

INSTANCE_NAME="<<The name of your Cloud SQL Instance>>"
PROJECT_ID=$(gcloud config get-value project)

SA_EMAIL=$(gcloud sql instances describe $INSTANCE_NAME --format='value(serviceAccountEmailAddress)')
gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member="serviceAccount:$SA_EMAIL" \
    --role="roles/aiplatform.user"

Mendaftarkan model Gemini 3 Flash di Cloud SQL

Jalankan pernyataan SQL di bawah dari Editor Kueri Cloud SQL

CALL google_ml.create_model(
    model_id => 'gemini-3-flash-preview',
    model_request_url => 'https://aiplatform.googleapis.com/v1/projects/<<YOUR_PROJECT_ID>>/locations/global/publishers/google/models/gemini-3-flash-preview:generateContent',
    model_qualified_name => 'gemini-3-flash-preview',
    model_provider => 'google',
    model_type => 'generic',
    model_auth_type => 'cloudsql_service_agent_iam'
);
--replace <<YOUR_PROJECT_ID>> with your project id.

Gotcha & Pemecahan Masalah

Loop "Lupa Sandi"

Jika Anda menggunakan penyiapan "Satu Klik" dan tidak dapat mengingat sandi, buka halaman Informasi dasar instance di konsol dan klik "Edit" untuk mereset sandi postgres.

Error "Ekstensi Tidak Ditemukan"

Jika CREATE EXTENSION gagal, hal ini sering kali disebabkan karena instance masih dalam status "Pemeliharaan" atau "Memperbarui" dari penyediaan awal. Periksa apakah langkah pembuatan instance sudah selesai dan tunggu beberapa detik jika diperlukan.

IAM Propagation Gap

Anda menjalankan perintah IAM gcloud, tetapi SQL CALL masih gagal dengan error izin. Perubahan IAM mungkin memerlukan waktu beberapa saat untuk diterapkan melalui backbone Google. Tarik napas.

Ketidakcocokan Dimensi Vektor

Tabel items disetel ke VECTOR(768). Jika Anda mencoba menggunakan model lain (seperti model 1536-dimensi) nanti, sisipan Anda akan meledak. Tetap gunakan text-embedding-005.

Kesalahan Pengetikan Project ID

Dalam panggilan create_model, jika Anda membiarkan tanda kurung « » atau salah mengetikkan ID project, pendaftaran model akan terlihat berhasil, tetapi gagal selama kueri pertama yang sebenarnya. Periksa kembali string Anda.

Integrasi Vertex AI dinonaktifkan

Jalankan –enable-google-ml-integration (terpisah dari tanda database)

5. Penyimpanan Gambar (Google Cloud Storage)

Untuk menyimpan foto barang surplus kami, kami menggunakan bucket GCS. Untuk tujuan aplikasi demo ini, kita ingin gambar dapat diakses secara publik sehingga dirender secara instan di kartu geser kita.

  1. Buat Bucket: Buat bucket baru di project GCP Anda (misalnya, neighborloop-images), sebaiknya di region yang sama dengan database dan aplikasi Anda.
  2. Konfigurasi Akses Publik: * Buka tab Izin bucket.
  3. Tambahkan prinsipal allUsers.
  4. Tetapkan peran Storage Object Viewer (agar semua orang dapat melihat foto) dan peran Storage Object Creator (untuk tujuan upload demo).

Alternatif (Akun Layanan): Jika Anda tidak ingin menggunakan akses publik, pastikan Akun Layanan aplikasi Anda diberi akses penuh ke Cloud SQL dan peran Storage yang diperlukan untuk mengelola objek dengan aman.

Jika Anda ingin menjalankan perintah dan memberikan akses publik. Jalankan perintah di bawah ini di Terminal Cloud Shell:

BUCKET_NAME="<<your-bucket-name>>"
gcloud storage buckets add-iam-policy-binding gs://$BUCKET_NAME \
    --member="allUsers" \
    --role="roles/storage.objectViewer"

Gotcha & Pemecahan Masalah

Penarikan Wilayah

Jika database Anda berada di us-central1 dan bucket Anda berada di europe-west1, Anda benar-benar memperlambat AI Anda. "Cek suasana" terjadi dengan cepat, tetapi pengambilan gambar untuk UI akan terasa lambat. Pastikan keduanya berada di region yang sama.

Keunikan Nama Bucket

Nama bucket adalah namespace global. Jika Anda mencoba memberi nama bucket Anda neighborloop-images, kemungkinan orang lain sudah memilikinya. Jika pembuatan gagal, tambahkan akhiran acak.

Kesalahan "Kreator" vs. "Penonton"

Kesalahan "Kreator" vs. "Pelihat": Jika Anda hanya menambahkan "Pelihat", aplikasi Anda akan error saat pengguna mencoba mencantumkan item baru karena tidak memiliki izin untuk menulis file. Anda memerlukan keduanya untuk penyiapan demo khusus ini.

6. Mari kita buat aplikasi

Clone repo ini ke project Anda dan mari kita bahas.

  1. Untuk meng-clone-nya, dari Cloud Shell Terminal Anda (di direktori root atau dari tempat mana pun Anda ingin membuat project ini), jalankan perintah berikut satu per satu:
git clone https://github.com/flazer99/neighbor-loop-cloud-sql

cd neighbor-loop-cloud-sql/

Tindakan ini akan membuat project dan Anda dapat memverifikasinya di Cloud Shell Editor.

53a398aff6ba7d5b.png

  1. Cara mendapatkan Kunci Gemini API Anda
  2. Buka Google AI Studio: Buka aistudio.google.com.
  3. Login: Gunakan Akun Google yang sama dengan yang Anda gunakan untuk project Google Cloud Anda.
  4. Buat Kunci API:
  5. Di sidebar kiri, klik "Dapatkan kunci API".
  6. Klik tombol "Create API key in new project".
  7. Salin Kunci: Setelah kunci dibuat, klik ikon salin.
  8. Sekarang tetapkan variabel lingkungan dalam file .env
GEMINI_API_KEY=<<YOUR_GEMINI_API_KEY>>
DATABASE_URL=postgresql+pg8000://postgres:<<YOUR_PASSWORD>>@<<HOST_IP>>:<<PORT>>/postgres
GCS_BUCKET_NAME=<<YOUR_GCS_BUCKET>>

Ganti nilai untuk placeholder <<YOUR_GEMINI_API_KEY>>, <<YOUR_PASSWORD>, <<HOST_IP>>, <<PORT>> and <<YOUR_GCS_BUCKET>>.

Gotcha & Pemecahan Masalah

Kebingungan Terhadap Beberapa Akun

Jika Anda login ke beberapa akun Google (Pribadi vs. Kerja), AI Studio mungkin menggunakan akun yang salah secara default. Periksa avatar di sudut kanan atas untuk memastikan avatar tersebut cocok dengan akun Project GCP Anda.

Terlampaui Kuota "Free Tier"

Jika Anda menggunakan tingkat Bebas Biaya, ada batas frekuensi (RPM - Permintaan Per Menit). Jika Anda "menggeser" terlalu cepat di Neighbor Loop, Anda mungkin akan mendapatkan error 429 Too Many Requests. Pelan-pelan!

Keamanan Kunci yang Terekspos

Jika Anda tidak sengaja git commit file .env dengan kunci di dalamnya. Selalu tambahkan .env ke .gitignore Anda.

7. Mari kita periksa kodenya

"Profil Kencan" untuk Barang Anda

c2c543562cc9b353.png

Saat pengguna mengupload foto item, mereka tidak perlu menulis deskripsi yang panjang. Saya menggunakan Gemini 3 Flash untuk "melihat" item dan menulis listingannya.

Di backend, pengguna hanya memberikan judul dan foto. Gemini akan menangani sisanya:

prompt = """
You are a witty community manager for NeighborLoop.
Analyze this surplus item and return JSON:
{
   "bio": "First-person witty dating-style profile bio for the product, not longer than 2 lines",
   "category": "One-word category",
   "tags": ["tag1", "tag2"]
}
"""
response = genai_client.models.generate_content(
   model="gemini-3-flash-preview",
   contents=[types.Part.from_bytes(data=image_bytes, mime_type="image/jpeg"), prompt],
   config=types.GenerateContentConfig(response_mime_type="application/json")
)

21f871a1b549efcf.png

Penyematan Dalam Database Real-time

aa783a459f1b02da.png

Salah satu fitur paling keren dari Cloud SQL adalah kemampuan untuk membuat penyematan tanpa keluar dari konteks SQL. Daripada memanggil model embedding di Python dan mengirim vektor kembali ke DB, saya melakukannya semua dalam satu pernyataan INSERT menggunakan fungsi embedding():

INSERT INTO items (owner_id, provider_name, provider_phone, title, bio, category, image_url, status, item_vector)
VALUES (
   :owner, :name, :phone, :title, :bio, :cat, :url, 'available',
   embedding('text-embedding-005', :title || ' ' || :bio)::vector
)

Hal ini memastikan bahwa setiap item dapat "ditelusuri" berdasarkan maknanya segera setelah diposting. Perhatikan bahwa bagian ini mencakup fitur "mencantumkan produk" di aplikasi Neighbor Loop.

Tambahkan screenshot fitur listingan produk

Penelusuran Vektor Lanjutan dan Pemfilteran Cerdas dengan Gemini 3.0

Penelusuran kata kunci standar terbatas. Jika Anda menelusuri "sesuatu untuk memperbaiki kursi saya", database tradisional mungkin tidak menampilkan apa pun jika kata "kursi" tidak ada dalam judul. Neighbor Loop memecahkan masalah ini dengan penelusuran vektor canggih AI Cloud SQL.

Dengan menggunakan ekstensi pgvector dan penyimpanan yang dioptimalkan Cloud SQL, kita dapat melakukan penelusuran kemiripan yang sangat cepat. Namun, "keajaiban" yang sebenarnya terjadi saat kita menggabungkan kedekatan vektor dengan logika berbasis LLM.

SELECT item_id, title, bio, category, image_url,
      1 - (item_vector <=> embedding('text-embedding-005', :query)::vector) as score
FROM items 
WHERE status = 'available' 
 AND item_vector IS NOT NULL 
ORDER BY score DESC 
LIMIT 5

Kueri ini merepresentasikan perubahan arsitektur yang signifikan: kita memindahkan logika ke data. Daripada menarik ribuan hasil ke dalam kode aplikasi untuk memfilternya, Gemini 3 Flash melakukan "pengecekan suasana" di dalam mesin database. Hal ini mengurangi latensi, menurunkan biaya traffic keluar, dan memastikan bahwa hasilnya tidak hanya serupa secara matematis, tetapi juga relevan secara kontekstual.

Screenshot Fitur Penelusuran Semantik

Loop "Geser untuk Mencocokkan"

UI adalah setumpuk kartu klasik.

Geser ke Kiri: Batalkan.

Geser ke Kanan: Anda cocok!

Screenshot Fitur Geser untuk Mencocokkan

Saat Anda menggeser ke kanan, backend akan mencatat interaksi di tabel geser kami dan menandai item sebagai cocok. Frontend akan langsung memicu modal yang menampilkan info kontak penyedia sehingga Anda dapat mengatur pengambilan.

8. Mari kita deploy ke Cloud Run

  1. Deploy di Cloud Run dengan menjalankan perintah berikut dari Cloud Shell Terminal tempat project di-clone dan pastikan Anda berada di dalam folder root project.

Jalankan perintah ini di terminal Cloud Shell Anda:

gcloud run deploy neighbor-loop-cloud-sql \
   --source . \
   --region=us-central1 \
   --allow-unauthenticated \
   --network=easy-cloudsql-vpc \
   --subnet=easy-cloudsql-subnet \
   --vpc-egress=private-ranges-only \
   --set-env-vars GEMINI_API_KEY=<<YOUR_GEMINI_API_KEY>>,DATABASE_URL=postgresql+pg8000://postgres:<<YOUR_PASSWORD>>@<<PRIVATE_IP_HOST>>:5432/postgres,GCS_BUCKET_NAME=<<YOUR_GCS_BUCKET>>

Ganti nilai untuk placeholder <<YOUR_GEMINI_API_KEY>>, <<YOUR_PASSWORD>, <<PRIVATE_IP_HOST>>, <<PORT>> and <<YOUR_GCS_BUCKET>>

Setelah perintah selesai, URL Layanan akan ditampilkan. Salin.

Sekarang gunakan URL layanan (endpoint Cloud Run yang Anda salin sebelumnya) dan uji aplikasi. Upload foto alat listrik lama tersebut, dan biarkan Gemini melakukan sisanya.

Gotcha & Pemecahan Masalah

Loop "Revisi Gagal"

Jika deployment selesai, tetapi URL menampilkan 500 Internal Server Error, periksa lognya. Hal ini biasanya disebabkan oleh Variabel Lingkungan yang tidak ada (seperti salah ketik di DATABASE_URL) atau Akun Layanan Cloud Run tidak memiliki izin untuk membaca dari bucket GCS Anda.

9. Pemecahan Masalah Tingkat Tinggi

206a26fcd93ea48.png

10. Demo

Anda akan dapat menggunakan endpoint untuk pengujian.

Namun, untuk tujuan demo selama beberapa hari, Anda dapat mencoba ini:

11. Pembersihan

Setelah lab ini selesai, jangan lupa untuk menghapus instance Cloud SQL.

12. Selamat

Anda telah berhasil membangun aplikasi Neighbor Loop untuk komunitas berkelanjutan dengan Google Cloud. Dengan memindahkan logika AI Gemini 3 Flash dan penyematan ke Cloud SQL, aplikasi menjadi sangat cepat (bergantung pada setelan deployment) dan kodenya sangat bersih. Kami tidak hanya menyimpan data, tetapi juga menyimpan niat.

Kombinasi kecepatan Gemini 3 Flash dan pemrosesan vektor yang dioptimalkan Cloud SQL benar-benar merupakan terobosan baru untuk platform berbasis komunitas.