เริ่มต้นใช้งานการฝังเวกเตอร์ใน Cloud SQL สำหรับ MySQL

1. บทนำ

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

8aa6ba3bc12a1593.png

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

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

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

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

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

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

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

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

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

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

  1. สร้างโปรเจ็กต์ใหม่หรือนำโปรเจ็กต์ที่มีอยู่มาใช้ซ้ำ หากต้องการสร้างโปรเจ็กต์ใหม่ใน Google Cloud Console ให้คลิกปุ่มเลือกโปรเจ็กต์ในส่วนหัว ซึ่งจะเปิดหน้าต่างป๊อปอัป

295004821bab6a87.png

ในหน้าต่างเลือกโปรเจ็กต์ ให้กดปุ่มโปรเจ็กต์ใหม่ ซึ่งจะเปิดกล่องโต้ตอบสำหรับโปรเจ็กต์ใหม่

37d264871000675d.png

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

96d86d3d5655cdbe.png

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

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

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

แลกรับเครดิต Google Cloud มูลค่า $5 (ไม่บังคับ)

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

  1. คลิกลิงก์นี้แล้วลงชื่อเข้าใช้ด้วยบัญชี Google ส่วนบุคคล
  2. คุณจะเห็นข้อความคล้ายกับข้อความต่อไปนี้

f54628965f465486.png

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

20e88842cf2a732e.png

  1. คลิก "ยืนยัน" ตอนนี้คุณเชื่อมต่อกับบัญชีสำหรับการเรียกเก็บเงินของ Google Cloud Platform เวอร์ชันทดลองใช้งานแล้ว

cdc87f1c57777951.png

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

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

หากต้องการตั้งค่าบัญชีสำหรับการเรียกเก็บเงินส่วนตัว ให้ไปที่นี่เพื่อเปิดใช้การเรียกเก็บเงินใน Cloud Console

ข้อควรทราบ

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

เริ่มต้น Cloud Shell

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

จาก Google Cloud Console ให้คลิกไอคอน Cloud Shell ในแถบเครื่องมือด้านขวาบน

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

หรือจะกด G แล้วตามด้วย S ก็ได้ ลำดับนี้จะเปิดใช้งาน Cloud Shell หากคุณอยู่ใน Google Cloud Console หรือใช้ลิงก์นี้

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

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

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

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

เปิดใช้ API

หากต้องการใช้ Cloud SQL, Compute Engine, บริการเครือข่าย และ Vertex AI คุณต้องเปิดใช้ API ที่เกี่ยวข้องในโปรเจ็กต์ Google Cloud

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

gcloud config set project [YOUR-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

  • Cloud SQL Admin API (sqladmin.googleapis.com) ช่วยให้คุณสร้าง กำหนดค่า และจัดการอินสแตนซ์ Cloud SQL ได้แบบเป็นโปรแกรม โดยจะมอบ Control Plane สำหรับบริการฐานข้อมูลเชิงสัมพันธ์ที่มีการจัดการครบวงจรของ Google (รองรับ MySQL, PostgreSQL และ SQL Server) ซึ่งจะจัดการงานต่างๆ เช่น การจัดสรร การสำรองข้อมูล ความพร้อมใช้งานสูง และการปรับขนาด
  • Compute Engine API (compute.googleapis.com) ช่วยให้คุณสร้างและจัดการเครื่องเสมือน (VM), Persistent Disk และการตั้งค่าเครือข่ายได้ โดยมีพื้นฐานด้าน Infrastructure-as-a-Service (IaaS) หลักที่จำเป็นต่อการเรียกใช้เวิร์กโหลดและโฮสต์โครงสร้างพื้นฐานที่อยู่เบื้องหลังสำหรับบริการที่มีการจัดการจำนวนมาก
  • Cloud Resource Manager API (cloudresourcemanager.googleapis.com) ช่วยให้คุณจัดการข้อมูลเมตาและการกำหนดค่าของโปรเจ็กต์ Google Cloud แบบเป็นโปรแกรมได้ ซึ่งช่วยให้คุณจัดระเบียบทรัพยากร จัดการนโยบาย Identity and Access Management (IAM) และตรวจสอบสิทธิ์ในลำดับชั้นของโปรเจ็กต์ได้
  • Service Networking API (servicenetworking.googleapis.com) ช่วยให้คุณตั้งค่าการเชื่อมต่อส่วนตัวระหว่างเครือข่าย Virtual Private Cloud (VPC) กับบริการที่มีการจัดการของ Google โดยอัตโนมัติได้ โดยเฉพาะอย่างยิ่งจำเป็นต้องสร้างการเข้าถึง IP ส่วนตัวสำหรับบริการต่างๆ เช่น AlloyDB เพื่อให้สื่อสารกับทรัพยากรอื่นๆ ได้อย่างปลอดภัย
  • Vertex AI API (aiplatform.googleapis.com) ช่วยให้แอปพลิเคชันของคุณสร้าง ปรับใช้ และปรับขนาดโมเดลแมชชีนเลิร์นนิงได้ โดยมีอินเทอร์เฟซแบบรวมสำหรับบริการ AI ทั้งหมดของ Google Cloud รวมถึงการเข้าถึงโมเดล Generative AI (เช่น Gemini) และการฝึกโมเดลที่กำหนดเอง

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

สร้างอินสแตนซ์ Cloud SQL ที่ผสานรวมฐานข้อมูลกับ Vertex AI

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

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

export CLOUDSQL_PASSWORD=`openssl rand -hex 12`

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

echo $CLOUDSQL_PASSWORD

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

คุณเปิดใช้แฟล็ก cloudsql_vector ได้เมื่อสร้างอินสแตนซ์ ขณะนี้การรองรับเวกเตอร์พร้อมให้บริการสำหรับ MySQL 8.0 R20241208.01_00 ขึ้นไป

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

gcloud sql instances create my-cloudsql-instance \
--database-version=MYSQL_8_4 \
--tier=db-custom-2-8192 \
--region=us-central1 \
--enable-google-ml-integration \
--edition=ENTERPRISE \
--root-password=$CLOUDSQL_PASSWORD

เราสามารถยืนยันการเชื่อมต่อได้โดยการดำเนินการจาก Cloud Shell

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

เรียกใช้คำสั่งและป้อนรหัสผ่านในพรอมต์เมื่อพร้อมเชื่อมต่อ

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

$gcloud sql connect my-cloudsql-instance --user=root
Allowlisting your IP for incoming connection for 5 minutes...done.                                                                                                                           
Connecting to database with SQL user [root].Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 71
Server version: 8.4.4-google (Google)

Copyright (c) 2000, 2025, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

ออกจากการเชื่อมต่อ MySQL ในตอนนี้โดยใช้แป้นพิมพ์ลัด Ctrl+d หรือเรียกใช้คำสั่ง exit

exit

เปิดใช้การผสานรวม Vertex AI

มอบสิทธิ์ที่จำเป็นให้กับบัญชีบริการ Cloud SQL ภายในเพื่อให้ใช้การผสานรวม Vertex AI ได้

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

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

ให้สิทธิ์เข้าถึง Vertex AI แก่บัญชีบริการ Cloud SQL โดยทำดังนี้

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$SERVICE_ACCOUNT_EMAIL" \
  --role="roles/aiplatform.user"

อ่านเพิ่มเติมเกี่ยวกับการสร้างและการกำหนดค่าอินสแตนซ์ได้ในเอกสารประกอบ Cloud SQL ที่นี่

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

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

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

สร้างฐานข้อมูลชื่อ quickstart_db โดยเรามีตัวเลือกต่างๆ เช่น ไคลเอ็นต์ฐานข้อมูลบรรทัดคำสั่ง เช่น mysql สำหรับ MySQL, SDK หรือ Cloud SQL Studio เราจะใช้ SDK (gcloud) ในการสร้างฐานข้อมูล

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

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

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

ตอนนี้เราต้องสร้างออบเจ็กต์ในฐานข้อมูลและโหลดข้อมูล เราจะใช้ข้อมูลร้าน Cymbal Store ที่สมมติขึ้น ข้อมูลมีให้ในรูปแบบ SQL (สำหรับสคีมา) และ CSV (สำหรับข้อมูล)

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

ก่อนอื่นเราต้องเพิ่ม IP สาธารณะของ Cloud Shell ลงในรายการเครือข่ายที่ได้รับอนุญาตสำหรับอินสแตนซ์ Cloud SQL ใน Cloud Shell ให้เรียกใช้คำสั่งต่อไปนี้

gcloud sql instances patch my-cloudsql-instance --authorized-networks=$(curl ifconfig.me)

หากเซสชันสูญหาย รีเซ็ต หรือคุณทำงานจากเครื่องมืออื่น ให้ส่งออกตัวแปร CLOUDSQL_PASSWORD อีกครั้ง

export CLOUDSQL_PASSWORD=...your password defined for the instance...

ตอนนี้เราสามารถสร้างออบเจ็กต์ที่จำเป็นทั้งหมดในฐานข้อมูลได้แล้ว โดยเราจะใช้ยูทิลิตี mysql ของ MySQL ร่วมกับยูทิลิตี curl ซึ่งจะดึงข้อมูลจากแหล่งข้อมูลสาธารณะ

ใน Cloud Shell ให้เรียกใช้คำสั่งต่อไปนี้

export INSTANCE_IP=$(gcloud sql instances describe my-cloudsql-instance --format="value(ipAddresses.ipAddress)")
curl -LJ https://raw.githubusercontent.com/GoogleCloudPlatform/devrel-demos/main/infrastructure/cymbal-store-embeddings/cymbal_mysql_schema.sql | mysql --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db

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

ขั้นตอนถัดไปคือการโหลดข้อมูล cymbal_products เราใช้ยูทิลิตี curl และ mysql เดียวกัน

curl -LJ https://raw.githubusercontent.com/GoogleCloudPlatform/devrel-demos/main/infrastructure/cymbal-store-embeddings/cymbal_products.csv | mysql --enable-local-infile --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db -e "LOAD DATA LOCAL INFILE '/dev/stdin'  INTO TABLE cymbal_products FIELDS TERMINATED BY ','  OPTIONALLY ENCLOSED BY '\"'  LINES TERMINATED BY '\n'  IGNORE 1 LINES;"

จากนั้นเราจะดำเนินการต่อด้วย cymbal_stores

curl -LJ https://raw.githubusercontent.com/GoogleCloudPlatform/devrel-demos/main/infrastructure/cymbal-store-embeddings/cymbal_stores.csv | mysql --enable-local-infile --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db -e "LOAD DATA LOCAL INFILE '/dev/stdin'  INTO TABLE cymbal_stores FIELDS TERMINATED BY ','  OPTIONALLY ENCLOSED BY '\"'  LINES TERMINATED BY '\n'  IGNORE 1 LINES;"

และจบด้วย cymbal_inventory ซึ่งมีจำนวนผลิตภัณฑ์แต่ละรายการในแต่ละร้านค้า

curl -LJ https://raw.githubusercontent.com/GoogleCloudPlatform/devrel-demos/main/infrastructure/cymbal-store-embeddings/cymbal_inventory.csv | mysql --enable-local-infile --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db -e "LOAD DATA LOCAL INFILE '/dev/stdin'  INTO TABLE cymbal_inventory FIELDS TERMINATED BY ','  OPTIONALLY ENCLOSED BY '\"'  LINES TERMINATED BY '\n'  IGNORE 1 LINES;"

หากคุณมีข้อมูลตัวอย่างของตัวเองและไฟล์ CSV ที่เข้ากันได้กับเครื่องมือนำเข้า Cloud SQL ที่มีอยู่ใน Cloud Console คุณสามารถใช้ข้อมูลดังกล่าวแทนวิธีการที่แสดงได้

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

ขั้นตอนถัดไปคือการสร้างการฝังสำหรับรายละเอียดผลิตภัณฑ์โดยใช้โมเดล textembedding-005 จาก Google Vertex AI และจัดเก็บไว้ในคอลัมน์ใหม่ในตาราง cymbal_products

หากต้องการจัดเก็บข้อมูลเวกเตอร์ เราต้องเปิดใช้ฟังก์ชันเวกเตอร์ในอินสแตนซ์ Cloud SQL เรียกใช้ใน Cloud Shell

gcloud sql instances patch my-cloudsql-instance \
--database-flags=cloudsql_vector=on

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

mysql --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db

และสร้างคอลัมน์ใหม่ชื่อ embedding ในตาราง cymbal_products โดยใช้ฟังก์ชัน Embedding คอลัมน์ใหม่นั้นจะเก็บการฝังเวกเตอร์ตามข้อความในคอลัมน์ product_description

ALTER TABLE cymbal_products ADD COLUMN embedding vector(768) using varbinary;
UPDATE cymbal_products SET embedding = mysql.ml_embedding('text-embedding-005', product_description);

โดยปกติแล้ว การสร้างการฝังเวกเตอร์สำหรับ 2,000 แถวจะใช้เวลาไม่เกิน 5 นาที แต่บางครั้งอาจใช้เวลานานกว่านั้นเล็กน้อย และมักจะเสร็จเร็วกว่านั้นมาก

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

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

คุณเรียกใช้คำค้นหา SQL ได้จากอินเทอร์เฟซบรรทัดคำสั่งเดียวกัน หรือจะใช้ Cloud SQL Studio แทนก็ได้ การค้นหาแบบหลายแถวและการค้นหาที่ซับซ้อนควรจัดการใน Cloud SQL Studio

สร้างผู้ใช้

เราต้องการผู้ใช้ใหม่ที่ใช้ Cloud SQL Studio ได้ เราจะสร้างผู้ใช้ประเภทที่สร้างไว้ล่วงหน้าซึ่งเป็นนักเรียนโดยใช้รหัสผ่านเดียวกันกับที่เราใช้สำหรับผู้ใช้รูท

ใน Cloud Shell ให้เรียกใช้คำสั่งต่อไปนี้

gcloud sql users create student  --instance=my-cloudsql-instance --password=$CLOUDSQL_PASSWORD --host=%

เริ่ม Cloud SQL Studio

ในคอนโซล ให้คลิกอินสแตนซ์ Cloud SQL ที่เราสร้างไว้ก่อนหน้านี้

27f060eb2764a26a.png

เมื่อเปิดในแผงด้านขวา เราจะเห็น Cloud SQL Studio ให้คลิกไอคอนนั้น

f08ce4794fce5bce.png

ซึ่งจะเป็นการเปิดกล่องโต้ตอบที่คุณระบุชื่อฐานข้อมูลและข้อมูลเข้าสู่ระบบ

  • ฐานข้อมูล: quickstart_db
  • ผู้ใช้: นักเรียน
  • รหัสผ่าน: รหัสผ่านที่คุณจดไว้สำหรับผู้ใช้

แล้วคลิกปุ่ม "ยืนยันตัวตน"

5c898e4a4a0adb96.png

หน้าต่างถัดไปจะเปิดขึ้น ให้คลิกแท็บ "เอดิเตอร์" ทางด้านขวาเพื่อเปิด SQL Editor

983d35d20f8a3dda.png

ตอนนี้เราพร้อมที่จะเรียกใช้การค้นหาแล้ว

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

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

นี่คือคําค้นหาที่คุณเรียกใช้เพื่อเลือก 5 รายการแรกที่เหมาะสมที่สุดสําหรับคําขอของเราโดยใช้ฟังก์ชัน cosine_distance

SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        cosine_distance(cp.embedding ,@query_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 5;

คัดลอกและวางการค้นหาลงในโปรแกรมแก้ไข Cloud SQL Studio แล้วกดปุ่ม "RUN" หรือวางในเซสชันบรรทัดคำสั่งที่เชื่อมต่อกับฐานข้อมูล quickstart_db

a8be9da7d5c2b176.png

และนี่คือรายการผลิตภัณฑ์ที่เลือกซึ่งตรงกับคำค้นหา

+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| product_name    | description                                                                      | sale_price | zip_code | distance            |
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| Malus Domestica | Malus Domestica, the classic apple tree, brings beauty and delicious fruit to yo |     100.00 |    93230 | 0.37740096545831603 |
| Cerasus         | Cerasus: A beautiful cherry tree that brings delicious fruit and vibrant color t |      75.00 |    93230 |   0.405704177142419 |
| Persica         | Persica: Enjoy homegrown, delicious peaches with this beautiful peach tree. Reac |     150.00 |    93230 | 0.41031799106722877 |
| Meyer Lemon     | Grow your own juicy Meyer Lemons with this semi-dwarf tree, California's favorit |      34.00 |    93230 | 0.42823360959352186 |
| Acer            | Acer, the classic maple. Known for vibrant fall foliage in reds, oranges, and ye |     100.00 |    93230 | 0.42953897057301615 |
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
5 rows in set (0.13 sec)

การดำเนินการคำค้นหาใช้เวลา 0.13 วินาทีด้วยฟังก์ชัน cosine_distance

ตอนนี้เราจะเรียกใช้การค้นหาเดียวกัน แต่ใช้การค้นหา KNN โดยใช้ฟังก์ชัน approx_distance หากไม่มีดัชนี ANN สำหรับการฝัง ระบบจะกลับไปใช้การค้นหาที่ตรงกันทุกประการโดยอัตโนมัติในเบื้องหลัง

SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        approx_distance(cp.embedding ,@query_vector, 'distance_measure=cosine') 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 5;

และนี่คือรายการผลิตภัณฑ์ที่ Query แสดงผล

+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| product_name    | description                                                                      | sale_price | zip_code | distance            |
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| Malus Domestica | Malus Domestica, the classic apple tree, brings beauty and delicious fruit to yo |     100.00 |    93230 | 0.37740096545831603 |
| Cerasus         | Cerasus: A beautiful cherry tree that brings delicious fruit and vibrant color t |      75.00 |    93230 |   0.405704177142419 |
| Persica         | Persica: Enjoy homegrown, delicious peaches with this beautiful peach tree. Reac |     150.00 |    93230 | 0.41031799106722877 |
| Meyer Lemon     | Grow your own juicy Meyer Lemons with this semi-dwarf tree, California's favorit |      34.00 |    93230 | 0.42823360959352186 |
| Acer            | Acer, the classic maple. Known for vibrant fall foliage in reds, oranges, and ye |     100.00 |    93230 | 0.42953897057301615 |
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
5 rows in set, 1 warning (0.12 sec)

การดำเนินการคำค้นหาใช้เวลาเพียง 0.12 วินาที เราได้รับผลลัพธ์เช่นเดียวกับฟังก์ชัน cosine_distance

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

เราสามารถปรับปรุงคำตอบของ LLM ของ Gen AI ให้กับแอปพลิเคชันไคลเอ็นต์ได้โดยใช้ผลลัพธ์ของคำค้นหาที่ดำเนินการแล้ว และเตรียมเอาต์พุตที่มีความหมายโดยใช้ผลลัพธ์ของคำค้นหาที่ระบุเป็นส่วนหนึ่งของพรอมต์ไปยังโมเดลภาษาพื้นฐานแบบ Generative ของ Vertex AI

ในการดำเนินการดังกล่าว เราต้องสร้าง JSON ที่มีผลลัพธ์จากการค้นหาเวกเตอร์ จากนั้นใช้ JSON ที่สร้างขึ้นเป็นส่วนเพิ่มเติมของพรอมต์สำหรับโมเดล LLM ใน Vertex AI เพื่อสร้างเอาต์พุตที่มีความหมาย ในขั้นตอนแรก เราจะสร้าง JSON จากนั้นทดสอบใน Vertex AI Studio และในขั้นตอนสุดท้าย เราจะรวมไว้ในคำสั่ง SQL ซึ่งสามารถใช้ในแอปพลิเคชันได้

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

แก้ไขคําค้นหาเพื่อสร้างเอาต์พุตในรูปแบบ JSON และแสดงผลเพียงแถวเดียวเพื่อส่งไปยัง Vertex AI

ตัวอย่างคำค้นหาที่ใช้การค้นหา ANN มีดังนี้

SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
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
        (approx_distance(cp.embedding ,@query_vector, 'distance_measure=cosine')) ASC
LIMIT 1)
SELECT json_arrayagg(json_object('product_name',product_name,'description',description,'sale_price',sale_price,'zip_code',zip_code,'product_id',product_id)) FROM trees;

และนี่คือ JSON ที่คาดไว้ในเอาต์พุต

[{"zip_code": 93230, "product_id": "23e41a71d63d8bbc9bdfa1d118cfddc5", "sale_price": 100.00, "description": "Malus Domestica, the classic apple tree, brings beauty and delicious fruit to yo", "product_name": "Malus Domestica"}]

เรียกใช้พรอมต์ใน Vertex AI Studio

เราสามารถใช้ JSON ที่สร้างขึ้นเพื่อจัดหาเป็นส่วนหนึ่งของพรอมต์ไปยังโมเดลข้อความ Generative AI ใน Vertex AI Studio

เปิดพรอมต์ Vertex AI Studio ใน Cloud Console

d48549b1b0f449b4.png

โดยอาจขอให้คุณเปิดใช้ API เพิ่มเติม แต่คุณสามารถเพิกเฉยต่อคำขอนี้ได้ เราไม่จำเป็นต้องใช้ API เพิ่มเติมเพื่อทำแล็บให้เสร็จ

ใส่พรอมต์ใน Studio

2a6f5a338fefd229.png

พรอมต์ที่เราจะใช้มีดังนี้

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, "produt_id": "02056727942aeb714dc9a2313654e1b0"}
Here is the list of products:
[place your JSON here]
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, "produt_id": "02056727942aeb714dc9a2313654e1b0"}
Here is the list of products:
{"zip_code": 93230, "product_id": "23e41a71d63d8bbc9bdfa1d118cfddc5", "sale_price": 100.00, "description": "Malus Domestica, the classic apple tree, brings beauty and delicious fruit to yo", "product_name": "Malus Domestica"}
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 และใช้โมเดล gemini-2.5-flash

62fccb783d4d4985.png

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

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

นอกจากนี้ เรายังใช้การผสานรวม AI ของ Cloud SQL กับ Vertex AI เพื่อรับคำตอบที่คล้ายกันจากโมเดล Generative AI โดยใช้ SQL ในฐานข้อมูลได้โดยตรง

ตอนนี้เราสามารถใช้ข้อมูลที่สร้างขึ้นในคำสั่งย่อยที่มีผลลัพธ์ JSON เพื่อส่งเป็นส่วนหนึ่งของพรอมต์ไปยังโมเดลข้อความ Generative AI โดยใช้ SQL

ในเซสชัน mysql หรือ Cloud SQL Studio ให้เรียกใช้การค้นหาในฐานข้อมูล

SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
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
         (approx_distance(cp.embedding ,@query_vector, 'distance_measure=cosine')) ASC
LIMIT 1),
prompt AS (
SELECT
       CONCAT( '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_arrayagg(json_object('product_name',trees.product_name,'description',trees.description,'sale_price',trees.sale_price,'zip_code',trees.zip_code,'product_id',trees.product_id)) , '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
       mysql.ML_PREDICT_ROW('publishers/google/models/gemini-2.0-flash-001:generateContent',
        json_object('contents',
        json_object('role',
        'user',
        'parts',
        json_array(
        json_object('text',
        prompt_text))))) AS resp
FROM
        prompt)
SELECT
JSON_EXTRACT(resp, '$.candidates[0].content.parts[0].text')
FROM
        response;

และนี่คือเอาต์พุตตัวอย่าง เอาต์พุตของคุณอาจแตกต่างกันไปตามเวอร์ชันโมเดลและพารามิเตอร์

"Okay, I see you're looking for fruit trees that grow well in your area. Based on the available product, the **Malus Domestica** (Apple Tree) is a great option to consider!\n\n* **Product:** Malus Domestica (Apple Tree)\n* **Description:** This classic apple tree grows to about 30 feet tall and provides beautiful seasonal color with green leaves in summer and fiery colors in the fall. It's known for its strength and provides good shade. Most importantly, it produces delicious apples!\n* **Price:** \\$100.00\n* **Growing Zones:** This particular apple tree is well-suited for USDA zones 4-8. Since your zip code is 93230, you are likely in USDA zone 9a or 9b. While this specific tree is rated for zones 4-8, with proper care and variety selection, apple trees can still thrive in slightly warmer climates. You may need to provide extra care during heat waves.\n\n**Recommendation:** I would recommend investigating varieties of Malus Domestica suited to slightly warmer climates or contacting a local nursery/arborist to verify if it is a good fit for your local climate conditions.\n"

เอาต์พุตจะอยู่ในรูปแบบมาร์กดาวน์

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

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

สร้างดัชนี ScANN

เราจะลองใช้ดัชนีประเภท ScANN สำหรับการทดสอบ

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

CREATE VECTOR INDEX cymbal_products_embedding_idx ON cymbal_products(embedding) USING SCANN DISTANCE_MEASURE=COSINE;

เปรียบเทียบคำตอบ

ตอนนี้เราสามารถเรียกใช้การค้นหาเวกเตอร์อีกครั้งและดูผลลัพธ์ได้แล้ว

SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        approx_distance(cp.embedding ,@query_vector, 'distance_measure=cosine') 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 5;

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

+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| product_name    | description                                                                      | sale_price | zip_code | distance            |
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| Malus Domestica | Malus Domestica, the classic apple tree, brings beauty and delicious fruit to yo |     100.00 |    93230 | 0.37740096545831603 |
| Cerasus         | Cerasus: A beautiful cherry tree that brings delicious fruit and vibrant color t |      75.00 |    93230 |   0.405704177142419 |
| Persica         | Persica: Enjoy homegrown, delicious peaches with this beautiful peach tree. Reac |     150.00 |    93230 | 0.41031799106722877 |
| Meyer Lemon     | Grow your own juicy Meyer Lemons with this semi-dwarf tree, California's favorit |      34.00 |    93230 | 0.42823360959352186 |
| Acer            | Acer, the classic maple. Known for vibrant fall foliage in reds, oranges, and ye |     100.00 |    93230 | 0.42953897057301615 |
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
5 rows in set (0.08 sec)

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

และเราสามารถดูแผนการดำเนินการได้โดยใช้คำสั่ง EXPLAIN

SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
EXPLAIN ANALYZE SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        approx_distance(cp.embedding ,@query_vector, 'distance_measure=cosine') 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 5;

แผนการดำเนินการ (ข้อความที่ตัดตอนมา):

...
-> Nested loop inner join  (cost=443 rows=5) (actual time=1.14..1.18 rows=5 loops=1)
                                -> Vector index scan on cp  (cost=441 rows=5) (actual time=1.1..1.1 rows=5 loops=1)
                                -> Single-row index lookup on cp using PRIMARY (uniq_id=cp.uniq_id)  (cost=0.25 rows=1) (actual time=0.0152..0.0152 rows=1 loops=5)

...

เราเห็นว่ามีการใช้การสแกนดัชนีเวกเตอร์ใน cp (นามแฝงของตาราง cymbal_products)

คุณทดสอบกับข้อมูลของคุณเองหรือทดสอบคำค้นหาต่างๆ เพื่อดูว่าการค้นหาเชิงความหมายทำงานอย่างไรใน MySQL ได้

11. ล้างข้อมูลในสภาพแวดล้อม

ลบอินสแตนซ์ Cloud SQL

ทำลายอินสแตนซ์ Cloud SQL เมื่อคุณทำแล็บเสร็จแล้ว

ใน 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 เสร็จสมบูรณ์

เส้นทางการเรียนรู้ของ Google Cloud

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

  • ดูหลักสูตรทั้งหมดเพื่อเชื่อมช่องว่างจากต้นแบบไปสู่การผลิต
  • แชร์ความคืบหน้าของคุณด้วยแฮชแท็ก #ProductionReadyAI

สิ่งที่เราได้พูดถึง

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

ลองใช้ codelab สำหรับ AlloyDB หรือ codelab สำหรับ Cloud SQL สำหรับ Postgres ที่คล้ายกัน

13. แบบสำรวจ

เอาต์พุต:

คุณจะใช้บทแนะนำนี้อย่างไร

อ่านอย่างเดียว อ่านและทำแบบฝึกหัดให้เสร็จ