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

1. ภาพรวม

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

d4324260c68d4a70.png

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

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

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

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

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

ข้อกำหนด

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

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 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 วินาที ระบบคลาวด์ต้องใช้เวลาสักครู่ในการเปิดใช้งานนิวรอน

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

หากใช้บัญชีทดลองใช้ใหม่ คุณอาจพบโควต้าระดับภูมิภาคสำหรับอินสแตนซ์ 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. ไปหากาแฟดื่มระหว่างที่บันทึกเลื่อนลงมาเรื่อยๆ และคุณสามารถอ่านเกี่ยวกับวิธีที่ระบบดำเนินการนี้เบื้องหลังได้ที่นี่ ซึ่งอาจใช้เวลาประมาณ 10-15 นาที

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

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

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

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

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

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

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

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

หากคุณพักดื่มกาแฟเป็นเวลา 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 เป็นเปิด:

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

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

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

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

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

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

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

ติดธง

  1. หากต้องการเพิ่มแฟล็กฐานข้อมูลลงในอินสแตนซ์ ให้คลิกเพิ่มแฟล็ก
  2. เลือกฟีเจอร์จากรายการฟีเจอร์ใหม่ของฐานข้อมูล
  3. ระบุค่าสำหรับ Flag
  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. การสร้างเวกเตอร์แบบ "นัดเดียว"

ซึ่งเป็นหัวใจสำคัญของห้องทดลอง แทนที่จะเขียนลูป Python เพื่อประมวลผลแถว 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, Worker ของ Python และสคริปต์การย้ายข้อมูลด้วย 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

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

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

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

6. การใช้การค้นหาตามบริบท

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

เรียกใช้การค้นหานี้เพื่อค้นหาปัญหาการเรียกเก็บเงินสำหรับผลิตภัณฑ์เวอร์ชัน 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. ไม่มีหนี้สินด้านโครงสร้างพื้นฐาน: คุณไม่ได้สร้าง Vector DB (Pinecone/Milvus) แยกต่างหาก คุณไม่ได้เขียนงาน ETL แยกต่างหาก ทุกอย่างอยู่ใน Postgres
  2. การอัปเดตแบบเรียลไทม์: การใช้โหมด "ธุรกรรม" จะทำให้ดัชนีการค้นหาของคุณเป็นข้อมูลล่าสุดอยู่เสมอ เมื่อมีการคอมมิตข้อมูล ข้อมูลนั้นก็จะพร้อมใช้งานเวกเตอร์
  3. การปรับขนาด: AlloyDB สร้างขึ้นบนโครงสร้างพื้นฐานของ Google โดยสามารถจัดการการสร้างเวกเตอร์จำนวนมากนับล้านได้เร็วกว่าสคริปต์ Python ของคุณ

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

ข้อควรระวังเกี่ยวกับประสิทธิภาพการผลิต

ปัญหา: รวดเร็วสำหรับ 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 ในคอลัมน์ 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 เดียว
  • เราได้ทำให้การสร้างเวกเตอร์ในอนาคตเป็นแบบอัตโนมัติด้วยทริกเกอร์
  • เราทำการค้นหาแบบไฮบริด

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