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

1. مقدمة

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

17e86406ab251142.png

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

  • فهم أساسي لـ Google Cloud وConsole
  • مهارات أساسية في واجهة سطر الأوامر وGoogle Shell

ما ستتعلمه

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

المتطلبات

  • حساب Google Cloud ومشروع Google Cloud
  • متصفّح ويب، مثل Chrome

2. الإعداد والمتطلبات

إعداد البيئة بالسرعة التي تناسبك

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

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها Google APIs. ويمكنك تعديلها في أي وقت.
  • معرّف المشروع هو معرّف فريد في جميع مشاريع Google Cloud ولا يمكن تغييره (لا يمكن تغييره بعد ضبطه). تنشئ Cloud Console تلقائيًا سلسلة فريدة، ولا يهمّك عادةً ما هي. في معظم دروس البرمجة، عليك الرجوع إلى رقم تعريف مشروعك (يُشار إليه عادةً باسم PROJECT_ID). إذا لم يعجبك رقم التعريف الذي تم إنشاؤه، يمكنك إنشاء رقم تعريف عشوائي آخر. يمكنك بدلاً من ذلك تجربة اسم مستخدم من اختيارك ومعرفة ما إذا كان متاحًا. لا يمكن تغيير هذا الخيار بعد هذه الخطوة وسيظل ساريًا طوال مدة المشروع.
  • للعلم، هناك قيمة ثالثة، وهي رقم المشروع، تستخدمها بعض واجهات برمجة التطبيقات. يمكنك الاطّلاع على مزيد من المعلومات حول هذه القيم الثلاث في المستندات.
  1. بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام موارد/واجهات برمجة تطبيقات Cloud. لن تكلفك تجربة هذا الدرس البرمجي الكثير، إن وُجدت أي تكلفة على الإطلاق. لإيقاف الموارد وتجنُّب تكبُّد رسوم فوترة تتجاوز هذا البرنامج التعليمي، يمكنك حذف الموارد التي أنشأتها أو حذف المشروع. يمكن لمستخدمي Google Cloud الجدد الاستفادة من برنامج الفترة التجريبية المجانية بقيمة 300 دولار أمريكي.

بدء Cloud Shell

على الرغم من إمكانية تشغيل Google Cloud عن بُعد من الكمبيوتر المحمول، ستستخدم في هذا الدرس العملي Google Cloud Shell، وهي بيئة سطر أوامر تعمل في السحابة الإلكترونية.

من Google Cloud Console، انقر على رمز Cloud Shell في شريط الأدوات أعلى يسار الصفحة:

5704d8c8d89c09d2.png

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

7ffe5cbb04455448.png

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

اضبط منطقتك التلقائية لاستخدام نماذج التضمين في Vertex AI. مزيد من المعلومات حول المواقع الجغرافية التي تتوفّر فيها Vertex AI في المثال الذي نستخدمه، تكون المنطقة us-central1.

gcloud config set compute/region us-central1

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 12`

الناتج المتوقّع في وحدة التحكّم:

student@cloudshell:~ (test-project-402417)$ export PGPASSWORD=`openssl rand -hex 12`

دوِّن كلمة مرور PostgreSQL لاستخدامها في المستقبل.

echo $PGPASSWORD

ستحتاج إلى كلمة المرور هذه في المستقبل للاتصال بالجهاز الظاهري بصفتك مستخدم postgres. أنصحك بتدوينه أو نسخه في مكان ما لتتمكّن من استخدامه لاحقًا.

الناتج المتوقّع في وحدة التحكّم:

student@cloudshell:~ (test-project-402417)$ echo $PGPASSWORD
bbefbfde7601985b0dee5723

إنشاء مجموعة من الفترات التجريبية المجانية

إذا لم يسبق لك استخدام AlloyDB، يمكنك إنشاء مجموعة تجريبية مجانية باتّباع الخطوات التالية:

حدِّد المنطقة واسم مجموعة AlloyDB. سنستخدم المنطقة us-central1 وalloydb-aip-01 كاسم مجموعة:

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 الأولى في المشروع، يمكنك المتابعة لإنشاء مجموعة عادية.

حدِّد المنطقة واسم مجموعة AlloyDB. سنستخدم المنطقة us-central1 وalloydb-aip-01 كاسم مجموعة:

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 باستخدام اتصال خاص فقط، لذلك نحتاج إلى جهاز افتراضي مثبَّت عليه برنامج PostgreSQL للتعامل مع قاعدة البيانات.

نشر جهاز GCE افتراضي

أنشئ جهازًا افتراضيًا على GCE في المنطقة نفسها والشبكة الافتراضية الخاصة (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-12 AND family!=debian-12-arm64" --format="value(name)") \
    --scopes=https://www.googleapis.com/auth/cloud-platform

الناتج المتوقّع في وحدة التحكّم:

student@cloudshell:~ (test-project-402417)$ export ZONE=us-central1-a
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-12 AND family!=debian-12-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.us-central1-a.c.gleb-test-short-001-418811.internal 6.1.0-18-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.76-1 (2024-02-01) 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 https://packages.cloud.google.com/apt google-compute-engine-bullseye-stable InRelease [5146 B]
Get:2 https://packages.cloud.google.com/apt cloud-sdk-bullseye InRelease [6406 B]   
Hit:3 https://deb.debian.org/debian bullseye InRelease  
Get:4 https://deb.debian.org/debian-security bullseye-security InRelease [48.4 kB]
Get:5 https://packages.cloud.google.com/apt google-compute-engine-bullseye-stable/main amd64 Packages [1930 B]
Get:6 https://deb.debian.org/debian bullseye-updates InRelease [44.1 kB]
Get:7 https://deb.debian.org/debian bullseye-backports InRelease [49.0 kB]
...redacted...
update-alternatives: using /usr/share/postgresql/13/man/man1/psql.1.gz to provide /usr/share/man/man1/psql.1.gz (psql.1.gz) in auto mode
Setting up postgresql-client (13+225) ...
Processing triggers for man-db (2.9.4-2) ...
Processing triggers for libc-bin (2.31-13+deb11u7) ...

الربط بالجهاز الافتراضي

اتّصِل بالمثيل الأساسي من الجهاز الافتراضي باستخدام 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:~$ ADBCLUSTER=alloydb-aip-01
student@instance-1:~$ REGION=us-central1
student@instance-1:~$ INSTANCE_IP=$(gcloud alloydb instances describe $ADBCLUSTER-pr --cluster=$ADBCLUSTER --region=$REGION --format="value(ipAddress)")
gleb@instance-1:~$ psql "host=$INSTANCE_IP user=postgres sslmode=require"
psql (15.6 (Debian 15.6-0+deb12u1), server 15.5)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.

postgres=>

أغلِق جلسة psql:

exit

6. إعداد قاعدة البيانات

علينا إنشاء قاعدة بيانات وتفعيل تكامل Vertex AI وإنشاء عناصر قاعدة البيانات واستيراد البيانات.

منح الأذونات اللازمة إلى AlloyDB

أضِف أذونات Vertex AI إلى وكيل خدمة AlloyDB.

افتح علامة تبويب أخرى في Cloud Shell باستخدام علامة "+" في أعلى الصفحة.

4ca978f5142bb6ce.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 الافتراضي، نفِّذ ما يلي:

gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_demo_schema.sql |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"
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"
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"
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"

الناتج المتوقّع في وحدة التحكّم:

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. علينا حساب بيانات المتجهات استنادًا إلى أوصاف منتجاتنا، وسنستخدم الدالة embedding لهذا الغرض. باستخدام الدالة، سنستفيد من عملية دمج Vertex AI لحساب بيانات المتّجهات استنادًا إلى أوصاف منتجاتنا وإضافتها إلى الجدول. يمكنك الاطّلاع على مزيد من المعلومات حول التكنولوجيا المستخدَمة في المستندات.

إنشاء عمود التضمين

اتّصِل بقاعدة البيانات باستخدام psql وأنشئ عمودًا افتراضيًا يتضمّن بيانات المتّجه باستخدام دالة التضمين في جدول cymbal_products. تعرض دالة التضمين بيانات متجهة من Vertex AI استنادًا إلى البيانات المقدَّمة من عمود product_description.

psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"

في جلسة psql بعد الاتصال بقاعدة البيانات، نفِّذ ما يلي:

ALTER TABLE cymbal_products ADD COLUMN embedding vector(768) GENERATED ALWAYS AS (embedding('text-embedding-005',product_description)) STORED;

سينشئ الأمر العمود الافتراضي ويملأه ببيانات متجهة.

الناتج المتوقّع في وحدة التحكّم:

student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"
psql (13.11 (Debian 13.11-0+deb11u1), server 14.7)
WARNING: psql major version 13, server major version 14.
         Some psql features might not work.
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.

quickstart_db=> ALTER TABLE cymbal_products ADD COLUMN embedding vector(768) GENERATED ALWAYS AS (embedding('text-embedding-004',product_description)) STORED;
ALTER TABLE
quickstart_db=> 

8. تشغيل "البحث عن فيديوهات مشابهة"

يمكننا الآن إجراء البحث باستخدام البحث عن التشابه استنادًا إلى قيم المتجهات المحسوبة للأوصاف وقيمة المتجه التي نحصل عليها لطلبنا.

يمكن تنفيذ طلب بحث SQL من واجهة سطر الأوامر نفسها في psql أو من AlloyDB Studio كبديل. قد تبدو أي نتائج معقّدة ومتعددة الصفوف أفضل في AlloyDB Studio.

الربط بـ AlloyDB Studio

في الفصول التالية، يمكن تنفيذ جميع أوامر SQL التي تتطلّب الاتصال بقاعدة البيانات بشكل بديل في AlloyDB Studio. لتنفيذ الأمر، عليك فتح واجهة وحدة تحكّم الويب لمجموعة AlloyDB من خلال النقر على المثيل الأساسي.

ef4bfbcf0ed2ef3a.png

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

5c155cbcd7d43a1.png

اختَر قاعدة بيانات quickstart_db والمستخدم postgres وأدخِل كلمة المرور التي دوّنتها عند إنشاء المجموعة. بعد ذلك، انقر على الزر "المصادقة".

432613065cac864f.png

سيؤدي ذلك إلى فتح واجهة AlloyDB Studio. لتنفيذ الأوامر في قاعدة البيانات، انقر على علامة التبويب "المحرّر 1" على اليسار.

b36c28f8165119ca.png

يتم فتح واجهة يمكنك من خلالها تنفيذ أوامر SQL

cf43aa20f292797e.png

إذا كنت تفضّل استخدام سطر الأوامر psql، اتّبِع المسار البديل واتّصِل بقاعدة البيانات من خلال جلسة SSH على جهازك الافتراضي كما هو موضّح في الفصول السابقة.

تشغيل "البحث عن صور مشابهة" من psql

إذا تم قطع اتصال جلسة قاعدة البيانات، أعِد الاتصال بقاعدة البيانات باستخدام psql أو AlloyDB Studio.

الربط بقاعدة البيانات:

psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"

تنفيذ طلب بحث للحصول على قائمة بالمنتجات المتاحة الأكثر صلةً بطلب العميل سيكون الطلب الذي سنمرّره إلى Vertex AI للحصول على قيمة المتّجه على النحو التالي: "ما هي أنواع أشجار الفاكهة التي تنمو جيدًا هنا؟"

إليك طلب البحث الذي يمكنك تنفيذه لاختيار أول 10 عناصر الأكثر ملاءمةً لطلبنا:

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

9- تحسين الردّ

يمكنك تحسين الردّ على تطبيق العميل باستخدام نتيجة الطلب وإعداد ناتج مفيد باستخدام نتائج الطلب المقدَّمة كجزء من الطلب إلى النموذج اللغوي الأساسي التوليدي في Vertex AI.

لتحقيق ذلك، نخطّط لإنشاء ملف JSON يتضمّن نتائج البحث المستند إلى المتجهات، ثم استخدام ملف JSON الذي تم إنشاؤه كإضافة إلى طلب موجّه إلى نموذج لغوي كبير (LLM) نصي في Vertex AI لإنشاء ناتج مفيد. في الخطوة الأولى، ننشئ ملف JSON، ثم نختبره في Vertex AI Studio، وفي الخطوة الأخيرة، ندمجه في عبارة SQL يمكن استخدامها في أحد التطبيقات.

إنشاء الإخراج بتنسيق JSON

عدِّل الاستعلام لإنشاء الإخراج بتنسيق JSON وعرض صف واحد فقط ليتم تمريره إلى Vertex AI

في ما يلي مثال على طلب البحث:

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.

افتح Vertex AI Studio في Cloud Console.

da990882f3cdc204.png

قد يُطلب منك الموافقة على بنود الاستخدام إذا لم يسبق لك استخدامها. انقر على الزر "الموافقة والمتابعة"

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

30a8ba039e4375b3.png

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

في ما يلي الطلب الذي سنستخدمه مع ناتج JSON الخاص بالاستعلام الأوّلي حول الأشجار:

أنت مستشار ودود يساعد في العثور على منتج بناءً على احتياجات العميل.

استنادًا إلى طلب العميل، حمّلنا قائمة بالمنتجات ذات الصلة الوثيقة بعملية البحث.

القائمة بتنسيق JSON مع قائمة بالقيم مثل {"product_name":"name","description":"some description","sale_price":10,"zip_code": 10234, "produt_id": "02056727942aeb714dc9a2313654e1b0"}

إليك قائمة المنتجات:

{"product_name":"شجرة كرز","description":"هذه شجرة كرز جميلة ستنتج كرزًا لذيذًا. It is an d","sale_price":75.00,"zip_code":93230,"product_id":"d536e9e823296a2eba198e52dd23e712"}

سأل العميل "ما هي الشجرة التي تنمو بشكل أفضل هنا؟"

يجب تقديم معلومات عن المنتج والسعر وبعض المعلومات التكميلية

30fc2ddf0cd262f1.png

في ما يلي النتيجة عند تنفيذ الطلب باستخدام قيم JSON وباستخدام نموذج gemini-2.5-flash-light:

3eee2f7505748c91.png

في ما يلي الإجابة التي حصلنا عليها من النموذج في هذا المثال. يُرجى العِلم أنّ إجابتك قد تختلف بسبب التغييرات التي تطرأ على النموذج والمَعلمات بمرور الوقت:

"استنادًا إلى المنتجات المتوفّرة، إليك ما يمكنني إخبارك به عن "Cherry Tree":

المنتج: شجرة كرز

السعر: 75.00 دولار أمريكي

الوصف: هذه شجرة كرز جميلة ستنتج كرزًا لذيذًا.

لتحديد الشجرة التي "تنمو بشكل أفضل هنا"، أحتاج إلى مزيد من المعلومات. هل لديك أي أشجار أخرى مدرَجة يمكننا مقارنتها، أو هل هناك جانب محدّد من "النمو الأفضل" يهمّك (مثل النمو الأسرع أو إنتاج أكبر كمية من الفاكهة أو القدرة على تحمّل المناخ في منطقتك)؟"

تنفيذ الطلب في PSQL

يمكننا استخدام عملية الدمج بين AlloyDB AI وVertex AI للحصول على الردّ نفسه من نموذج توليدي باستخدام SQL مباشرةً في قاعدة البيانات. ولكن لاستخدام نموذج gemini-1.5-flash، علينا تسجيله أولاً.

تأكَّد من تثبيت إضافة google_ml_integration. يجب أن يكون الإصدار 1.4.2 أو إصدارًا أحدث.

اتّصِل بقاعدة بيانات quickstart_db من psql كما هو موضّح سابقًا (أو استخدِم AlloyDB Studio) ونفِّذ ما يلي:

SELECT extversion from pg_extension where extname='google_ml_integration';

تحقَّق من علامة قاعدة البيانات google_ml_integration.enable_model_support.

show google_ml_integration.enable_model_support;

الناتج المتوقّع من جلسة psql هو "on":

postgres=> show google_ml_integration.enable_model_support;
 google_ml_integration.enable_model_support 
--------------------------------------------
 on
(1 row)

إذا ظهرت القيمة "إيقاف"، علينا ضبط علامة قاعدة البيانات google_ml_integration.enable_model_support على "تفعيل". لتنفيذ ذلك، يمكنك استخدام واجهة وحدة تحكّم AlloyDB على الويب أو تشغيل أمر gcloud التالي.

PROJECT_ID=$(gcloud config get-value project)
REGION=us-central1
ADBCLUSTER=alloydb-aip-01
gcloud beta alloydb instances update $ADBCLUSTER-pr \
  --database-flags google_ml_integration.enable_model_support=on \
  --region=$REGION \
  --cluster=$ADBCLUSTER \
  --project=$PROJECT_ID \
  --update-mode=FORCE_APPLY

يستغرق تنفيذ الأمر في الخلفية من 3 إلى 5 دقائق تقريبًا. بعد ذلك، يمكنك تأكيد الإبلاغ مرة أخرى.

بالنسبة إلى طلب البحث، نحتاج إلى نموذجين. الأول هو نموذج text-embedding-005 المستخدَم حاليًا، والثاني هو أحد نماذج Google gemini العامة.

نبدأ بنموذج تضمين النص. لتسجيل عملية تنفيذ النموذج في psql أو AlloyDB Studio، استخدِم الرمز التالي:

CALL
  google_ml.create_model(
    model_id => 'text-embedding-005',
    model_provider => 'google',
    model_qualified_name => 'text-embedding-005',
    model_type => 'text_embedding',
    model_auth_type => 'alloydb_service_agent_iam',
    model_in_transform_fn => 'google_ml.vertexai_text_embedding_input_transform',
    model_out_transform_fn => 'google_ml.vertexai_text_embedding_output_transform');

والنموذج التالي الذي يجب تسجيله هو gemini-2.0-flash-001 الذي سيتم استخدامه لإنشاء النتائج سهلة الاستخدام.

CALL
  google_ml.create_model(
    model_id => 'gemini-2.5-flash',
    model_request_url => 'publishers/google/models/gemini-2.5-flash:streamGenerateContent',
    model_provider => 'google',
    model_auth_type => 'alloydb_service_agent_iam');

يمكنك دائمًا التحقّق من قائمة النماذج المسجّلة من خلال اختيار معلومات من google_ml.model_info_view.

select model_id,model_type from google_ml.model_info_view;

في ما يلي مثال على الناتج

quickstart_db=> select model_id,model_type from google_ml.model_info_view;
        model_id         |   model_type   
-------------------------+----------------
 textembedding-gecko     | text_embedding
 textembedding-gecko@001 | text_embedding
 text-embedding-005      | text_embedding
 gemini-2.5-flash        | generic
(4 rows)

يمكننا الآن استخدام JSON الذي تم إنشاؤه في طلب فرعي لتوفيره كجزء من الطلب إلى نموذج نصي للذكاء الاصطناعي التوليدي باستخدام 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
        json_array_elements(google_ml.predict_row( model_id =>'gemini-2.5-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
        string_agg(resp::text,
        ' ')
FROM
        response;

وفي ما يلي الناتج المتوقّع. قد يختلف الناتج حسب إصدار النموذج والمعلمات.:

"Hello there! I can certainly help you with finding a great fruit tree for your area.\n\nBased on what grows well, we have a wonderful **Cherry Tree** that could be a perfect fit!\n\nThis beautiful cherry tree is an excellent choice for producing delicious cherries right in your garden. It's an deciduous tree that typically" " grows to about 15 feet tall. Beyond its fruit, it offers lovely aesthetics with dark green leaves in the summer that transition to a beautiful red in the fall, making it great for shade and privacy too.\n\nCherry trees generally prefer a cool, moist climate and sandy soil, and they are best suited for USDA Zones" " 4-9. Given the zip code you're inquiring about (93230), which is typically in USDA Zone 9, this Cherry Tree should thrive wonderfully!\n\nYou can get this magnificent tree for just **$75.00**.\n\nLet me know if you have any other questions!" "

10. إنشاء فهرس متجهات

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

إنشاء فهرس ScaNN

لإنشاء فهرس SCANN، علينا تفعيل إضافة أخرى. توفّر لنا الإضافة alloydb_scann واجهة للتعامل مع فهرس متّجه من النوع ANN باستخدام خوارزمية Google ScaNN.

CREATE EXTENSION IF NOT EXISTS alloydb_scann;

الناتج المتوقّع:

quickstart_db=> CREATE EXTENSION IF NOT EXISTS alloydb_scann;
CREATE EXTENSION
Time: 27.468 ms
quickstart_db=> 

يمكننا الآن إنشاء الفهرس. في المثال التالي، سأترك معظم المَعلمات كإعدادات تلقائية وسأقدّم فقط عددًا من الأقسام (num_leaves) للفهرس:

CREATE INDEX cymbal_products_embeddings_scann ON cymbal_products
  USING scann (embedding cosine)
  WITH (num_leaves=31, max_num_levels = 2);

يمكنك الاطّلاع على معلومات حول ضبط مَعلمات الفهرس في المستندات.

الناتج المتوقّع:

quickstart_db=> CREATE INDEX cymbal_products_embeddings_scann ON cymbal_products
  USING scann (embedding cosine)
  WITH (num_leaves=31, max_num_levels = 2);
CREATE INDEX
quickstart_db=>

مقارنة الردود

يمكننا الآن تشغيل طلب البحث عن المتجهات في وضع EXPLAIN والتحقّق مما إذا تم استخدام الفهرس.

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=16.59..16.60 rows=1 width=32) (actual time=2.875..2.877 rows=1 loops=1)
-> Subquery Scan on trees (cost=8.42..16.59 rows=1 width=142) (actual time=2.860..2.862 rows=1 loops=1)
-> Limit (cost=8.42..16.58 rows=1 width=158) (actual time=2.855..2.856 rows=1 loops=1)
-> Nested Loop (cost=8.42..6489.19 rows=794 width=158) (actual time=2.854..2.855 rows=1 loops=1)
-> Nested Loop (cost=8.13..6466.99 rows=794 width=938) (actual time=2.742..2.743 rows=1 loops=1)
-> Index Scan using cymbal_products_embeddings_scann on cymbal_products cp (cost=7.71..111.99 rows=876 width=934) (actual time=2.724..2.724 rows=1 loops=1)
Order By: (embedding <=> '[0.008864171,0.03693164,-0.024245683,-0.00355923,0.0055611245,0.015985578,...<redacted>...5685,-0.03914233,-0.018452475,0.00826032,-0.07372604]'::vector)
-> Index Scan using walmart_inventory_pkey on cymbal_inventory ci (cost=0.42..7.26 rows=1 width=37) (actual time=0.015..0.015 rows=1 loops=1)
Index Cond: ((store_id = 1583) AND (uniq_id = (cp.uniq_id)::text))
...

من الناتج، يمكننا أن نرى بوضوح أنّ طلب البحث كان يستخدم "Index Scan using cymbal_products_embeddings_scann on cymbal_products".

وإذا نفّذنا الاستعلام بدون explain:

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":"Meyer Lemon Tree","description":"Meyer Lemon trees are California's favorite lemon tree! Grow your own lemons by ","sale_price":34,"zip_code":93230,"product_id":"02056727942aeb714dc9a2313654e1b0"}]

نلاحظ أنّ النتيجة مختلفة قليلاً، إذ لم يتم عرض شجرة الكرز التي كانت في أعلى نتائج البحث غير المفهرسة، بل تم عرض الخيار الثاني، أي شجرة ليمون ماير. وبالتالي، يقدّم لنا الفهرس أداءً جيدًا مع الحفاظ على دقة كافية لتحقيق نتائج جيدة.

يمكنك تجربة فهارس مختلفة متاحة للمتجهات والمزيد من المعامل والأمثلة مع دمج 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. تهانينا

تهانينا على إكمال هذا الدرس العملي.

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

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

13. استطلاع

إخراج:

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

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