1. مقدمة
ستتعلّم في هذا الدرس التطبيقي كيفية استخدام AIDB AI من خلال دمج البحث المتجه مع تضمينات Vertex AI.
المتطلبات الأساسية
- الإلمام بأساسيات Google Cloud ووحدة التحكم
- المهارات الأساسية في واجهة سطر الأوامر وgoogle Shell
المعلومات التي ستطّلع عليها
- كيفية نشر مجموعة AlloyDB والمثيل الأساسي
- كيفية الاتصال بـ AlloyDB من جهاز افتراضي في Google Compute Engine
- كيفية إنشاء قاعدة بيانات وتفعيل ميزة AlloyDB AI
- كيفية تحميل البيانات إلى قاعدة البيانات
- كيفية استخدام نموذج إدراج Vertex AI في AlloyDB
- كيفية تحسين النتيجة باستخدام النموذج التوليدي في Vertex AI
- كيفية تحسين الأداء باستخدام فهرس المتجه
المتطلبات
- حساب على 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.
حدِّد كلمة المرور لمستخدم postgres. يمكنك تحديد كلمة المرور الخاصة بك أو استخدام دالة عشوائية لإنشاء كلمة مرور
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 وaloydb-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 للمجموعة في جلسة 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 افتراضي
أنشئ جهازًا افتراضيًا على Google Compute Engine في المنطقة وشبكة VPC نفسها اللتين تتوفّر فيهما مجموعة AlloyDB.
نفِّذ ما يلي في Cloud Shell:
export ZONE=us-central1-a
gcloud compute instances create instance-1 \
--zone=$ZONE \
--create-disk=auto-delete=yes,boot=yes,image=projects/debian-cloud/global/images/$(gcloud compute images list --filter="family=debian-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 المفتوحة على جهازك الافتراضي المثيل-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
فعِّل دمج 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 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(768) 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(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 من خلال النقر على المثيل الأساسي.
بعد ذلك، انقر على AlloyDB Studio على اليمين:
اختَر قاعدة بيانات quickstart_db ومستخدِم postgres وأدخِل كلمة المرور التي تم تدوينها عند إنشاء المجموعة. بعد ذلك، انقر على الزر "مصادقة".
سيؤدي ذلك إلى فتح واجهة AlloyDB Studio. لتنفيذ الأوامر في قاعدة البيانات، انقر على علامة التبويب "المحرِّر 1" على يسار الصفحة.
يفتح واجهة حيث يمكنك تشغيل أوامر SQL
إذا كنت تفضّل استخدام سطر الأوامر 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-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.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-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 في وحدة تحكّم السحابة الإلكترونية.
قد يطلب منك تفعيل واجهات برمجة تطبيقات إضافية، ولكن يمكنك تجاهل الطلب. لا نحتاج إلى أي واجهات برمجة تطبيقات إضافية لإكمال الدرس.
في ما يلي الطلب الذي سنستخدمه:
أنت مستشار ودود يساعد في العثور على منتج استنادًا إلى احتياجات العميل.
استنادًا إلى طلب العميل، حمّلنا قائمة بالمنتجات ذات الصلة ارتباطًا وثيقًا بموضوع البحث.
القائمة بتنسيق 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 مع Vertex AI للحصول على الردّ نفسه من نموذج توليدي باستخدام SQL مباشرةً في قاعدة البيانات. ولكن لاستخدام نموذج gemini-1.5-flash، علينا تسجيله أولاً.
ترقية الإضافة إلى الإصدار 1.4.1 (إذا كان الإصدار الحالي أقل) يمكنك الربط بقاعدة بيانات Quickstart_db من psql كما هو موضَّح من قبل (أو استخدام تطبيق AlloyDB Studio) وتنفيذ ما يلي:
SELECT extversion from pg_extension where extname='google_ml_integration';
إذا كانت القيمة التي تم عرضها أقل من 1.4.1، يجب تنفيذ ما يلي:
ALTER EXTENSION google_ml_integration UPDATE TO '1.4.1';
بعد ذلك، علينا ضبط علامة قاعدة بيانات 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 دقائق تقريبًا. بعد ذلك، يمكنك التحقّق من العلامة الجديدة في جلسة 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-002 والذي سيتم استخدامه لإنشاء نتائج سهلة الاستخدام.
CALL
google_ml.create_model(
model_id => 'gemini-1.5-flash-002',
model_request_url => 'https://$REGION-aiplatform.googleapis.com/v1/projects/$PROJECT_ID/locations/$REGION/publishers/google/models/gemini-1.5-flash-002: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-002',
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;
وهذا هو الناتج المتوقع. قد تختلف مخرجاتك بناءً على إصدار النموذج والمعلمات.:
"That" "'s a great question! Based on your location (assuming you're" " in zip code 93230), I have a suggestion for a" " fruit tree that should thrive.\n\nWe have the **Cherry Tree** available.\n\n**Product Name:** Cherry Tree\n\n**Description:** This is a beautiful cherry" " tree that will produce delicious cherries. It's a deciduous tree (meaning it loses its leaves in the fall) growing to about 15 feet tall." " The leaves are dark green in summer, turning a beautiful red in the fall. Cherry trees are known for their beauty, shade, and privacy.\n\n**Sale Price:** $75.00\n\n**Important Considerations for Growing" " Cherry Trees:**\n\n* **Climate:** Cherry trees prefer a cool, moist climate, and 93230 falls within a suitable range (USDA zones 4-9). However, it's always a good idea to" " check the specific microclimate of your property (sun exposure, drainage etc.).\n* **Soil:** They do best in sandy soil. If your soil is different, you may need to amend it to improve drainage.\n* **Pollination:** Many cherry varieties require a second, compatible cherry tree for proper pollination" ". Check the specific pollination needs of this variety before purchase if you want a significant cherry yield.\n\nThis cherry tree is a beautiful addition to any yard and will provide you with delicious cherries if you can meet its needs. Would you like to know more about its pollination requirements, or perhaps see if we have any other" " fruit trees suitable for your area?\n" ""
10. إنشاء فهرس المتجهات
مجموعة البيانات لدينا صغيرة جدًا ويعتمد وقت الاستجابة بشكل أساسي على التفاعل مع نماذج الذكاء الاصطناعي. ولكن عندما يكون لديك الملايين من المتجهات، يمكن لجزء بحث المتجه أن يأخذ جزءًا كبيرًا من وقت الاستجابة لدينا ويضع عبئًا كبيرًا على النظام. لتحسين ذلك، يمكننا إنشاء فهرس على أساس المتجهات.
إنشاء فهرس ScaNN
لإنشاء فهرس SCANN، نحتاج إلى تفعيل إضافة أخرى. تقدّم لنا إضافة alloydb_scann واجهة للعمل مع فهرس متّجهات نوع الشبكات العصبية الاصطناعية باستخدام خوارزمية 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-004','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))
من الإخراج، يمكننا أن نرى بوضوح أنّ طلب البحث كان يستخدم "فهرسة المسح باستخدام cymbal_products_embeddings_scann على cymbal_products".
وإذا قمنا بتشغيل الاستعلام دون شرح:
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;
الناتج المتوقّع:
[{"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 وجميع المثيلات
يتمّ إتلاف المجموعة باستخدام الخيار 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. استطلاع
إخراج: