بدء استخدام ميزة "إدراج المتجهات" مع AlloyDB AI

1. مقدمة

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

81802d1e350b59bb.png

المتطلبات الأساسية

  • فهم أساسي لـ 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. الإعداد والمتطلبات

إعداد المشروع

  1. سجِّل الدخول إلى Google Cloud Console. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.

استخدام حساب شخصي بدلاً من حساب تديره المؤسسة التعليمية أو حساب تابع للعمل.

  1. أنشئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. لإنشاء مشروع جديد في Google Cloud Console، انقر على الزر "اختيار مشروع" في العنوان، ما سيؤدي إلى فتح نافذة منبثقة.

295004821bab6a87.png

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

37d264871000675d.png

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

96d86d3d5655cdbe.png

  • اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. لا تستخدم 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 في شريط الأدوات أعلى يسار الصفحة:

تفعيل Cloud Shell

يمكنك بدلاً من ذلك الضغط على G ثم S. سيؤدي هذا التسلسل إلى تفعيل Cloud Shell إذا كنت تستخدم Google Cloud Console أو هذا الرابط.

لن يستغرق توفير البيئة والاتصال بها سوى بضع لحظات. عند الانتهاء، من المفترض أن يظهر لك ما يلي:

لقطة شاشة لواجهة سطر الأوامر في Google Cloud Shell توضّح أنّه تم ربط البيئة

يتم تحميل هذه الآلة الافتراضية مزوّدة بكل أدوات التطوير التي ستحتاج إليها. توفّر هذه الخدمة دليلًا منزليًا دائمًا بسعة 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 باستخدام علامة "+" في أعلى الصفحة.

abc505ac4d41f24e.png

في علامة تبويب 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، اتّبِع الخطوات التالية:

  1. في Google Cloud Console، انتقِل إلى صفحة المجموعات في AlloyDB for PostgreSQL.
  2. اختَر مثيلك الأساسي لفتح واجهة الويب الخاصة به.

1d7298e7096e7313.png3. بعد ذلك، انقر على AlloyDB Studio في يمين الصفحة:

a33131c72ad29478.png

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

4f26532ecdb5bade.png

يؤدي هذا الإجراء إلى فتح واجهة AlloyDB Studio.

  1. انقر على علامة التبويب "طلب بدون عنوان" (Untitled Query) لفتح محرِّر SQL.

6696bc771fab9983.png

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

ae34288e5bf237c7.png

إذا كنت تفضّل استخدام سطر الأوامر 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.

154dc1a290c37f.jpeg

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

fd3abd6062009ee6.jpeg

أدخِل الطلب التالي:

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

edeea32a69d81aee.jpeg

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

831038ea1d819be6.jpeg

تتضمّن الإجابة السعر والوصف والمعلومات التكميلية التي يحصل عليها النموذج من مصادر خارجية استنادًا إلى معلومات حول الشجرة والموقع الجغرافي.

تنفيذ الطلب في 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.

المواضيع التي تناولناها

  • كيفية نشر مجموعة AlloyDB ومثيل أساسي
  • كيفية الاتصال بـ AlloyDB من جهاز Google Compute Engine الافتراضي
  • كيفية إنشاء قاعدة بيانات وتفعيل AlloyDB AI
  • كيفية تحميل البيانات إلى قاعدة البيانات
  • كيفية استخدام AlloyDB Studio
  • كيفية استخدام نموذج التضمين Gemini Enterprise Agent Platform في AlloyDB
  • كيفية استخدام Gemini Enterprise Agent Platform Studio
  • كيفية تحسين النتيجة باستخدام النموذج التوليدي في Gemini Enterprise Agent Platform
  • كيفية تحسين الأداء باستخدام فهرس المتّجه

13. استطلاع

إخراج:

كيف ستستخدم هذا البرنامج التعليمي؟

قراءة المحتوى فقط قراءة المحتوى وإكمال التمارين