۱. مقدمه
در این codelab، نحوه استفاده از ادغام هوش مصنوعی Cloud SQL برای MySQL برای جستجوی معنایی بااستفاده از جاسازیها و نحوه بهبود عملکرد بااستفاده از نمایه روی دادههای برداری را خواهید آموخت.

پیشنیازها
- درک اولیه از Google Cloud و کنسول Google Cloud
- تجربه پایه با میانای خط فرمان و Cloud Shell
آنچه خواهید آموخت
- نحوه استقرار نمونه Cloud SQL برای MySQL
- نحوه ایجاد کردن پایگاه داده و فعال کردن ادغام Cloud SQL AI
- نحوه بار کردن دادهها در پایگاه داده
- نحوه استفاده از Cloud SQL Studio
- نحوه استفاده از مدل جاسازی Vertex AI در Cloud SQL
- نحوه استفاده از Agent Platform Studio
- نحوه غنیسازی نتیجه بااستفاده از مدل Gemini Enterprise Agent Platform
- نحوه بهبود عملکرد بااستفاده از نمایه برداری
آنچه نیاز خواهید داشت
- حساب Google Cloud و پروژه Google Cloud
- مرورگر وب مانند Chrome
۲. راهاندازی و شرایط لازم
راهاندازی پروژه
- به سیستم کنسول Google Cloud وارد شوید. اگر ازقبل حساب Gmail یا Google Workspace ندارید، باید «حساب Google» ایجاد کنید.
بهجای حساب کاری یا تحصیلی، از حساب شخصی استفاده کنید.
- پروژه جدیدی ایجاد کنید یا از پروژه موجودی دوباره استفاده کنید. برای ایجاد پروژه جدید در کنسول Google Cloud، در نوارابزار روی انتخاب پروژه کلیک کنید.

در پنجره «انتخاب پروژه»، دکمه «پروژه جدید» را فشار دهید تا چارگوش گفتگویی برای پروژه جدید باز شود.

در کادر گفتگو، نام پروژه را وارد کنید و مکان را انتخاب کنید.

- نام پروژه نام نمایشی برای شرکتکنندگان این پروژه است. نام پروژه توسط Google APIs استفاده نمیشود و میتوان آن را در هرزمانی تغییر داد.
- شناسه پروژه در همه پروژههای Google Cloud یکتا است و تغییرناپذیر است (پساز تنظیم شدن نمیتوان آن را تغییر داد). کنسول Google Cloud بهطور خودکار شناسه یکتایی تولید میکند، اما میتوانید آن را سفارشیسازی کنید. اگر شناسه تولیدشده را نمیپسندید، میتوانید شناسه تصادفی دیگری تولید کنید یا شناسه خودتان را ارائه دهید تا دردسترس بودن آن بررسی شود. در اکثر codelabها، به شناسه پروژهتان ارجاع میدهید که معمولاً با جایبان
مشخص میشود. - برای اطلاع شما، مقدار سومی هم وجود دارد، شماره پروژه، که برخیاز میاناهای برنامهسازی کاربردی از آن استفاده میکنند. درباره هر سه این مقادیر در سند ایجاد و مدیریت پروژهها بیشتر بدانید.
فعال کردن صورتحساب
برای فعال کردن صورتحساب، دو گزینه دارید. میتوانید از حساب صورتحساب شخصیتان استفاده کنید یا با مراحل زیر اعتبار پسخرید کنید.
پسخرید کردن اعتبارهای Google Cloud (اختیاری)
برای اجرای این کارگاه، به حساب صورتحساب با اعتبار نیاز دارید. برای شروع، از اعتبار ارائهشده توسط سازماندهندگان کارگاه یا اعتبار ارائهشده در برنمای بالای این codelab استفاده کنید. اگر ازقبل به حساب صورتحساب متصل شدهاید، میتوانید این مرحله را رد کنید.
راهاندازی حساب صورتحساب شخصی
اگر صورتحساب را بااستفاده از اعتبارهای Google Cloud راهاندازی کردهاید، میتوانید از این مرحله رد شوید.
برای راهاندازی حساب صورتحساب شخصی، صورتحساب را در کنسول صورتحساب Google Cloud فعال کنید.
نکتهها:
- تکمیل این آزمایشی کمتر از ۵ دلار امریکا در منابع Google Cloud هزینه دارد.
- برای حذف منابع و جلوگیری از کسر هزینههای بیشتر، مراحل انتهای این آزمایشگاه را دنبال کنید.
- کاربران جدید واجدشرایط دوره آزمایشی رایگان ۳۰۰ دلاری هستند.
- کاربران جدید و فعلی میتوانند بااستفاده از نمونه دوره آزمایشی رایگان Cloud SQL، کار با Cloud SQL را شروع کنند
راهاندازی Cloud Shell
درحالیکه میتوانید Google Cloud را از راه دور از رایانهتان اجرا کنید، در این codelab از Google Cloud Shell استفاده میکنید که محیط خط فرمانی است که در فضای ابری اجرا میشود.
در کنسول Google Cloud، روی نماد Cloud Shell در نوارابزار بالا سمت چپ کلیک کنید:

یا در کنسول Google Cloud، کلید g و سپس s را فشار دهید، یا Cloud Shell را باز کنید.
تأمین و اتصال به محیط فقط چند لحظه طول میکشد. وقتی تمام شد، باید پایانه متصلشده را ببینید:

این ماشین مجازی با همه ابزارهای توسعهای که نیاز دارید بار شده است. این پوسته یک دایرکتوری خانگی دائمی ۵ گیگابایتی ارائه میدهد و روی Google Cloud اجرا میشود، که عملکرد شبکه و اصالتسنجی را بهبود میبخشد. همه کارهای شما در این codelab میتواند در مرورگر انجام شود.
۳. قبلاز شروع
فعال کردن میانای برنامهسازی کاربردی
برای استفاده از Cloud SQL، Compute Engine، Service Networking، و Gemini Enterprise Agent Platform، میاناهای برنامهسازی کاربردی مربوطه را در پروژه Google Cloud خود فعال کنید.
در پایانه Cloud Shell، مطمئن شوید که شناسه پروژه شما تنظیم شده است:
gcloud config get project
اگر رشته خالی برگرداند، آن را با این مورد تنظیم کنید:
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
یک نمونه Cloud SQL با یکپارچهسازی پایگاه داده پلاتفرم Gemini Enterprise Agent ایجاد کنید.
ایجاد گذرواژه پایگاه داده
گذرواژهای برای کاربر پایگاه داده پیشفرض تعریف کنید. میتوانید گذرواژه خودتان را تعریف کنید یا از تابع تصادفی برای تولید گذرواژه استفاده کنید:
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>
با فشار دادن Ctrl+D یا وارد کردن exit، از جلسه mysql خارج شوید:
exit
فعال کردن ادغام پلاتفرم Gemini Enterprise Agent
نقش IAM لازم را به حساب خدمات Cloud SQL اعطا کنید تا ادغام پلاتفرم Gemini Enterprise Agent فعال شود.
ایمیل حساب سرویس 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 اینجا درباره ایجاد و پیکربندی نمونه بیشتر بخوانید.
۵. آمادهسازی پایگاه داده
پایگاه دادهای ایجاد کنید و پشتیبانی برداری را فعال کنید.
ایجاد پایگاه داده
پایگاه دادهای بهنام quickstart_db بسازید. میتوانید بااستفاده از کارخواههای پایگاه داده (مثل mysql)، Google Cloud CLI، یا Cloud SQL Studio پایگاه داده ایجاد کنید. در این مرحله، از gcloud استفاده کنید.
در Cloud Shell، فرمان زیر را برای ایجاد پایگاه داده اجرا کنید:
gcloud sql databases create quickstart_db --instance=my-cloudsql-instance
۶. بار کردن دادهها
جدولهایی در پایگاه داده ایجاد کنید و دادهها را بااستفاده از فایلهای مجموعه داده Cymbal Store ساختگی ذخیرهشده در یک سطل «فضای ذخیرهسازی ابری» عمومی در قالب CSV بار کنید.
Cloud Shell محیط اصلی شما برای اتصال به پایگاه داده، ایجاد همه اشیاء، و بار کردن دادهها خواهد بود.
IP عمومی Cloud Shell خود را به فهرست شبکههای مجاز برای نمونه Cloud SQL ما اضافه کنید.
در پوسته ابری، این دستور را اجرا کنید:
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 برای بارگیری و اعمال طرحواره از منبع عمومی استفاده کنید.
در پوسته ابری، این دستور را اجرا کنید:
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 را برای ایجاد جدولها، نمایهها، و توالیها اجرا کردید.
سپس، با اجرای curl و mysql، پایگاه داده را با دادههای cymbal_products پر کنید:
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 وارد کنید.
۷. ایجاد جاسازیها
بااستفاده از مدل text-embedding-005 از Gemini Enterprise Agent Platform، جاسازیهایی برای شرح محصولات بسازید و آنها را بهعنوان دادههای برداری ذخیره کنید.
برای ذخیره کردن دادههای برداری، باید عملکرد برداری را در نمونه 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);
توجه: تولید جاسازی برای ۲۰۰۰ ردیف معمولاً در کمتر از ۵ دقیقه تمام میشود.
از جلسه mysql خارج شوید:
exit
۸. اجرای جستجوی شباهت
با مقایسه کردن جاسازیهای برداری محاسبهشده برای شرح محصولات با جاسازی مربوط به پُرسمان جستجو، جستجوی شباهت اجرا کنید.
میتوانید پُرسمانهای SQL را از خط فرمان یا از Cloud SQL Studio اجرا کنید. Cloud SQL studio روش راحتتری برای ویرایش و اجرای عبارتهای طولانی 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» باز شود.

اجرای پُرسمان
پُرسمانی را برای بازیابی ۵ محصول برتر که بیشترین ارتباط را با پُرسمان مشتری دارند اجرا کنید: «چه نوع درختان میوهای در اینجا خوب رشد میکنند؟»
اجرای پُرسمان با cosine_distance برای جستجوی برداری KNN (دقیق)
در اینجا پُرسمانی را میبینید که میتوانید برای انتخاب ۵ مورد اول که بااستفاده از تابع 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)
زمان اجرای پُرسمان با تابع 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)
اجرای پُرسمان فقط ۰٫۱۲ ثانیه طول کشید. همان نتایج تابع cosine_distance دقیق KNN را دریافت کردیم.
درباره این تابع در اسناد Cloud SQL برای MySQL بیشتر بخوانید
۹. بهبود پاسخ مدل زبانی بزرگ بااستفاده از دادههای بازیابیشده
با ارسال نتایج پُرسمان بهعنوان بافت پایهمند در پیامواره به مدل زبانی پایه پلاتفرم Gemini Enterprise Agent، پاسخ هوش مصنوعی زایا به برنامه کارخواه را بهبود دهید.
برای انجام این کار:
- تولید پایهبار JSON از نتیجه جستجوی برداری در Cloud SQL.
- پیامواره را در Agent Platform Studio آزمایش کنید.
- بااستفاده از ادغام
google_ml، پیامواره سرتاسر را مستقیماً از SQL اجرا کنید.
تولید خروجی در قالب JSON
پُرسمان را اصلاح کنید تا نتیجه را بهصورت JSON قالببندی کند و یک ردیف برگرداند:
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 تولیدشده را بهعنوان بافت در پیاموارهای به مدل زایا در Agent Platform Studio ارائه دهید.
- در کنسول Google Cloud، 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, "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
همچنین میتوانید از ادغام Cloud SQL AI با Gemini Enterprise Agent Platform برای دریافت پاسخ از مدل زایا مستقیماً در 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);
همچنین میتوانیم از ادغام Cloud SQL AI با Gemini Enterprise Agent Platform استفاده کنیم تا پاسخ مشابهی را از مدل زایا بااستفاده از SQL مستقیماً در پایگاه داده دریافت کنیم.
اکنون میتوانیم از نتایج تولیدشده در یک زیرپُرسمان با نتایج JSON استفاده کنیم تا آن را بهعنوان بخشی از پیامواره به مدل نوشتاری هوش مصنوعی زایا بااستفاده از 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!"
برونداد در قالب Markdown ارائه میشود.
۱۰. ایجاد نمایه نزدیکترین همسایه
برای مجموعههای داده بزرگ با میلیونها بردار، جستجوی برداری ممکن است به منابع محاسباتی قابلتوجهی نیاز داشته باشد. برای بهبود عملکرد پُرسمان، نمایهای در جاسازیهای برداری ایجاد کنید.
ایجاد نمایه 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 کار میکند.
۱۱. پاکسازی محیط
حذف نمونه 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].
۱۲. تبریک میگوییم
بابت تکمیل codelab به شما تبریک میگوییم.
مسیر یادگیری Google Cloud
این آزمایشگاه بخشی از «مسیر یادگیری هوش مصنوعی آماده تولید با Google Cloud» است.
- برنامه درسی کامل را کاوش کنید تا فاصله بین نمونه اولیه و تولید را پر کنید.
- پیشرفتتان را با هشتگ
#ProductionReadyAIهمرسانی کنید.
آنچه پوشش دادهاید
- نحوه استقرار نمونه Cloud SQL برای MySQL
- نحوه ایجاد کردن پایگاه داده و فعال کردن ادغام Cloud SQL AI
- نحوه بار کردن دادهها در پایگاه داده
- نحوه استفاده از Cloud SQL Studio
- نحوه استفاده از مدل جاسازی Vertex AI در Cloud SQL
- نحوه استفاده از Agent Platform Studio
- نحوه غنیسازی نتیجه بااستفاده از مدل Gemini Enterprise Agent Platform
- نحوه بهبود عملکرد بااستفاده از نمایه برداری
codelab مشابه برای AlloyDB یا codelab برای Cloud SQL برای Postgres را امتحان کنید
نظرسنجی
خروجی: