เริ่มต้นใช้งาน Vector Embeddings ใน Cloud SQL สำหรับ PostgreSQL

1. บทนำ

ใน Codelab นี้ คุณจะได้เรียนรู้วิธีใช้การผสานรวม AI ของ Cloud SQL สำหรับ PostgreSQL โดยการรวมการค้นหาเวกเตอร์กับการฝังแพลตฟอร์ม Gemini Enterprise Agent

แผนภาพสถาปัตยกรรมที่แสดงการผสานรวม Cloud SQL กับแพลตฟอร์ม Agent ของ Gemini Enterprise

ข้อกำหนดเบื้องต้น

  • ความเข้าใจพื้นฐานเกี่ยวกับ Google Cloud และคอนโซล Google Cloud
  • ประสบการณ์พื้นฐานเกี่ยวกับอินเทอร์เฟซบรรทัดคำสั่งและ Cloud Shell

สิ่งที่คุณต้องทำ

  • ติดตั้งใช้งานอินสแตนซ์ Cloud SQL สำหรับ PostgreSQL
  • สร้างฐานข้อมูลและเปิดใช้การผสานรวม AI ของ Cloud SQL
  • โหลดข้อมูลลงในฐานข้อมูล
  • ใช้ Cloud SQL Studio
  • สร้างการฝังโดยใช้แพลตฟอร์ม Agent ของ Gemini Enterprise ใน Cloud SQL
  • ใช้ Agent Platform Studio
  • เสริมผลการค้นหาโดยใช้โมเดล Generative ของแพลตฟอร์ม Agent ของ Gemini Enterprise
  • ปรับปรุงประสิทธิภาพการค้นหาโดยใช้ดัชนีเวกเตอร์ HNSW

สิ่งที่คุณต้องมี

  • บัญชี Google Cloud และโปรเจ็กต์ Google Cloud
  • เว็บเบราว์เซอร์ เช่น Chrome

2. การตั้งค่าและข้อกำหนด

การตั้งค่าโปรเจ็กต์

  1. ลงชื่อเข้าใช้คอนโซล Google Cloud หากยังไม่มีบัญชี Google (Gmail หรือ Google Workspace) คุณต้องสร้างบัญชี Google

ใช้บัญชีส่วนตัวแทนบัญชีงานหรือบัญชีโรงเรียน

  1. สร้างโปรเจ็กต์ใหม่หรือนําโปรเจ็กต์ที่มีอยู่มาใช้ซ้ำ หากต้องการสร้างโปรเจ็กต์ใหม่ในคอนโซล Google Cloud ให้คลิกเลือกโปรเจ็กต์ในแถบเครื่องมือ

เลือกกล่องโต้ตอบโปรเจ็กต์ในคอนโซล Google Cloud

ในกล่องโต้ตอบเลือกโปรเจ็กต์ ให้คลิกโปรเจ็กต์ใหม่

37d264871000675d.png

ในกล่องโต้ตอบ ให้ป้อนชื่อโปรเจ็กต์และเลือกสถานที่

96d86d3d5655cdbe.png

  • ชื่อโปรเจ็กต์คือชื่อที่แสดงสำหรับผู้เข้าร่วมโปรเจ็กต์นี้ Google APIs จะไม่ใช้ชื่อโปรเจ็กต์ และคุณสามารถเปลี่ยนชื่อได้ทุกเมื่อ
  • รหัสโปรเจ็กต์จะไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมดและเปลี่ยนแปลงไม่ได้ (หลังจากตั้งค่าแล้วจะเปลี่ยนแปลงไม่ได้) คอนโซล Google Cloud จะสร้างรหัสที่ไม่ซ้ำกันโดยอัตโนมัติ แต่คุณปรับแต่งได้ หากไม่ชอบรหัสที่สร้างขึ้น คุณสามารถสร้างรหัสแบบสุ่มอีกรหัสหนึ่งหรือระบุรหัสของคุณเองเพื่อตรวจสอบความพร้อมใช้งานได้ ใน Codelab ส่วนใหญ่ คุณจะอ้างอิงรหัสโปรเจ็กต์ ซึ่งโดยปกติจะระบุด้วยตัวยึดตำแหน่ง
  • API บางรายการใช้ค่าที่ 3 ซึ่งคือหมายเลขโปรเจ็กต์ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 นี้ได้ในเอกสารประกอบการสร้างและการจัดการโปรเจ็กต์

เปิดใช้การเรียกเก็บเงิน

สร้างบัญชีสำหรับการเรียกเก็บเงินส่วนตัว

หากตั้งค่าการเรียกเก็บเงินโดยใช้เครดิต Google Cloud คุณสามารถข้ามขั้นตอนนี้ได้

หากต้องการตั้งค่าบัญชีสำหรับการเรียกเก็บเงินส่วนบุคคล ให้เปิดใช้การเรียกเก็บเงินในคอนโซลการเรียกเก็บเงินใน Cloud ของ Google

หมายเหตุ:

  • การทำ Lab นี้ให้เสร็จสมบูรณ์จะใช้ทรัพยากร Google Cloud น้อยกว่า $5 USD
  • ทำตามขั้นตอนที่ส่วนท้ายของแล็บนี้เพื่อลบทรัพยากรและหลีกเลี่ยงการเรียกเก็บเงินเพิ่มเติม
  • ผู้ใช้ใหม่มีสิทธิ์ทดลองใช้ฟรีมูลค่า $300 USD

เริ่มต้น Cloud Shell

แม้ว่าคุณจะใช้งาน Google Cloud จากระยะไกลจากคอมพิวเตอร์ได้ แต่ใน Codelab นี้คุณจะใช้ Google Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานในระบบคลาวด์

ในแถบเครื่องมือของคอนโซล Google Cloud ให้คลิกเปิดใช้งาน Cloud Shell

เปิดใช้งาน Cloud Shell

หรือจะกด g แล้วตามด้วย s ในคอนโซล Google Cloud หรือเปิด Cloud Shell ก็ได้

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

ภาพหน้าจอของเทอร์มินัล Google Cloud Shell ที่แสดงว่าสภาพแวดล้อมเชื่อมต่อแล้ว

เครื่องเสมือนนี้มีเครื่องมือพัฒนาซอฟต์แวร์ทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหน้าแรกขนาด 5 GB แบบถาวรและทำงานบน Google Cloud ซึ่งจะช่วยเพิ่มประสิทธิภาพเครือข่ายและการตรวจสอบสิทธิ์ คุณสามารถทำงานทั้งหมดใน Codelab นี้ได้ภายในเบราว์เซอร์

3. เปิดใช้ API

หากต้องการใช้ Cloud SQL, Compute Engine, Service Networking และ Gemini Enterprise Agent Platform ให้เปิดใช้ API ที่เกี่ยวข้องในโปรเจ็กต์ Google Cloud

ในเทอร์มินัล Cloud Shell ให้ตรวจสอบว่าได้ตั้งค่ารหัสโปรเจ็กต์แล้ว

gcloud config set project <PROJECT_ID>

ตั้งค่าตัวแปรสภาพแวดล้อม PROJECT_ID ดังนี้

PROJECT_ID=$(gcloud config get-value project)

เปิดใช้บริการที่จำเป็นทั้งหมด

gcloud services enable sqladmin.googleapis.com \
                       compute.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       servicenetworking.googleapis.com \
                       aiplatform.googleapis.com

ผลลัพธ์ที่คาดไว้

student@cloudshell:~ (test-project-001-402417)$ gcloud config set project test-project-001-402417
Updated property [core/project].
student@cloudshell:~ (test-project-001-402417)$ PROJECT_ID=$(gcloud config get-value project)
Your active configuration is: [cloudshell-14650]
student@cloudshell:~ (test-project-001-402417)$ 
student@cloudshell:~ (test-project-001-402417)$ gcloud services enable sqladmin.googleapis.com \
                       compute.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       servicenetworking.googleapis.com \
                       aiplatform.googleapis.com
Operation "operations/acat.p2-4470404856-1f44ebd8-894e-4356-bea7-b84165a57442" finished successfully.

คุณอ่านเกี่ยวกับ API ที่เปิดใช้แต่ละรายการได้ในเอกสารประกอบ

4. สร้างอินสแตนซ์ Cloud SQL

สร้างอินสแตนซ์ Cloud SQL ด้วยการผสานรวมฐานข้อมูล Gemini Enterprise Agent Platform

สร้างรหัสผ่านฐานข้อมูล

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

export CLOUDSQL_PASSWORD=$(openssl rand -hex 16)

แสดงค่ารหัสผ่านที่สร้างขึ้น

echo $CLOUDSQL_PASSWORD

จดรหัสผ่านที่สร้างขึ้นเพื่อใช้ในภายหลัง

สร้างอินสแตนซ์ Cloud SQL สำหรับ PostgreSQL

คุณสร้างอินสแตนซ์ Cloud SQL ได้หลายวิธี เช่น ใช้คอนโซล Google Cloud, Terraform หรือ Google Cloud CLI (gcloud) ใน Codelab นี้ คุณจะใช้ gcloud ดูวิธีสร้างอินสแตนซ์ด้วยเครื่องมืออื่นๆ ได้ที่เอกสารประกอบสร้างอินสแตนซ์

ใน Cloud Shell ให้เรียกใช้คำสั่งต่อไปนี้เพื่อสร้างอินสแตนซ์

gcloud sql instances create my-cloudsql-instance \
--database-version=POSTGRES_18 \
--tier=db-custom-1-3840 \
--region=us-central1 \
--edition=ENTERPRISE \
--enable-google-ml-integration \
--database-flags cloudsql.enable_google_ml_integration=on

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

gcloud sql users set-password postgres \
    --instance=my-cloudsql-instance \
    --password=$CLOUDSQL_PASSWORD

เชื่อมต่อกับอินสแตนซ์โดยใช้ gcloud sql connect เมื่อได้รับข้อความแจ้ง ให้ป้อนรหัสผ่าน

gcloud sql connect my-cloudsql-instance --user=postgres

ออกจากเซสชัน psql โดยกด Ctrl+D หรือป้อน exit

exit

เปิดใช้การผสานรวมแพลตฟอร์ม Agent ของ Gemini Enterprise

มอบบทบาท IAM ที่จำเป็นให้กับบัญชีบริการ Cloud SQL เพื่อเปิดใช้การผสานรวมแพลตฟอร์ม Agent ของ Gemini Enterprise

เรียกอีเมลของบัญชีบริการ Cloud SQL และส่งออกเป็นตัวแปรสภาพแวดล้อม

SERVICE_ACCOUNT_EMAIL=$(gcloud sql instances describe my-cloudsql-instance --format="value(serviceAccountEmailAddress)")
echo $SERVICE_ACCOUNT_EMAIL

มอบบทบาท roles/aiplatform.user ให้กับบัญชีบริการ Cloud SQL โดยทำดังนี้

PROJECT_ID=$(gcloud config get-value project)
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$SERVICE_ACCOUNT_EMAIL" \
  --role="roles/aiplatform.user"

ดูข้อมูลเพิ่มเติมเกี่ยวกับการสร้างและการกำหนดค่าอินสแตนซ์ได้ที่ผสานรวม Cloud SQL กับ Gemini Enterprise Agent Platform

5. เตรียมฐานข้อมูล

สร้างฐานข้อมูลและเปิดใช้การรองรับเวกเตอร์

สร้างฐานข้อมูล

สร้างฐานข้อมูลชื่อ quickstart_db คุณสร้างฐานข้อมูลได้โดยใช้ไคลเอ็นต์ฐานข้อมูล (เช่น psql), Google Cloud CLI หรือ Cloud SQL Studio ในขั้นตอนนี้ ให้ใช้ gcloud

เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell เพื่อสร้างฐานข้อมูล

gcloud sql databases create quickstart_db --instance=my-cloudsql-instance

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

หากต้องการทำงานกับแพลตฟอร์ม Agent ของ Gemini Enterprise และเวกเตอร์ ให้เปิดใช้ส่วนขยาย 2 รายการในฐานข้อมูล quickstart_db ได้แก่ google_ml_integration และ vector

ใน Cloud Shell ให้เชื่อมต่อกับฐานข้อมูลโดยทำดังนี้

gcloud sql connect my-cloudsql-instance --database quickstart_db --user=postgres

เมื่อได้รับข้อความแจ้ง ให้ป้อนรหัสผ่านของฐานข้อมูล

เรียกใช้คำสั่งต่อไปนี้ในเซสชัน SQL

CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector CASCADE;

ออกจากเซสชัน SQL

exit;

6. โหลดข้อมูล

สร้างตารางในฐานข้อมูลและโหลดข้อมูลโดยใช้ไฟล์ชุดข้อมูลร้าน Cymbal ที่สมมติขึ้นซึ่งจัดเก็บไว้ใน Bucket ของ Cloud Storage สาธารณะในรูปแบบ CSV

ก่อนอื่น ให้สร้างออบเจ็กต์สคีมาที่จำเป็น เรียกใช้ gcloud sql connect และ gcloud storage เพื่อดาวน์โหลดและนำเข้าสคีมา

ใน Cloud Shell ให้เรียกใช้คำสั่งต่อไปนี้ (เมื่อได้รับข้อความแจ้ง ให้ป้อนรหัสผ่านที่สร้างขึ้นสำหรับอินสแตนซ์)

gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_demo_schema.sql | gcloud sql connect my-cloudsql-instance --database quickstart_db --user=postgres

คำสั่งนี้จะเชื่อมต่อกับฐานข้อมูลและเรียกใช้โค้ด SQL ที่ดาวน์โหลดมาเพื่อสร้างตาราง ดัชนี และลำดับ

จากนั้นให้ดาวน์โหลดไฟล์ข้อมูล CSV จาก Cloud Storage โดยทำดังนี้

gcloud storage cp gs://cloud-training/gcc/gcc-tech-004/cymbal_products.csv .
gcloud storage cp gs://cloud-training/gcc/gcc-tech-004/cymbal_inventory.csv .
gcloud storage cp gs://cloud-training/gcc/gcc-tech-004/cymbal_stores.csv .

เชื่อมต่อกับฐานข้อมูล

gcloud sql connect my-cloudsql-instance --database quickstart_db --user=postgres

นำเข้าข้อมูลจากไฟล์ CSV โดยทำดังนี้

\copy cymbal_products from 'cymbal_products.csv' csv header
\copy cymbal_inventory from 'cymbal_inventory.csv' csv header
\copy cymbal_stores from 'cymbal_stores.csv' csv header

หากใช้ข้อมูลของคุณเองและไฟล์ CSV เข้ากันได้กับเครื่องมือนำเข้าของ Cloud SQL ในคอนโซล Google Cloud คุณสามารถใช้คอนโซลแทนบรรทัดคำสั่งได้

7. สร้างการฝัง

สร้างการฝังสำหรับคำอธิบายผลิตภัณฑ์โดยใช้โมเดล text-embedding-005 จากแพลตฟอร์มเอเจนต์ Gemini Enterprise และจัดเก็บเป็นข้อมูลเวกเตอร์

หากเซสชันของคุณถูกตัดการเชื่อมต่อ ให้เชื่อมต่อกับฐานข้อมูลโดยทำดังนี้

gcloud sql connect my-cloudsql-instance --database quickstart_db --user=postgres

สร้างคอลัมน์ที่สร้างขึ้นชื่อ embedding ในตาราง cymbal_products โดยใช้ฟังก์ชัน embedding คำสั่งนี้จะสร้างคอลัมน์ที่สร้างขึ้นที่จัดเก็บซึ่งมีการฝังเวกเตอร์ที่สร้างจากคอลัมน์ product_description สำหรับทุกแถวในตาราง โดยระบุโมเดลเป็นพารามิเตอร์แรก และคอลัมน์ข้อความต้นฉบับเป็นพารามิเตอร์ที่ 2 ดังนี้

ALTER TABLE cymbal_products ADD COLUMN embedding vector(768) GENERATED ALWAYS AS (google_ml.embedding('text-embedding-005', product_description)) STORED;

สำหรับแถว 900-1, 000 แถว โดยปกติกระบวนการนี้จะใช้เวลา 1-5 นาที

เมื่อแทรกแถวใหม่ลงในตารางหรืออัปเดต product_description ในแถวที่มีอยู่ คอลัมน์ embedding จะอัปเดตโดยอัตโนมัติ

8. เรียกใช้การค้นหาความคล้ายคลึง

เรียกใช้การค้นหาความคล้ายคลึงโดยเปรียบเทียบการฝังเวกเตอร์ที่คำนวณสำหรับคำอธิบายผลิตภัณฑ์กับการฝังสำหรับคำค้นหา

คุณเรียกใช้การค้นหา SQL จากบรรทัดคำสั่งได้โดยใช้ gcloud sql connect หรือจาก Cloud SQL Studio สตูดิโอ Cloud SQL ช่วยให้คุณแก้ไขและเรียกใช้คำสั่ง SQL ที่ยาวซึ่งมีหลายแถวในเอาต์พุตได้สะดวกยิ่งขึ้น

เริ่ม Cloud SQL Studio

  1. ในคอนโซล Google Cloud ให้ไปที่อินสแตนซ์ Cloud SQL แล้วคลิก my-cloudsql-instance

รายการอินสแตนซ์ Cloud SQL ในคอนโซล Google Cloud

  1. ในเมนูการนำทาง ให้คลิก Cloud SQL Studio

รายการเมนู Cloud SQL Studio

  1. ในกล่องโต้ตอบการตรวจสอบสิทธิ์ ให้ป้อนชื่อฐานข้อมูลและข้อมูลเข้าสู่ระบบ
    • ฐานข้อมูล: quickstart_db
    • ผู้ใช้: postgres
    • รหัสผ่าน:
  2. คลิกตรวจสอบสิทธิ์

กล่องโต้ตอบการตรวจสอบสิทธิ์ Cloud SQL Studio

  1. คลิกแท็บเครื่องมือแก้ไขเพื่อเปิดเครื่องมือแก้ไข SQL

แท็บเครื่องมือแก้ไข SQL ของ Cloud SQL Studio

ดำเนินการค้นหา

เรียกใช้การค้นหาเพื่อดึงข้อมูลผลิตภัณฑ์ 10 อันดับแรกที่เกี่ยวข้องกับคำค้นหาของลูกค้ามากที่สุด: "ที่นี่ปลูกต้นไม้ผลชนิดใดได้ดี"

SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        (cp.embedding <=> embedding('text-embedding-005','What kind of fruit trees grow well here?')::vector) as distance
FROM
        cymbal_products cp
JOIN cymbal_inventory ci on
        ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
        cs.store_id=ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        distance ASC
LIMIT 10;

ใน Cloud SQL Studio ให้ป้อนการค้นหาแล้วคลิกเรียกใช้ (หรือเรียกใช้การค้นหาในเซสชัน psql):

การเรียกใช้การค้นหา SQL ใน Cloud SQL Studio

การค้นหาจะแสดงผลิตภัณฑ์ที่ตรงกันโดยเรียงตามระยะทางโคไซน์ ดังนี้

product_name       |                                   description                                    | sale_price | zip_code |      distance       
-------------------------+----------------------------------------------------------------------------------+------------+----------+---------------------
 Cherry Tree             | This is a beautiful cherry tree that will produce delicious cherries. It is an d |      75.00 |    93230 | 0.43922018972266397
 Meyer Lemon Tree        | Meyer Lemon trees are California's favorite lemon tree! Grow your own lemons by  |         34 |    93230 |  0.4685112926118228
 Toyon                   | This is a beautiful toyon tree that can grow to be over 20 feet tall. It is an e |      10.00 |    93230 |  0.4835677149651668
 California Lilac        | This is a beautiful lilac tree that can grow to be over 10 feet tall. It is an d |       5.00 |    93230 |  0.4947204525907498
 California Peppertree   | This is a beautiful peppertree that can grow to be over 30 feet tall. It is an e |      25.00 |    93230 |  0.5054166905547247
 California Black Walnut | This is a beautiful walnut tree that can grow to be over 80 feet tall. It is a d |     100.00 |    93230 |  0.5084219510932597
 California Sycamore     | This is a beautiful sycamore tree that can grow to be over 100 feet tall. It is  |     300.00 |    93230 |  0.5140519790508755
 Coast Live Oak          | This is a beautiful oak tree that can grow to be over 100 feet tall. It is an ev |     500.00 |    93230 |  0.5143126438081371
 Fremont Cottonwood      | This is a beautiful cottonwood tree that can grow to be over 100 feet tall. It i |     200.00 |    93230 |  0.5174774727252058
 Madrone                 | This is a beautiful madrona tree that can grow to be over 80 feet tall. It is an |      50.00 |    93230 |  0.5227400803389093
(10 rows)

9. ปรับปรุงคำตอบของ LLM โดยใช้ข้อมูลที่ดึงมา

ปรับปรุงคำตอบของ Generative AI ให้กับแอปพลิเคชันไคลเอ็นต์โดยส่งผลการค้นหาเป็นบริบทที่อิงตามความเป็นจริงในพรอมต์ไปยังโมเดลภาษาพื้นฐานของแพลตฟอร์ม Agent ของ Gemini Enterprise

ทั้งสองสามารถทำได้โดยดำเนินการดังนี้

  1. สร้างเพย์โหลด JSON จากผลการค้นหาเวกเตอร์ใน Cloud SQL
  2. ทดสอบพรอมต์ใน Agent Platform Studio
  3. เรียกใช้พรอมต์แบบครบวงจรจาก SQL โดยตรงโดยใช้การผสานรวม google_ml

สร้างเอาต์พุตในรูปแบบ JSON

แก้ไขคําค้นหาเพื่อจัดรูปแบบผลลัพธ์เป็น JSON และแสดงผล 1 แถว

WITH trees as (
SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        cp.uniq_id as product_id
FROM
        cymbal_products cp
JOIN cymbal_inventory ci on
        ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
        cs.store_id=ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        (cp.embedding <=> embedding('text-embedding-005','What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1)
SELECT json_agg(trees) FROM trees;

เอาต์พุต JSON ที่คาดไว้

[{"product_name":"Cherry Tree","description":"This is a beautiful cherry tree that will produce delicious cherries. It is an d","sale_price":75.00,"zip_code":93230,"product_id":"d536e9e823296a2eba198e52dd23e712"}]

เรียกใช้พรอมต์ใน Agent Platform Studio

ระบุ JSON ที่สร้างขึ้นเป็นบริบทในพรอมต์ไปยังโมเดล Generative ใน Agent Platform Studio

  1. เปิด Agent Platform Studio ในคอนโซล Google Cloud

การนำทาง Agent Platform Studio

  1. ป้อนพรอมต์ต่อไปนี้ใน Agent Platform Studio

การป้อนพรอมต์ใน Agent Platform Studio

You are a friendly advisor helping to find a product based on the customer's needs.
Based on the client request we have loaded a list of products closely related to search.
The list in JSON format with list of values like {"product_name":"name","description":"some description","sale_price":10,"zip_code": 10234, "product_id": "02056727942aeb714dc9a2313654e1b0"}
Here is the list of products:
<JSON_OUTPUT>
The customer asked "What tree is growing the best here?"
You should give information about the product, price and some supplemental information.
Do not ask any additional questions and assume location based on the zip code provided in the list of products.

แทนที่ ด้วยการตอบกลับ JSON จากการค้นหาของคุณ

You are a friendly advisor helping to find a product based on the customer's needs.
Based on the client request we have loaded a list of products closely related to search.
The list in JSON format with list of values like {"product_name":"name","description":"some description","sale_price":10,"zip_code": 10234, "product_id": "02056727942aeb714dc9a2313654e1b0"}
Here is the list of products:
[{"product_name":"Cherry Tree","description":"This is a beautiful cherry tree that will produce delicious cherries. It is an d","sale_price":75.00,"zip_code":93230,"product_id":"d536e9e823296a2eba198e52dd23e712"}]
The customer asked "What tree is growing the best here?"
You should give information about the product, price and some supplemental information.
Do not ask any additional questions and assume location based on the zip code provided in the list of products.

พรอมต์ใน Agent Platform Studio

  1. เรียกใช้พรอมต์

ผลลัพธ์ของพรอมต์ใน Agent Platform Studio

คำตอบจะมีราคา คำอธิบาย และข้อมูลเสริมที่โมเดลได้รับจากแหล่งข้อมูลภายนอกโดยอิงตามข้อมูลเกี่ยวกับต้นไม้และสถานที่

เรียกใช้พรอมต์ใน psql

นอกจากนี้ คุณยังใช้การผสานรวม AI ของ Cloud SQL กับแพลตฟอร์ม Agent ของ Gemini Enterprise เพื่อรับคำตอบจากโมเดล Generative ได้โดยตรงภายใน SQL ก่อนอื่น ให้ลงทะเบียนโมเดล

  1. อัปเกรดส่วนขยายเป็นเวอร์ชัน 1.4.3 ขึ้นไปหากจำเป็น เชื่อมต่อกับ quickstart_db แล้วเรียกใช้คำสั่งต่อไปนี้
SELECT extversion from pg_extension where extname='google_ml_integration';

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

ALTER EXTENSION google_ml_integration UPDATE TO '1.4.3';
  1. ตรวจสอบแฟล็กฐานข้อมูล google_ml_integration.enable_model_support
SHOW google_ml_integration.enable_model_support;

หากมีเครื่องหมาย off ให้อัปเดต Flag ของฐานข้อมูลใน Cloud Shell โดยทำดังนี้

gcloud sql instances patch my-cloudsql-instance \
--database-flags google_ml_integration.enable_model_support=on,cloudsql.enable_google_ml_integration=on

การดำเนินการนี้ใช้เวลา 1-3 นาที ยืนยันการตั้งค่าอีกครั้งโดยทำดังนี้

SHOW google_ml_integration.enable_model_support;
  1. ลงทะเบียนโมเดล gemini-3.5-flash เพื่อสร้างคำตอบ (แทนที่ ด้วยรหัสโปรเจ็กต์ของคุณ)
CALL
  google_ml.create_model(
    model_id => 'gemini-3.5-flash',
    model_request_url => 'https://aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/global/publishers/google/models/gemini-3.5-flash:generateContent',
    model_provider => 'google',
    model_auth_type => 'cloudsql_service_agent_iam');

ยืนยันโมเดลที่ลงทะเบียนแล้ว

SELECT model_id, model_type FROM google_ml.model_info_view WHERE model_id='gemini-3.5-flash';
  1. เรียกใช้การค้นหา SQL ที่สมบูรณ์เพื่อดึงผลการค้นหาเวกเตอร์และส่งไปยัง gemini-3.5-flash โดยตรง
WITH trees AS (
SELECT
        cp.product_name,
        cp.product_description AS description,
        cp.sale_price,
        cs.zip_code,
        cp.uniq_id AS product_id
FROM
        cymbal_products cp
JOIN cymbal_inventory ci ON
        ci.uniq_id = cp.uniq_id
JOIN cymbal_stores cs ON
        cs.store_id = ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        (cp.embedding <=> embedding('text-embedding-005',
        'What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1),
prompt AS (
SELECT
        'You are a friendly advisor helping to find a product based on the customer''s needs.
Based on the client request we have loaded a list of products closely related to search.
The list in JSON format with list of values like {"product_name":"name","product_description":"some description","sale_price":10}
Here is the list of products:' || json_agg(trees) || 'The customer asked "What kind of fruit trees grow well here?"
You should give information about the product, price and some supplemental information' AS prompt_text
FROM
        trees),
response AS (
SELECT
        google_ml.predict_row( model_id =>'gemini-3.5-flash',
        request_body => json_build_object('contents',
        json_build_object('role',
        'user',
        'parts',
        json_build_object('text',
        prompt_text))))->'candidates'->0->'content'->'parts'->0->'text' AS resp
FROM
        prompt)
SELECT
REPLACE(resp::text, '\n', CHR(10))
FROM
        response;

ผลลัพธ์ที่คาดไว้

"Hello there! If you're looking for a wonderful fruit tree to plant, I have a fantastic option for you: ### **Cherry Tree** * **Price:** $75.00 * **Product ID:** `d536e9e823296a2eba198e52dd23e712` --- ### **Why it's a great choice:** * **Fruit & Shade:** Not only will it produce delicious, sweet cherries, but it also grows into a beautiful 15-foot deciduous tree that provides excellent shade and privacy for your yard. * **Seasonal Beauty:** Its leaves are a lovely dark green throughout the summer and transition into a striking red during the fall. * **Ideal Growing Conditions:** Cherry trees thrive best in cool, moist climates with sandy soil and are suitable for **USDA hardiness zones 4–9**. If your local climate matches these conditions, this Cherry Tree would make a beautiful and tasty addition to your garden! Let me know if you'd like more details or help placing an order."

10. สร้างดัชนีเพื่อนบ้านที่ใกล้ที่สุด

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

สร้างดัชนี HNSW

Hierarchical Navigable Small World (HNSW) คือดัชนีเวกเตอร์ที่อิงตามกราฟ

หากต้องการสร้างดัชนี HNSW ในคอลัมน์ embedding ให้ระบุฟังก์ชันระยะทาง (vector_cosine_ops) และพารามิเตอร์ที่ไม่บังคับ เช่น m และ ef_construction ดูข้อมูลเพิ่มเติมได้ที่ทำงานกับเวกเตอร์ Embedding

CREATE INDEX cymbal_products_embeddings_hnsw ON cymbal_products
  USING hnsw (embedding vector_cosine_ops)
  WITH (m = 16, ef_construction = 64);

ผลลัพธ์ที่คาดไว้

quickstart_db=> CREATE INDEX cymbal_products_embeddings_hnsw ON cymbal_products
  USING hnsw (embedding vector_cosine_ops)
  WITH (m = 16, ef_construction = 64);
CREATE INDEX
quickstart_db=>

เปรียบเทียบประสิทธิภาพของคำค้นหา

เรียกใช้การค้นหาเวกเตอร์ด้วย EXPLAIN (ANALYZE) เพื่อยืนยันว่าเครื่องมือวางแผนการค้นหาใช้ดัชนี

EXPLAIN (ANALYZE) 
WITH trees as (
SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        cp.uniq_id as product_id
FROM
        cymbal_products cp
JOIN cymbal_inventory ci on
        ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
        cs.store_id=ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        (cp.embedding <=> embedding('text-embedding-005','What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1)
SELECT json_agg(trees) FROM trees;

ผลลัพธ์ที่คาดไว้

 Aggregate  (cost=779.12..779.13 rows=1 width=32) (actual time=1.066..1.069 rows=1 loops=1)
   ->  Subquery Scan on trees  (cost=769.05..779.12 rows=1 width=142) (actual time=1.038..1.041 rows=1 loops=1)
         ->  Limit  (cost=769.05..779.11 rows=1 width=158) (actual time=1.022..1.024 rows=1 loops=1)
               ->  Nested Loop  (cost=769.05..9339.69 rows=852 width=158) (actual time=1.020..1.021 rows=1 loops=1)
                     ->  Nested Loop  (cost=768.77..9316.48 rows=852 width=945) (actual time=0.858..0.859 rows=1 loops=1)
                           ->  Index Scan using cymbal_products_embeddings_hnsw on cymbal_products cp  (cost=768.34..2572.47 rows=941 width=941) (actual time=0.532..0.539 rows=3 loops=1)
...
 Planning Time: 112.398 ms
 Execution Time: 1.221 ms

แผนการดำเนินการจะแสดง Index Scan using cymbal_products_embeddings_hnsw

เรียกใช้การค้นหาโดยไม่ต้องใช้ EXPLAIN ดังนี้

WITH trees as (
SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        cp.uniq_id as product_id
FROM
        cymbal_products cp
JOIN cymbal_inventory ci on
        ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
        cs.store_id=ci.store_id
        AND ci.inventory>0
        AND cs.store_id = 1583
ORDER BY
        (cp.embedding <=> embedding('text-embedding-005','What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1)
SELECT json_agg(trees) FROM trees;

ผลลัพธ์ที่คาดไว้

[{"product_name":"Cherry Tree","description":"This is a beautiful cherry tree that will produce delicious cherries. It is an d","sale_price":75.00,"zip_code":93230,"product_id":"d536e9e823296a2eba198e52dd23e712"}]

ดูข้อมูลเพิ่มเติมและตัวอย่างเกี่ยวกับ LangChain และดัชนีเวกเตอร์ได้ในเอกสารประกอบภาพรวม AI ของ Cloud SQL

11. ล้างข้อมูลทรัพยากร

ลบอินสแตนซ์ Cloud SQL หลังจากทำ Codelab เสร็จแล้ว

ใน Cloud Shell ให้ตั้งค่าตัวแปรโปรเจ็กต์และตัวแปรสภาพแวดล้อมหากเซสชันของคุณถูกตัดการเชื่อมต่อ

export INSTANCE_NAME=my-cloudsql-instance
export PROJECT_ID=$(gcloud config get-value project)

ลบอินสแตนซ์

gcloud sql instances delete $INSTANCE_NAME --project=$PROJECT_ID

ผลลัพธ์ที่คาดไว้

student@cloudshell:~$ gcloud sql instances delete $INSTANCE_NAME --project=$PROJECT_ID
All of the instance data will be lost when the instance is deleted.

Do you want to continue (Y/n)?  y

Deleting Cloud SQL instance...done.                                                                                                                
Deleted [https://sandbox.googleapis.com/v1beta4/projects/test-project-001-402417/instances/my-cloudsql-instance].

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

ยินดีด้วย คุณทำ Codelab เสร็จแล้ว

Lab นี้เป็นส่วนหนึ่งของเส้นทางการเรียนรู้ AI ที่พร้อมใช้งานจริงด้วย Google Cloud

สรุป

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

  • ติดตั้งใช้งานอินสแตนซ์ Cloud SQL สำหรับ PostgreSQL
  • สร้างฐานข้อมูลและเปิดใช้การผสานรวม AI ของ Cloud SQL
  • โหลดข้อมูลลงในฐานข้อมูล
  • ใช้ Cloud SQL Studio
  • ใช้โมเดลการฝังของแพลตฟอร์ม Agent ของ Gemini Enterprise ใน Cloud SQL
  • ใช้ Agent Platform Studio
  • เสริมผลการค้นหาโดยใช้โมเดล Generative ของแพลตฟอร์ม Agent ของ Gemini Enterprise
  • ปรับปรุงประสิทธิภาพการค้นหาโดยใช้ดัชนีเวกเตอร์

ลองใช้ Codelab การฝังเวกเตอร์ของ AlloyDB AI ด้วยดัชนี ScaNN แทน HNSW