1. ภาพรวม
ในโค้ดแล็บนี้ คุณจะได้สร้าง 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 แล้ว ดูวิธีตรวจสอบว่าโปรเจ็กต์เปิดใช้การเรียกเก็บเงินแล้วหรือไม่
- คุณจะใช้ 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 หาก |
ตัวแทนบริการ"ซ่อน" | บางครั้ง AlloyDB Service Agent จะไม่ได้รับบทบาท |
3. การตั้งค่าฐานข้อมูล
ในแล็บนี้ เราจะใช้ AlloyDB เป็นฐานข้อมูลสำหรับข้อมูลทดสอบ โดยจะใช้คลัสเตอร์เพื่อจัดเก็บทรัพยากรทั้งหมด เช่น ฐานข้อมูลและบันทึก แต่ละคลัสเตอร์มีอินสแตนซ์หลักที่ให้จุดเข้าถึงข้อมูล ตารางจะเก็บข้อมูลจริง
มาสร้างคลัสเตอร์ อินสแตนซ์ และตาราง AlloyDB ที่จะโหลดชุดข้อมูลทดสอบกัน
- คลิกปุ่มหรือคัดลอกลิงก์ด้านล่างไปยังเบราว์เซอร์ที่คุณเข้าสู่ระบบผู้ใช้ Google Cloud Console
- เมื่อทำขั้นตอนนี้เสร็จแล้ว ระบบจะโคลนที่เก็บไปยังโปรแกรมแก้ไข 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 เพื่อจัดเก็บรูปภาพของสินค้าคงเหลือ สำหรับแอปสาธิตนี้ เราต้องการให้รูปภาพเข้าถึงได้แบบสาธารณะเพื่อให้แสดงผลในการ์ดที่ปัดได้ทันที
- สร้างที่เก็บข้อมูล: สร้างที่เก็บข้อมูลใหม่ในโปรเจ็กต์ GCP (เช่น neighborloop-images) โดยควรอยู่ในภูมิภาคเดียวกับฐานข้อมูลและแอปพลิเคชัน
- กำหนดค่าการเข้าถึงแบบสาธารณะ: * ไปที่แท็บสิทธิ์ของที่เก็บข้อมูล
- เพิ่มหลักการ allUsers
- มอบหมายบทบาทผู้ดูออบเจ็กต์ในพื้นที่เก็บข้อมูล (เพื่อให้ทุกคนดูรูปภาพได้) และบทบาทผู้สร้างออบเจ็กต์ในพื้นที่เก็บข้อมูล (เพื่อวัตถุประสงค์ในการอัปโหลดเดโม)
ทางเลือก (บัญชีบริการ): หากไม่ต้องการใช้การเข้าถึงแบบสาธารณะ โปรดตรวจสอบว่าบัญชีบริการของแอปพลิเคชันได้รับสิทธิ์เข้าถึง AlloyDB อย่างเต็มรูปแบบ รวมถึงบทบาทของ Storage ที่จำเป็นเพื่อจัดการออบเจ็กต์อย่างปลอดภัย
ข้อควรระวังและการแก้ปัญหา
The Region Drag | หากฐานข้อมูลอยู่ใน |
ชื่อที่เก็บข้อมูลต้องไม่ซ้ำกัน | ชื่อที่เก็บข้อมูลเป็นเนมสเปซส่วนกลาง หากคุณพยายามตั้งชื่อที่เก็บข้อมูลเป็น |
ความสับสนระหว่าง "ครีเอเตอร์" กับ "ผู้ชม" | การสับสนระหว่าง "ผู้สร้าง" กับ "ผู้ดู": หากคุณเพิ่มเฉพาะ "ผู้ดู" แอปจะขัดข้องเมื่อผู้ใช้พยายามแสดงรายการใหม่ เนื่องจากไม่มีสิทธิ์เขียนไฟล์ คุณต้องมีทั้ง 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 |
ถึงโควต้า "Free Tier" | หากคุณใช้ระดับแบบไม่มีค่าใช้จ่าย จะมีขีดจำกัดอัตรา (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

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