เวกเตอร์ 1 ล้านรายการ ไม่ต้องวนซ้ำ: การสร้างการฝังที่ปรับขนาดได้ด้วย AlloyDB

1. ภาพรวม

ใน Codelab นี้ คุณจะสร้างแอปพลิเคชันการค้นหาฐานความรู้ที่รองรับการปรับขนาดได้ แทนที่จะจัดการไปป์ไลน์ ETL ที่ซับซ้อนด้วยสคริปต์ Python และลูปเพื่อสร้างการฝังเวกเตอร์ คุณจะใช้ AlloyDB AI เพื่อจัดการการสร้างการฝังในฐานข้อมูลโดยตรงโดยใช้คำสั่ง SQL เพียงคำสั่งเดียว

d4324260c68d4a70.png

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

แอปพลิเคชันฐานข้อมูลฐานความรู้ที่ "ค้นหาได้" และมีประสิทธิภาพสูง

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

คุณจะได้เรียนรู้วิธีต่อไปนี้

  • จัดสรรคลัสเตอร์ AlloyDB และเปิดใช้ส่วนขยาย AI
  • สร้างข้อมูลสังเคราะห์ (มากกว่า 50,000 แถว) โดยใช้ SQL
  • ทดแทนการฝังเวกเตอร์สำหรับชุดข้อมูลทั้งหมดโดยใช้การประมวลผลแบบกลุ่ม
  • ตั้งค่าทริกเกอร์ที่เพิ่มขึ้นแบบเรียลไทม์เพื่อฝังข้อมูลใหม่โดยอัตโนมัติ
  • ทำการค้นหาแบบผสม (เวกเตอร์ + ตัวกรอง SQL) สำหรับ "บริบทที่ยืดหยุ่น"

ข้อกำหนด

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

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

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

  1. ในคอนโซล Google Cloud ในหน้าตัวเลือกโปรเจ็กต์ ให้เลือกหรือสร้างโปรเจ็กต์ Google Cloud
  2. ตรวจสอบว่าได้เปิดใช้การเรียกเก็บเงินสำหรับโปรเจ็กต์ที่อยู่ในระบบคลาวด์แล้ว ดูวิธีตรวจสอบว่าได้เปิดใช้การเรียกเก็บเงินในโปรเจ็กต์แล้วหรือยัง
  3. คุณจะใช้ 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 services enable \
  alloydb.googleapis.com \
  compute.googleapis.com \
  cloudresourcemanager.googleapis.com \
  servicenetworking.googleapis.com \
  aiplatform.googleapis.com

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

อาการ "โปรเจ็กต์ผี"

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

อุปสรรคด้านการเรียกเก็บเงิน

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

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

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

Quota Quags

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

Service Agent "ที่ซ่อนอยู่"

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

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

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

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

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

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

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

ปัญหา "ความอดทน"

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

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

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

Zombie Clusters

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

Cloud Shell Timeout

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

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

ในขั้นตอนนี้ เราจะพูดถึงหัวข้อต่อไปนี้

879263c907f3cac6.png

เมื่อคลัสเตอร์และอินสแตนซ์ 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;

สร้างตาราง

เราต้องการชุดข้อมูลเพื่อแสดงให้เห็นถึงขนาด เราจะสร้าง "บทความช่วยเหลือ" สังเคราะห์จำนวน 50,000 แถวทันทีโดยใช้ SQL แทนการนำเข้า CSV

คุณสร้างตารางได้โดยใช้คำสั่ง DDL ด้านล่างใน AlloyDB Studio

-- 1. Create the table
CREATE TABLE help_articles (
    id SERIAL PRIMARY KEY,
    title TEXT,
    category TEXT,
    product_version TEXT,
    content_body TEXT,
    embedding vector(768) -- Dimension for text-embedding-005
);

-- 2. Generate 50,000 rows of synthetic data
INSERT INTO help_articles (title, category, product_version, content_body)
SELECT
    'Help Article ' || i,
    CASE 
        WHEN i % 3 = 0 THEN 'Billing' 
        WHEN i % 3 = 1 THEN 'Technical' 
        ELSE 'General' 
    END,
    CASE 
        WHEN i % 2 = 0 THEN '2.0' 
        ELSE '1.0' 
    END,
    'This article covers common issues regarding ' || 
    CASE 
        WHEN i % 3 = 0 THEN 'payment failures, invoice disputes, and credit card updates.'
        WHEN i % 3 = 1 THEN 'connection timeouts, latency issues, and API errors.'
        ELSE 'account profile settings, password resets, and user roles.' 
    END
FROM generate_series(1, 50000) AS i;

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

ตรวจสอบข้อมูล

SELECT count(*) FROM help_articles;
-- Output: 50000

เปิดใช้แฟล็กฐานข้อมูล

ไปที่คอนโซลการกำหนดค่าอินสแตนซ์ คลิก "แก้ไขอินสแตนซ์หลัก" ไปที่การกำหนดค่าขั้นสูง แล้วคลิก "เพิ่มแฟล็กฐานข้อมูล"

  1. ตรวจสอบว่าได้ตั้งค่าแฟล็ก google_ml_integration.enable_model_support เป็นเปิด:

หากไม่มี ให้ป้อนในเมนูแบบเลื่อนลงของแฟล็กและตั้งค่าเป็น "ON" แล้วอัปเดตอินสแตนซ์

  1. ตรวจสอบว่าได้ตั้งค่าแฟล็ก google_ml_integration.enable_faster_embedding_generation เป็นเปิด:

หากไม่มี ให้ป้อนในเมนูแบบเลื่อนลงของแฟล็กและตั้งค่าเป็น "ON" แล้วอัปเดตอินสแตนซ์

ขั้นตอนในการกำหนดค่าแฟล็กฐานข้อมูล

  1. ในคอนโซล Google Cloud ให้ไปที่หน้าคลัสเตอร์

ไปที่คลัสเตอร์

  1. คลิกคลัสเตอร์ในคอลัมน์ชื่อทรัพยากร
  2. ในหน้าภาพรวม ให้ไปที่อินสแตนซ์ในคลัสเตอร์ เลือกอินสแตนซ์ แล้วคลิกแก้ไข
  3. เพิ่ม แก้ไข หรือลบแฟล็กฐานข้อมูลออกจากอินสแตนซ์โดยทำดังนี้

เพิ่มแฟล็ก

  1. หากต้องการเพิ่มแฟล็กฐานข้อมูลลงในอินสแตนซ์ ให้คลิก "เพิ่มแฟล็ก"
  2. เลือกแฟล็กจากรายการแฟล็กฐานข้อมูลใหม่
  3. ระบุค่าสำหรับแฟล็ก
  4. คลิกเสร็จสิ้น
  5. คลิกอัปเดตอินสแตนซ์
  6. ตรวจสอบว่าส่วนขยาย google_ml_integration เป็นเวอร์ชัน 1.5.2 ขึ้นไป

หากต้องการตรวจสอบเวอร์ชันของส่วนขยาย ให้ใช้คำสั่งต่อไปนี้

SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';

หากต้องการอัปเดตส่วนขยายเป็นเวอร์ชันที่สูงขึ้น ให้ใช้คำสั่งต่อไปนี้

ALTER EXTENSION google_ml_integration UPDATE;

ให้สิทธิ์

  1. หากต้องการอนุญาตให้ผู้ใช้จัดการการสร้างการฝังอัตโนมัติ ให้มอบสิทธิ์ INSERT, UPDATE และ DELETE ในตาราง google_ml.embed_gen_progress และ google_ml.embed_gen_settings ดังนี้
GRANT INSERT, UPDATE, DELETE ON google_ml.embed_gen_progress TO postgres;

"postgres" คือ USER_NAME ที่ได้รับสิทธิ์

  1. เรียกใช้คำสั่งด้านล่างเพื่อให้สิทธิ์ดำเนินการในฟังก์ชัน "การฝัง"
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"

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

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

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

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

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

5. การสร้างเวกเตอร์แบบ "One-Shot"

ซึ่งเป็นหัวใจสำคัญของห้องทดลองนี้ แทนที่จะเขียน Python Loop เพื่อประมวลผล 50,000 แถวนี้ เราจะใช้ฟังก์ชัน ai.initialize_embeddings

คำสั่งเดียวนี้ทำ 2 อย่างต่อไปนี้

  1. ทดแทนแถวที่มีอยู่ทั้งหมด
  2. สร้างทริกเกอร์เพื่อฝังแถวในอนาคตโดยอัตโนมัติ

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

CALL ai.initialize_embeddings(
  model_id => 'text-embedding-005',
  table_name => 'help_articles',
  content_column => 'content_body',
  embedding_column => 'embedding',
  incremental_refresh_mode => 'transactional'
);

ยืนยันการฝัง

ตรวจสอบว่าคอลัมน์ embedding มีข้อมูลแล้ว โดยทำดังนี้

SELECT id, left(content_body, 30), substring(embedding::text, 1, 30) as vector_partial 
FROM help_articles;

คุณควรเห็นผลลัพธ์ที่คล้ายกับด้านล่างนี้

a872b8926a164275.png

เกิดอะไรขึ้น

  1. ทดแทนข้อมูลจำนวนมาก: ระบบจะสแกนแถวที่มีอยู่ 50,000 แถวโดยอัตโนมัติและสร้างการฝังผ่าน Vertex AI
  2. การทำงานอัตโนมัติ: การตั้งค่า incremental_refresh_mode => 'transactional' จะทำให้ AlloyDB ตั้งค่าทริกเกอร์ภายในโดยอัตโนมัติ แถวใหม่ที่แทรกใน help_articles จะมีการสร้างการฝังทันที
  3. คุณสามารถเลือกตั้งค่า incremental_refresh_mode => ‘None' เพื่อให้ได้รับเฉพาะคำสั่งเพื่ออัปเดตหลายรายการพร้อมกัน และเรียกใช้ ai.refresh_embeddings() ด้วยตนเองเพื่ออัปเดตการฝังแถวทั้งหมด

คุณเพิ่งแทนที่คิว Kafka, Python Worker และสคริปต์การย้ายข้อมูลด้วย SQL 6 บรรทัด ดูเอกสารประกอบอย่างเป็นทางการโดยละเอียดสำหรับแอตทริบิวต์ทั้งหมด

การทดสอบทริกเกอร์แบบเรียลไทม์

มาตรวจสอบกันว่าการทำงานอัตโนมัติ "Zero Loop" ทำงานกับข้อมูลใหม่ได้หรือไม่

  1. แทรกแถวใหม่
INSERT INTO help_articles (title, category, product_version, content_body)
VALUES ('New Scaling Guide', 'Technical', '2.0', 'How to scale AlloyDB to millions of transactions.');
  1. ตรวจสอบทันที:
SELECT embedding FROM help_articles WHERE title = 'New Scaling Guide';

ผลลัพธ์:

คุณควรเห็นเวกเตอร์ที่สร้างขึ้นทันทีโดยไม่ต้องเรียกใช้สคริปต์ภายนอก

ขนาดกลุ่มการปรับแต่ง

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

CALL ai.initialize_embeddings(
  model_id => 'text-embedding-005',
  table_name => 'help_articles',
  content_column => 'content_body',
  embedding_column => 'embedding',
  incremental_refresh_mode => 'transactional',
  batch_size => 20
);

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

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

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

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

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

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

6. การค้นหาบริบทที่ยืดหยุ่น

ตอนนี้เราจะทำการค้นหาแบบผสม เราผสานรวมความเข้าใจเชิงความหมาย (เวกเตอร์) เข้ากับตรรกะทางธุรกิจ (ตัวกรอง SQL)

เรียกใช้การค้นหานี้เพื่อค้นหาปัญหาการเรียกเก็บเงินสำหรับ Product Version 2.0 โดยเฉพาะ

SELECT
  title,
  left(content_body, 100) as content_snippet,
  1 - (embedding <=> embedding('text-embedding-005', 'Invoice did not go through')::vector) as relevance
FROM help_articles
WHERE category = 'Billing'  -- Hard SQL Filter
  AND product_version = '2.0' -- Hard SQL Filter
ORDER BY relevance DESC
LIMIT 5;

นี่คือการปรับเปลี่ยนบริบท การค้นหาจะ "ยืดหยุ่น" เพื่อทำความเข้าใจเจตนาของผู้ใช้ ("ปัญหาการเรียกเก็บเงิน") ขณะเดียวกันก็เคารพข้อจำกัดทางธุรกิจที่เข้มงวด (เวอร์ชัน 2.0)

f0fdb50d6195c462.png

เหตุผลที่โซลูชันนี้เหมาะสำหรับสตาร์ทอัพและการย้ายข้อมูล

  1. ไม่มีหนี้ทางเทคนิคด้านโครงสร้างพื้นฐาน: คุณไม่ได้สร้างฐานข้อมูลเวกเตอร์แยกต่างหาก (Pinecone/Milvus) คุณไม่ได้เขียนงาน ETL แยกต่างหาก ข้อมูลทั้งหมดอยู่ใน Postgres
  2. การอัปเดตแบบเรียลไทม์: การใช้โหมด "ธุรกรรม" จะทำให้ดัชนีของ Search ไม่ล้าสมัย เมื่อคอมมิตข้อมูลแล้ว ข้อมูลจะพร้อมใช้งานเวกเตอร์
  3. การปรับขนาด: AlloyDB สร้างขึ้นบนโครงสร้างพื้นฐานของ Google โดยสามารถจัดการการสร้างเวกเตอร์หลายล้านรายการพร้อมกันได้เร็วกว่าสคริปต์ Python ของคุณ

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

Production Performance Gotcha

ปัญหา: ทำงานได้รวดเร็วสำหรับ 50,000 แถว ช้ามากสำหรับ 1 ล้านแถวหากตัวกรองหมวดหมู่ไม่เลือกมากพอวิธีแก้ไข:เพิ่มดัชนีเวกเตอร์: สำหรับขนาดการใช้งานจริง คุณต้องสร้างดัชนี:CREATE INDEX ON help_articles USING hnsw (embedding vector_cosine_ops);ยืนยันการใช้ดัชนี: เรียกใช้ EXPLAIN ANALYZE SELECT ... เพื่อให้แน่ใจว่าฐานข้อมูลใช้ดัชนีและไม่ได้ทำการสแกนตามลำดับ

หายนะจาก "รูปแบบที่ไม่ตรงกัน"

ปัญหา: คุณเริ่มต้นคอลัมน์โดยใช้ text-embedding-005 ในกระบวนการ CALL หากคุณใช้โมเดลอื่นโดยไม่ตั้งใจ (เช่น text-embedding-004 หรือโมเดล OSS) ในฟังก์ชันการค้นหา SELECT embedding('model-name', ...) มิติข้อมูลอาจตรงกัน (768) แต่พื้นที่เวกเตอร์จะแตกต่างกันโดยสิ้นเชิง การค้นหาจะทำงานโดยไม่มีข้อผิดพลาด แต่ผลลัพธ์จะไม่เกี่ยวข้องเลย (คะแนนความเกี่ยวข้องเป็นขยะ) การแก้ปัญหา:ตรวจสอบว่า model_id ใน ai.initialize_embeddings ตรงกับ model_id ในการค้นหา SELECT ทุกประการ

ผลลัพธ์ "ว่างเปล่าแบบเงียบ" (การกรองมากเกินไป)

ปัญหา: การค้นหาแบบผสมเป็นการดำเนินการ "AND" ซึ่งต้องใช้ทั้งการจับคู่เชิงความหมายและการจับคู่ SQL หากผู้ใช้ค้นหา "ความช่วยเหลือเกี่ยวกับการเรียกเก็บเงิน" แต่คอลัมน์ product_version มี ‘2.0.1' แทนที่จะเป็น ‘2.0' ผลลัพธ์จะเป็น 0 แถว แม้ว่าการจับคู่เวกเตอร์จะเป็น 99% ก็ตาม การแก้ปัญหา

  • เรียกใช้การค้นหาโดยไม่มีการจัดเรียงเวกเตอร์ก่อนเพื่อดูว่าตัวกรอง SQL (WHERE category...) แสดงผลข้อมูลจริงหรือไม่
  • ตรวจสอบการคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ (Billing เทียบกับ billing)

4. ข้อผิดพลาดเกี่ยวกับสิทธิ์/โควต้า (ข้อผิดพลาด 500)

ปัญหา:ฟังก์ชัน embedding() ในส่วนคำสั่ง SELECT จะทำการเรียกใช้เครือข่ายแบบเรียลไทม์ไปยัง Vertex AI หากบัญชีบริการฐานข้อมูลสูญเสียบทบาทผู้ใช้ Vertex AI หรือหากคุณใช้โควต้า Vertex AI API (QPM) จนหมด การค้นหา SQL ทั้งหมดจะล้มเหลว การแก้ปัญหา:

  • ตรวจสอบ Cloud Logging สำหรับ AlloyDB
  • ตรวจสอบว่าบทบาท IAM ยังคงทำงานอยู่
  • รวมฟังก์ชันไว้ในบล็อก TRY/CATCH ในขั้นตอนที่จัดเก็บไว้หากต้องการความยืดหยุ่นสูง

5. การฝัง Null

ปัญหา:หากคุณแทรกข้อมูลก่อนที่โมเดลจะเริ่มต้นอย่างสมบูรณ์หรือหากผู้ปฏิบัติงานเบื้องหลังทำงานไม่สำเร็จ บางแถวอาจมี NULL ในคอลัมน์ embeddingNULL <=> Vector แสดงผล NULL แถวเหล่านี้จะหายไปจากลำดับการจัดเรียงการแก้ปัญหา

  • เรียกใช้ SELECT count(*) FROM help_articles WHERE embedding IS NULL; เพื่อยืนยันความครอบคลุม 100%

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

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

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

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

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

สรุปประเด็นที่ได้พูดถึง

  • เราได้ยกเลิก "Python For-Loop" สำหรับการประมวลผลข้อมูล
  • เราสร้างเวกเตอร์ 50,000 รายการด้วยคำสั่ง SQL เพียงคำสั่งเดียว
  • เราทำให้การสร้างเวกเตอร์ในอนาคตเป็นแบบอัตโนมัติด้วยทริกเกอร์
  • เราทำการค้นหาแบบผสมผสาน

ขั้นตอนถัดไป