بدء استخدام ميزة تضمين المتجهات باستخدام الذكاء الاصطناعي من AlloyDB

1. مقدمة

ستتعلّم في هذا الدرس التطبيقي كيفية استخدام AIDB AI من خلال دمج البحث المتجه مع تضمينات Vertex AI.

17e86406ab251142.png

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

  • الإلمام بأساسيات Google Cloud ووحدة التحكم
  • المهارات الأساسية في واجهة سطر الأوامر وgoogle Shell

المعلومات التي ستطّلع عليها

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

المتطلبات

  • حساب على 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 في شريط الأدوات العلوي الأيسر:

55efc1aaa7a4d3ad.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.

تحديد كلمة المرور لمستخدم Postgrs. يمكنك تحديد كلمة المرور الخاصة بك أو استخدام دالة عشوائية لإنشاء كلمة مرور

export PGPASSWORD=`openssl rand -hex 12`

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

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

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

echo $PGPASSWORD

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

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

حدِّد المنطقة واسم مجموعة 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

يمكنك إنشاء مثيل أساسي في 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:~$ 

ثبِّت البرنامج الذي يشغِّل الأمر داخل الجهاز الافتراضي (VM):

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 المفتوحة على جهازك الافتراضي المثيل-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 VM، نفِّذ ما يلي:

إنشاء قاعدة البيانات:

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 Integration

تفعيل دمج Vertex AI وإضافات pgect في قاعدة البيانات

في GCE VM، التنفيذ:

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 VM، التنفيذ:

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 GENERATED ALWAYS AS (embedding('text-embedding-004',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 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. لتشغيل الأوامر في قاعدة البيانات، انقر فوق "Editor 1" (المحرر 1) على اليمين.

b36c28f8165119ca.png

يفتح واجهة حيث يمكنك تشغيل أوامر SQL

cf43aa20f292797e.png

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

تشغيل ميزة البحث المشابه من 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-004','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-004','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.287184013172779
 Toyon               | This is a beautiful toyon tree that can grow to be over 20 feet tall. It is an e |      10.00 |    93230 | 0.30574073611569963
 Secateurs           | These secateurs are perfect for pruning small branches and vines.                |      15.00 |    93230 |  0.3264385326189635
 Trimming Shears     | These trimming shears are perfect for trimming hedges and bushes.                |      20.00 |    93230 | 0.33293036535756393
 Cypress Tree        | This is a beautiful cypress tree that will provide shade and privacy. It is an e |      75.00 |    93230 | 0.33485770716129326
 Madrone             | This is a beautiful madrona tree that can grow to be over 80 feet tall. It is an |      50.00 |    93230 |  0.3354408801293012
 California Redwood  | This is a beautiful redwood tree that can grow to be over 300 feet tall. It is a |    1000.00 |    93230 |  0.3427243109636263
 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.3427628377929176
 California Sycamore | This is a beautiful sycamore tree that can grow to be over 100 feet tall. It is  |     300.00 |    93230 |  0.3430208475356905
 Maple Tree          | This is a beautiful maple tree that will produce colorful leaves in the fall. It |     100.00 |    93230 |  0.3432609589330091
(10 rows)

quickstart_db=> 

9. تحسين الاستجابة

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

لتحقيق ذلك، نخطط لإنشاء ملف 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-004','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.

e514b176aef7945e.png

54712e5ade7121f.png

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

إليك الطلب الذي سنستخدمه:

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

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

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

في ما يلي قائمة المنتجات:

[مكان مخصّص لـ JSON]

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

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

وإليك النتيجة عند تشغيل الطلب بقيم JSON واستخدام نموذج gemini-1.5-flash:

30e5072cd2975685.png

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

"أرى أنّك تبحث عن شجرة تزدهر في منطقتك. استنادًا إلى الرمز البريدي، 93230، تبدو شجرة الكرز خيارًا رائعًا!

يُوصَف بأنه شجرة جميلة تُنتج كرز كرز لذيذ. هَذَا الْخِيَارْ مُتَوَفِّرٌ الْآنْ بِسِعْرْ 75.00$.

ليس لدي تفاصيل محددة عن معدل نموها في منطقتك، ولكن يمكنني أن أخبرك أن أشجار الكرز بشكل عام تفضل بشكل عام التربة المجففة جيدًا والشمس الكاملة.

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

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

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

عليك ترقية الإضافة إلى الإصدار 1.3. يمكنك الربط بقاعدة بيانات Quickstart_db من pSQL كما هو موضَّح من قبل (أو استخدام تطبيق AlloyDB Studio) وتنفيذ ما يلي:

ALTER EXTENSION google_ml_integration UPDATE TO '1.3'

ثم نحتاج إلى تعيين علامة قاعدة البيانات google_ml_integration.enable_model_support على "on". لتنفيذ ذلك، يمكنك استخدام واجهة وحدة التحكّم على الويب في تطبيق 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 دقائق تقريبًا. بعد ذلك، يمكنك التحقّق من العلامة الجديدة في جلسة psql أو باستخدام AlloyDB Studio للاتصال بقاعدة بيانات Quickstart_db.

show google_ml_integration.enable_model_support;

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

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

ثم نحتاج إلى تسجيل نموذجين. النوع الأول هو نموذج text-embedding-004 المستخدَم حاليًا. يجب أن يكون مسجَّلاً بما أننا فعّلنا إمكانات تسجيل النموذج.

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

CALL
  google_ml.create_model(
    model_id => 'text-embedding-004',
    model_provider => 'google',
    model_qualified_name => 'text-embedding-004',
    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-1.5-flash-001 والذي سيتم استخدامه لإنشاء نتائج سهلة الاستخدام.

CALL
  google_ml.create_model(
    model_id => 'gemini-1.5-flash-001',
    model_request_url => 'https://$REGION-aiplatform.googleapis.com/v1/projects/$PROJECT_ID/locations/$REGION/publishers/google/models/gemini-1.5-flash-001: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-004      | text_embedding
 gemini-1.5-flash-001    | 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-004',
        '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-1.5-flash-001',
        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;

وهذا هو الناتج المتوقع. قد تختلف مخرجاتك بناءً على إصدار النموذج والمعلمات.:

--------------------------------------------------------------------------------------------------------
 "I" " see you're interested in fruit trees! Based on your location, I found" " one great option:\n\n**Cherry Tree:** \n\nThis beautiful cherry tree will" " produce delicious cherries. It's a deciduous tree, meaning it loses its leaves in the fall, and can grow up to 15 feet tall. The" " leaves are a vibrant dark green in the summer, turning a beautiful red in the fall. \n\nCherry trees are known for their beauty and ability to provide shade" " and privacy. They prefer a cool, moist climate and sandy soil, making them a good fit for your area. \n\nThe Cherry Tree is currently on sale for $75.00.\n\nWould you like to know more about" " the Cherry Tree, or are you interested in exploring other fruit tree options? \n" ""
(1 row)

10. تنظيف البيئة

يمكنك تدمير مثيلات AlloyDB وتجميعها عند الانتهاء من التمرين المعملي.

حذف مجموعة AlloyDB وجميع المثيلات

يتم إتلاف المجموعة باستخدام فرض الخيار الذي يؤدي أيضًا إلى حذف جميع النُسخ الافتراضية التي تنتمي إلى المجموعة.

في 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 

11. تهانينا

تهانينا على إكمال الدرس التطبيقي حول الترميز.

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

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

12. استطلاع

إخراج:

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

قراءته فقط اقرأها وأكمِل التمارين