شروع کار با Vector Embeddings در Cloud SQL برای MySQL

1. مقدمه

در این کد لبه، نحوه استفاده از Cloud SQL را برای ادغام MySQL Vertex AI با ترکیب جستجوی برداری با جاسازی‌های Vertex AI خواهید آموخت.

30b7c4dcdd8bb68f.png

پیش نیازها

  • درک اولیه از Google Cloud، کنسول
  • مهارت های اولیه در رابط خط فرمان و Cloud Shell

چیزی که یاد خواهید گرفت

  • نحوه استقرار یک Cloud SQL برای نمونه MySQL
  • نحوه ایجاد پایگاه داده و فعال کردن Cloud SQL AI
  • نحوه بارگذاری اطلاعات در پایگاه داده
  • نحوه استفاده از مدل جاسازی هوش مصنوعی Vertex در Cloud SQL
  • نحوه غنی سازی نتیجه با استفاده از مدل مولد Vertex AI
  • نحوه بهبود عملکرد با استفاده از شاخص برداری

آنچه شما نیاز دارید

  • یک حساب Google Cloud و پروژه Google Cloud
  • یک مرورگر وب مانند کروم که از کنسول Google Cloud و Cloud Shell پشتیبانی می کند

2. راه اندازی و الزامات

تنظیم محیط خود به خود

  1. به Google Cloud Console وارد شوید و یک پروژه جدید ایجاد کنید یا از یک موجود استفاده مجدد کنید. اگر قبلاً یک حساب Gmail یا Google Workspace ندارید، باید یک حساب ایجاد کنید .

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • نام پروژه نام نمایشی برای شرکت کنندگان این پروژه است. این یک رشته کاراکتری است که توسط API های Google استفاده نمی شود. همیشه می توانید آن را به روز کنید.
  • شناسه پروژه در تمام پروژه‌های Google Cloud منحصربه‌فرد است و تغییرناپذیر است (پس از تنظیم نمی‌توان آن را تغییر داد). Cloud Console به طور خودکار یک رشته منحصر به فرد تولید می کند. معمولاً برای شما مهم نیست که چیست. در اکثر کدها، باید شناسه پروژه خود را ارجاع دهید (معمولاً با نام PROJECT_ID شناخته می شود). اگر شناسه تولید شده را دوست ندارید، ممکن است یک شناسه تصادفی دیگر ایجاد کنید. از طرف دیگر، می‌توانید خودتان را امتحان کنید، و ببینید آیا در دسترس است یا خیر. پس از این مرحله نمی توان آن را تغییر داد و در طول مدت پروژه باقی می ماند.
  • برای اطلاع شما، یک مقدار سوم وجود دارد، یک شماره پروژه ، که برخی از API ها از آن استفاده می کنند. در مورد هر سه این مقادیر در مستندات بیشتر بیاموزید.
  1. در مرحله بعد، برای استفاده از منابع Cloud/APIها باید صورتحساب را در کنسول Cloud فعال کنید . اجرا کردن از طریق این کد لبه هزینه زیادی نخواهد داشت. برای خاموش کردن منابع برای جلوگیری از تحمیل صورت‌حساب فراتر از این آموزش، می‌توانید منابعی را که ایجاد کرده‌اید حذف کنید یا پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان 300 دلاری هستند.

Cloud Shell را راه اندازی کنید

در حالی که Google Cloud را می توان از راه دور از لپ تاپ شما کار کرد، در این کد لبه از Google Cloud Shell استفاده خواهید کرد، یک محیط خط فرمان که در Cloud اجرا می شود.

از Google Cloud Console ، روی نماد Cloud Shell در نوار ابزار بالا سمت راست کلیک کنید:

55efc1aaa7a4d3ad.png

تهیه و اتصال به محیط فقط چند لحظه طول می کشد. وقتی تمام شد، باید چیزی شبیه به این را ببینید:

7ffe5cbb04455448.png

این ماشین مجازی با تمام ابزارهای توسعه که شما نیاز دارید بارگذاری شده است. این یک فهرست اصلی 5 گیگابایتی دائمی را ارائه می دهد و در Google Cloud اجرا می شود و عملکرد و احراز هویت شبکه را تا حد زیادی افزایش می دهد. تمام کارهای شما در این کد لبه را می توان در یک مرورگر انجام داد. شما نیازی به نصب چیزی ندارید.

3. قبل از شروع

فعال کردن API

در داخل Cloud Shell، مطمئن شوید که ID پروژه شما تنظیم شده است:

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

هنگام ایجاد یک نمونه، پرچم cloudsql_vector را می توان فعال کرد. پشتیبانی 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 Integration را فعال کنید

امتیازات لازم را به حساب سرویس داخلی ابری 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. پایگاه داده را آماده کنید

اکنون باید یک پایگاه داده ایجاد کنیم و پشتیبانی از vectors را فعال کنیم.

ایجاد پایگاه داده

یک پایگاه داده با نام quickstart_db ایجاد کنید. برای این کار ما گزینه های مختلفی مانند سرویس گیرندگان پایگاه داده خط فرمان مانند mysql برای mySQL، SDK یا Cloud SQL Studio داریم. ما از SDK (gcloud) برای ایجاد پایگاه داده استفاده خواهیم کرد.

در Cloud Shell دستور را برای ایجاد پایگاه داده اجرا کنید

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

6. بارگذاری داده ها

حالا باید آبجکت هایی را در پایگاه داده ایجاد کنیم و داده ها را بارگذاری کنیم. ما می خواهیم از داده های خیالی فروشگاه Cymbal استفاده کنیم. داده ها در SQL (برای طرحواره) و فرمت 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 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 دانلود شده را اجرا کردیم که جداول، فهرست ها و دنباله ها را ایجاد می کرد.

مرحله بعدی بارگذاری داده های 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 سازگار است، می‌توانید به جای رویکرد ارائه‌شده از آن استفاده کنید.

7. Embeddings ایجاد کنید

گام بعدی این است که با استفاده از مدل textembedding-005 از Google Vertex AI، جاسازی‌هایی را برای توضیحات محصول خود بسازیم و آنها را در ستون جدید جدول cymbal_products ذخیره کنیم.

برای ذخیره داده های برداری، باید عملکرد برداری را در نمونه Cloud SQL خود فعال کنیم. اجرا در پوسته ابری:

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 خود ایجاد کنید.

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

ایجاد جاسازی های برداری برای 2000 ردیف معمولاً کمتر از 5 دقیقه طول می کشد، اما گاهی اوقات ممکن است کمی بیشتر طول بکشد و اغلب بسیار سریعتر به پایان می رسد.

8. Similarity Search را اجرا کنید

اکنون می‌توانیم جستجوی خود را با استفاده از جستجوی شباهت بر اساس مقادیر برداری محاسبه‌شده برای توصیف‌ها و مقدار برداری که برای درخواست خود با استفاده از همان مدل جاسازی ایجاد می‌کنیم، اجرا کنیم.

کوئری SQL را می توان از همان رابط خط فرمان یا به عنوان جایگزین، از Cloud SQL Studio اجرا کرد. هر کوئری چند ردیفه و پیچیده بهتر است در Cloud SQL Studio مدیریت شود.

یک کاربر ایجاد کنید

ما به یک کاربر جدید نیاز داریم که بتواند از Cloud SQL Studio استفاده کند. ما قصد داریم یک user student نوع داخلی با همان رمز عبوری که برای کاربر root استفاده کرده ایم ایجاد کنیم.

در Cloud Shell اجرا کنید:

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

Cloud SQL Studio را راه اندازی کنید

در کنسول روی نمونه Cloud SQL که قبلا ایجاد کرده بودیم کلیک کنید.

667b658dbf98eb0b.png

وقتی در پنل سمت راست باز است، می‌توانیم Cloud SQL Studio را ببینیم. روی آن کلیک کنید.

a879e8ac914a8ce9.png

یک گفتگو باز می شود که در آن نام پایگاه داده و اعتبار خود را ارائه می دهید:

  • پایگاه داده: quickstart_db
  • کاربر: دانشجو
  • رمز عبور: رمز عبور یادداشت شده شما برای کاربر

و بر روی دکمه "Authenticate" کلیک کنید.

36e6036847333d18.png

پنجره بعدی باز می شود که روی تب "Editor" در سمت راست کلیک می کنید تا ویرایشگر SQL باز شود.

d803b7b6a798094f.png

اکنون ما آماده ایم تا درخواست های خود را اجرا کنیم.

Query را اجرا کنید

برای دریافت لیستی از محصولات موجود که بیشترین ارتباط را با درخواست مشتری دارد، یک پرس و جو انجام دهید. درخواستی که می‌خواهیم به 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 متصل می شود، قرار دهید.

dffc70835901cf03.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)

اجرای پرس و جو با تابع cosine_distance 0.13 ثانیه طول کشید.

اکنون همان پرس و جو را اجرا می کنیم اما با استفاده از جستجوی 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 ثانیه طول کشید. ما همان نتایج را برای تابع کسینوس_فاصله گرفتیم.

9. بهبود پاسخ LLM با استفاده از داده های بازیابی شده

ما می‌توانیم پاسخ Gen AI LLM به یک برنامه مشتری را با استفاده از نتیجه کوئری اجرا شده بهبود بخشیم و خروجی معنی‌داری را با استفاده از نتایج جستجوی ارائه شده به عنوان بخشی از درخواست مدل زبان پایه مولد Vertex AI آماده کنیم.

برای رسیدن به این هدف، باید یک JSON با نتایج خود از جستجوی برداری تولید کنیم، سپس از JSON تولید شده به عنوان یک درخواست برای مدل LLM در Vertex AI برای ایجاد یک خروجی معنادار استفاده کنیم. در مرحله اول ما JSON را تولید می کنیم، سپس آن را در استودیو Vertex AI تست می کنیم و در مرحله آخر آن را در یک دستور 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 تولید شده برای ارائه آن به عنوان بخشی از مدل متنی AI مولد در Vertex AI Studio استفاده کنیم.

درخواست Vertex AI Studio را در کنسول ابری باز کنید.

411ffb9d164ac140.png

ممکن است از شما بخواهد 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 اجرا می کنیم، نتیجه این است:

9839af512686130d.png

پاسخی که از مدل در این مثال گرفتیم با استفاده از نتایج جستجوی معنایی و بهترین محصول مطابق موجود در کد پستی ذکر شده به شرح زیر است.

دستور را در PSQL اجرا کنید

همچنین می‌توانیم از ادغام Cloud SQL AI با Vertex AI برای دریافت پاسخ مشابه از یک مدل تولیدی با استفاده از SQL به طور مستقیم در پایگاه داده استفاده کنیم.

اکنون می‌توانیم از داده‌های تولید شده در یک پرسش فرعی با نتایج JSON برای ارائه آن به عنوان بخشی از مدل متنی 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. یک نمایه نزدیکترین همسایه ایجاد کنید

مجموعه داده ما نسبتاً کوچک است و زمان پاسخ در درجه اول به تعامل با مدل‌های هوش مصنوعی بستگی دارد. اما وقتی میلیون‌ها بردار دارید، جستجوی برداری می‌تواند بخش قابل‌توجهی از زمان پاسخ ما را بگیرد و بار زیادی را روی سیستم وارد کند. برای بهبود آن می توانیم یک شاخص در بالای بردارهای خود بسازیم.

ایجاد نمایه 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. تبریک می گویم

برای تکمیل کد لبه تبریک می گویم.

آنچه را پوشش داده ایم

  • نحوه استقرار یک Cloud SQL برای نمونه MySQL
  • نحوه ایجاد پایگاه داده و فعال کردن Cloud SQL AI
  • نحوه بارگذاری اطلاعات در پایگاه داده
  • نحوه استفاده از مدل جاسازی هوش مصنوعی Vertex در Cloud SQL
  • نحوه غنی سازی نتیجه با استفاده از مدل مولد Vertex AI
  • نحوه بهبود عملکرد با استفاده از شاخص برداری

Codelab مشابه را برای AlloyDB یا یک Codelab برای Cloud SQL برای Postgres امتحان کنید

13. نظرسنجی

خروجی:

چگونه از این آموزش استفاده خواهید کرد؟

فقط آن را بخوانید آن را بخوانید و تمرینات را کامل کنید