1. مقدمة
في هذا الدرس التطبيقي حول الترميز، ستتعلّم كيفية استخدام AlloyDB AI من خلال الجمع بين البحث عن المتّجهات وتضمينات Vertex AI. يشكّل هذا المختبر جزءًا من مجموعة مختبرات مخصّصة لميزات AlloyDB AI. يمكنك الاطّلاع على مزيد من المعلومات في صفحة AlloyDB AI ضمن المستندات.

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

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

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

- اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. لا تستخدم Google APIs اسم المشروع، ويمكن تغييره في أي وقت.
- رقم تعريف المشروع هو رقم تعريف فريد في جميع مشاريع Google Cloud ولا يمكن تغييره (لا يمكن تغييره بعد ضبطه). تنشئ وحدة تحكّم Google Cloud تلقائيًا معرّفًا فريدًا، ولكن يمكنك تخصيصه. إذا لم يعجبك المعرّف الذي تم إنشاؤه، يمكنك إنشاء معرّف عشوائي آخر أو تقديم معرّفك الخاص للتحقّق من توفّره. في معظم دروس البرمجة، عليك الرجوع إلى رقم تعريف مشروعك، والذي يتم تحديده عادةً باستخدام العنصر النائب PROJECT_ID.
- للعلم، هناك قيمة ثالثة، وهي رقم المشروع، وتستخدمها بعض واجهات برمجة التطبيقات. يمكنك الاطّلاع على مزيد من المعلومات حول هذه القيم الثلاث في المستندات.
تفعيل الفوترة
إعداد حساب فوترة شخصي
إذا أعددت الفوترة باستخدام أرصدة 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- قبل البدء
تفعيل واجهة برمجة التطبيقات
إخراج:
لاستخدام AlloyDB وCompute Engine وخدمات الشبكات ومنصة وكيل Gemini Enterprise، عليك تفعيل واجهات برمجة التطبيقات الخاصة بها في مشروعك على Google Cloud.
تفعيل واجهات برمجة التطبيقات
داخل Cloud Shell في الوحدة الطرفية، تأكَّد من إعداد رقم تعريف مشروعك:
gcloud config set project [YOUR-PROJECT-ID]
اضبط متغيّر البيئة PROJECT_ID:
PROJECT_ID=$(gcloud config get-value project)
فعِّل جميع واجهات برمجة التطبيقات اللازمة:
gcloud services enable alloydb.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 alloydb.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. تفعيل AlloyDB
قبل إنشاء مجموعة AlloyDB، خصِّص نطاق عناوين IP خاصة متاحًا في شبكتك VPC لاستخدامه في مثيل AlloyDB المستقبلي. إذا لم يكن لديك، عليك إنشاؤه وتعيينه ليتم استخدامه من قِبل خدمات Google الداخلية، وبعد ذلك ستتمكّن من إنشاء المجموعة والآلة الافتراضية.
إنشاء نطاق عناوين IP خاصة
يجب ضبط إعدادات الوصول إلى الخدمات الخاصة في شبكة السحابة الإلكترونية الخاصة الافتراضية (VPC) لخدمة AlloyDB. الافتراض هنا هو أنّ لديك شبكة VPC "تلقائية" في المشروع وسيتم استخدامها في جميع الإجراءات.
أنشئ نطاق عناوين IP الخاصة:
gcloud compute addresses create psa-range \
--global \
--purpose=VPC_PEERING \
--prefix-length=24 \
--description="VPC private service access" \
--network=default
أنشئ اتصالاً خاصًا باستخدام نطاق عناوين IP المخصّص:
gcloud services vpc-peerings connect \
--service=servicenetworking.googleapis.com \
--ranges=psa-range \
--network=default
الناتج المتوقّع في وحدة التحكّم:
student@cloudshell:~ (test-project-402417)$ gcloud compute addresses create psa-range \
--global \
--purpose=VPC_PEERING \
--prefix-length=24 \
--description="VPC private service access" \
--network=default
Created [https://www.googleapis.com/compute/v1/projects/test-project-402417/global/addresses/psa-range].
student@cloudshell:~ (test-project-402417)$ gcloud services vpc-peerings connect \
--service=servicenetworking.googleapis.com \
--ranges=psa-range \
--network=default
Operation "operations/pssn.p24-4470404856-595e209f-19b7-4669-8a71-cbd45de8ba66" finished successfully.
student@cloudshell:~ (test-project-402417)$
إنشاء مجموعة AlloyDB
إنشاء مجموعة AlloyDB في المنطقة us-central1
حدِّد كلمة مرور لمستخدم postgres. يمكنك تحديد كلمة المرور الخاصة بك أو استخدام دالة عشوائية لإنشاء كلمة مرور
export PGPASSWORD=`openssl rand -hex 16`
الناتج المتوقّع في وحدة التحكّم:
student@cloudshell:~ (test-project-402417)$ export PGPASSWORD=`openssl rand -hex 12`
دوِّن كلمة مرور PostgreSQL لاستخدامها في المستقبل:
echo $PGPASSWORD
ستحتاج إلى كلمة المرور هذه في المستقبل للاتصال بالجهاز الظاهري بصفتك مستخدم postgres. احفظ كلمة المرور هذه لاستخدامها في الخطوات اللاحقة.
الناتج المتوقّع في وحدة التحكّم:
student@cloudshell:~ (test-project-402417)$ echo $PGPASSWORD bbefbfde7601985b0dee5723 (Note: Yours will be different!)
إنشاء مجموعة من الفترات التجريبية المجانية
إذا لم يسبق لك استخدام AlloyDB، يمكنك إنشاء مجموعة تجريبية مجانية باتّباع الخطوات التالية:
اضبط متغيّرات البيئة الخاصة بالمنطقة واسم المجموعة:
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
نفِّذ الأمر التالي لإنشاء المجموعة:
gcloud alloydb clusters create $ADBCLUSTER \
--password=$PGPASSWORD \
--network=default \
--region=$REGION \
--subscription-type=TRIAL
الناتج المتوقّع في وحدة التحكّم:
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
gcloud alloydb clusters create $ADBCLUSTER \
--password=$PGPASSWORD \
--network=default \
--region=$REGION \
--subscription-type=TRIAL
Operation ID: operation-1697655441138-6080235852277-9e7f04f5-2012fce4
Creating cluster...done.
أنشئ مثيلاً أساسيًا من AlloyDB لمجموعتك في جلسة Cloud Shell نفسها. في حال انقطاع الاتصال، عليك تحديد متغيرات بيئة اسم المنطقة واسم المجموعة مرة أخرى.
gcloud alloydb instances create $ADBCLUSTER-pr \
--instance-type=PRIMARY \
--cpu-count=8 \
--region=$REGION \
--cluster=$ADBCLUSTER
الناتج المتوقّع في وحدة التحكّم:
student@cloudshell:~ (test-project-402417)$ gcloud alloydb instances create $ADBCLUSTER-pr \
--instance-type=PRIMARY \
--cpu-count=8 \
--region=$REGION \
--availability-type ZONAL \
--cluster=$ADBCLUSTER
Operation ID: operation-1697659203545-6080315c6e8ee-391805db-25852721
Creating instance...done.
إنشاء مجموعة AlloyDB Standard
إذا لم تكن هذه هي مجموعة AlloyDB الأولى في المشروع، يمكنك المتابعة لإنشاء مجموعة عادية. إذا سبق لك إنشاء مجموعة تجريبية مجانية، يمكنك تخطّي هذه الخطوة.
اضبط متغيّرات البيئة الخاصة بالمنطقة واسم المجموعة:
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
نفِّذ الأمر التالي لإنشاء المجموعة:
gcloud alloydb clusters create $ADBCLUSTER \
--password=$PGPASSWORD \
--network=default \
--region=$REGION
الناتج المتوقّع في وحدة التحكّم:
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
gcloud alloydb clusters create $ADBCLUSTER \
--password=$PGPASSWORD \
--network=default \
--region=$REGION
Operation ID: operation-1697655441138-6080235852277-9e7f04f5-2012fce4
Creating cluster...done.
أنشئ مثيلاً أساسيًا من AlloyDB لمجموعتك في جلسة Cloud Shell نفسها. في حال انقطاع الاتصال، عليك تحديد متغيرات بيئة اسم المنطقة واسم المجموعة مرة أخرى.
gcloud alloydb instances create $ADBCLUSTER-pr \
--instance-type=PRIMARY \
--cpu-count=2 \
--region=$REGION \
--cluster=$ADBCLUSTER
الناتج المتوقّع في وحدة التحكّم:
student@cloudshell:~ (test-project-402417)$ gcloud alloydb instances create $ADBCLUSTER-pr \
--instance-type=PRIMARY \
--cpu-count=2 \
--region=$REGION \
--availability-type ZONAL \
--cluster=$ADBCLUSTER
Operation ID: operation-1697659203545-6080315c6e8ee-391805db-25852721
Creating instance...done.
5- الربط بـ AlloyDB
يتم نشر AlloyDB باستخدام اتصال خاص فقط، لذا تحتاج إلى جهاز Compute Engine الظاهري مثبَّت عليه برنامج PostgreSQL للتعامل مع قاعدة البيانات.
نشر جهاز افتراضي على "محرك حساب Google"
أنشئ جهازًا افتراضيًا على Google Compute Engine في المنطقة نفسها والسحابة الإلكترونية الخاصة الافتراضية (VPC) نفسها التي تضم مجموعة AlloyDB.
في Cloud Shell، نفِّذ ما يلي:
export ZONE=us-central1-a
gcloud compute instances create instance-1 \
--zone=$ZONE \
--create-disk=auto-delete=yes,boot=yes,image=projects/debian-cloud/global/images/$(gcloud compute images list --filter="family=debian-13 AND family!=debian-13-arm64" --format="value(name)") \
--scopes=https://www.googleapis.com/auth/cloud-platform
الناتج المتوقّع في وحدة التحكّم:
student@cloudshell:~ (test-project-402417)$ export ZONE=us-central1-a
gcloud compute instances create instance-1 \
--zone=$ZONE \
--create-disk=auto-delete=yes,boot=yes,image=projects/debian-cloud/global/images/$(gcloud compute images list --filter="family=debian-13 AND family!=debian-13-arm64" --format="value(name)") \
--scopes=https://www.googleapis.com/auth/cloud-platform
Created [https://www.googleapis.com/compute/v1/projects/test-project-402417/zones/us-central1-a/instances/instance-1].
NAME: instance-1
ZONE: us-central1-a
MACHINE_TYPE: n1-standard-1
PREEMPTIBLE:
INTERNAL_IP: 10.128.0.2
EXTERNAL_IP: 34.71.192.233
STATUS: RUNNING
تثبيت عميل Postgres
تثبيت برنامج عميل PostgreSQL على الجهاز الافتراضي الذي تم نشره
اتّبِع الخطوات التالية للاتصال بالجهاز الافتراضي:
gcloud compute ssh instance-1 --zone=us-central1-a
الناتج المتوقّع في وحدة التحكّم:
student@cloudshell:~ (test-project-402417)$ gcloud compute ssh instance-1 --zone=us-central1-a Updating project ssh metadata...working..Updated [https://www.googleapis.com/compute/v1/projects/test-project-402417]. Updating project ssh metadata...done. Waiting for SSH key to propagate. Warning: Permanently added 'compute.5110295539541121102' (ECDSA) to the list of known hosts. Linux instance-1 6.12.101+deb13-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.101-1 (2026-08-05) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. student@instance-1:~$
ثبِّت البرنامج الذي يشغّل الأمر داخل الجهاز الافتراضي:
sudo apt-get update
sudo apt-get install --yes postgresql-client
الناتج المتوقّع في وحدة التحكّم:
student@instance-1:~$ sudo apt-get update sudo apt-get install --yes postgresql-client Get:1 file:/etc/apt/mirrors/debian.list Mirrorlist [30 B] Get:2 file:/etc/apt/mirrors/debian-security.list Mirrorlist [39 B] Hit:3 https://deb.debian.org/debian trixie InRelease Get:4 https://deb.debian.org/debian trixie-updates InRelease [47.3 kB] Get:5 https://deb.debian.org/debian trixie-backports InRelease [54.0 kB] Get:6 https://deb.debian.org/debian-security trixie-security InRelease [43.4 kB] Hit:10 https://packages.cloud.google.com/apt google-compute-engine-trixie-stable InRelease ...redacted... update-alternatives: using /usr/share/postgresql/17/man/man1/psql.1.gz to provide /usr/share/man/man1/psql.1.gz (psql.1.gz) in auto mode Setting up postgresql-client (17+278) ... Processing triggers for man-db (2.13.1-1) ... Processing triggers for libc-bin (2.41-12+deb13u3) ...
الربط بالجهاز الافتراضي
اتّصِل بالمثيل الأساسي من الجهاز الافتراضي باستخدام psql.
في علامة التبويب نفسها في Cloud Shell التي تم فيها فتح جلسة SSH على الجهاز الظاهري instance-1
استخدِم قيمة كلمة مرور AlloyDB (PGPASSWORD) ومعرّف مجموعة AlloyDB للاتصال بـ AlloyDB من الجهاز الافتراضي على GCE:
export PGPASSWORD=<Noted password>
export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
export INSTANCE_IP=$(gcloud alloydb instances describe $ADBCLUSTER-pr --cluster=$ADBCLUSTER --region=$REGION --format="value(ipAddress)")
psql "host=$INSTANCE_IP user=postgres sslmode=require"
الناتج المتوقّع في وحدة التحكّم:
student@instance-1:~$ export PGPASSWORD=CQhOi5OygD4ps6ty student@instance-1:~$ export PROJECT_ID=$(gcloud config get-value project) export REGION=us-central1 export ADBCLUSTER=alloydb-aip-01 export INSTANCE_IP=$(gcloud alloydb instances describe $ADBCLUSTER-pr --cluster=$ADBCLUSTER --region=$REGION --format="value(ipAddress)") psql "host=$INSTANCE_IP user=postgres sslmode=require" psql (17.10 (Debian 17.10-0+deb13u1), server 17.9) SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off, ALPN: postgresql) Type "help" for help. postgres=>
أغلِق جلسة psql:
exit
6. إعداد قاعدة البيانات
أنشئ قاعدة بيانات، وفعِّل تكامل الذكاء الاصطناعي في "منصة الوكلاء"، وأنشئ عناصر قاعدة البيانات، واستورِد البيانات.
منح الأذونات اللازمة إلى AlloyDB
أضِف أذونات Gemini Enterprise Agent Platform إلى وكيل خدمة AlloyDB.
افتح علامة تبويب أخرى في Cloud Shell باستخدام علامة "+" في أعلى الصفحة.

في علامة تبويب Cloud Shell الجديدة، نفِّذ ما يلي:
PROJECT_ID=$(gcloud config get-value project)
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"
الناتج المتوقّع في وحدة التحكّم:
student@cloudshell:~ (test-project-001-402417)$ PROJECT_ID=$(gcloud config get-value project) Your active configuration is: [cloudshell-11039] student@cloudshell:~ (test-project-001-402417)$ gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \ --role="roles/aiplatform.user" Updated IAM policy for project [test-project-001-402417]. bindings: - members: - serviceAccount:service-4470404856@gcp-sa-alloydb.iam.gserviceaccount.com role: roles/aiplatform.user - members: ... etag: BwYIEbe_Z3U= version: 1
أغلِق علامة التبويب من خلال تنفيذ الأمر "exit" في علامة التبويب:
exit
إنشاء قاعدة بيانات
إنشاء قاعدة بيانات باستخدام التشغيل السريع
في جلسة الجهاز الافتراضي على GCE، نفِّذ ما يلي:
إنشاء قاعدة بيانات:
psql "host=$INSTANCE_IP user=postgres" -c "CREATE DATABASE quickstart_db"
الناتج المتوقّع في وحدة التحكّم:
student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres" -c "CREATE DATABASE quickstart_db" CREATE DATABASE student@instance-1:~$
تفعيل عملية الدمج مع Vertex AI
فعِّل عمليات دمج Vertex AI وإضافات pgvector في قاعدة البيانات.
في جهاز GCE الافتراضي، نفِّذ ما يلي:
psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE"
psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "CREATE EXTENSION IF NOT EXISTS vector"
الناتج المتوقّع في وحدة التحكّم:
student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE" psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "CREATE EXTENSION IF NOT EXISTS vector" CREATE EXTENSION CREATE EXTENSION student@instance-1:~$
استيراد البيانات
نزِّل البيانات المُعدّة واستوردها إلى قاعدة البيانات الجديدة.
في جهاز GCE الافتراضي، نفِّذ ما يلي:
gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_demo_schema.sql |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"
gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_products.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_products from stdin csv header"
gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_inventory.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_inventory from stdin csv header"
gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_stores.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_stores from stdin csv header"
الناتج المتوقّع في وحدة التحكّم:
student@instance-1:~$ gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_demo_schema.sql |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" SET SET SET SET SET set_config ------------ (1 row) SET SET SET SET SET SET CREATE TABLE ALTER TABLE CREATE TABLE ALTER TABLE CREATE TABLE ALTER TABLE CREATE TABLE ALTER TABLE CREATE SEQUENCE ALTER TABLE ALTER SEQUENCE ALTER TABLE ALTER TABLE ALTER TABLE student@instance-1:~$ gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_products.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_products from stdin csv header" COPY 941 student@instance-1:~$ gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_inventory.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_inventory from stdin csv header" COPY 263861 student@instance-1:~$ gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_stores.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_stores from stdin csv header" COPY 4654 student@instance-1:~$
7. احتساب التضمينات
بعد استيراد البيانات، ستتوفّر بيانات المنتجات في جدول cymbal_products، والمستودع الذي يعرض عدد المنتجات المتوفّرة في كل متجر في جدول cymbal_inventory، وقائمة المتاجر في جدول cymbal_stores. عليك حساب بيانات المتجهات استنادًا إلى أوصاف المنتجات، ويمكنك استخدام دوال مثل google_ml.embedding لهذا الغرض. يمكنك الاطّلاع على مزيد من المعلومات حول التكنولوجيا المستخدَمة في المستندات.
من السهل إنشاء تضمينات لبعض الصفوف، ولكن كيف يمكن جعلها فعّالة إذا كان لدينا الآلاف منها؟ يوضّح هذا القسم كيفية إنشاء عمليات تضمين للجداول الكبيرة وإدارتها. يمكنك الاطّلاع على مزيد من المعلومات حول الخيارات والأساليب المختلفة في الدليل.
تفعيل ميزة "إنشاء التضمينات السريع"
اتّصِل بقاعدة البيانات باستخدام psql من جهازك الافتراضي باستخدام عنوان IP لمثيل AlloyDB وكلمة مرور postgres:
psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"
تحقَّق من إصدار إضافة google_ml_integration.
SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';
يجب أن يكون الإصدار 1.5.2 أو إصدارًا أحدث. في ما يلي مثال على الناتج:
quickstart_db=> SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration'; extversion ------------ 1.6 (1 row)
يجب أن يكون الإصدار التلقائي 1.6 أو إصدارًا أحدث، ولكن إذا كان مثبّتًا لديك إصدار أقدم، من المحتمل أن تحتاج إلى تحديثه. تحقَّق مما إذا كانت الصيانة غير مفعَّلة للآلة الافتراضية.
تأكَّد من ضبط علامة قاعدة البيانات google_ml_integration.enable_faster_embedding_generation على "مفعّلة". في جلسة psql نفسها، تحقَّق من قيمة العلامة:
show google_ml_integration.enable_faster_embedding_generation;
إذا كانت العلامة في الموضع الصحيح، سيبدو الناتج المتوقّع على النحو التالي:
quickstart_db=> show google_ml_integration.enable_faster_embedding_generation; google_ml_integration.enable_faster_embedding_generation ---------------------------------------------------------- on (1 row)
إذا كانت قيمة العلامة تعرض "off"، عليك تعديل المثيل. يمكنك إجراء ذلك باستخدام وحدة تحكّم الويب أو أمر gcloud كما هو موضّح في المستندات.
للخروج من جلسة psql، اتّبِع الخطوات التالية:
exit;
لتعديل العلامة باستخدام gcloud، نفِّذ ما يلي:
export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
gcloud beta alloydb instances update $ADBCLUSTER-pr \
--database-flags google_ml_integration.enable_faster_embedding_generation=on \
--region=$REGION \
--cluster=$ADBCLUSTER \
--project=$PROJECT_ID \
--update-mode=FORCE_APPLY
قد يستغرق ذلك بضع دقائق، ولكن من المفترض أن يتم تغيير قيمة العلامة إلى "مفعَّل" في النهاية. بعد ذلك، يمكنك المتابعة إلى الخطوات التالية.
إنشاء عمود التضمين
اتّصِل بقاعدة البيانات باستخدام psql وأنشئ عمودًا افتراضيًا بنوع بيانات متّجه لاستخدامه في دالة التضمين في جدول cymbal_products.
psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"
في جلسة psql بعد الاتصال بقاعدة البيانات، نفِّذ ما يلي:
ALTER TABLE cymbal_products ADD COLUMN embedding vector(768);
ينشئ الأمر عمودًا افتراضيًا لعمليات التضمين المستقبلية.
الناتج المتوقّع في وحدة التحكّم:
quickstart_db=> ALTER TABLE cymbal_products ADD COLUMN embedding vector(768); ALTER TABLE quickstart_db=>
إنشاء عمليات تضمين في مجموعات من 50 صفًا في جلسة psql نفسها، نفِّذ ما يلي:
فعِّل ميزة تحديد الوقت لقياس المدة التي سيستغرقها:
\timing
نفِّذ الأمر التالي:
CALL ai.initialize_embeddings(
model_id => 'text-embedding-005',
table_name => 'cymbal_products',
content_column => 'product_description',
embedding_column => 'embedding',
batch_size => 50
);
وكان الناتج في وحدة التحكّم أقل من ثانيتَين لإنشاء التضمين:
quickstart_db=> CALL ai.initialize_embeddings(
model_id => 'text-embedding-005',
table_name => 'cymbal_products',
content_column => 'product_description',
embedding_column => 'embedding',
batch_size => 50
);
NOTICE: Initialize embedding completed successfully for table cymbal_products
CALL
Time: 1458.704 ms (00:01.459)
quickstart_db=>
يمكنك تجربة أحجام دفعات مختلفة ومعرفة ما إذا كانت ستؤدي إلى تغيير وقت التنفيذ.
لا يتم تلقائيًا إعادة إنشاء التضمينات إذا تم تعديل عمود product_description المقابل أو إدراج صف جديد بالكامل. ولكن يمكنك إجراء ذلك من خلال ضبط المَعلمة incremental_refresh_mode.
أنشئ عمودًا باسم product_embeddings واجعله قابلاً للتعديل تلقائيًا:
ALTER TABLE cymbal_products ADD COLUMN product_embedding vector(768);
CALL ai.initialize_embeddings(
model_id => 'text-embedding-005',
table_name => 'cymbal_products',
content_column => 'product_description',
embedding_column => 'product_embedding',
batch_size => 50,
incremental_refresh_mode => 'transactional'
);
أدرِج صفًا جديدًا في الجدول.
INSERT INTO "cymbal_products" ("uniq_id", "crawl_timestamp", "product_url", "product_name", "product_description", "list_price", "sale_price", "brand", "item_number", "gtin", "package_size", "category", "postal_code", "available", "product_embedding", "embedding") VALUES ('fd604542e04b470f9e6348e640cff794', NOW(), 'https://example.com/new_product', 'New Cymbal Product', 'This is a new cymbal product description.', 199.99, 149.99, 'Example Brand', 'EB123', '1234567890', 'Single', 'Cymbals', '12345', TRUE, NULL, NULL);
أرسِل طلب بحث إلى الجدول لمقارنة عمودَين خاصَّين بالتضمين:
SELECT uniq_id,embedding, (product_embedding::real[])[1:5] as product_embedding FROM cymbal_products WHERE uniq_id='fd604542e04b470f9e6348e640cff794';
توضّح النتيجة أنّه تتم تعبئة product_embedding تلقائيًا بينما يبقى embedding فارغًا:
quickstart_db=> SELECT uniq_id,embedding, (product_embedding::real[])[1:5] as product_embedding FROM cymbal_products WHERE uniq_id='fd604542e04b470f9e6348e640cff794';
uniq_id | embedding | product_embedding
----------------------------------+-----------+---------------------------------------------------------------
fd604542e04b470f9e6348e640cff794 | | {0.015003494,-0.005349732,-0.059790313,-0.0087091,-0.0271452}
(1 row)
Time: 3.295 ms
8. تشغيل ميزة "البحث عن صور مشابهة"
إجراء بحث عن التشابه استنادًا إلى عمليات تضمين المتّجهات التي تم إنشاؤها باستخدام AlloyDB AI
يمكن تنفيذ طلب بحث SQL من واجهة سطر الأوامر نفسها في psql أو من AlloyDB Studio كبديل. تعمل أي نتائج تتضمّن عدة صفوف ومعقّدة بشكل أفضل في AlloyDB Studio.
الربط بـ AlloyDB Studio
لفتح AlloyDB Studio، اتّبِع الخطوات التالية:
- في Google Cloud Console، انتقِل إلى صفحة المجموعات في AlloyDB for PostgreSQL.
- اختَر مثيلك الأساسي لفتح واجهة الويب الخاصة به.
3. بعد ذلك، انقر على AlloyDB Studio في يمين الصفحة:

- اختَر قاعدة بيانات
quickstart_db، والمستخدم postgres، وقدِّم كلمة المرور المذكورة، ثم انقر على "المصادقة".

يؤدي هذا الإجراء إلى فتح واجهة AlloyDB Studio.
- انقر على علامة التبويب "طلب بدون عنوان" (Untitled Query) لفتح محرِّر SQL.

سيؤدي ذلك إلى فتح محرِّر يمكنك من خلاله تنفيذ أوامر SQL، كما هو موضّح في الصورة التالية:

إذا كنت تفضّل استخدام سطر الأوامر psql، اتّبِع المسار البديل واتّصِل بقاعدة البيانات من خلال جلسة SSH على جهازك الافتراضي كما هو موضّح في الفصول السابقة.
تشغيل ميزة "البحث عن صور مشابهة"
نفِّذ طلب بحث للحصول على قائمة بالمنتجات المتاحة الأكثر صلةً بطلب العميل. عبارة البحث التي تم تمريرها إلى نموذج التضمين على "منصة الوكيل" في Gemini Enterprise (وهي العبارة نفسها التي استخدمناها لإنشاء عمليات تضمين لمنتجاتنا) للحصول على قيمة المتّجه لعبارة "ما هي أنواع أشجار الفاكهة التي تنمو جيدًا هنا؟"
نفِّذ الاستعلام:
SELECT
cp.product_name,
left(cp.product_description,80) as description,
cp.sale_price,
cs.zip_code,
(cp.embedding <=> embedding('text-embedding-005','What kind of fruit trees grow well here?')::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 10;
إليك الناتج المتوقّع:
quickstart_db=> SELECT
cp.product_name,
left(cp.product_description,80) as description,
cp.sale_price,
cs.zip_code,
(cp.embedding <=> embedding('text-embedding-005','What kind of fruit trees grow well here?')::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 10;
product_name | description | sale_price | zip_code | distance
-------------------------+----------------------------------------------------------------------------------+------------+----------+---------------------
Cherry Tree | This is a beautiful cherry tree that will produce delicious cherries. It is an d | 75.00 | 93230 | 0.43922018972266397
Meyer Lemon Tree | Meyer Lemon trees are California's favorite lemon tree! Grow your own lemons by | 34 | 93230 | 0.4685112926118228
Toyon | This is a beautiful toyon tree that can grow to be over 20 feet tall. It is an e | 10.00 | 93230 | 0.4835677149651668
California Lilac | This is a beautiful lilac tree that can grow to be over 10 feet tall. It is an d | 5.00 | 93230 | 0.4947204525907498
California Peppertree | This is a beautiful peppertree that can grow to be over 30 feet tall. It is an e | 25.00 | 93230 | 0.5054166905547247
California Black Walnut | This is a beautiful walnut tree that can grow to be over 80 feet tall. It is a d | 100.00 | 93230 | 0.5084219510932597
California Sycamore | This is a beautiful sycamore tree that can grow to be over 100 feet tall. It is | 300.00 | 93230 | 0.5140519790508755
Coast Live Oak | This is a beautiful oak tree that can grow to be over 100 feet tall. It is an ev | 500.00 | 93230 | 0.5143126438081371
Fremont Cottonwood | This is a beautiful cottonwood tree that can grow to be over 100 feet tall. It i | 200.00 | 93230 | 0.5174774727252058
Madrone | This is a beautiful madrona tree that can grow to be over 80 feet tall. It is an | 50.00 | 93230 | 0.5227400803389093
ستحصل على 10 منتجات تتضمّن أوصافًا قريبة دلاليًا من عبارة البحث، ويتم ترتيبها حسب مدى التشابه، مع عرض المنتج الأكثر تشابهًا في الأعلى.
9. تحسين الردّ
يمكنك تحسين الردّ على تطبيق العميل باستخدام نتيجة الطلب وإعداد ناتج مفيد باستخدام نتائج الطلب المقدَّمة كجزء من الطلب إلى نموذج لغوي توليدي أساسي.
لتحقيق ذلك، يمكنك إنشاء ملف JSON يتضمّن أهم النتائج من البحث المتّجه، ثم استخدام ملف JSON الذي تم إنشاؤه كإضافة إلى طلب موجّه إلى نموذج الذكاء الاصطناعي التوليدي في "منصة الوكيل" لإنشاء ناتج مفيد. تنشئ الخطوة الأولى ملف JSON، ثم يتم اختباره في Agent Platform Studio، وتتضمّن الخطوة الأخيرة كل ذلك في عبارة SQL واحدة يمكن استخدامها في أحد التطبيقات.
إنشاء ناتج بتنسيق JSON
عدِّل الاستعلام لإنشاء الإخراج بتنسيق JSON وإرجاع صف واحد فقط لتمريره إلى "منصة الوكيل".
نفِّذ الاستعلام:
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
(cp.embedding <=> embedding('text-embedding-005','What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1)
SELECT json_agg(trees) FROM trees;
تنسيق JSON في الناتج:
[{"product_name":"Cherry Tree","description":"This is a beautiful cherry tree that will produce delicious cherries. It is an d","sale_price":75.00,"zip_code":93230,"product_id":"d536e9e823296a2eba198e52dd23e712"}]
تشغيل الطلب في Vertex AI Studio
استخدِم ملف JSON الذي تم إنشاؤه لتضمينه كجزء من الطلب المقدَّم إلى نموذج الذكاء الاصطناعي التوليدي في Vertex AI Studio
افتح Gemini Enterprise Agent Platform Studio في Google Cloud Console.

اكتب طلبك في الواجهة:

أدخِل الطلب التالي:
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:
{"product_name":"Cherry Tree","description":"This is a beautiful cherry tree that will produce delicious cherries. It is an d","sale_price":75.00,"zip_code":93230,"product_id":"d536e9e823296a2eba198e52dd23e712"}
The customer asked "What tree is growing the best here?"
You should give information about the product, price and some supplemental information

إليك النتيجة عند تنفيذ الطلب :

تتضمّن الإجابة السعر والوصف والمعلومات التكميلية التي يحصل عليها النموذج من مصادر خارجية استنادًا إلى معلومات حول الشجرة والموقع الجغرافي.
تنفيذ الطلب في PSQL
يمكن تحقيق نتيجة مماثلة من خلال تشغيل عملية دمج AlloyDB AI مع "منصة وكيل Gemini Enterprise" للحصول على الردّ نفسه من نموذج توليدي باستخدام SQL مباشرةً في قاعدة البيانات. قبل أن تتمكّن من استخدام نموذج gemini-3.6-flash، عليك تسجيله.
تسجيل نموذج gemini-3.6-flash:
في عملية تشغيل AlloyDB Studio:
CALL google_ml.create_model(
model_id => 'gemini-3.6-flash',
model_request_url => 'https://aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/global/publishers/google/models/gemini-3.6-flash:generateContent',
model_provider => 'google',
model_type => 'llm'
);
يمكنك دائمًا التحقّق من قائمة النماذج المسجّلة من خلال اختيار معلومات من google_ml.model_info_view.
SELECT model_id,model_type FROM google_ml.model_info_view WHERE model_id ILIKE '%flash%';
في ما يلي مثال على الناتج
quickstart_db=> SELECT model_id,model_type FROM google_ml.model_info_view WHERE model_id ILIKE '%flash%';
model_id | model_type
-----------------------+------------
gemini-3.6-flash | llm
gemini-2.0-flash | llm
gemini-2.5-flash | llm
gemini-2.0-flash-lite | llm
gemini-2.5-flash-lite | llm
(5 rows)
يمكنك الآن استخدام JSON الذي تم إنشاؤه في طلب فرعي كجزء من الطلب لنموذج gemini-3.6-flash باستخدام SQL.
في جلسة psql أو AlloyDB Studio، نفِّذ طلب البحث التالي:
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
(cp.embedding <=> embedding('text-embedding-005',
'What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1),
prompt AS (
SELECT
'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_agg(trees) || '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
google_ml.predict_row( model_id =>'gemini-3.6-flash',
request_body => json_build_object('contents',
json_build_object('role',
'user',
'parts',
json_build_object('text',
prompt_text))))->'candidates'->0->'content'->'parts'->0->'text' AS resp
FROM
prompt)
SELECT
REPLACE(resp::text, '\n', CHR(10))
FROM
response;
وفي ما يلي الناتج المتوقّع. قد تختلف النتائج بسبب الطبيعة غير الحتمية لنماذج الذكاء الاصطناعي التوليدي:
"Hello there! I'd be delighted to help you pick out a wonderful fruit tree for your space. Based on our local selection, a fantastic option that grows very well is the **Cherry Tree**! Here are the details on this beautiful tree: * **Product:** Cherry Tree * **Price:** $75.00 ### Why it's a great choice: * **Delicious Harvest:** It produces tasty, fresh cherries right in your backyard. * **Size & Benefits:** It's a deciduous tree that grows to about 15 feet tall, making it ideal for providing both lovely shade and a bit of privacy. * **Year-Round Beauty:** It features lush, dark green leaves throughout the summer that transform into a stunning red in the autumn. * **Growing Requirements:** Cherry trees thrive best in cool, moist climates with sandy soil, and are perfectly suited for USDA hardiness zones 4 through 9. Please let me know if you have any questions about planting or if you'd like help adding this to your order!"
10. إنشاء فهرس متجهات
بما أنّ مجموعة البيانات هذه صغيرة، تعتمد أوقات الاستجابة بشكل أساسي على التفاعلات مع النماذج على Gemini Enterprise Agent Platform. ومع ذلك، عند طلب البحث عن ملايين المتّجهات، يمكن أن يستهلك البحث المتّجه نفسه جزءًا كبيرًا من وقت الاستجابة ويزيد الحمل على قاعدة البيانات. لتحسين أداء البحث، يمكنك إنشاء فهرس متّجهي.
إنشاء فهرس ScaNN
لإنشاء فهرس ScaNN، يجب تفعيل إضافة أخرى. توفّر الإضافة alloydb_scann واجهة للتعامل مع فهارس المتجهات الخاصة بخوارزمية "الجار الأقرب التقريبي" (ANN) باستخدام خوارزمية ScaNN من Google.
التشغيل في AlloyDB Studio:
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
يمكن إنشاء الفهرس في الوضع MANUAL أو AUTO. يكون الوضع MANUAL مفعَّلاً تلقائيًا ويمكنك إنشاء فهرس والاحتفاظ به كأي فهرس آخر. ولكن إذا فعّلت الوضع "تلقائي"، ستتمكّن من إنشاء الفهرس الذي لا يتطلّب أي صيانة من جانبك. يمكنك الاطّلاع على تفاصيل حول جميع الخيارات في المستندات. ليس لدينا صفوف كافية لإنشاء الفهرس في الوضع AUTO، لذا عليك إنشاؤه في الوضع MANUAL.
التشغيل في AlloyDB Studio:
CREATE INDEX cymbal_products_embeddings_scann ON cymbal_products
USING scann (embedding cosine)
WITH (num_leaves=10, max_num_levels = 1);
يمكنك الاطّلاع على معلومات حول ضبط مَعلمات الفهرس في المستندات.
الناتج المتوقّع:
quickstart_db=> CREATE INDEX cymbal_products_embeddings_scann ON cymbal_products USING scann (embedding cosine) WITH (num_leaves=10, max_num_levels = 1); CREATE INDEX quickstart_db=>
مقارنة الردود
كرِّر طلب البحث الذي استخدمناه للحصول على القيمة الأعلى في البحث الدلالي:
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
(cp.embedding <=> embedding('text-embedding-005','What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1)
SELECT json_agg(trees) FROM trees;
الناتج المتوقّع:
[{"product_name":"Cherry Tree","description":"This is a beautiful cherry tree that will produce delicious cherries. It is an d","sale_price":75.00,"zip_code":93230,"product_id":"d536e9e823296a2eba198e52dd23e712"}]
يظهر اسم "شجرة الكرز" نفسه في الناتج.
تحقَّق من استخدام الفهرس:
EXPLAIN (analyze)
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
(cp.embedding <=> embedding('text-embedding-005','What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1)
SELECT json_agg(trees) FROM trees;
الناتج المتوقّع (تم إخفاء بعض المعلومات لتوضيح المثال):
...
Aggregate (cost=27.24..27.25 rows=1 width=32) (actual time=0.964..0.965 rows=1 loops=1)
-> Subquery Scan on trees (cost=18.91..27.23 rows=1 width=142) (actual time=0.953..0.954 rows=1 loops=1)
-> Limit (cost=18.91..27.22 rows=1 width=158) (actual time=0.948..0.949 rows=1 loops=1)
-> Nested Loop (cost=18.91..7126.86 rows=855 width=158) (actual time=0.948..0.948 rows=1 loops=1)
-> Nested Loop (cost=18.63..7103.59 rows=855 width=907) (actual time=0.931..0.931 rows=1 loops=1)
-> Index Scan using cymbal_products_embeddings_scann on cymbal_products cp (cost=18.21..343.15 rows=942 width=903) (actual time=0.906..0.908 rows=2 loops=1)
Order By: (embedding <=> '[-0.106554024,0.035774965,-0.027267234,-0.045653425,-0.03286045,0.02124319...
من الناتج، يمكنك أن ترى أنّ طلب البحث كان يستخدم "Index Scan using cymbal_products_embeddings_scann on cymbal_products".
يعرض طلب البحث شجرة الكرز نفسها التي ظهرت في أعلى نتائج البحث قبل إنشاء الفهرس. بما أنّ فهارس البحث عن أقرب جار تقريبي (ANN) تستبدل الدقة المطلقة بسرعة البحث، قد تعرض طلبات البحث المستندة إلى الفهرس أحيانًا نتائج مختلفة قليلاً عن نتائج البحث الدقيق غير المفهرس. ومع ذلك، يوفّر فهرس المتجهات تحسّنًا كبيرًا في الأداء مع الحفاظ على دقة عالية.
للمزيد من الاستكشاف، يمكنك تجربة أنواع أخرى من فهارس المتجهات أو العثور على المزيد من المعامل والأمثلة التي تتضمّن دمج LangChain على صفحة المستندات.
11. تنظيف البيئة
إتلاف مثيلات AlloyDB ومجموعة AlloyDB عند الانتهاء من الدرس التطبيقي
حذف مجموعة AlloyDB وجميع الآلات الافتراضية
يتم إيقاف المجموعة باستخدام الخيار force الذي يؤدي أيضًا إلى حذف جميع الآلات الافتراضية التابعة للمجموعة.
إذا تم قطع اتصال الجهاز الطرفي، أعِد الاتصال وحدِّد متغيرات المشروع والبيئة في Cloud Shell:
gcloud config set project <YOUR_PROJECT_ID>
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
export PROJECT_ID=$(gcloud config get-value project)
احذف المجموعة:
gcloud alloydb clusters delete $ADBCLUSTER --region=$REGION --force
الناتج المتوقّع في وحدة التحكّم:
student@cloudshell:~ (test-project-001-402417)$ gcloud alloydb clusters delete $ADBCLUSTER --region=$REGION --force All of the cluster data will be lost when the cluster is deleted. Do you want to continue (Y/n)? Y Operation ID: operation-1697820178429-6082890a0b570-4a72f7e4-4c5df36f Deleting cluster...done.
حذف نُسخ AlloyDB الاحتياطية
احذف جميع النُسخ الاحتياطية من AlloyDB للمجموعة:
for i in $(gcloud alloydb backups list \
--filter="CLUSTER_NAME: projects/$PROJECT_ID/locations/$REGION/clusters/$ADBCLUSTER" \
--format="value(name)" \
--sort-by=~createTime) ; do \
gcloud alloydb backups delete $(basename $i) --region $REGION --quiet; done
الناتج المتوقّع في وحدة التحكّم:
student@cloudshell:~ (test-project-001-402417)$ for i in $(gcloud alloydb backups list --filter="CLUSTER_NAME: projects/$PROJECT_ID/locations/$REGION/clusters/$ADBCLUSTER" --format="value(name)" --sort-by=~createTime) ; do gcloud alloydb backups delete $(basename $i) --region $REGION --quiet; done Operation ID: operation-1697826266108-60829fb7b5258-7f99dc0b-99f3c35f Deleting backup...done.
الآن يمكننا إيقاف الجهاز الافتراضي
حذف جهاز GCE الافتراضي
في Cloud Shell، نفِّذ ما يلي:
export GCEVM=instance-1
export ZONE=us-central1-a
gcloud compute instances delete $GCEVM \
--zone=$ZONE \
--quiet
الناتج المتوقّع في وحدة التحكّم:
student@cloudshell:~ (test-project-001-402417)$ export GCEVM=instance-1
export ZONE=us-central1-a
gcloud compute instances delete $GCEVM \
--zone=$ZONE \
--quiet
Deleted
12. تهانينا
تهانينا على إكمال درس البرمجة.
يشكّل هذا المختبر جزءًا من مسار "الذكاء الاصطناعي الجاهز للإنتاج" التعليمي على Google Cloud.
- استكشِف المنهج الدراسي الكامل لسدّ الفجوة بين النموذج الأوّلي والإنتاج.
- شارِك مستوى تقدّمك باستخدام الهاشتاغ
#ProductionReadyAI.
المواضيع التي تناولناها
- كيفية نشر مجموعة AlloyDB ومثيل أساسي
- كيفية الاتصال بـ AlloyDB من جهاز Google Compute Engine الافتراضي
- كيفية إنشاء قاعدة بيانات وتفعيل AlloyDB AI
- كيفية تحميل البيانات إلى قاعدة البيانات
- كيفية استخدام AlloyDB Studio
- كيفية استخدام نموذج التضمين Gemini Enterprise Agent Platform في AlloyDB
- كيفية استخدام Gemini Enterprise Agent Platform Studio
- كيفية تحسين النتيجة باستخدام النموذج التوليدي في Gemini Enterprise Agent Platform
- كيفية تحسين الأداء باستخدام فهرس المتّجه
13. استطلاع
إخراج: