1. مقدمة
في هذا الدرس التطبيقي حول الترميز، ستتعرّف على كيفية استخدام تكنولوجيات الذكاء الاصطناعي في AlloyDB من خلال الجمع بين البحث عن المتّجهات وعمليات التضمين في Vertex AI.
المتطلبات الأساسية
- فهم أساسي لواجهة Google Cloud Console
- المهارات الأساسية في واجهة سطر الأوامر و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. ويمكنك تعديلها في أي وقت.
- يكون معرّف المشروع فريدًا في جميع مشاريع 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 و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 للمجموعة في جلسة 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 باستخدام الرمز "+" في أعلى الصفحة.
في علامة تبويب shell الجديدة في السحابة الإلكترونية، نفِّذ ما يلي:
PROJECT_ID=$(gcloud config get-value project)
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"
الناتج المتوقّع في وحدة التحكّم:
student@cloudshell:~ (test-project-001-402417)$ PROJECT_ID=$(gcloud config get-value project) Your active configuration is: [cloudshell-11039] student@cloudshell:~ (test-project-001-402417)$ gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \ --role="roles/aiplatform.user" Updated IAM policy for project [test-project-001-402417]. bindings: - members: - serviceAccount:service-4470404856@gcp-sa-alloydb.iam.gserviceaccount.com role: roles/aiplatform.user - members: ... etag: BwYIEbe_Z3U= version: 1
يمكنك إغلاق علامة التبويب باستخدام الأمر التنفيذي "exit" في علامة التبويب:
exit
إنشاء قاعدة بيانات
إنشاء قاعدة بيانات سريعة
في جلسة جهاز GCE الظاهري، نفِّذ ما يلي:
إنشاء قاعدة بيانات:
psql "host=$INSTANCE_IP user=postgres" -c "CREATE DATABASE quickstart_db"
الناتج المتوقّع في وحدة التحكّم:
student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres" -c "CREATE DATABASE quickstart_db" CREATE DATABASE student@instance-1:~$
تفعيل دمج Vertex AI
فعِّل دمج Vertex AI وإضافات pgvector في قاعدة البيانات.
في جهاز GCE الظاهري، نفِّذ ما يلي:
psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE"
psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "CREATE EXTENSION IF NOT EXISTS vector"
الناتج المتوقّع في وحدة التحكّم:
student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE" psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "CREATE EXTENSION IF NOT EXISTS vector" CREATE EXTENSION CREATE EXTENSION student@instance-1:~$
استيراد البيانات
نزِّل البيانات المُعدّة واستورِدها إلى قاعدة البيانات الجديدة.
في جهاز GCE الظاهري، نفِّذ ما يلي:
gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_demo_schema.sql |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"
gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_products.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_products from stdin csv header"
gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_inventory.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_inventory from stdin csv header"
gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_stores.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_stores from stdin csv header"
الناتج المتوقّع في وحدة التحكّم:
student@instance-1:~$ gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_demo_schema.sql |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" SET SET SET SET SET set_config ------------ (1 row) SET SET SET SET SET SET CREATE TABLE ALTER TABLE CREATE TABLE ALTER TABLE CREATE TABLE ALTER TABLE CREATE TABLE ALTER TABLE CREATE SEQUENCE ALTER TABLE ALTER SEQUENCE ALTER TABLE ALTER TABLE ALTER TABLE student@instance-1:~$ gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_products.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_products from stdin csv header" COPY 941 student@instance-1:~$ gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_inventory.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_inventory from stdin csv header" COPY 263861 student@instance-1:~$ gsutil cat gs://cloud-training/gcc/gcc-tech-004/cymbal_stores.csv |psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db" -c "\copy cymbal_stores from stdin csv header" COPY 4654 student@instance-1:~$
7- احتساب عمليات التضمين
بعد استيراد البيانات، حصلنا على بيانات المنتجات في جدول cymbal_products، والمستودع الذي يعرض عدد المنتجات المتوفّرة في كل متجر في جدول cymbal_inventory وقائمة المتاجر في جدول cymbal_stores. نحتاج إلى احتساب بيانات المتجهات استنادًا إلى أوصاف منتجاتنا، وسنستخدم الدالة embedding لذلك. باستخدام الدالة، سنستخدم عملية دمج Vertex AI لاحتساب بيانات المتّجهات استنادًا إلى أوصاف منتجاتنا وإضافتها إلى الجدول. يمكنك الاطّلاع على مزيد من المعلومات حول التكنولوجيا المستخدَمة في المستندات.
إنشاء عمود التضمين
اتصل بقاعدة البيانات باستخدام psql وأنشئ عمودًا افتراضيًا يحتوي على بيانات المتجهات باستخدام دالة التضمين في جدول cymbal_products. تعرض دالة التضمين بيانات متجهات من Vertex AI استنادًا إلى البيانات المقدَّمة من عمود product_description.
psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"
في جلسة psql بعد الاتصال بقاعدة البيانات، نفِّذ ما يلي:
ALTER TABLE cymbal_products ADD COLUMN embedding vector(768) GENERATED ALWAYS AS (embedding('text-embedding-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 الذي تم إنشاؤه كإضافة إلى طلب لنموذج معالجة لغوية كبيرة للنصوص في 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، يبدو أنّ Cherry Tree هو خيار رائع.
يُوصف هذا النوع من الأشجار بأنّه شجرة جميلة تنتج كرزًا لذيذًا. وهو متوفّر حاليًا بسعر مخفَّض يبلغ 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 هو "on":
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".
وإذا أجرينا الاستعلام بدون explain:
WITH trees as (
SELECT
cp.product_name,
left(cp.product_description,80) as description,
cp.sale_price,
cs.zip_code,
cp.uniq_id as product_id
FROM
cymbal_products cp
JOIN cymbal_inventory ci on
ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
cs.store_id=ci.store_id
AND ci.inventory>0
AND cs.store_id = 1583
ORDER BY
(cp.embedding <=> embedding('text-embedding-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"}]
نرى أنّ النتيجة مختلفة قليلاً، ولا تعرض شجرة الكرز التي كانت في الصدارة في بحثنا بدون فهرس، بل الخيار الثاني وهو شجرة الليمون. وبالتالي، يقدّم لنا المؤشر أداءً جيدًا، ولكنه لا يزال دقيقًا بما يكفي لتحقيق نتائج جيدة.
يمكنك تجربة الفهارس المختلفة المتاحة للمتجهات والمزيد من التجارب والأمثلة مع دمج سلاسل النصوص في صفحة المستندات.
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. تهانينا
تهانينا على إكمال دورة codelab.
المواضيع التي تناولناها
- كيفية نشر مجموعة AlloyDB والمثيل الأساسي
- كيفية الاتصال بقاعدة بيانات AlloyDB من جهاز Google Compute Engine الافتراضي
- كيفية إنشاء قاعدة بيانات وتفعيل ميزة AlloyDB AI
- كيفية تحميل البيانات إلى قاعدة البيانات
- كيفية استخدام نموذج إدراج Vertex AI في AlloyDB
- كيفية تحسين النتيجة باستخدام النموذج التوليدي في Vertex AI
- كيفية تحسين الأداء باستخدام فهرس المتجهات
13. استطلاع
إخراج: