เกี่ยวกับ Codelab นี้
1 บทนำ
ในโค้ดแล็บนี้ คุณจะได้เรียนรู้วิธีใช้ Cloud SQL สําหรับการผสานรวม Vertex AI ของ MySQL ด้วยการรวมการค้นหาแบบเวกเตอร์เข้ากับการฝัง Vertex AI
ข้อกำหนดเบื้องต้น
- ความเข้าใจพื้นฐานเกี่ยวกับคอนโซล Google Cloud
- ทักษะพื้นฐานในอินเทอร์เฟซบรรทัดคำสั่งและ Cloud Shell
สิ่งที่จะได้เรียนรู้
- วิธีทำให้อินสแตนซ์ Cloud SQL สำหรับ MySQL ใช้งานได้
- วิธีสร้างฐานข้อมูลและเปิดใช้การผสานรวม AI ของ Cloud SQL
- วิธีโหลดข้อมูลไปยังฐานข้อมูล
- วิธีใช้โมเดลการฝังของ Vertex AI ใน Cloud SQL
- วิธีเพิ่มประสิทธิภาพผลลัพธ์โดยใช้โมเดล Generative ของ Vertex AI
- วิธีปรับปรุงประสิทธิภาพโดยใช้ดัชนีเวกเตอร์
สิ่งที่ต้องมี
- บัญชี Google Cloud และโปรเจ็กต์ Google Cloud
- เว็บเบราว์เซอร์ เช่น Chrome ที่รองรับ Google Cloud Console และ Cloud Shell
2 การตั้งค่าและข้อกําหนด
การตั้งค่าสภาพแวดล้อมด้วยตนเอง
- ลงชื่อเข้าใช้ Google Cloud Console และสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี
- ชื่อโปรเจ็กต์คือชื่อที่แสดงสำหรับผู้เข้าร่วมโปรเจ็กต์นี้ ซึ่งเป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้ คุณจะอัปเดตได้ทุกเมื่อ
- รหัสโปรเจ็กต์จะซ้ำกันไม่ได้ในโปรเจ็กต์ Google Cloud ทั้งหมดและจะเปลี่ยนแปลงไม่ได้ (เปลี่ยนแปลงไม่ได้หลังจากตั้งค่าแล้ว) คอนโซล Cloud จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ซึ่งปกติแล้วคุณไม่จำเป็นต้องสนใจว่าสตริงนั้นจะเป็นอะไร ในโค้ดแล็บส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (ปกติจะระบุเป็น
PROJECT_ID
) หากไม่ชอบรหัสที่สร้างขึ้น คุณอาจสร้างรหัสอื่นแบบสุ่มได้ หรือจะลองใช้อุปกรณ์ของคุณเองเพื่อดูว่าอุปกรณ์พร้อมใช้งานหรือไม่ก็ได้ คุณจะเปลี่ยนแปลงชื่อหลังจากขั้นตอนนี้ไม่ได้ และชื่อดังกล่าวจะคงอยู่ตลอดระยะเวลาของโปรเจ็กต์ - โปรดทราบว่ามีค่าที่ 3 ซึ่งเป็นหมายเลขโปรเจ็กต์ที่ API บางรายการใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 รายการนี้ได้ในเอกสารประกอบ
- ถัดไป คุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของ Cloud การทำตามโค้ดแล็บนี้จะไม่เสียค่าใช้จ่ายมากนัก หรืออาจไม่เสียค่าใช้จ่ายเลย หากต้องการปิดทรัพยากรเพื่อหลีกเลี่ยงการเรียกเก็บเงินหลังจากบทแนะนำนี้ คุณลบทรัพยากรที่สร้างไว้หรือลบโปรเจ็กต์ได้ ผู้ใช้ Google Cloud รายใหม่มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300 USD
เริ่ม Cloud Shell
แม้ว่า Google Cloud จะทำงานจากระยะไกลจากแล็ปท็อปได้ แต่ในโค้ดแล็บนี้ คุณจะใช้ Google Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานในระบบคลาวด์
จาก Google Cloud Console ให้คลิกไอคอน Cloud Shell ในแถบเครื่องมือด้านขวาบน
การจัดสรรและเชื่อมต่อกับสภาพแวดล้อมจะใช้เวลาเพียงไม่กี่นาที เมื่อดำเนินการเสร็จแล้ว คุณควรเห็นข้อมูลดังต่อไปนี้
เครื่องเสมือนนี้โหลดเครื่องมือการพัฒนาทั้งหมดที่คุณต้องการ ซึ่งจะมีไดเรกทอรีหลักขนาด 5 GB ถาวรและทำงานบน Google Cloud ซึ่งจะช่วยเพิ่มประสิทธิภาพเครือข่ายและการรับรองได้อย่างมีประสิทธิภาพ คุณทํางานทั้งหมดในโค้ดแล็บนี้ได้ภายในเบราว์เซอร์ คุณไม่จำเป็นต้องติดตั้งอะไร
3 ก่อนเริ่มต้น
เปิดใช้ API
ใน 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.
4 สร้างอินสแตนซ์ Cloud SQL
สร้างอินสแตนซ์ Cloud SQL ด้วยการผสานรวมฐานข้อมูลกับ Vertex AI
สร้างรหัสผ่านฐานข้อมูล
กําหนดรหัสผ่านสําหรับผู้ใช้ฐานข้อมูลเริ่มต้น คุณกำหนดรหัสผ่านของคุณเองหรือใช้ฟังก์ชันสุ่มเพื่อสร้างรหัสผ่านก็ได้
export CLOUDSQL_PASSWORD=`openssl rand -hex 12`
จดค่าที่สร้างขึ้นสำหรับรหัสผ่าน
echo $CLOUDSQL_PASSWORD
สร้างอินสแตนซ์ Cloud SQL สำหรับ MySQL
คุณเปิดใช้ Flag 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>
เปิดใช้การผสานรวม 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
และสร้างคอลัมน์เสมือนที่ฝังในตาราง cymbal_products โดยใช้ฟังก์ชันการฝัง
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 ที่เราสร้างไว้ก่อนหน้านี้
เมื่อเปิดในแผงด้านขวา เราจะเห็น Cloud SQL Studio คลิกที่ไอคอน
ซึ่งจะเปิดกล่องโต้ตอบที่ให้คุณระบุชื่อฐานข้อมูลและข้อมูลเข้าสู่ระบบ
- ฐานข้อมูล: quickstart_db
- ผู้ใช้: นักเรียน
- รหัสผ่าน: รหัสผ่านที่คุณจดไว้ให้ผู้ใช้
แล้วคลิกปุ่ม "ตรวจสอบสิทธิ์"
ซึ่งจะเปิดหน้าต่างถัดไปที่คุณคลิกแท็บ "เครื่องมือแก้ไข" ทางด้านขวาเพื่อเปิดเครื่องมือแก้ไข SQL
ตอนนี้เราพร้อมที่จะเรียกใช้การค้นหาแล้ว
ดำเนินการค้นหา
เรียกใช้การค้นหาเพื่อดูรายการผลิตภัณฑ์ที่มีจำหน่ายซึ่งเกี่ยวข้องกับคำขอของลูกค้ามากที่สุด คําขอที่เราส่งไปยัง Vertex AI เพื่อรับค่าเวกเตอร์จะมีลักษณะดังนี้ "ต้นไม้ผลชนิดใดที่ปลูกได้ดีที่นี่"
เรียกใช้การค้นหาด้วย 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 แล้วกดปุ่ม "เรียกใช้" หรือวางในเซสชันบรรทัดคำสั่งที่เชื่อมต่อกับฐานข้อมูล quickstart_db
และนี่คือรายการผลิตภัณฑ์ที่เลือกซึ่งตรงกับคำค้นหา
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| 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
เรียกใช้การค้นหาด้วย approx_distance สําหรับการค้นหาเวกเตอร์ KNN (แบบตรงทั้งหมด)
ตอนนี้เราจะเรียกใช้การค้นหาเดียวกันนี้ แต่ใช้การค้นหา 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 วินาที เราได้ผลลัพธ์เดียวกันกับฟังก์ชัน cosine_distance
9 ปรับปรุงการตอบกลับ LLM โดยใช้ข้อมูลที่ดึงมา
เราปรับปรุงคำตอบ LLM ของ Gen AI ในแอปพลิเคชันไคลเอ็นต์ได้โดยใช้ผลลัพธ์ของการค้นหาที่ดำเนินการ และเตรียมเอาต์พุตที่สื่อความหมายโดยใช้ผลลัพธ์การค้นหาที่ระบุเป็นส่วนหนึ่งของพรอมต์สำหรับโมเดลภาษาพื้นฐานแบบ Generative ของ Vertex AI
ในการทำเช่นนั้น เราจำเป็นต้องสร้าง JSON ที่มีผลลัพธ์จากการค้นหาเวกเตอร์ จากนั้นใช้ JSON ที่สร้างขึ้นนั้นเพิ่มเติมจากพรอมต์สำหรับโมเดล LLM ใน Vertex AI เพื่อสร้างเอาต์พุตที่มีความหมาย ในขั้นตอนแรก เราจะสร้าง JSON จากนั้นทดสอบใน Vertex AI Studio และขั้นตอนสุดท้ายเราจะรวม JSON ไว้ในคำสั่ง SQL ซึ่งสามารถใช้ในแอปพลิเคชันได้
สร้างเอาต์พุตในรูปแบบ JSON
แก้ไขการค้นหาเพื่อสร้างเอาต์พุตในรูปแบบ JSON และแสดงผลเพียง 1 แถวเพื่อส่งไปยัง 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
ระบบอาจขอให้คุณเปิดใช้ API เพิ่มเติม แต่คุณเพิกเฉยต่อคำขอนี้ได้ เราไม่จำเป็นต้องใช้ API เพิ่มเติมเพื่อทําให้ห้องทดลองเสร็จสมบูรณ์
พรอมต์ที่เราจะใช้มีดังนี้
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.0-flash มีดังนี้
คำตอบที่เราได้รับจากโมเดลในตัวอย่างนี้เป็นไปตามการใช้ผลการค้นหาเชิงความหมายและผลิตภัณฑ์ที่ตรงกันที่สุดซึ่งมีให้บริการในรหัสไปรษณีย์ที่กล่าวถึง
เรียกใช้พรอมต์ใน PSQL
นอกจากนี้ เรายังใช้การผสานรวม AI ของ Cloud SQL กับ Vertex AI เพื่อรับคำตอบที่คล้ายกันจากโมเดล 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('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 เมื่อคุณใช้งานห้องทดลองเสร็จแล้ว
ในเชลล์ระบบคลาวด์ ให้กําหนดตัวแปรโปรเจ็กต์และสภาพแวดล้อมหากคุณถูกตัดการเชื่อมต่อและการตั้งค่าก่อนหน้านี้ทั้งหมดหายไป
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 จนเสร็จสมบูรณ์
สิ่งที่เราได้พูดถึง
- วิธีทำให้อินสแตนซ์ Cloud SQL สำหรับ MySQL พร้อมใช้งาน
- วิธีสร้างฐานข้อมูลและเปิดใช้การผสานรวม AI ของ Cloud SQL
- วิธีโหลดข้อมูลไปยังฐานข้อมูล
- วิธีใช้โมเดลการฝังของ Vertex AI ใน Cloud SQL
- วิธีเพิ่มประสิทธิภาพผลลัพธ์โดยใช้โมเดล Generative ของ Vertex AI
- วิธีปรับปรุงประสิทธิภาพโดยใช้ดัชนีเวกเตอร์
ลองใช้ Codelab สำหรับ AlloyDB หรือ Codelab สำหรับ Cloud SQL สำหรับ Postgres ที่คล้ายกัน