1- مقدمة
في هذا الدرس التطبيقي حول الترميز، ستتعرّف على كيفية استخدام عملية دمج Cloud SQL for MySQL مع Vertex AI من خلال الجمع بين البحث عن المتّجهات وعمليات التضمين في Vertex AI.

المتطلبات الأساسية
- فهم أساسي لـ Google Cloud وGoogle Cloud Console
- مهارات أساسية في واجهة سطر الأوامر وCloud Shell
ما ستتعلمه
- كيفية نشر مثيل Cloud SQL لـ PostgreSQL
- كيفية إنشاء قاعدة بيانات وتفعيل عمليات الدمج مع الذكاء الاصطناعي في Cloud SQL
- كيفية تحميل البيانات إلى قاعدة البيانات
- كيفية استخدام Cloud SQL Studio
- كيفية استخدام نموذج التضمين في Vertex AI في Cloud SQL
- كيفية استخدام Vertex AI Studio
- كيفية تحسين النتيجة باستخدام نموذج الذكاء الاصطناعي التوليدي من Vertex AI
- كيفية تحسين الأداء باستخدام فهرس المتجهات
المتطلبات
- حساب Google Cloud ومشروع Google Cloud
- متصفّح ويب، مثل Chrome، متوافق مع "وحدة تحكّم Google Cloud" وCloud Shell
2. الإعداد والمتطلبات
إعداد المشروع
- سجِّل الدخول إلى Google Cloud Console. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.
استخدام حساب شخصي بدلاً من حساب عمل أو حساب تديره مؤسسة تعليمية
- أنشئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. لإنشاء مشروع جديد في Google Cloud Console، انقر على الزر "اختيار مشروع" في العنوان، ما سيؤدي إلى فتح نافذة منبثقة.

في نافذة "اختيار مشروع"، انقر على الزر "مشروع جديد" الذي سيفتح مربع حوار للمشروع الجديد.

في مربّع الحوار، أدخِل اسم المشروع المفضّل لديك واختَر الموقع الجغرافي.

- اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. لا تستخدم واجهات برمجة تطبيقات Google اسم المشروع، ويمكن تغييره في أي وقت.
- معرّف المشروع فريد في جميع مشاريع Google Cloud ولا يمكن تغييره (لا يمكن تغييره بعد ضبطه). تنشئ وحدة تحكّم Google Cloud تلقائيًا معرّفًا فريدًا، ولكن يمكنك تخصيصه. إذا لم يعجبك المعرّف الذي تم إنشاؤه، يمكنك إنشاء معرّف عشوائي آخر أو تقديم معرّفك الخاص للتحقّق من توفّره. في معظم دروس البرمجة، عليك الرجوع إلى رقم تعريف مشروعك، والذي يتم تحديده عادةً باستخدام العنصر النائب PROJECT_ID.
- للعلم، هناك قيمة ثالثة، وهي رقم المشروع، تستخدمها بعض واجهات برمجة التطبيقات. يمكنك الاطّلاع على مزيد من المعلومات حول هذه القيم الثلاث في المستندات.
تفعيل الفوترة
لتفعيل الفوترة، لديك خياران. يمكنك استخدام حساب الفوترة الشخصي أو تحصيل قيمة الرصيد باتّباع الخطوات التالية.
تحصيل قيمة رصيد Google Cloud بقيمة 5 دولار أمريكي (اختياري)
لإجراء ورشة العمل هذه، تحتاج إلى حساب فوترة يتضمّن بعض الرصيد. إذا كنت تخطّط لاستخدام نظام الفوترة الخاص بك، يمكنك تخطّي هذه الخطوة.
- انقر على هذا الرابط وسجِّل الدخول باستخدام حساب Google شخصي.
- سيظهر لك ما يلي:

- انقر على الزر انقر هنا للوصول إلى أرصدتك. ستنتقل إلى صفحة لإعداد ملف الفوترة. إذا ظهرت لك شاشة الاشتراك في تجربة مجانية، انقر على "إلغاء" وواصِل ربط الفوترة.

- انقر على "تأكيد". لقد تم ربط حسابك الآن بحساب فوترة تجريبي في Google Cloud Platform.

إعداد حساب فوترة شخصي
إذا أعددت الفوترة باستخدام أرصدة Google Cloud، يمكنك تخطّي هذه الخطوة.
لإعداد حساب فوترة شخصي، انتقِل إلى هنا لتفعيل الفوترة في Cloud Console.
ملاحظات:
- يجب أن تبلغ تكلفة إكمال هذا المختبر أقل من 3 دولارات أمريكية من موارد السحابة الإلكترونية.
- يمكنك اتّباع الخطوات في نهاية هذا المختبر لحذف الموارد وتجنُّب المزيد من الرسوم.
- يمكن للمستخدمين الجدد الاستفادة من الفترة التجريبية المجانية بقيمة 300 دولار أمريكي.
بدء Cloud Shell
على الرغم من إمكانية تشغيل Google Cloud عن بُعد من الكمبيوتر المحمول، ستستخدم في هذا الدرس العملي Google Cloud Shell، وهي بيئة سطر أوامر تعمل في السحابة الإلكترونية.
من Google Cloud Console، انقر على رمز Cloud Shell في شريط الأدوات أعلى يسار الصفحة:

يمكنك بدلاً من ذلك الضغط على G ثم S. سيؤدي هذا التسلسل إلى تفعيل Cloud Shell إذا كنت تستخدم Google Cloud Console أو هذا الرابط.
لن يستغرق توفير البيئة والاتصال بها سوى بضع لحظات. عند الانتهاء، من المفترض أن يظهر لك ما يلي:

يتم تحميل هذه الآلة الافتراضية مزوّدة بكل أدوات التطوير التي ستحتاج إليها. توفّر هذه الخدمة دليلًا منزليًا ثابتًا بسعة 5 غيغابايت، وتعمل على Google Cloud، ما يؤدي إلى تحسين أداء الشبكة والمصادقة بشكل كبير. يمكن إكمال جميع المهام في هذا الدرس العملي ضمن المتصفّح. ليس عليك تثبيت أي تطبيق.
3- قبل البدء
تفعيل واجهة برمجة التطبيقات
لاستخدام Cloud SQL وCompute Engine وخدمات الشبكات وVertex AI، عليك تفعيل واجهات برمجة التطبيقات الخاصة بها في مشروعك على Google Cloud.
داخل نافذة Cloud Shell، تأكَّد من إعداد رقم تعريف مشروعك:
gcloud config set project [YOUR-PROJECT-ID]
اضبط متغيّر البيئة PROJECT_ID:
PROJECT_ID=$(gcloud config get-value project)
فعِّل جميع الخدمات اللازمة:
gcloud services enable sqladmin.googleapis.com \
compute.googleapis.com \
cloudresourcemanager.googleapis.com \
servicenetworking.googleapis.com \
aiplatform.googleapis.com
الناتج المتوقّع
student@cloudshell:~ (test-project-001-402417)$ gcloud config set project test-project-001-402417
Updated property [core/project].
student@cloudshell:~ (test-project-001-402417)$ PROJECT_ID=$(gcloud config get-value project)
Your active configuration is: [cloudshell-14650]
student@cloudshell:~ (test-project-001-402417)$
student@cloudshell:~ (test-project-001-402417)$ gcloud services enable sqladmin.googleapis.com \
compute.googleapis.com \
cloudresourcemanager.googleapis.com \
servicenetworking.googleapis.com \
aiplatform.googleapis.com
Operation "operations/acat.p2-4470404856-1f44ebd8-894e-4356-bea7-b84165a57442" finished successfully.
لمحة عن واجهات برمجة التطبيقات
- تتيح لك Cloud SQL Admin API (
sqladmin.googleapis.com) إنشاء مثيلات Cloud SQL وتكوينها وإدارتها آليًا. توفر هذه الخدمة لوحة التحكّم لخدمة قواعد البيانات الارتباطية المُدارة بالكامل من Google (التي تتوافق مع MySQL وPostgreSQL وSQL Server)، وتتعامل مع مهام مثل توفير الموارد وعمليات النسخ الاحتياطي والتوفّر العالي وتغيير الحجم. - تتيح لك Compute Engine API (
compute.googleapis.com) إنشاء الأجهزة الافتراضية والأقراص الثابتة وإعدادات الشبكة وإدارتها. توفّر هذه المنطقة الأساس المطلوب لتشغيل أحجام العمل واستضافة البنية التحتية الأساسية للعديد من الخدمات المُدارة. - تتيح لك Cloud Resource Manager API (
cloudresourcemanager.googleapis.com) إدارة البيانات الوصفية وإعدادات مشروعك على Google Cloud آليًا. تتيح لك هذه الخدمة تنظيم الموارد والتعامل مع سياسات "إدارة الهوية والوصول" (IAM) والتحقّق من صحة الأذونات في جميع مستويات بنية المشروع. - تتيح لك Service Networking API (
servicenetworking.googleapis.com) إمكانية برمجة عملية إعداد الاتصال الخاص بين شبكة السحابة الافتراضية الخاصة (VPC) وخدمات Google المُدارة. وهي مطلوبة تحديدًا لإتاحة الوصول إلى عناوين IP الخاصة لخدمات مثل AlloyDB، ما يتيح لها التواصل بأمان مع مواردك الأخرى. - تتيح Vertex AI API (
aiplatform.googleapis.com) لتطبيقاتك إنشاء نماذج تعلُّم الآلة ونشرها وتوسيع نطاقها. توفّر هذه المنصة واجهة موحّدة لجميع خدمات الذكاء الاصطناعي من Google Cloud، بما في ذلك إمكانية الوصول إلى نماذج الذكاء الاصطناعي التوليدي (مثل Gemini) وتدريب النماذج المخصّصة.
4. إنشاء مثيل Cloud SQL
أنشئ مثيل Cloud SQL مع دمج قاعدة البيانات مع Vertex AI.
إنشاء كلمة مرور لقاعدة البيانات
حدِّد كلمة مرور لمستخدم قاعدة البيانات التلقائي. يمكنك تحديد كلمة المرور الخاصة بك أو استخدام دالة عشوائية لإنشاء كلمة مرور:
export CLOUDSQL_PASSWORD=`openssl rand -hex 12`
دوِّن القيمة التي تم إنشاؤها لكلمة المرور:
echo $CLOUDSQL_PASSWORD
إنشاء مثيل Cloud SQL for MySQL
يمكن تفعيل العلامة cloudsql_vector عند إنشاء مثيل. تتوفّر ميزة "البحث المستند إلى المتجهات" حاليًا للإصدار MySQL 8.0 R20241208.01_00 أو الإصدارات الأحدث.
في جلسة Cloud Shell، نفِّذ ما يلي:
gcloud sql instances create my-cloudsql-instance \
--database-version=MYSQL_8_4 \
--tier=db-custom-2-8192 \
--region=us-central1 \
--enable-google-ml-integration \
--edition=ENTERPRISE \
--root-password=$CLOUDSQL_PASSWORD
يمكننا التحقّق من الاتصال من خلال التنفيذ من Cloud Shell
gcloud sql connect my-cloudsql-instance --user=root
نفِّذ الأمر وأدخِل كلمة المرور في الطلب عندما يكون جاهزًا للاتصال.
الناتج المتوقّع:
$gcloud sql connect my-cloudsql-instance --user=root Allowlisting your IP for incoming connection for 5 minutes...done. Connecting to database with SQL user [root].Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 71 Server version: 8.4.4-google (Google) Copyright (c) 2000, 2025, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
يمكنك الخروج من جلسة mysql في الوقت الحالي باستخدام اختصار لوحة المفاتيح ctrl+d أو تنفيذ أمر الخروج.
exit
تفعيل عملية الدمج مع 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
امنح حساب خدمة Cloud SQL إذن الوصول إلى Vertex AI:
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. سنستخدم حزمة تطوير البرامج (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. في 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 التي تحصل على البيانات من المصدر العام.
في shell، نفِّذ ما يلي:
export INSTANCE_IP=$(gcloud sql instances describe my-cloudsql-instance --format="value(ipAddresses.ipAddress)")
curl -LJ https://raw.githubusercontent.com/GoogleCloudPlatform/devrel-demos/main/infrastructure/cymbal-store-embeddings/cymbal_mysql_schema.sql | mysql --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db
ما الذي فعلناه بالضبط في الأمر السابق؟ ربطنا قاعدة البيانات ونفّذنا رمز SQL الذي تم تنزيله والذي أنشأ جداول وفهارس وتسلسلات.
الخطوة التالية هي تحميل بيانات cymbal_products. نستخدم أداتَي curl وmysql المساعدتَين نفسيهما.
curl -LJ https://raw.githubusercontent.com/GoogleCloudPlatform/devrel-demos/main/infrastructure/cymbal-store-embeddings/cymbal_products.csv | mysql --enable-local-infile --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db -e "LOAD DATA LOCAL INFILE '/dev/stdin' INTO TABLE cymbal_products FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n' IGNORE 1 LINES;"
بعد ذلك، ننتقل إلى cymbal_stores.
curl -LJ https://raw.githubusercontent.com/GoogleCloudPlatform/devrel-demos/main/infrastructure/cymbal-store-embeddings/cymbal_stores.csv | mysql --enable-local-infile --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db -e "LOAD DATA LOCAL INFILE '/dev/stdin' INTO TABLE cymbal_stores FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n' IGNORE 1 LINES;"
وأكملها بـ cymbal_inventory الذي يتضمّن عدد كل منتج في كل متجر.
curl -LJ https://raw.githubusercontent.com/GoogleCloudPlatform/devrel-demos/main/infrastructure/cymbal-store-embeddings/cymbal_inventory.csv | mysql --enable-local-infile --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db -e "LOAD DATA LOCAL INFILE '/dev/stdin' INTO TABLE cymbal_inventory FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n' IGNORE 1 LINES;"
إذا كانت لديك بيانات نموذجية خاصة بك وكانت ملفات CSV متوافقة مع أداة الاستيراد في Cloud SQL المتاحة من Cloud Console، يمكنك استخدامها بدلاً من الطريقة المعروضة.
7. إنشاء تضمينات
الخطوة التالية هي إنشاء تضمينات لأوصاف منتجاتنا باستخدام نموذج textembedding-005 من Google Vertex AI وتخزينها في العمود الجديد في الجدول cymbal_products.
لتخزين بيانات المتجهات، علينا تفعيل وظيفة المتجهات في مثيل Cloud SQL. نفِّذ ما يلي في Cloud Shell:
gcloud sql instances patch my-cloudsql-instance \
--database-flags=cloudsql_vector=on
الربط بقاعدة البيانات:
mysql --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db
وأنشئ عمودًا جديدًا باسم embedding في جدول cymbal_products باستخدام دالة التضمين. سيتضمّن هذا العمود الجديد التضمينات المتجهة استنادًا إلى النص في العمود product_description.
ALTER TABLE cymbal_products ADD COLUMN embedding vector(768) using varbinary;
UPDATE cymbal_products SET embedding = mysql.ml_embedding('text-embedding-005', product_description);
يستغرق إنشاء تضمينات متجهة لـ 2,000 صف عادةً أقل من 5 دقائق، ولكن قد يستغرق أحيانًا وقتًا أطول قليلاً، وغالبًا ما ينتهي بشكل أسرع بكثير.
8. تشغيل ميزة "البحث عن صور مشابهة"
يمكننا الآن إجراء البحث باستخدام البحث المستند إلى التشابه استنادًا إلى قيم المتجهات المحسوبة للأوصاف وقيمة المتجه التي ننشئها لطلبنا باستخدام نموذج التضمين نفسه.
يمكن تنفيذ طلب بحث SQL من واجهة سطر الأوامر نفسها أو من Cloud SQL Studio كبديل. من الأفضل إدارة أي استعلام معقّد ومتعدد الصفوف في Cloud SQL Studio.
إنشاء مستخدم
نحتاج إلى مستخدم جديد يمكنه استخدام Cloud SQL Studio. سننشئ مستخدمًا طالبًا من النوع المضمّن باستخدام كلمة المرور نفسها التي استخدمناها للمستخدم الجذر.
في Cloud Shell، نفِّذ ما يلي:
gcloud sql users create student --instance=my-cloudsql-instance --password=$CLOUDSQL_PASSWORD --host=%
بدء Cloud SQL Studio
في وحدة التحكّم، انقر على مثيل Cloud SQL الذي أنشأناه سابقًا.

عندما تكون مفتوحة في اللوحة اليمنى، يمكننا رؤية Cloud SQL Studio. انقروا عليها.

سيتم فتح مربّع حوار حيث يمكنك تقديم اسم قاعدة البيانات وبيانات الاعتماد:
- قاعدة البيانات: quickstart_db
- المستخدم: طالب
- كلمة المرور: كلمة المرور التي دوّنتها للمستخدم
وانقر على الزر "المصادقة".

سيتم فتح النافذة التالية حيث تنقر على علامة التبويب "المحرّر" (Editor) على الجانب الأيسر لفتح "محرّر SQL" (SQL Editor).

نحن الآن جاهزون لتشغيل طلبات البحث.
تنفيذ طلب البحث
تنفيذ طلب بحث للحصول على قائمة بالمنتجات المتاحة الأكثر صلةً بطلب العميل سيكون الطلب الذي سنمرّره إلى Vertex AI للحصول على قيمة المتّجه على النحو التالي: "ما هي أنواع أشجار الفاكهة التي تنمو جيدًا هنا؟"
تنفيذ طلب بحث باستخدام cosine_distance للبحث عن المتجهات باستخدام خوارزمية الجار الأقرب (التطابق التام)
في ما يلي طلب البحث الذي يمكنك تنفيذه لاختيار أول 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.

في ما يلي قائمة بالمنتجات التي تم اختيارها لتتطابق مع طلب البحث.
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| 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 للبحث عن المتجهات باستخدام خوارزمية الجار الأقرب (مطابقة تامة)
الآن، ننفّذ طلب البحث نفسه ولكن باستخدام البحث عن الجيران الأقرب باستخدام الدالة 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- تحسين ردود النماذج اللغوية الكبيرة باستخدام البيانات المسترجَعة
يمكننا تحسين ردّ النموذج اللغوي الكبير للذكاء الاصطناعي التوليدي على تطبيق العميل باستخدام نتيجة طلب البحث الذي تم تنفيذه وإعداد ناتج مفيد باستخدام نتائج طلب البحث المقدَّمة كجزء من الطلب إلى نموذج لغوي أساسي توليدي في Vertex AI.
لتحقيق ذلك، علينا إنشاء ملف JSON يتضمّن نتائج البحث المتّجه، ثم استخدام ملف JSON الذي تم إنشاؤه كإضافة إلى طلب موجّه إلى نموذج لغوي كبير في Vertex AI لإنشاء إخراج ذي معنى. في الخطوة الأولى، ننشئ ملف JSON، ثم نختبره في Vertex AI Studio، وفي الخطوة الأخيرة، ندمجه في عبارة SQL يمكن استخدامها في أحد التطبيقات.
إنشاء ناتج بتنسيق JSON
عدِّل طلب البحث لإنشاء الناتج بتنسيق JSON وعرض صف واحد فقط لتمريره إلى Vertex AI
في ما يلي مثال على طلب البحث باستخدام البحث التقريبي لأقرب جار:
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 الذي تم إنشاؤه لتضمينه كجزء من الطلب المقدَّم إلى نموذج الذكاء الاصطناعي التوليدي المستند إلى نص في Vertex AI Studio.
افتح طلب Vertex AI Studio في Cloud Console.

قد يُطلب منك تفعيل واجهات برمجة تطبيقات إضافية، ولكن يمكنك تجاهل الطلب. لا نحتاج إلى أي واجهات برمجة تطبيقات إضافية لإكمال الدرس التطبيقي.
إدخال طلب في "استوديو YouTube"

إليك الطلب الذي سنستخدمه:
You are a friendly advisor helping to find a product based on the customer's needs.
Based on the client request we have loaded a list of products closely related to search.
The list in JSON format with list of values like {"product_name":"name","description":"some description","sale_price":10,"zip_code": 10234, "produt_id": "02056727942aeb714dc9a2313654e1b0"}
Here is the list of products:
[place your JSON here]
The customer asked "What tree is growing the best here?"
You should give information about the product, price and some supplemental information.
Do not ask any additional questions and assume location based on the zip code provided in the list of products.
في ما يلي طريقة ظهورها عند استبدال العنصر النائب JSON بالاستجابة من طلب البحث:
You are a friendly advisor helping to find a product based on the customer's needs.
Based on the client request we have loaded a list of products closely related to search.
The list in JSON format with list of values like {"product_name":"name","description":"some description","sale_price":10,"zip_code": 10234, "produt_id": "02056727942aeb714dc9a2313654e1b0"}
Here is the list of products:
{"zip_code": 93230, "product_id": "23e41a71d63d8bbc9bdfa1d118cfddc5", "sale_price": 100.00, "description": "Malus Domestica, the classic apple tree, brings beauty and delicious fruit to yo", "product_name": "Malus Domestica"}
The customer asked "What tree is growing the best here?"
You should give information about the product, price and some supplemental information.
Do not ask any additional questions and assume location based on the zip code provided in the list of products.
في ما يلي النتيجة عند تنفيذ الطلب باستخدام قيم JSON ونموذج gemini-2.5-flash:

تستند الإجابة التي حصلنا عليها من النموذج في هذا المثال إلى نتائج البحث الدلالي وأفضل منتج مطابق متوفّر في الرمز البريدي المذكور.
تنفيذ الطلب في SQL
يمكننا أيضًا استخدام عملية دمج الذكاء الاصطناعي في Cloud SQL مع Vertex AI للحصول على الردّ المشابه من نموذج توليدي باستخدام 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('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"
يتم تقديم الناتج بتنسيق Markdown.
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. تهانينا
تهانينا على إكمال تجربة البرمجة.
المسار التعليمي في Google Cloud
هذا المختبر هو جزء من مسار "الذكاء الاصطناعي الجاهز للإنتاج" التعليمي على Google Cloud.
- استكشِف المنهج الدراسي الكامل لسدّ الفجوة بين النموذج الأولي والإنتاج.
- شارِك مستوى تقدّمك باستخدام الهاشتاغ
#ProductionReadyAI.
المواضيع التي تناولناها
- كيفية نشر مثيل Cloud SQL لـ PostgreSQL
- كيفية إنشاء قاعدة بيانات وتفعيل عمليات الدمج مع الذكاء الاصطناعي في Cloud SQL
- كيفية تحميل البيانات إلى قاعدة البيانات
- كيفية استخدام Cloud SQL Studio
- كيفية استخدام نموذج التضمين في Vertex AI في Cloud SQL
- كيفية استخدام Vertex AI Studio
- كيفية تحسين النتيجة باستخدام نموذج الذكاء الاصطناعي التوليدي من Vertex AI
- كيفية تحسين الأداء باستخدام فهرس المتجهات
جرِّب درسًا تطبيقيًا مشابهًا حول AlloyDB أو درسًا تطبيقيًا حول Cloud SQL for Postgres
13. استطلاع
إخراج: