1. مقدمة
ستتعلّم في هذا الدرس التطبيقي كيفية استخدام AIDB AI من خلال دمج البحث المتجه مع تضمينات Vertex AI.
المتطلبات الأساسية
- الإلمام بأساسيات Google Cloud ووحدة التحكم
- المهارات الأساسية في واجهة سطر الأوامر وgoogle Shell
المعلومات التي ستطّلع عليها
- كيفية نشر مجموعة AlloyDB والمثيل الأساسي
- كيفية الاتصال بـ AlloyDB من جهاز افتراضي في Google Compute Engine
- كيفية إنشاء قاعدة بيانات وتفعيل تقنيات الذكاء الاصطناعي في تطبيق AlloyDB
- كيفية تحميل البيانات إلى قاعدة البيانات
- كيفية استخدام نموذج تضمين Vertex AI في AlloyDB
- طريقة تحسين النتيجة باستخدام نموذج Vertex المستنِد إلى الذكاء الاصطناعي التوليدي
المتطلبات
- حساب على Google Cloud ومشروع على Google Cloud
- متصفّح ويب، مثل Chrome
2. الإعداد والمتطلبات
إعداد بيئة ذاتية
- سجِّل الدخول إلى Google Cloud Console وأنشئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.
- اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها Google APIs. ويمكنك تعديلها في أي وقت.
- يكون رقم تعريف المشروع فريدًا في جميع مشاريع Google Cloud وغير قابل للتغيير (لا يمكن تغييره بعد تحديده). تنشئ Cloud Console سلسلة فريدة تلقائيًا. فعادةً لا تهتم بما هو. في معظم الدروس التطبيقية حول الترميز، يجب الإشارة إلى رقم تعريف المشروع (الذي يتم تحديده عادةً على أنّه
PROJECT_ID
). وإذا لم يعجبك رقم التعريف الذي تم إنشاؤه، يمكنك إنشاء رقم تعريف عشوائي آخر. ويمكنك بدلاً من ذلك تجربة طلبك الخاص ومعرفة ما إذا كان متاحًا. ولا يمكن تغييره بعد هذه الخطوة ويبقى طوال مدة المشروع. - لمعلوماتك، هناك قيمة ثالثة، وهي رقم المشروع، الذي تستخدمه بعض واجهات برمجة التطبيقات. اطّلِع على مزيد من المعلومات حول هذه القيم الثلاث في المستندات.
- بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام الموارد/واجهات برمجة التطبيقات في Cloud. لن يؤدي إكمال هذا الدرس التطبيقي حول الترميز إلى فرض أي تكاليف، إن وُجدت. لإيقاف تشغيل الموارد لتجنب تحمُّل الفواتير إلى ما هو أبعد من هذا البرنامج التعليمي، يمكنك حذف الموارد التي أنشأتها أو حذف المشروع. يكون مستخدمو Google Cloud الجدد مؤهَّلون للانضمام إلى برنامج فترة تجريبية مجانية بقيمة 300 دولار أمريكي.
بدء Cloud Shell
مع أنّه يمكن إدارة Google Cloud عن بُعد من الكمبيوتر المحمول، ستستخدم في هذا الدرس التطبيقي Google Cloud Shell، وهي بيئة سطر أوامر يتم تشغيلها في السحابة الإلكترونية.
من Google Cloud Console، انقر على رمز Cloud Shell في شريط الأدوات العلوي الأيسر:
من المفترَض أن تستغرق عملية إدارة الحسابات والاتصال بالبيئة بضع لحظات فقط. عند الانتهاء، من المفترض أن يظهر لك شيء مثل هذا:
يتم تحميل هذه الآلة الافتراضية مزوّدة بكل أدوات التطوير التي ستحتاج إليها. وتوفّر هذه الشبكة دليلاً رئيسيًا دائمًا بسعة 5 غيغابايت وتعمل على Google Cloud، ما يحسّن بشكل كبير من أداء الشبكة والمصادقة. يمكنك تنفيذ جميع أعمالك في هذا الدرس التطبيقي حول الترميز من خلال متصفّح. لا تحتاج إلى تثبيت أي تطبيقات.
3- قبل البدء
تفعيل واجهة برمجة التطبيقات
إخراج:
داخل Cloud Shell، تأكَّد من إعداد رقم تعريف مشروعك:
gcloud config set project [YOUR-PROJECT-ID]
تعيين متغير البيئة PROJECT_ID:
PROJECT_ID=$(gcloud config get-value project)
تفعيل جميع الخدمات اللازمة:
gcloud services enable 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 باستخدام العلامة "+". في أعلى الصفحة
في علامة تبويب 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 من خلال النقر على المثيل الأساسي.
بعد ذلك، انقر على AlloyDB Studio على اليمين:
اختر قاعدة بيانات Quickstart_db وPostgres للمستخدم وقدّم كلمة المرور التي ظهرت عند إنشاء المجموعة. ثم انقر على "مصادقة" .
سيتم فتح واجهة AlloyDB Studio. لتشغيل الأوامر في قاعدة البيانات، انقر فوق "Editor 1" (المحرر 1) على اليمين.
يفتح واجهة حيث يمكنك تشغيل أوامر SQL
إذا كنت تفضّل استخدام سطر الأوامر 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.
قد يطلب منك تفعيل واجهات برمجة تطبيقات إضافية، ولكن يمكنك تجاهل الطلب. لا نحتاج إلى أي واجهات برمجة تطبيقات إضافية لإكمال الدرس.
إليك الطلب الذي سنستخدمه:
أنت مستشار ودود يساعد في العثور على منتج استنادًا إلى احتياجات العميل.
استنادًا إلى طلب العميل، حمّلنا قائمة بالمنتجات ذات الصلة بالبحث.
القائمة بتنسيق JSON مع قائمة قيم مثل {"product_name":"name","description":"some description","sale_price":10,"zip_code": 10234, "produt_id": "02056727942aeb714dc9a2313654e1b0"}
في ما يلي قائمة المنتجات:
[مكان مخصّص لـ JSON]
سأل العميل: "ما هي أفضل شجرة تنمو هنا؟"
يجب تقديم معلومات عن المنتج والسعر وبعض المعلومات التكميلية." كطلب
وإليك النتيجة عند تشغيل الطلب بقيم JSON واستخدام نموذج gemini-1.5-flash:
في ما يلي الإجابة التي حصلنا عليها من النموذج في هذا المثال. يُرجى العِلم أنّ إجابتك قد تكون مختلفة بسبب التغييرات في النموذج والمعلَمات بمرور الوقت:
"أرى أنّك تبحث عن شجرة تزدهر في منطقتك. استنادًا إلى الرمز البريدي، 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. استطلاع
إخراج: