لمحة عن هذا الدرس التطبيقي حول الترميز
1. مقدمة
في هذا الدرس التطبيقي حول الترميز، ستتعرّف على كيفية استخدام Cloud SQL لدمج MySQL Vertex AI من خلال دمج البحث عن المتّجهات مع عمليات التضمين في Vertex AI.
المتطلبات الأساسية
- فهم أساسي لوحدة تحكّم Google Cloud
- المهارات الأساسية في واجهة سطر الأوامر وCloud Shell
ما ستتعرّف عليه
- كيفية نشر مثيل Cloud SQL for MySQL
- كيفية إنشاء قاعدة بيانات وتفعيل دمج الذكاء الاصطناعي في Cloud SQL
- كيفية تحميل البيانات إلى قاعدة البيانات
- كيفية استخدام نموذج التضمين في Vertex AI في Cloud SQL
- كيفية تحسين النتيجة باستخدام النموذج التوليدي في Vertex AI
- كيفية تحسين الأداء باستخدام فهرس المتجهات
المتطلبات
- حساب Google Cloud ومشروع Google Cloud
- متصفّح ويب، مثل Chrome، متوافق مع Google Cloud Console وCloud Shell
2. الإعداد والمتطلبات
إعداد البيئة حسب السرعة التي تناسبك
- سجِّل الدخول إلى Google Cloud Console وأنشئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.
- اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها واجهات برمجة تطبيقات Google. ويمكنك تعديلها في أي وقت.
- يكون معرّف المشروع فريدًا في جميع مشاريع Google Cloud وغير قابل للتغيير (لا يمكن تغييره بعد ضبطه). تنشئ وحدة تحكّم Cloud Console سلسلة فريدة تلقائيًا، ولا يهمّك عادةً معرفة قيمتها. في معظم ورشات عمل رموز البرامج، ستحتاج إلى الإشارة إلى معرّف المشروع (يُعرَف عادةً باسم
PROJECT_ID
). إذا لم يعجبك المعرّف الذي تم إنشاؤه، يمكنك إنشاء معرّف آخر عشوائي. يمكنك بدلاً من ذلك تجربة عنوانك الخاص لمعرفة ما إذا كان متاحًا. ولا يمكن تغييره بعد هذه الخطوة ويبقى ساريًا طوال مدة المشروع. - يُرجى العِلم أنّ هناك قيمة ثالثة، وهي رقم المشروع، تستخدمها بعض واجهات برمجة التطبيقات. يمكنك الاطّلاع على مزيد من المعلومات عن كلّ من هذه القيم الثلاث في المستندات.
- بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام موارد/واجهات برمجة تطبيقات Cloud. لن تتطلّب المشاركة في هذا الدليل التعليمي البرمجي أي تكلفة، أو قد تتطلّب تكلفة بسيطة. لإيقاف الموارد لتجنُّب تحصيل رسوم بعد انتهاء هذا الدليل التعليمي، يمكنك حذف الموارد التي أنشأتها أو حذف المشروع. يكون مستخدمو Google Cloud الجدد مؤهّلين للاستفادة من برنامج الفترة التجريبية المجانية التي تبلغ قيمتها 300 دولار أمريكي.
بدء Cloud Shell
على الرغم من أنّه يمكن تشغيل Google Cloud عن بُعد من الكمبيوتر المحمول، ستستخدم في هذا الدليل التعليمي Google Cloud Shell، وهي بيئة سطر أوامر تعمل في السحابة الإلكترونية.
من Google Cloud Console، انقر على رمز Cloud Shell في شريط الأدوات أعلى يسار الصفحة:
من المفترض ألا تستغرق عملية توفير البيئة والاتصال بها سوى بضع دقائق. عند الانتهاء، من المفترض أن يظهر لك ما يلي:
يتم تحميل هذه الآلة الافتراضية مزوّدة بكل أدوات التطوير التي ستحتاج إليها. ويقدّم هذا الدليل دليلاً منزليًا دائمًا بسعة 5 غيغابايت، ويتم تشغيله على Google Cloud، ما يُحسِّن بشكل كبير أداء الشبكة والمصادقة. يمكنك تنفيذ جميع أعمالك في هذا الدليل التعليمي للترميز داخل متصفّح. لست بحاجة إلى تثبيت أي تطبيق.
3. قبل البدء
تفعيل واجهة برمجة التطبيقات
في Cloud Shell، تأكَّد من إعداد رقم تعريف مشروعك:
gcloud config set project [YOUR-PROJECT-ID]
اضبط متغيّر البيئة PROJECT_ID:
PROJECT_ID=$(gcloud config get-value project)
فعِّل جميع الخدمات اللازمة:
gcloud services enable sqladmin.googleapis.com \
compute.googleapis.com \
cloudresourcemanager.googleapis.com \
servicenetworking.googleapis.com \
aiplatform.googleapis.com
الناتج المتوقّع
student@cloudshell:~ (test-project-001-402417)$ gcloud config set project test-project-001-402417 Updated property [core/project]. student@cloudshell:~ (test-project-001-402417)$ PROJECT_ID=$(gcloud config get-value project) Your active configuration is: [cloudshell-14650] student@cloudshell:~ (test-project-001-402417)$ student@cloudshell:~ (test-project-001-402417)$ gcloud services enable sqladmin.googleapis.com \ compute.googleapis.com \ cloudresourcemanager.googleapis.com \ servicenetworking.googleapis.com \ aiplatform.googleapis.com Operation "operations/acat.p2-4470404856-1f44ebd8-894e-4356-bea7-b84165a57442" finished successfully.
4. إنشاء مثيل Cloud SQL
أنشئ مثيل Cloud SQL مع دمج قاعدة البيانات مع Vertex AI.
إنشاء كلمة مرور قاعدة البيانات
حدِّد كلمة المرور لمستخدم قاعدة البيانات التلقائي. يمكنك تحديد كلمة المرور الخاصة بك أو استخدام دالة عشوائية لإنشاء كلمة مرور:
export CLOUDSQL_PASSWORD=`openssl rand -hex 12`
دوِّن القيمة التي تم إنشاؤها لكلمة المرور:
echo $CLOUDSQL_PASSWORD
إنشاء مثيل Cloud SQL for 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
امنح الامتيازات اللازمة لحساب خدمة 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. في Cloud Shell، نفِّذ ما يلي:
gcloud sql instances patch my-cloudsql-instance --authorized-networks=$(curl ifconfig.me)
إذا فقدت جلستك أو أعدت ضبطها أو كنت تعمل من أداة أخرى، يمكنك تصدير متغيّر CLOUDSQL_PASSWORD مرة أخرى:
export CLOUDSQL_PASSWORD=...your password defined for the instance...
يمكننا الآن إنشاء جميع العناصر المطلوبة في قاعدة بياناتنا. لإجراء ذلك، سنستخدم الأداة mysql في MySQL مع الأداة curl التي تحصل على البيانات من المصدر العام.
في Cloud Shell، نفِّذ ما يلي:
export INSTANCE_IP=$(gcloud sql instances describe my-cloudsql-instance --format="value(ipAddresses.ipAddress)")
curl -LJ https://raw.githubusercontent.com/GoogleCloudPlatform/devrel-demos/main/infrastructure/cymbal-store-embeddings/cymbal_mysql_schema.sql | mysql --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db
ما الذي فعلناه بالضبط في الأمر السابق؟ لقد ربطنا بقاعدة بياناتنا ونفّذنا رمز SQL الذي تم تنزيله والذي أنشأ الجداول والفهارس والتسلسلات.
الخطوة التالية هي تحميل بيانات cymbal_products. نستخدم الأداتَين curl وmysql نفسيهما.
curl -LJ https://raw.githubusercontent.com/GoogleCloudPlatform/devrel-demos/main/infrastructure/cymbal-store-embeddings/cymbal_products.csv | mysql --enable-local-infile --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db -e "LOAD DATA LOCAL INFILE '/dev/stdin' INTO TABLE cymbal_products FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n' IGNORE 1 LINES;"
بعد ذلك، نواصل استخدام cymbal_stores.
curl -LJ https://raw.githubusercontent.com/GoogleCloudPlatform/devrel-demos/main/infrastructure/cymbal-store-embeddings/cymbal_stores.csv | mysql --enable-local-infile --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db -e "LOAD DATA LOCAL INFILE '/dev/stdin' INTO TABLE cymbal_stores FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n' IGNORE 1 LINES;"
وأكمِل ذلك بإضافة cymbal_inventory الذي يحتوي على عدد كل منتج في كل متجر.
curl -LJ https://raw.githubusercontent.com/GoogleCloudPlatform/devrel-demos/main/infrastructure/cymbal-store-embeddings/cymbal_inventory.csv | mysql --enable-local-infile --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db -e "LOAD DATA LOCAL INFILE '/dev/stdin' INTO TABLE cymbal_inventory FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n' IGNORE 1 LINES;"
إذا كانت لديك عيّنات البيانات الخاصة بك وملفات CSV متوافقة مع أداة استيراد Cloud SQL المتاحة من Cloud Console، يمكنك استخدامها بدلاً من النهج المعروض.
7. إنشاء عمليات التضمين
الخطوة التالية هي إنشاء نماذج إدراج لأوصاف منتجاتنا باستخدام نموذج textembedding-005 من Google Vertex AI وتخزينها في العمود الجديد في الجدول cymbal_products.
لتخزين بيانات المتجهات، علينا تفعيل وظيفة المتجهات في مثيل Cloud SQL. تنفيذ ما يلي في Cloud Shell:
gcloud sql instances patch my-cloudsql-instance \
--database-flags=cloudsql_vector=on
الاتصال بقاعدة البيانات:
mysql --host=$INSTANCE_IP --user=root --password=$CLOUDSQL_PASSWORD quickstart_db
وأنشئ عمودًا افتراضيًا مضمّنًا في جدول cymbal_products باستخدام دالة التضمين.
ALTER TABLE cymbal_products ADD COLUMN embedding vector(768) using varbinary;
UPDATE cymbal_products SET embedding = mysql.ml_embedding('text-embedding-005', product_description);
يستغرق إنشاء نماذج embeddings للصفوف الـ 2000 عادةً أقل من 5 دقائق، ولكن قد يستغرق أحيانًا وقتًا أطول قليلاً، وغالبًا ما يكتمل بشكل أسرع بكثير.
8. تشغيل ميزة "البحث عن التشابه"
يمكننا الآن إجراء عملية البحث باستخدام البحث عن التشابه استنادًا إلى قيم المتجهات المحسوبة للأوصاف وقيمة المتجه التي ننشئها لطلبنا باستخدام نموذج التضمين نفسه.
يمكن تنفيذ طلب البحث SQL من واجهة سطر الأوامر نفسها أو من Cloud SQL Studio كخيار بديل. من الأفضل إدارة أي استعلام متعدّد الصفوف ومعقد في Cloud SQL Studio.
إنشاء مستخدم
نحتاج إلى مستخدم جديد يمكنه استخدام Cloud SQL Studio. سننشئ مستخدمًا مضمّنًا من النوع student باستخدام كلمة المرور نفسها التي استخدمناها للمستخدم root.
في Cloud Shell، نفِّذ ما يلي:
gcloud sql users create student --instance=my-cloudsql-instance --password=$CLOUDSQL_PASSWORD --host=%
ابدأ Cloud SQL Studio.
في وحدة التحكّم، انقر على مثيل Cloud SQL الذي أنشأناه سابقًا.
عندما يكون مفتوحًا في اللوحة اليمنى، يمكننا رؤية Cloud SQL Studio. انقر عليه.
سيؤدي ذلك إلى فتح مربّع حوار حيث يمكنك تقديم اسم قاعدة البيانات وبيانات الاعتماد:
- قاعدة البيانات: quickstart_db
- المستخدم: طالب
- كلمة المرور: كلمة المرور التي سجّلتها للمستخدم
انقر على الزر "مصادقة".
سيؤدي ذلك إلى فتح النافذة التالية التي تنقر فيها على علامة التبويب "المحرِّر" على يسار الصفحة لفتح محرِّر SQL.
نحن الآن جاهزون لتشغيل استفساراتنا.
تنفيذ الطلب
يمكنك إجراء طلب بحث للحصول على قائمة بالمنتجات المتاحة الأكثر صلةً بطلبك. الطلب الذي سنرسله إلى Vertex AI للحصول على قيمة المتجه يبدو مثل "ما هو نوع أشجار الفاكهة التي تنمو جيدًا هنا؟"
تنفيذ طلب باستخدام cosine_distance للبحث عن متّجهات KNN (دقيقة)
في ما يلي طلب البحث الذي يمكنك تنفيذه لاختيار أوّل 5 عناصر تناسب طلبنا باستخدام الدالة cosine_distance:
SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
SELECT
cp.product_name,
left(cp.product_description,80) as description,
cp.sale_price,
cs.zip_code,
cosine_distance(cp.embedding ,@query_vector) as distance
FROM
cymbal_products cp
JOIN cymbal_inventory ci on
ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
cs.store_id=ci.store_id
AND ci.inventory>0
AND cs.store_id = 1583
ORDER BY
distance ASC
LIMIT 5;
انسخ طلب البحث والصقه في محرِّر Cloud SQL Studio واضغط على الزر "تشغيل" (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 في خوارزمية KNN (بحث متجه دقيق)
الآن، سنُجري طلب البحث نفسه ولكن باستخدام بحث KNN باستخدام دالة approx_distance. إذا لم يكن لدينا فهرس ANN لملفات التضمين، يتم تلقائيًا الرجوع إلى البحث الدقيق في الخلفية:
SELECT mysql.ML_EMBEDDING('text-embedding-005','What kind of fruit trees grow well here?') into @query_vector;
SELECT
cp.product_name,
left(cp.product_description,80) as description,
cp.sale_price,
cs.zip_code,
approx_distance(cp.embedding ,@query_vector, 'distance_measure=cosine') as distance
FROM
cymbal_products cp
JOIN cymbal_inventory ci on
ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
cs.store_id=ci.store_id
AND ci.inventory>0
AND cs.store_id = 1583
ORDER BY
distance ASC
LIMIT 5;
في ما يلي قائمة بالمنتجات التي أرجعها طلب البحث.
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| product_name | description | sale_price | zip_code | distance |
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
| Malus Domestica | Malus Domestica, the classic apple tree, brings beauty and delicious fruit to yo | 100.00 | 93230 | 0.37740096545831603 |
| Cerasus | Cerasus: A beautiful cherry tree that brings delicious fruit and vibrant color t | 75.00 | 93230 | 0.405704177142419 |
| Persica | Persica: Enjoy homegrown, delicious peaches with this beautiful peach tree. Reac | 150.00 | 93230 | 0.41031799106722877 |
| Meyer Lemon | Grow your own juicy Meyer Lemons with this semi-dwarf tree, California's favorit | 34.00 | 93230 | 0.42823360959352186 |
| Acer | Acer, the classic maple. Known for vibrant fall foliage in reds, oranges, and ye | 100.00 | 93230 | 0.42953897057301615 |
+-----------------+----------------------------------------------------------------------------------+------------+----------+---------------------+
5 rows in set, 1 warning (0.12 sec)
استغرق تنفيذ الاستعلام 0.12 ثانية فقط. لقد حصلنا على النتائج نفسها التي حصلنا عليها باستخدام دالة cosine_distance.
9. تحسين استجابة نموذج "التعلم الآلي للغات" باستخدام البيانات التي تم استرجاعها
يمكننا تحسين ردّ نموذج اللغة الكبير المستنِد إلى الذكاء الاصطناعي التوليدي على تطبيق العميل باستخدام نتيجة طلب البحث الذي تم تنفيذه وإعداد ناتج ذي معنى باستخدام نتائج طلب البحث المقدَّمة كجزء من الطلب المرسَل إلى نموذج اللغة الأساسي التوليدي في Vertex AI.
لتحقيق ذلك، نحتاج إلى إنشاء ملف JSON يتضمّن نتائجنا من البحث عن المتّجهات، ثم استخدام ملف JSON الذي تم إنشاؤه كإضافة إلى طلب لنموذج LLM في 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 في وحدة تحكّم السحابة الإلكترونية.
قد يُطلب منك تفعيل واجهات برمجة تطبيقات إضافية، ولكن يمكنك تجاهل الطلب. لا نحتاج إلى أي واجهات برمجة تطبيقات إضافية لإكمال الدرس التطبيقي.
في ما يلي الطلب الذي سنستخدمه:
You are a friendly advisor helping to find a product based on the customer's needs.
Based on the client request we have loaded a list of products closely related to search.
The list in JSON format with list of values like {"product_name":"name","description":"some description","sale_price":10,"zip_code": 10234, "produt_id": "02056727942aeb714dc9a2313654e1b0"}
Here is the list of products:
[place your JSON here]
The customer asked "What tree is growing the best here?"
You should give information about the product, price and some supplemental information.
Do not ask any additional questions and assume location based on the zip code provided in the list of products.
في ما يلي الشكل الذي سيظهر به العنصر النائب JSON عند استبداله بالاستجابة من طلب البحث:
You are a friendly advisor helping to find a product based on the customer's needs. Based on the client request we have loaded a list of products closely related to search. The list in JSON format with list of values like {"product_name":"name","description":"some description","sale_price":10,"zip_code": 10234, "produt_id": "02056727942aeb714dc9a2313654e1b0"} Here is the list of products: {"zip_code": 93230, "product_id": "23e41a71d63d8bbc9bdfa1d118cfddc5", "sale_price": 100.00, "description": "Malus Domestica, the classic apple tree, brings beauty and delicious fruit to yo", "product_name": "Malus Domestica"} The customer asked "What tree is growing the best here?" You should give information about the product, price and some supplemental information. Do not ask any additional questions and assume location based on the zip code provided in the list of products.
في ما يلي النتيجة عند تشغيل الطلب باستخدام قيم JSON واستخدام نموذج gemini-2.0-flash:
الإجابة التي حصلنا عليها من النموذج في هذا المثال ناتجة عن استخدام نتائج البحث الدلالي والمنتج الأنسب المتاح في الرمز البريدي المذكور.
تنفيذ الطلب في PSQL
يمكننا أيضًا استخدام دمج الذكاء الاصطناعي في 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. تهانينا
تهانينا على إكمال دورة codelab.
المواضيع التي تناولناها
- كيفية نشر مثيل Cloud SQL for MySQL
- كيفية إنشاء قاعدة بيانات وتفعيل دمج الذكاء الاصطناعي في Cloud SQL
- كيفية تحميل البيانات إلى قاعدة البيانات
- كيفية استخدام نموذج التضمين في Vertex AI في Cloud SQL
- كيفية تحسين النتيجة باستخدام النموذج التوليدي في Vertex AI
- كيفية تحسين الأداء باستخدام فهرس المتجهات
جرِّب درسًا تطبيقيًا مشابهًا حول الترميز لـ AlloyDB أو درسًا تطبيقيًا حول الترميز لـ Cloud SQL for Postgres.