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

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

- เมื่อเชื่อมต่อกับ Cloud Shell แล้ว ให้ตรวจสอบว่าคุณได้รับการตรวจสอบสิทธิ์แล้วและตั้งค่าโปรเจ็กต์เป็นรหัสโปรเจ็กต์โดยใช้คำสั่งต่อไปนี้
gcloud auth list
- เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell เพื่อยืนยันว่าคำสั่ง gcloud รู้จักโปรเจ็กต์ของคุณ
gcloud config list project
- หากไม่ได้ตั้งค่าโปรเจ็กต์ ให้ใช้คำสั่งต่อไปนี้เพื่อตั้งค่า
gcloud config set project <YOUR_PROJECT_ID>
- เปิดใช้ API ที่จำเป็น: ทำตามลิงก์และเปิดใช้ API
หรือจะใช้คำสั่ง gcloud สำหรับการดำเนินการนี้ก็ได้ โปรดดูคำสั่งและการใช้งาน gcloud ในเอกสารประกอบ
ข้อควรระวังและการแก้ปัญหา
กลุ่มอาการ"โปรเจ็กต์ผี" | คุณเรียกใช้ |
แผงกั้น การเรียกเก็บเงิน | คุณเปิดใช้โปรเจ็กต์แล้ว แต่ลืมบัญชีสำหรับการเรียกเก็บเงิน AlloyDB เป็นเครื่องมือที่มีประสิทธิภาพสูง ซึ่งจะไม่เริ่มทำงานหาก "ถังน้ำมัน" (การเรียกเก็บเงิน) ว่างเปล่า |
ความล่าช้าการเผยแพร่ API | คุณคลิก "เปิดใช้ API" แต่บรรทัดคำสั่งยังคงแสดง |
คำถามที่พบบ่อยเกี่ยวกับโควต้า | หากใช้บัญชีทดลองใช้ใหม่ คุณอาจพบโควต้าระดับภูมิภาคสำหรับอินสแตนซ์ AlloyDB หาก |
ตัวแทนบริการ"ซ่อน" | บางครั้งระบบไม่ได้มอบบทบาท |
3. การตั้งค่าฐานข้อมูล
ในแล็บนี้ เราจะใช้ AlloyDB เป็นฐานข้อมูลสำหรับข้อมูลทดสอบ โดยจะใช้คลัสเตอร์เพื่อจัดเก็บทรัพยากรทั้งหมด เช่น ฐานข้อมูลและบันทึก แต่ละคลัสเตอร์มีอินสแตนซ์หลักที่ให้จุดเข้าใช้งานข้อมูล ตารางจะเก็บข้อมูลจริง
มาสร้างคลัสเตอร์ อินสแตนซ์ และตาราง AlloyDB ที่จะโหลดชุดข้อมูลทดสอบกัน
- คลิกปุ่มหรือคัดลอกลิงก์ด้านล่างไปยังเบราว์เซอร์ที่คุณเข้าสู่ระบบผู้ใช้คอนโซล Google Cloud
- เมื่อขั้นตอนนี้เสร็จสมบูรณ์แล้ว ระบบจะโคลนที่เก็บไปยังโปรแกรมแก้ไข Cloud Shell ในเครื่องของคุณ และคุณจะเรียกใช้คำสั่งด้านล่างจากโฟลเดอร์โปรเจ็กต์ได้ (โปรดตรวจสอบว่าคุณอยู่ในไดเรกทอรีโปรเจ็กต์)
sh run.sh
- ตอนนี้ให้ใช้ UI (คลิกลิงก์ในเทอร์มินัลหรือคลิกลิงก์ "แสดงตัวอย่างบนเว็บ" ในเทอร์มินัล
- ป้อนรายละเอียดสำหรับรหัสโปรเจ็กต์ ชื่อคลัสเตอร์ และชื่ออินสแตนซ์เพื่อเริ่มต้นใช้งาน
- ไปหากาแฟดื่มระหว่างที่บันทึกเลื่อนลงมาได้เลย และคุณสามารถอ่านเกี่ยวกับวิธีที่ระบบดำเนินการนี้เบื้องหลังได้ที่นี่
ข้อควรระวังและการแก้ปัญหา
ปัญหาเรื่อง "ความอดทน" | คลัสเตอร์ฐานข้อมูลเป็นโครงสร้างพื้นฐานที่มีขนาดใหญ่ หากรีเฟรชหน้าเว็บหรือปิดเซสชัน Cloud Shell เนื่องจาก "ดูเหมือนว่าค้างอยู่" คุณอาจมีอินสแตนซ์ "ผี" ที่มีการจัดสรรบางส่วนและลบไม่ได้หากไม่ดำเนินการด้วยตนเอง |
ภูมิภาคไม่ตรงกัน | หากเปิดใช้ API ใน |
คลัสเตอร์ซอมบี้ | หากก่อนหน้านี้คุณใช้ชื่อเดียวกันสำหรับคลัสเตอร์และไม่ได้ลบคลัสเตอร์ออก สคริปต์อาจแจ้งว่ามีชื่อคลัสเตอร์อยู่แล้ว ชื่อคลัสเตอร์ต้องไม่ซ้ำกันภายในโปรเจ็กต์ |
การหมดเวลาของ Cloud Shell | หากคุณพักดื่มกาแฟเป็นเวลา 30 นาที Cloud Shell อาจเข้าสู่โหมดสลีปและยกเลิกการเชื่อมต่อกระบวนการ |
4. การจัดสรรสคีมา
เมื่อคลัสเตอร์และอินสแตนซ์ AlloyDB ทำงานแล้ว ให้ไปที่เครื่องมือแก้ไข SQL ของ AlloyDB Studio เพื่อเปิดใช้ส่วนขยาย AI และจัดสรรสคีมา

คุณอาจต้องรอให้อินสแตนซ์สร้างเสร็จ เมื่อพร้อมแล้ว ให้ลงชื่อเข้าใช้ AlloyDB โดยใช้ข้อมูลเข้าสู่ระบบที่คุณสร้างขึ้นเมื่อสร้างคลัสเตอร์ ใช้ข้อมูลต่อไปนี้เพื่อตรวจสอบสิทธิ์ใน PostgreSQL
- ชื่อผู้ใช้ : "
postgres" - ฐานข้อมูล : "
postgres" - รหัสผ่าน : "
alloydb" (หรือรหัสผ่านที่คุณตั้งค่าไว้ตอนสร้าง)
เมื่อตรวจสอบสิทธิ์ใน AlloyDB Studio สำเร็จแล้ว ให้ป้อนคำสั่ง SQL ในเอดิเตอร์ คุณเพิ่มหน้าต่างเอดิเตอร์หลายหน้าต่างได้โดยใช้เครื่องหมายบวกทางด้านขวาของหน้าต่างสุดท้าย

คุณจะป้อนคำสั่งสำหรับ 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.
ข้อควรระวังและการแก้ปัญหา
วงจร "ลืมรหัสผ่าน" | หากคุณใช้การตั้งค่า "คลิกเดียว" และจำรหัสผ่านไม่ได้ ให้ไปที่หน้าข้อมูลพื้นฐานของอินสแตนซ์ในคอนโซล แล้วคลิก "แก้ไข" เพื่อรีเซ็ตรหัสผ่าน |
ข้อผิดพลาด "ไม่พบส่วนขยาย" | หาก |
ช่องว่างในการเผยแพร่ IAM | คุณเรียกใช้ |
มิติข้อมูลเวกเตอร์ไม่ตรงกัน | ตั้งค่าตาราง |
พิมพ์รหัสโปรเจ็กต์ผิด | ใน |
5. ที่เก็บรูปภาพ (Google Cloud Storage)
เราใช้ที่เก็บข้อมูล GCS เพื่อจัดเก็บรูปภาพของสินค้าคงค้าง สำหรับแอปเดโมนี้ เราต้องการให้รูปภาพเข้าถึงได้แบบสาธารณะเพื่อให้แสดงผลในการ์ดที่ปัดได้ทันที
- สร้าง Bucket: สร้าง Bucket ใหม่ในโปรเจ็กต์ GCP (เช่น neighborloop-images) โดยควรอยู่ในภูมิภาคเดียวกับฐานข้อมูลและแอปพลิเคชัน
- กำหนดค่าการเข้าถึงแบบสาธารณะ: * ไปที่แท็บสิทธิ์ของที่เก็บข้อมูล
- เพิ่มหลักการ allUsers
- มอบหมายบทบาทผู้ดูออบเจ็กต์ในพื้นที่เก็บข้อมูล (เพื่อให้ทุกคนดูรูปภาพได้) และบทบาทผู้สร้างออบเจ็กต์ในพื้นที่เก็บข้อมูล (เพื่อวัตถุประสงค์ในการอัปโหลดเดโม)
ทางเลือก (บัญชีบริการ): หากไม่ต้องการใช้การเข้าถึงแบบสาธารณะ โปรดตรวจสอบว่าบัญชีบริการของแอปพลิเคชันได้รับสิทธิ์เข้าถึง AlloyDB อย่างเต็มรูปแบบ รวมถึงบทบาทของ Storage ที่จำเป็นเพื่อจัดการออบเจ็กต์อย่างปลอดภัย
ข้อควรระวังและการแก้ปัญหา
The Region Drag | หากฐานข้อมูลอยู่ใน |
ชื่อที่เก็บข้อมูลที่ไม่ซ้ำกัน | ชื่อ Bucket เป็นเนมสเปซส่วนกลาง หากคุณพยายามตั้งชื่อ Bucket เป็น |
ความสับสนระหว่าง "ครีเอเตอร์" กับ "ผู้ชม" | การสับสนระหว่าง "ผู้สร้าง" กับ "ผู้ดู": หากคุณเพิ่มเฉพาะ "ผู้ดู" แอปจะขัดข้องเมื่อผู้ใช้พยายามแสดงรายการใหม่ เนื่องจากไม่มีสิทธิ์เขียนไฟล์ คุณต้องมีทั้ง 2 อย่างนี้สำหรับการตั้งค่าการสาธิตเฉพาะนี้ |
6. มาสร้างแอปพลิเคชันกัน
โคลนที่เก็บนี้ลงในโปรเจ็กต์ของคุณ แล้วมาดูรายละเอียดกัน
- หากต้องการโคลน ให้เรียกใช้คำสั่งต่อไปนี้จากเทอร์มินัล Cloud Shell (ในไดเรกทอรีรากหรือจากที่ใดก็ตามที่ต้องการสร้างโปรเจ็กต์นี้)
git clone https://github.com/AbiramiSukumaran/neighbor-loop
ซึ่งจะสร้างโปรเจ็กต์และคุณสามารถยืนยันได้ใน Cloud Shell Editor

- วิธีรับคีย์ Gemini API
- ไปที่ Google AI Studio: ไปที่ aistudio.google.com
- ลงชื่อเข้าใช้: ใช้บัญชี Google เดียวกันกับที่ใช้สำหรับโปรเจ็กต์ที่อยู่ในระบบคลาวด์ของ Google Cloud
- สร้างคีย์ API
- คลิก "รับคีย์ API" ในแถบด้านข้างทางซ้ายมือ
- คลิกปุ่ม "สร้างคีย์ API ในโปรเจ็กต์ใหม่"
- คัดลอกคีย์: เมื่อสร้างคีย์แล้ว ให้คลิกไอคอนคัดลอก
- ตอนนี้ให้ตั้งค่าตัวแปรสภาพแวดล้อมในไฟล์ .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 |
ถึงโควต้า "รุ่นฟรี" แล้ว | หากคุณใช้ระดับแบบไม่มีค่าใช้จ่าย จะมีขีดจำกัดอัตรา (RPM - คำขอต่อนาที) หาก "ปัด" เร็วเกินไปใน Neighbor Loop คุณอาจได้รับข้อผิดพลาด |
ความปลอดภัยของคีย์ที่เปิดเผย | หากคุณ |
การยกเลิก "การเชื่อมต่อหมดเวลา" | คุณใช้ที่อยู่ 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. มาตรวจสอบรหัสกัน
ข้อมูลโปรไฟล์สำหรับสิ่งที่คุณมี

เมื่อผู้ใช้อัปโหลดรูปภาพของสินค้า ผู้ใช้ไม่ควรต้องเขียนคำอธิบายยาวๆ ฉันใช้ 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")
)

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

ฟีเจอร์ที่ยอดเยี่ยมอย่างหนึ่งของ 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

Vector Search ขั้นสูงและการกรองอัจฉริยะด้วย Gemini 3.0
การค้นหาคีย์เวิร์ดมาตรฐานมีข้อจำกัด หากคุณค้นหา "วิธีซ่อมเก้าอี้" ฐานข้อมูลแบบเดิมอาจไม่แสดงผลลัพธ์ใดๆ หากไม่มีคำว่า "เก้าอี้" ในชื่อ Neighbor Loop แก้ปัญหานี้ได้ด้วย Vector Search ขั้นสูงของ 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 กัน
- ทำให้ใช้งานได้ใน 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 ของบริการ คัดลอก
- มอบบทบาทไคลเอ็นต์ 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 แสดง |
บทบาท "Shadow" ของ IAM | แม้ว่าคุณจะมีสิทธิ์ทำให้ใช้งานได้ แต่บัญชีบริการ Cloud Run (โดยปกติคือ |
9. การแก้ปัญหาในระดับสูง

10. สาธิต
คุณควรใช้จุดสิ้นสุดสำหรับการทดสอบได้
แต่หากต้องการใช้เพื่อการสาธิตเป็นเวลา 2-3 วัน คุณสามารถใช้ค่าต่อไปนี้ได้
11. ล้างข้อมูล
เมื่อห้องทดลองนี้เสร็จสิ้นแล้ว อย่าลืมลบคลัสเตอร์และอินสแตนซ์ AlloyDB
ซึ่งควรล้างข้อมูลคลัสเตอร์พร้อมกับอินสแตนซ์
12. ขอแสดงความยินดี
คุณสร้างแอป Neighbor Loop สำหรับชุมชนที่ยั่งยืนด้วย Google Cloud ได้สำเร็จแล้ว การย้ายตรรกะการฝังและ AI ของ Gemini 3 Flash ไปยัง AlloyDB ทำให้แอปทำงานได้รวดเร็วอย่างไม่น่าเชื่อ (ขึ้นอยู่กับการตั้งค่าการติดตั้งใช้งาน) และโค้ดก็สะอาดอย่างเห็นได้ชัด เราไม่ได้จัดเก็บแค่ข้อมูล แต่เราจัดเก็บเจตนาด้วย
การผสานความเร็วของ Gemini 3 Flash เข้ากับการประมวลผลเวกเตอร์ที่ได้รับการเพิ่มประสิทธิภาพของ AlloyDB ถือเป็นขอบเขตใหม่สำหรับแพลตฟอร์มที่ขับเคลื่อนโดยชุมชนอย่างแท้จริง