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

ข้อกำหนดเบื้องต้น
- ความเข้าใจพื้นฐานเกี่ยวกับ Google Cloud และคอนโซล Google Cloud
- ประสบการณ์พื้นฐานเกี่ยวกับอินเทอร์เฟซบรรทัดคำสั่งและ Cloud Shell
สิ่งที่คุณจะได้เรียนรู้
- วิธีติดตั้งใช้งานอินสแตนซ์ Cloud SQL สำหรับ MySQL
- วิธีสร้างฐานข้อมูลและเปิดใช้การผสานรวม AI ของ Cloud SQL
- วิธีโหลดข้อมูลลงในฐานข้อมูล
- วิธีใช้ Cloud SQL Studio
- วิธีใช้โมเดลการฝังของ Vertex AI ใน Cloud SQL
- วิธีใช้ Agent Platform Studio
- วิธีเพิ่มคุณค่าให้กับผลลัพธ์โดยใช้โมเดลแพลตฟอร์ม Agent ของ Gemini Enterprise
- วิธีปรับปรุงประสิทธิภาพโดยใช้ดัชนีเวกเตอร์
สิ่งที่คุณต้องมี
- บัญชี Google Cloud และโปรเจ็กต์ Google Cloud
- เว็บเบราว์เซอร์ เช่น Chrome
2. การตั้งค่าและข้อกำหนด
การตั้งค่าโปรเจ็กต์
- ลงชื่อเข้าใช้ คอนโซล Google Cloud หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี Google
ใช้บัญชีส่วนตัวแทนบัญชีงานหรือบัญชีโรงเรียน
- สร้างโปรเจ็กต์ใหม่หรือนำโปรเจ็กต์ที่มีอยู่มาใช้ซ้ำ หากต้องการสร้างโปรเจ็กต์ใหม่ในคอนโซล Google Cloud ให้คลิกเลือกโปรเจ็กต์ในแถบเครื่องมือ

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

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

- ชื่อโปรเจ็กต์คือชื่อที่แสดงสำหรับผู้เข้าร่วมโปรเจ็กต์นี้ Google APIs จะไม่ใช้ชื่อโปรเจ็กต์ และคุณสามารถเปลี่ยนชื่อได้ทุกเมื่อ
- รหัสโปรเจ็กต์จะไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมดและเปลี่ยนแปลงไม่ได้ (หลังจากตั้งค่าแล้วจะเปลี่ยนแปลงไม่ได้) คอนโซล Google Cloud จะสร้างรหัสที่ไม่ซ้ำกันโดยอัตโนมัติ แต่คุณปรับแต่งได้ หากไม่ชอบรหัสที่สร้างขึ้น คุณสามารถสร้างรหัสแบบสุ่มอีกรหัสหนึ่งหรือระบุรหัสของคุณเองเพื่อตรวจสอบความพร้อมใช้งานได้ ใน Codelab ส่วนใหญ่ คุณจะอ้างอิงรหัสโปรเจ็กต์ ซึ่งโดยปกติจะระบุด้วยตัวยึดตำแหน่ง
- โปรดทราบว่ามีค่าที่ 3 คือหมายเลขโปรเจ็กต์ ซึ่ง API บางตัวใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 นี้ได้ในเอกสารประกอบการสร้างและการจัดการโปรเจ็กต์
เปิดใช้การเรียกเก็บเงิน
คุณมี 2 ตัวเลือกในการเปิดใช้การเรียกเก็บเงิน คุณจะใช้บัญชีการเรียกเก็บเงินส่วนตัวหรือแลกรับเครดิตได้โดยทำตามขั้นตอนต่อไปนี้
แลกรับเครดิต Google Cloud (ไม่บังคับ)
หากต้องการจัดเวิร์กช็อปนี้ คุณต้องมีบัญชีสำหรับการเรียกเก็บเงินที่มีเครดิต ใช้เครดิตที่ผู้จัดเวิร์กช็อปให้ไว้ หรือหากมีเครดิตในแบนเนอร์ที่ด้านบนของ Codelab นี้เพื่อเริ่มต้นใช้งาน หากเชื่อมต่อกับบัญชีสำหรับการเรียกเก็บเงินอยู่แล้ว ให้ข้ามขั้นตอนนี้
สร้างบัญชีสำหรับการเรียกเก็บเงินส่วนตัว
หากตั้งค่าการเรียกเก็บเงินโดยใช้เครดิต Google Cloud คุณสามารถข้ามขั้นตอนนี้ได้
หากต้องการตั้งค่าบัญชีสำหรับการเรียกเก็บเงินส่วนบุคคล ให้เปิดใช้การเรียกเก็บเงินในคอนโซลการเรียกเก็บเงินใน Cloud ของ Google
หมายเหตุ:
- การทำ Lab นี้ให้เสร็จสมบูรณ์จะใช้ทรัพยากร Google Cloud น้อยกว่า $5 USD
- ทำตามขั้นตอนที่ส่วนท้ายของแล็บนี้เพื่อลบทรัพยากรและหลีกเลี่ยงการเรียกเก็บเงินเพิ่มเติม
- ผู้ใช้ใหม่มีสิทธิ์ทดลองใช้ฟรีมูลค่า $300 USD
- ผู้ใช้ใหม่และผู้ใช้ปัจจุบันสามารถเริ่มต้นใช้งาน Cloud SQL ได้โดยใช้อินสแตนซ์ช่วงทดลองใช้ฟรีของ Cloud SQL
เริ่มต้น Cloud Shell
แม้ว่าคุณจะใช้งาน Google Cloud จากระยะไกลจากคอมพิวเตอร์ได้ แต่ใน Codelab นี้คุณจะใช้ Google Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานในระบบคลาวด์
ในคอนโซล Google Cloud ให้คลิกไอคอน Cloud Shell ในแถบเครื่องมือด้านขวาบน

หรือจะกด g แล้ว s ในคอนโซล Google Cloud หรือเปิด 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 get project
หากแสดงผลเป็นสตริงว่าง ให้ตั้งค่าด้วย
gcloud config set project [YOUR-PROJECT-ID]
ตั้งค่าตัวแปรสภาพแวดล้อม PROJECT_ID ดังนี้
PROJECT_ID=$(gcloud config get-value project)
เปิดใช้ API ที่จำเป็นทั้งหมด
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 สำหรับ MySQL
คุณสร้างอินสแตนซ์ Cloud SQL ได้หลายวิธี เช่น ใช้คอนโซล Google Cloud, Terraform หรือ Google Cloud CLI (gcloud) ใน Codelab นี้ คุณจะใช้ gcloud ดูวิธีสร้างอินสแตนซ์ด้วยเครื่องมืออื่นๆ ได้ที่เอกสารประกอบสร้างอินสแตนซ์
คุณเปิดใช้แฟล็ก 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
เชื่อมต่อกับอินสแตนซ์โดยใช้ gcloud sql connect เมื่อได้รับข้อความแจ้ง ให้ป้อนรหัสผ่าน
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
เปิดใช้การผสานรวมแพลตฟอร์ม 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 โดยทำดังนี้
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$SERVICE_ACCOUNT_EMAIL" \
--role="roles/aiplatform.user"
ดูข้อมูลเพิ่มเติมเกี่ยวกับการสร้างและการกำหนดค่าอินสแตนซ์ได้ในเอกสารประกอบของ Cloud SQL ที่นี่
5. เตรียมฐานข้อมูล
สร้างฐานข้อมูลและเปิดใช้การรองรับเวกเตอร์
สร้างฐานข้อมูล
สร้างฐานข้อมูลชื่อ quickstart_db คุณสร้างฐานข้อมูลได้โดยใช้ไคลเอ็นต์ฐานข้อมูล (เช่น mysql), Google Cloud CLI หรือ Cloud SQL Studio ในขั้นตอนนี้ ให้ใช้ gcloud
เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell เพื่อสร้างฐานข้อมูล
gcloud sql databases create quickstart_db --instance=my-cloudsql-instance
6. โหลดข้อมูล
สร้างตารางในฐานข้อมูลและโหลดข้อมูลโดยใช้ไฟล์ชุดข้อมูลร้าน Cymbal ที่สมมติขึ้นซึ่งจัดเก็บไว้ใน Bucket ของ Cloud Storage สาธารณะในรูปแบบ 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 ร่วมกับ 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 ที่เข้ากันได้โดยใช้เครื่องมือนำเข้าในคอนโซล Google Cloud แทน
7. สร้างการฝัง
สร้างการฝังสำหรับคำอธิบายผลิตภัณฑ์โดยใช้โมเดล text-embedding-005 จากแพลตฟอร์มเอเจนต์ Gemini Enterprise และจัดเก็บเป็นข้อมูลเวกเตอร์
หากต้องการจัดเก็บข้อมูลเวกเตอร์ คุณต้องเปิดใช้ฟังก์ชันเวกเตอร์ในอินสแตนซ์ 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 โดยใช้ฟังก์ชันการฝัง คอลัมน์ใหม่นั้นจะเก็บการฝังเวกเตอร์ตามข้อความในคอลัมน์ 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 นาที
ออกจากเซสชัน MySQL
exit
8. เรียกใช้การค้นหาความคล้ายคลึง
เรียกใช้การค้นหาความคล้ายคลึงโดยเปรียบเทียบการฝังเวกเตอร์ที่คำนวณสำหรับคำอธิบายผลิตภัณฑ์กับการฝังสำหรับคำค้นหา
คุณเรียกใช้การค้นหา SQL ได้จากบรรทัดคำสั่งหรือจาก Cloud SQL Studio สตูดิโอ Cloud SQL ช่วยให้คุณแก้ไขและเรียกใช้คำสั่ง SQL ที่ยาวซึ่งมีหลายแถวในเอาต์พุตได้สะดวกยิ่งขึ้น
สร้างผู้ใช้ MySQL สำหรับ Cloud SQL Studio
คุณต้องมีผู้ใช้ฐานข้อมูลใหม่ที่ใช้ Cloud SQL Studio ได้ สร้างผู้ใช้ประเภทในตัว student โดยใช้รหัสผ่านเดียวกับที่คุณใช้สำหรับผู้ใช้ราก
ใน Cloud Shell ให้เรียกใช้คำสั่งต่อไปนี้
gcloud sql users create student --instance=my-cloudsql-instance --password=$CLOUDSQL_PASSWORD --host=%
เริ่ม Cloud SQL Studio
- ในคอนโซล Google Cloud ให้ไปที่อินสแตนซ์ Cloud SQL แล้วคลิก
my-cloudsql-instance

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

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

- คลิกแท็บการค้นหาที่ไม่มีชื่อเพื่อเปิดเครื่องมือแก้ไข SQL

ดำเนินการค้นหา
เรียกใช้การค้นหาเพื่อดึงข้อมูลผลิตภัณฑ์ 5 อันดับแรกที่เกี่ยวข้องกับคำค้นหาของลูกค้ามากที่สุด: "ที่นี่ปลูกต้นไม้ผลชนิดใดได้ดี"
เรียกใช้การค้นหาด้วย cosine_distance สำหรับการค้นหาเวกเตอร์ KNN (แบบตรง)
นี่คือการค้นหาที่คุณเรียกใช้เพื่อเลือก 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 ให้ป้อนการค้นหาแล้วคลิกเรียกใช้ (หรือเรียกใช้การค้นหาในเซสชัน sql):

การค้นหาจะแสดงผลิตภัณฑ์ที่ตรงกันซึ่งจัดเรียงตามระยะทางโคไซน์
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+ | 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
เรียกใช้การค้นหาเดียวกัน แต่ใช้การค้นหา 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;
และนี่คือรายการผลิตภัณฑ์ที่การค้นหาแสดง
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+ | 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 วินาที เราได้รับผลลัพธ์เช่นเดียวกับฟังก์ชัน KNN exact cosine_distance
อ่านเพิ่มเติมเกี่ยวกับฟังก์ชันนี้ได้ในเอกสารประกอบของ Cloud SQL สำหรับ MySQL
9. ปรับปรุงคำตอบของ LLM โดยใช้ข้อมูลที่ดึงมา
ปรับปรุงคำตอบของ Generative AI ให้กับแอปพลิเคชันไคลเอ็นต์โดยส่งผลการค้นหาเป็นบริบทที่อิงตามความเป็นจริงในพรอมต์ไปยังโมเดลภาษาพื้นฐานของแพลตฟอร์ม Agent ของ Gemini Enterprise
ทั้งสองสามารถทำได้โดยดำเนินการดังนี้
- สร้างเพย์โหลด JSON จากผลการค้นหาเวกเตอร์ใน Cloud SQL
- ทดสอบพรอมต์ใน Agent Platform Studio
- เรียกใช้พรอมต์แบบครบวงจรจาก SQL โดยตรงโดยใช้การผสานรวม
google_ml
สร้างเอาต์พุตในรูปแบบ JSON
แก้ไขคําค้นหาเพื่อจัดรูปแบบผลลัพธ์เป็น JSON และแสดงผล 1 แถว
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"}]
เรียกใช้พรอมต์ใน Agent Platform Studio
ระบุ JSON ที่สร้างขึ้นเป็นบริบทในพรอมต์ไปยังโมเดล Generative ใน Agent Platform Studio
- เปิด Agent Platform Studio ในคอนโซล Google Cloud

- ป้อนพรอมต์ต่อไปนี้ใน 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, "produt_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, "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.

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

คำตอบจะมีราคา คำอธิบาย และข้อมูลเสริมที่โมเดลได้รับจากแหล่งข้อมูลภายนอกโดยอิงตามข้อมูลเกี่ยวกับต้นไม้และสถานที่
เรียกใช้พรอมต์ใน SQL
นอกจากนี้ คุณยังใช้การผสานรวม AI ของ Cloud SQL กับแพลตฟอร์ม Agent ของ Gemini Enterprise เพื่อรับคำตอบจากโมเดล Generative ได้โดยตรงภายใน SQL
ก่อนอื่น ให้ลงทะเบียนโมเดล
- ลงทะเบียนโมเดล
gemini-3.5-flashเพื่อสร้างคำตอบ (แทนที่ด้วยรหัสโปรเจ็กต์ของคุณ)
CALL
mysql.ml_create_model_registration(
'gemini-3.5-flash',
'https://aiplatform.googleapis.com/v1/projects/<PROJECT_ID>/locations/global/publishers/google/models/gemini-3.5-flash:generateContent',
'google',
'GENERIC',
NULL,
'auth_type_cloudsql_service_agent_iam',
NULL, NULL, NULL, NULL);
นอกจากนี้ เรายังใช้การผสานรวม AI ของ Cloud SQL กับแพลตฟอร์ม Gemini Enterprise Agent เพื่อรับคำตอบที่คล้ายกันจากโมเดล Generative โดยใช้ 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('gemini-3.5-flash',
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;
และนี่คือเอาต์พุตตัวอย่าง เอาต์พุตของคุณอาจแตกต่างกันไปตามเวอร์ชันของโมเดลและพารามิเตอร์
"Hello there! I'd be happy to help you find the perfect fruit tree for your space. \n\nBased on your area, a wonderful option we currently have in stock is the **Malus Domestica** (the classic Apple Tree)!\n\nHere are the key details:\n\n* **Product Name:** Malus Domestica (Classic Apple Tree)\n* **Price:** $100.00\n\n### Why it's a great choice:\n* **Beautiful Seasonal Foliage:** It features vibrant green leaves during the summer that turn into gorgeous shades of red, orange, and yellow in the autumn. \n* **Shade & Size:** It grows to approximately 30 feet tall, making it a strong, durable tree that offers excellent shade for your yard alongside delicious fresh fruit.\n* **Growing Conditions:** It thrives best in cool, moist climates with well-draining, loamy soil and is ideal for USDA Hardiness Zones 4–8.\n\n### Supplemental Care Tips:\n* **Planting Location:** Choose a spot that gets full sunlight (at least 6 hours a day) to ensure maximum fruit production.\n* **Soil:** Make sure the soil is rich and loamy with good drainage so the roots stay healthy.\n* **Cross-Pollination:** Apple trees often produce a higher yield when planted near another compatible apple tree variety, so if you have extra space, adding a companion tree in the future can boost your harvest!\n\nLet me know if you have any questions about planting or care, or if you'd like help adding this to your cart!"
เอาต์พุตจะอยู่ในรูปแบบมาร์กดาวน์
10. สร้างดัชนีเพื่อนบ้านที่ใกล้ที่สุด
สำหรับชุดข้อมูลขนาดใหญ่ที่มีเวกเตอร์หลายล้านรายการ การค้นหาเวกเตอร์อาจต้องใช้ทรัพยากรการประมวลผลจำนวนมาก สร้างดัชนีในเวกเตอร์ฝังเพื่อปรับปรุงประสิทธิภาพการค้นหา
สร้างดัชนี 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
Lab นี้เป็นส่วนหนึ่งของเส้นทางการเรียนรู้ AI ที่พร้อมใช้งานจริงด้วย Google Cloud
- สำรวจหลักสูตรทั้งหมดเพื่อเชื่อมช่องว่างจากต้นแบบไปสู่การผลิต
- แชร์ความคืบหน้าของคุณด้วยแฮชแท็ก
#ProductionReadyAI
สิ่งที่คุณได้เรียนรู้
- วิธีติดตั้งใช้งานอินสแตนซ์ Cloud SQL สำหรับ MySQL
- วิธีสร้างฐานข้อมูลและเปิดใช้การผสานรวม AI ของ Cloud SQL
- วิธีโหลดข้อมูลลงในฐานข้อมูล
- วิธีใช้ Cloud SQL Studio
- วิธีใช้โมเดลการฝังของ Vertex AI ใน Cloud SQL
- วิธีใช้ Agent Platform Studio
- วิธีเพิ่มคุณค่าให้กับผลลัพธ์โดยใช้โมเดลแพลตฟอร์ม Agent ของ Gemini Enterprise
- วิธีปรับปรุงประสิทธิภาพโดยใช้ดัชนีเวกเตอร์
ลองใช้ Codelab สำหรับ AlloyDB หรือ Codelab สำหรับ Cloud SQL สำหรับ Postgres ที่คล้ายกัน
แบบสำรวจ
เอาต์พุต: