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

1. ภาพรวม

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

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

1da27e0c4d9a33e0.jpeg

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

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

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

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

สถาปัตยกรรม

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

  1. AlloyDB AI: เพื่อสร้างและจัดเก็บเวกเตอร์แบบเรียลไทม์
  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 ของคอนโซล ตรวจสอบรหัสโปรเจ็กต์ในเมนูแบบเลื่อนลงด้านซ้ายบน

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

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

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

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

คำถามที่พบบ่อยเกี่ยวกับโควต้า

หากใช้บัญชีทดลองใช้ใหม่ คุณอาจพบโควต้าระดับภูมิภาคสำหรับอินสแตนซ์ AlloyDB หาก us-central1 ไม่สำเร็จ ให้ลอง us-east1

ตัวแทนบริการ"ซ่อน"

บางครั้ง AlloyDB Service Agent จะไม่ได้รับบทบาท aiplatform.user โดยอัตโนมัติ หากคำค้นหา SQL สื่อสารกับ Gemini ไม่ได้ในภายหลัง สาเหตุส่วนใหญ่จะมาจากข้อจำกัดนี้

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

ในแล็บนี้ เราจะใช้ AlloyDB เป็นฐานข้อมูลสำหรับข้อมูลทดสอบ โดยจะใช้คลัสเตอร์เพื่อจัดเก็บทรัพยากรทั้งหมด เช่น ฐานข้อมูลและบันทึก แต่ละคลัสเตอร์มีอินสแตนซ์หลักที่ให้จุดเข้าถึงข้อมูล ตารางจะเก็บข้อมูลจริง

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

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

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

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

ปัญหาเรื่อง "ความอดทน"

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

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

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

คลัสเตอร์ซอมบี้

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

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

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

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

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

1e3ac974b18a8113.png

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

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

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

28cb9a8b6aa0789f.png

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

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

ในการสร้างแอปนี้ เราจะใช้ส่วนขยาย 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 ด้านล่างใน AlloyDB 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;

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

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

หรือจะเรียกใช้คำสั่งด้านล่างจากเทอร์มินัล Cloud Shell ก็ได้

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"

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

เรียกใช้คำสั่ง SQL ด้านล่างจากเครื่องมือแก้ไขการค้นหา AlloyDB

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 => 'llm',
   model_auth_type => 'alloydb_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 หากคุณเว้นวงเล็บ « » หรือพิมพ์รหัสโปรเจ็กต์ผิด การลงทะเบียนโมเดลจะดูเหมือนสำเร็จ แต่จะล้มเหลวในระหว่างการค้นหาจริงครั้งแรก ตรวจสอบสตริงอีกครั้ง

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

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

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

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

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

The Region Drag

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

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

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

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

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

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

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

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

ซึ่งควรสร้างโปรเจ็กต์และคุณสามารถยืนยันได้ใน 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 เสมอ

การยกเลิก "การเชื่อมต่อหมดเวลา"

คุณใช้ที่อยู่ IP ส่วนตัวในไฟล์ .env แต่พยายามเชื่อมต่อจากภายนอก VPC (เช่น เครื่องในพื้นที่) ที่อยู่ IP ส่วนตัวจะเข้าถึงได้จากภายในเครือข่าย Google Cloud เดียวกันเท่านั้น เปลี่ยนไปใช้ IP สาธารณะ

สมมติฐานเกี่ยวกับพอร์ต 5432

แม้ว่า 5432 จะเป็นพอร์ต PostgreSQL มาตรฐาน แต่บางครั้ง AlloyDB ก็ต้องมีการกำหนดค่าพอร์ตที่เฉพาะเจาะจงหากคุณใช้ Auth Proxy สำหรับแล็บนี้ โปรดตรวจสอบว่าคุณใช้ :5432 ที่ท้ายสตริงโฮสต์

ผู้ดูแล "เครือข่ายที่ได้รับอนุญาต"

แม้ว่าคุณจะมี IP สาธารณะ แต่ AlloyDB จะ "ปฏิเสธการเชื่อมต่อ" เว้นแต่คุณจะเพิ่มที่อยู่ IP ของเครื่องที่เรียกใช้โค้ดลงในรายการที่อนุญาตวิธีแก้ไข: ในการตั้งค่าอินสแตนซ์ AlloyDB ให้เพิ่ม 0.0.0.0/0 (สําหรับการทดสอบชั่วคราวเท่านั้น) หรือ IP เฉพาะของคุณลงในเครือข่ายที่ได้รับอนุญาต

แฮนด์เชค SSL/TLS ไม่สำเร็จ

AlloyDB ต้องการการเชื่อมต่อที่ปลอดภัย หาก DATABASE_URL ไม่ได้ระบุไดรเวอร์อย่างถูกต้อง (เช่น ใช้ pg8000) การแฮนด์เชคอาจล้มเหลวโดยไม่มีข้อความแจ้ง ทำให้คุณได้รับข้อผิดพลาดทั่วไปว่า "เข้าถึงฐานข้อมูลไม่ได้"

การสลับ "พูลหลักเทียบกับพูลอ่าน"

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

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

ฟีเจอร์ที่ยอดเยี่ยมอย่างหนึ่งของ AlloyDB คือความสามารถในการสร้างการฝังโดยไม่ต้องออกจากบริบท 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 แก้ปัญหานี้ด้วยการค้นหาเวกเตอร์ขั้นสูงของ AlloyDB AI

การใช้ส่วนขยาย pgvector และพื้นที่เก็บข้อมูลที่ได้รับการเพิ่มประสิทธิภาพของ AlloyDB ช่วยให้เราทำการค้นหาความคล้ายกันได้อย่างรวดเร็ว แต่ "เวทมนตร์" ที่แท้จริงจะเกิดขึ้นเมื่อเราผสานรวมความใกล้เคียงของเวกเตอร์เข้ากับตรรกะที่อิงตาม LLM

AlloyDB AI ช่วยให้เราเรียกใช้โมเดลต่างๆ เช่น Gemini ได้โดยตรงภายในคำค้นหา SQL ซึ่งหมายความว่าเราสามารถทำการค้นพบเชิงความหมายซึ่งรวมถึง "การตรวจสอบความสมเหตุสมผล" ตามตรรกะโดยใช้ฟังก์ชัน ai.if() ได้

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
 AND ai.if(
       prompt => 'Does this text: "' || bio ||'" match the user request: "' ||  :query || '", at least 60%? "',
       model_id => 'gemini-3-flash-preview'
     ) 
ORDER BY score DESC
LIMIT 5

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

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

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

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

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

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

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

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

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

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

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

gcloud beta run deploy neighbor-loop \
   --source . \
   --region=us-central1 \
   --network=<<YOUR_NETWORK_NAME>> \
   --subnet=<<YOUR_SUBNET_NAME>> \
   --allow-unauthenticated \
   --vpc-egress=all-traffic \
   --set-env-vars GEMINI_API_KEY=<<YOUR_GEMINI_API_KEY>>,DATABASE_URL=postgresql+pg8000://postgres:<<YOUR_PASSWORD>>@<<PRIVATE_IP_HOST>>:<<PORT>>/postgres,GCS_BUCKET_NAME=<<YOUR_GCS_BUCKET>>

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

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

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

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

# 1. Get your Project ID and Project Number
PROJECT_ID=$(gcloud config get-value project)
PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")

# 2. Grant the AlloyDB Client role
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
--role="roles/alloydb.client"

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

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

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

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

บทบาท "Shadow" ของ IAM

แม้ว่าคุณจะมีสิทธิ์ทำให้ใช้งานได้ แต่บัญชีบริการ Cloud Run (โดยปกติคือ [project-number]-compute@developer.gserviceaccount.com) ต้องมีบทบาท AlloyDB Client เพื่อสร้างการเชื่อมต่อกับฐานข้อมูลจริงๆ

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

b6cdd3785d5461a9.jpeg

10. สาธิต

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

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

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

เมื่อห้องทดลองนี้เสร็จสิ้นแล้ว อย่าลืมลบคลัสเตอร์และอินสแตนซ์ AlloyDB

ซึ่งควรล้างข้อมูลคลัสเตอร์พร้อมกับอินสแตนซ์

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

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

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