การสร้างเครื่องมือส่วนเกินแบบเรียลไทม์ด้วย Gemini 3 Flash และ Cloud SQL

1. ภาพรวม

ในโค้ดแล็บนี้ คุณจะได้สร้าง Neighbor Loop ซึ่งเป็นแอปแชร์ส่วนเกินที่ยั่งยืนซึ่งถือว่าความอัจฉริยะเป็นพลเมืองชั้นหนึ่งของเลเยอร์ข้อมูล

การผสานรวม Gemini 3.0 Flash และการผสานรวม ML ของ Cloud SQL จะช่วยให้คุณก้าวข้ามการจัดเก็บข้อมูลขั้นพื้นฐานไปสู่ขอบเขตของข้อมูลอัจฉริยะในฐานข้อมูล คุณจะได้เรียนรู้วิธีวิเคราะห์สินค้าแบบหลายรูปแบบและการค้นพบเชิงความหมายภายใน SQL โดยตรง

645daa545b0e46a6.png

สิ่งที่คุณจะสร้าง

เว็บแอปพลิเคชัน "ปัดเพื่อจับคู่" ประสิทธิภาพสูงสำหรับการแชร์ของเหลือในชุมชน

สิ่งที่คุณจะได้เรียนรู้

  • การจัดสรรด้วยการคลิกเพียงครั้งเดียว: วิธีตั้งค่า Cloud SQL และอินสแตนซ์ที่ออกแบบมาสำหรับภาระงาน AI
  • การฝังในฐานข้อมูล: สร้างเวกเตอร์ text-embedding-005 ภายในคำสั่ง INSERT โดยตรง
  • การให้เหตุผลแบบมัลติโมดัล: ใช้ Gemini 3.0 Flash เพื่อ "ดู" รายการและสร้างไบโอสไตล์การหาคู่ที่เฉลียวฉลาดโดยอัตโนมัติ
  • การค้นพบเชิงความหมาย: การ "ตรวจสอบความรู้สึก" ตามตรรกะภายในคำค้นหา SQL โดยใช้ฟังก์ชัน ai.if() เพื่อกรองผลลัพธ์ตามบริบท ไม่ใช่แค่คณิตศาสตร์

สถาปัตยกรรม

Neighbor Loop จะข้ามการติดขัดที่เลเยอร์แอปพลิเคชันแบบเดิม เราใช้สิ่งต่อไปนี้แทนการดึงข้อมูลออกมาเพื่อประมวลผล

  1. การผสานรวม Cloud SQL + ML: เพื่อสร้างและจัดเก็บเวกเตอร์แบบเรียลไทม์
  2. Google Cloud Storage: เพื่อจัดเก็บรูปภาพ
  3. Gemini 3.0 Flash: เพื่อดำเนินการให้เหตุผลในระดับต่ำกว่าวินาทีเกี่ยวกับข้อมูลรูปภาพและข้อความโดยตรงผ่าน SQL
  4. Cloud Run: เพื่อโฮสต์แบ็กเอนด์ Flask แบบไฟล์เดียวที่มีน้ำหนักเบา

ข้อกำหนด

  • เบราว์เซอร์ เช่น Chrome หรือ Firefox
  • โปรเจ็กต์ Google Cloud ที่เปิดใช้การเรียกเก็บเงิน
  • มีความคุ้นเคยพื้นฐานกับ SQL และ Python

2. ก่อนเริ่มต้น

สร้างโปรเจ็กต์

  1. ในคอนโซล Google Cloud ให้เลือกหรือสร้างโปรเจ็กต์ Google Cloud ในหน้าตัวเลือกโปรเจ็กต์
  2. ตรวจสอบว่าได้เปิดใช้การเรียกเก็บเงินสำหรับโปรเจ็กต์ Cloud แล้ว ดูวิธีตรวจสอบว่าโปรเจ็กต์เปิดใช้การเรียกเก็บเงินแล้วหรือไม่
  1. คุณจะใช้ Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานใน Google Cloud คลิกเปิดใช้งาน Cloud Shell ที่ด้านบนของคอนโซล Google Cloud

รูปภาพปุ่มเปิดใช้งาน Cloud Shell

  1. เมื่อเชื่อมต่อกับ Cloud Shell แล้ว ให้ตรวจสอบว่าคุณได้รับการตรวจสอบสิทธิ์แล้วและตั้งค่าโปรเจ็กต์เป็นรหัสโปรเจ็กต์โดยใช้คำสั่งต่อไปนี้
gcloud auth list
  1. เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell เพื่อยืนยันว่าคำสั่ง gcloud รู้จักโปรเจ็กต์ของคุณ
gcloud config list project
  1. หากไม่ได้ตั้งค่าโปรเจ็กต์ ให้ใช้คำสั่งต่อไปนี้เพื่อตั้งค่า
gcloud config set project <YOUR_PROJECT_ID>
  1. เปิดใช้ API ที่จำเป็น: ทำตามลิงก์และเปิดใช้ API

หรือจะใช้คำสั่ง gcloud สำหรับการดำเนินการนี้ก็ได้ โปรดดูคำสั่งและการใช้งาน gcloud ในเอกสารประกอบ

ข้อควรระวังและการแก้ปัญหา

กลุ่มอาการ"โปรเจ็กต์ผี"

คุณเรียกใช้ gcloud config set project แต่จริงๆ แล้วคุณกำลังดูโปรเจ็กต์อื่นใน UI ของคอนโซล ตรวจสอบรหัสโปรเจ็กต์ในเมนูแบบเลื่อนลงด้านซ้ายบน

แผงกั้น การเรียกเก็บเงิน

คุณเปิดใช้โปรเจ็กต์แล้ว แต่ลืมบัญชีสำหรับการเรียกเก็บเงิน Cloud SQL จะไม่เริ่มทำงานหากการเรียกเก็บเงินว่างเปล่า

ความล่าช้าการเผยแพร่ API

คุณคลิก "เปิดใช้ API" แต่บรรทัดคำสั่งยังคงแสดง Service Not Enabled รอ 60 วินาที ระบบคลาวด์ต้องใช้เวลาสักครู่ในการเปิดใช้งานนิวรอน

3. การตั้งค่าฐานข้อมูล

ใน Lab นี้ เราจะใช้ Cloud SQL สำหรับ PostgreSQL เป็นฐานข้อมูลสำหรับข้อมูลทดสอบ

มาสร้างอินสแตนซ์ Cloud SQL ที่จะโหลดชุดข้อมูลทดสอบกัน

  1. คลิกปุ่มหรือคัดลอกลิงก์ด้านล่างไปยังเบราว์เซอร์ที่คุณเข้าสู่ระบบผู้ใช้ Google Cloud Console

  1. เมื่อทำขั้นตอนนี้เสร็จแล้ว ระบบจะโคลนที่เก็บไปยังโปรแกรมแก้ไข Cloud Shell ในเครื่อง และคุณจะเรียกใช้คำสั่งด้านล่างจากโฟลเดอร์โปรเจ็กต์ได้ (โปรดตรวจสอบว่าคุณอยู่ในไดเรกทอรีโปรเจ็กต์)
sh run.sh
  1. ตอนนี้ให้ใช้ UI (คลิกลิงก์ในเทอร์มินัลหรือคลิกลิงก์ "แสดงตัวอย่างบนเว็บ" ในเทอร์มินัล)
  2. ป้อนรายละเอียดสำหรับรหัสโปรเจ็กต์และชื่ออินสแตนซ์เพื่อเริ่มต้นใช้งาน
  3. ไปหากาแฟดื่มระหว่างที่บันทึกเลื่อนลงมาได้เลย และคุณสามารถอ่านเกี่ยวกับวิธีที่ระบบดำเนินการนี้เบื้องหลังได้ที่นี่

ข้อควรระวังและการแก้ปัญหา

ภูมิภาคไม่ตรงกัน

หากเปิดใช้ API ใน us-central1 แต่พยายามจัดสรรคลัสเตอร์ใน asia-south1 คุณอาจพบปัญหาเกี่ยวกับโควต้าหรือการหน่วงเวลาของสิทธิ์ในบัญชีบริการ ใช้ภูมิภาคเดียวตลอดทั้งแล็บ

การหมดเวลาของ Cloud Shell

หากคุณพักดื่มกาแฟเป็นเวลา 30 นาที Cloud Shell อาจเข้าสู่โหมดสลีปและยกเลิกการเชื่อมต่อกระบวนการ sh run.sh อย่าปิดแท็บ

4. การจัดสรรสคีมา

เมื่ออินสแตนซ์ Cloud SQL ทำงานแล้ว ให้ไปที่โปรแกรมแก้ไข SQL ของ Cloud SQL Studio เพื่อเปิดใช้ส่วนขยาย AI และจัดสรรสคีมา

5a835906362f7609.png

คุณอาจต้องรอให้อินสแตนซ์สร้างเสร็จเรียบร้อย เมื่อพร้อมแล้ว ให้ลงชื่อเข้าใช้อินสแตนซ์ Cloud SQL โดยใช้ข้อมูลเข้าสู่ระบบที่คุณสร้างขึ้นเมื่อสร้างอินสแตนซ์ ใช้ข้อมูลต่อไปนี้เพื่อตรวจสอบสิทธิ์ใน PostgreSQL

  • ชื่อผู้ใช้ : "postgres"
  • ฐานข้อมูล : "postgres"
  • รหัสผ่าน : "cloudsql" (หรือรหัสผ่านที่คุณตั้งค่าไว้ตอนสร้าง)

เมื่อตรวจสอบสิทธิ์ใน Cloud SQL Studio สำเร็จแล้ว ให้ป้อนคำสั่ง SQL ในตัวแก้ไข คุณเพิ่มหน้าต่างเอดิเตอร์หลายหน้าต่างได้โดยใช้เครื่องหมายบวกทางด้านขวาของหน้าต่างสุดท้าย

9408d708b7dac90c.png

คุณจะป้อนคำสั่งสำหรับ Cloud SQL ในหน้าต่างเอดิเตอร์ โดยใช้ตัวเลือกเรียกใช้ จัดรูปแบบ และล้างตามที่จำเป็น

เปิดใช้ส่วนขยาย

ในการสร้างแอปนี้ เราจะใช้ส่วนขยาย pgvector และ google_ml_integration ส่วนขยาย pgvector ช่วยให้คุณจัดเก็บและค้นหาการฝังเวกเตอร์ได้ ส่วนขยาย google_ml_integration มีฟังก์ชันที่คุณใช้เพื่อเข้าถึงปลายทางการคาดการณ์ของ Vertex AI เพื่อรับการคาดการณ์ใน SQL เปิดใช้ส่วนขยายเหล่านี้โดยเรียกใช้ DDL ต่อไปนี้

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

สร้างตาราง

คุณสร้างตารางได้โดยใช้คำสั่ง DDL ด้านล่างใน 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()
);

คอลัมน์ item_vector จะอนุญาตให้จัดเก็บค่าเวกเตอร์ของข้อความ

ให้สิทธิ์

เรียกใช้คำสั่งด้านล่างเพื่อให้สิทธิ์ดำเนินการในฟังก์ชัน "ฝัง"

GRANT EXECUTE ON FUNCTION embedding TO postgres;

เปิดใช้การผสานรวม ML

หากต้องการใช้ประโยชน์จากฟีเจอร์แมชชีนเลิร์นนิงภายในฐานข้อมูลโดยตรง คุณต้องเปิดใช้ Flag การผสานรวม ML

คุณเรียกใช้คำสั่งด้านล่างจากเทอร์มินัล 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

มอบบทบาทผู้ใช้ Vertex AI ให้กับบัญชีบริการ Cloud SQL

จากคอนโซล Google Cloud IAM ให้ให้สิทธิ์เข้าถึงบทบาท "ผู้ใช้ Vertex AI" แก่บัญชีบริการ Cloud SQL (ซึ่งมีลักษณะดังนี้ service-<<PROJECT_NUMBER >>@cp-sa-cloud-sql.iam.gserviceaccount.com) PROJECT_NUMBER จะมีหมายเลขโปรเจ็กต์ของคุณ

หรือคุณอาจเรียกใช้คำสั่งด้านล่างจากเทอร์มินัล 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"

ลงทะเบียนโมเดล Gemini 3 Flash ใน Cloud SQL

เรียกใช้คำสั่ง SQL ด้านล่างจากตัวแก้ไขการค้นหา 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.

ข้อควรระวังและการแก้ปัญหา

วงจร "ลืมรหัสผ่าน"

หากคุณใช้การตั้งค่า "คลิกเดียว" และจำรหัสผ่านไม่ได้ ให้ไปที่หน้าข้อมูลพื้นฐานของอินสแตนซ์ในคอนโซล แล้วคลิก "แก้ไข" เพื่อรีเซ็ตรหัสผ่าน postgres

ข้อผิดพลาด "ไม่พบส่วนขยาย"

หาก CREATE EXTENSION ล้มเหลว มักเป็นเพราะอินสแตนซ์ยังอยู่ในสถานะ "การบำรุงรักษา" หรือ "การอัปเดต" จากการจัดสรรครั้งแรก ไปตรวจสอบว่าขั้นตอนการสร้างอินสแตนซ์เสร็จสมบูรณ์แล้วหรือไม่ และรอสักครู่หากจำเป็น

ช่องว่างในการเผยแพร่ IAM

คุณเรียกใช้gcloudคำสั่ง IAM แต่ SQL CALL ยังคงล้มเหลวเนื่องจากข้อผิดพลาดเกี่ยวกับสิทธิ์ การเปลี่ยนแปลง IAM อาจใช้เวลาสักครู่จึงจะมีผลผ่านแกนหลักของ Google พักหายใจสักหน่อย

มิติข้อมูลเวกเตอร์ไม่ตรงกัน

ตั้งค่าตาราง items เป็น VECTOR(768) หากคุณพยายามใช้โมเดลอื่น (เช่น โมเดล 1536 มิติ) ในภายหลัง การแทรกจะขยายออก อย่าลืม text-embedding-005

พิมพ์รหัสโปรเจ็กต์ผิด

ในcreate_model หากคุณเว้นวงเล็บ « » หรือพิมพ์รหัสโปรเจ็กต์ผิด การลงทะเบียนโมเดลจะดูเหมือนสำเร็จ แต่จะล้มเหลวในระหว่างการค้นหาจริงครั้งแรก ตรวจสอบสตริงอีกครั้ง

การผสานรวม Vertex AI ปิดใช้อยู่

เรียกใช้ –enable-google-ml-integration (แยกจากแฟล็กฐานข้อมูล)

5. ที่เก็บรูปภาพ (Google Cloud Storage)

เราใช้ที่เก็บข้อมูล GCS เพื่อจัดเก็บรูปภาพของสินค้าคงค้าง สำหรับแอปเดโมนี้ เราต้องการให้รูปภาพเข้าถึงได้แบบสาธารณะเพื่อให้แสดงผลในการ์ดปัดได้ทันที

  1. สร้าง Bucket: สร้าง Bucket ใหม่ในโปรเจ็กต์ GCP (เช่น neighborloop-images) โดยควรอยู่ในภูมิภาคเดียวกับฐานข้อมูลและแอปพลิเคชัน
  2. กำหนดค่าการเข้าถึงแบบสาธารณะ: * ไปที่แท็บสิทธิ์ของที่เก็บข้อมูล
  3. เพิ่มหลักการ allUsers
  4. มอบหมายบทบาทผู้ดูออบเจ็กต์ในพื้นที่เก็บข้อมูล (เพื่อให้ทุกคนดูรูปภาพได้) และบทบาทผู้สร้างออบเจ็กต์ในพื้นที่เก็บข้อมูล (เพื่อวัตถุประสงค์ในการอัปโหลดการสาธิต)

ทางเลือก (บัญชีบริการ): หากไม่ต้องการใช้การเข้าถึงแบบสาธารณะ โปรดตรวจสอบว่าบัญชีบริการของแอปพลิเคชันได้รับสิทธิ์เข้าถึง Cloud SQL อย่างเต็มรูปแบบและบทบาท Storage ที่จำเป็นเพื่อจัดการออบเจ็กต์อย่างปลอดภัย

หากต้องการเรียกใช้คำสั่งและให้สิทธิ์เข้าถึงแบบสาธารณะ เรียกใช้คำสั่งด้านล่างในเทอร์มินัลของ Cloud Shell

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

ข้อควรระวังและการแก้ปัญหา

The Region Drag

หากฐานข้อมูลอยู่ใน us-central1 และ Bucket อยู่ใน europe-west1 คุณกำลังทำให้ AI ทำงานช้าลง "การตรวจสอบบรรยากาศ" เกิดขึ้นอย่างรวดเร็ว แต่การดึงข้อมูลรูปภาพสำหรับ UI จะรู้สึกว่าช้า เก็บไว้ในภูมิภาคเดียวกัน

ชื่อที่เก็บข้อมูลต้องไม่ซ้ำกัน

ชื่อ Bucket เป็นเนมสเปซส่วนกลาง หากคุณพยายามตั้งชื่อ Bucket เป็น neighborloop-images แสดงว่ามีคนอื่นใช้ชื่อนี้อยู่แล้ว หากสร้างไม่สำเร็จ ให้เพิ่มคำต่อท้ายแบบสุ่ม

ความสับสนระหว่าง "ครีเอเตอร์" กับ "ผู้ชม"

การสับสนระหว่าง "ผู้สร้าง" กับ "ผู้ดู": หากคุณเพิ่มเฉพาะ "ผู้ดู" แอปจะขัดข้องเมื่อผู้ใช้พยายามแสดงรายการใหม่ เนื่องจากไม่มีสิทธิ์เขียนไฟล์ คุณต้องมีทั้ง 2 อย่างนี้สำหรับการตั้งค่าการสาธิตนี้

6. มาสร้างแอปพลิเคชันกัน

โคลนที่เก็บนี้ลงในโปรเจ็กต์ของคุณ แล้วมาดูรายละเอียดกัน

  1. หากต้องการโคลน ให้เรียกใช้คำสั่งต่อไปนี้ทีละคำสั่งจากเทอร์มินัล Cloud Shell (ในไดเรกทอรีรากหรือจากที่ใดก็ตามที่คุณต้องการสร้างโปรเจ็กต์นี้)
git clone https://github.com/flazer99/neighbor-loop-cloud-sql

cd neighbor-loop-cloud-sql/

ซึ่งควรสร้างโปรเจ็กต์และคุณสามารถยืนยันได้ใน Cloud Shell Editor

53a398aff6ba7d5b.png

  1. วิธีรับคีย์ Gemini API
  2. ไปที่ Google AI Studio: ไปที่ aistudio.google.com
  3. ลงชื่อเข้าใช้: ใช้บัญชี Google เดียวกันกับที่ใช้สำหรับโปรเจ็กต์ Google Cloud
  4. สร้างคีย์ API
  5. คลิก "รับคีย์ API" ในแถบด้านข้างทางซ้ายมือ
  6. คลิกปุ่ม "สร้างคีย์ API ในโปรเจ็กต์ใหม่"
  7. คัดลอกคีย์: เมื่อสร้างคีย์แล้ว ให้คลิกไอคอนคัดลอก
  8. ตอนนี้ให้ตั้งค่าตัวแปรสภาพแวดล้อมในไฟล์ .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>>

แทนที่ค่าสำหรับตัวยึดตำแหน่ง <<YOUR_GEMINI_API_KEY>>, <<YOUR_PASSWORD>, <<HOST_IP>>, <<PORT>> and <<YOUR_GCS_BUCKET>>.

ข้อควรระวังและการแก้ปัญหา

ความสับสนเกี่ยวกับบัญชีหลายบัญชี

หากคุณเข้าสู่ระบบบัญชี Google หลายบัญชี (ส่วนตัวเทียบกับที่ทำงาน) AI Studio อาจตั้งค่าเริ่มต้นเป็นบัญชีที่ไม่ถูกต้อง ตรวจสอบอวตารที่มุมขวาบนเพื่อให้ตรงกับบัญชีโปรเจ็กต์ GCP

โควต้า "Free Tier" ถึงขีดจำกัด

หากคุณใช้ระดับแบบไม่มีค่าใช้จ่าย จะมีขีดจำกัดอัตรา (RPM - คำขอต่อนาที) หาก "ปัด" เร็วเกินไปใน Neighbor Loop คุณอาจได้รับข้อผิดพลาด 429 Too Many Requests ใจเย็นๆ

ความปลอดภัยของคีย์ที่เปิดเผย

หากคุณgit commitไฟล์ .env โดยไม่ได้ตั้งใจและมีคีย์อยู่ภายใน เพิ่ม .env ลงใน .gitignore เสมอ

7. มาตรวจสอบรหัสกัน

"โปรไฟล์หาคู่" สำหรับสิ่งที่คุณมี

c2c543562cc9b353.png

เมื่อผู้ใช้อัปโหลดรูปภาพของสินค้า ผู้ใช้ไม่ควรต้องเขียนคำอธิบายยาวๆ ฉันใช้ Gemini 3 Flash เพื่อ "ดู" รายการและเขียนข้อมูลสำหรับรายการเหล่านั้น

ในแบ็กเอนด์ ผู้ใช้เพียงแค่ระบุชื่อและรูปภาพ Gemini จะจัดการส่วนที่เหลือให้เอง

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

การฝังในฐานข้อมูลแบบเรียลไทม์

aa783a459f1b02da.png

ฟีเจอร์ที่ยอดเยี่ยมอย่างหนึ่งของ Cloud SQL คือความสามารถในการสร้างการฝังโดยไม่ต้องออกจากบริบท SQL แทนที่จะเรียกใช้โมเดลการฝังใน Python และส่งเวกเตอร์กลับไปยัง DB ฉันทำทุกอย่างในคำสั่ง INSERT เดียวโดยใช้ฟังก์ชัน 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
)

ซึ่งช่วยให้มั่นใจว่าทุกรายการจะ "ค้นหาได้" ตามความหมายของรายการนั้นๆ ทันทีที่โพสต์ และโปรดทราบว่าส่วนนี้ครอบคลุมฟีเจอร์ "แสดงผลิตภัณฑ์" ของแอป Neighbor Loop

เพิ่มภาพหน้าจอของฟีเจอร์การแสดงผลิตภัณฑ์

การค้นหาเวกเตอร์ขั้นสูงและการกรองอัจฉริยะด้วย Gemini 3.0

การค้นหาคีย์เวิร์ดมาตรฐานมีข้อจำกัด หากคุณค้นหา "วิธีซ่อมเก้าอี้" ฐานข้อมูลแบบเดิมอาจไม่แสดงผลลัพธ์ใดๆ หากไม่มีคำว่า "เก้าอี้" ในชื่อ Neighbor Loop แก้ปัญหานี้ด้วยการค้นหาเวกเตอร์ขั้นสูงของ AI ใน Cloud SQL

การใช้ส่วนขยาย pgvector และพื้นที่เก็บข้อมูลที่เพิ่มประสิทธิภาพของ Cloud SQL ช่วยให้เราค้นหาความคล้ายกันได้อย่างรวดเร็ว แต่ "เวทมนตร์" ที่แท้จริงจะเกิดขึ้นเมื่อเราผสานรวมความใกล้เคียงของเวกเตอร์กับตรรกะที่อิงตาม 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

การค้นหานี้แสดงถึงการเปลี่ยนแปลงครั้งสำคัญในสถาปัตยกรรม นั่นคือเรากำลังย้ายตรรกะไปยังข้อมูล Gemini 3 Flash จะทำการ "ตรวจสอบบรรยากาศ" ภายในเครื่องมือฐานข้อมูลแทนที่จะดึงผลลัพธ์หลายพันรายการลงในโค้ดแอปพลิเคชันเพื่อกรอง ซึ่งจะช่วยลดเวลาในการตอบสนอง ลดต้นทุนสำหรับข้อมูลขาออก และทำให้มั่นใจได้ว่าผลลัพธ์จะไม่เพียงแค่มีความคล้ายคลึงกันในเชิงคณิตศาสตร์ แต่ยังมีความเกี่ยวข้องตามบริบทด้วย

ภาพหน้าจอของฟีเจอร์การค้นหาเชิงความหมาย

วงจร "ปัดเพื่อจับคู่"

UI เป็นสำรับไพ่คลาสสิก

ปัดไปทางซ้าย: ทิ้ง

ปัดไปทางขวา: คุณจับคู่ได้แล้ว

ภาพหน้าจอของฟีเจอร์ปัดเพื่อจับคู่

เมื่อคุณปัดไปทางขวา แบ็กเอนด์จะบันทึกการโต้ตอบในตารางการปัดของเราและทําเครื่องหมายรายการว่าตรงกัน ส่วนหน้าจะทริกเกอร์โมดอลทันทีเพื่อแสดงข้อมูลติดต่อของผู้ให้บริการเพื่อให้คุณจัดเตรียมการรับสินค้าได้

8. มาทำให้ใช้งานได้ใน Cloud Run กัน

  1. ทำให้ใช้งานได้ใน Cloud Run โดยเรียกใช้คำสั่งต่อไปนี้จากเทอร์มินัล Cloud Shell ที่โคลนโปรเจ็กต์และตรวจสอบว่าคุณอยู่ในโฟลเดอร์รูทของโปรเจ็กต์

เรียกใช้คำสั่งนี้ในเทอร์มินัล Cloud Shell

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

แทนที่ค่าสำหรับตัวยึดตำแหน่ง <<YOUR_GEMINI_API_KEY>>, <<YOUR_PASSWORD>, <<PRIVATE_IP_HOST>>, <<PORT>> and <<YOUR_GCS_BUCKET>>

เมื่อคำสั่งเสร็จสิ้นแล้ว ระบบจะแสดง URL ของบริการ คัดลอก

ตอนนี้ให้ใช้ URL ของบริการ (ปลายทาง Cloud Run ที่คุณคัดลอกไว้ก่อนหน้านี้) แล้วทดสอบแอป อัปโหลดรูปภาพเครื่องมือไฟฟ้าเก่าๆ นั้น แล้วให้ Gemini จัดการส่วนที่เหลือ

ข้อควรระวังและการแก้ปัญหา

วงจร "การแก้ไขล้มเหลว"

หากการติดตั้งใช้งานเสร็จสมบูรณ์ แต่ URL แสดง 500 Internal Server Error ให้ตรวจสอบบันทึก โดยปกติแล้ว ปัญหานี้เกิดจากตัวแปรสภาพแวดล้อมที่ขาดหายไป (เช่น การพิมพ์ผิดใน DATABASE_URL) หรือบัญชีบริการ Cloud Run ไม่มีสิทธิ์อ่านจาก Bucket ของ GCS

9. การแก้ปัญหาในระดับสูง

206a26fcd93ea48.png

10. สาธิต

คุณควรใช้ปลายทางสำหรับการทดสอบได้

แต่หากต้องการใช้เพื่อการสาธิตเป็นเวลา 2-3 วัน คุณสามารถลองใช้สิ่งต่อไปนี้ได้

11. ล้างข้อมูล

เมื่อทำแล็บนี้เสร็จแล้ว อย่าลืมลบอินสแตนซ์ Cloud SQL

12. ขอแสดงความยินดี

คุณสร้างแอป Neighbor Loop สำหรับชุมชนที่ยั่งยืนด้วย Google Cloud เรียบร้อยแล้ว การย้ายตรรกะการฝังและ AI ของ Gemini 3 Flash ไปยัง Cloud SQL ทำให้แอปทำงานได้รวดเร็วอย่างไม่น่าเชื่อ (ขึ้นอยู่กับการตั้งค่าการติดตั้งใช้งาน) และโค้ดก็สะอาดอย่างเห็นได้ชัด เราไม่ได้จัดเก็บแค่ข้อมูล แต่เราจัดเก็บเจตนาด้วย

การผสานความเร็วของ Gemini 3 Flash เข้ากับการประมวลผลเวกเตอร์ที่ได้รับการเพิ่มประสิทธิภาพของ Cloud SQL ถือเป็นขอบเขตใหม่สำหรับแพลตฟอร์มที่ขับเคลื่อนโดยชุมชนอย่างแท้จริง