1. مقدمه
در این کد لبه، نحوه استفاده از AlloyDB AI را با ترکیب جستجوی برداری با جاسازیهای Vertex AI خواهید آموخت.
پیش نیازها
- درک اولیه از Google Cloud، کنسول
- مهارت های اولیه در رابط خط فرمان و پوسته گوگل
چیزی که یاد خواهید گرفت
- نحوه استقرار خوشه AlloyDB و نمونه اولیه
- نحوه اتصال به AlloyDB از Google Compute Engine VM
- نحوه ایجاد پایگاه داده و فعال کردن AlloyDB AI
- نحوه بارگذاری اطلاعات در پایگاه داده
- نحوه استفاده از مدل جاسازی هوش مصنوعی Vertex در AlloyDB
- نحوه غنی سازی نتیجه با استفاده از مدل مولد Vertex AI
- نحوه بهبود عملکرد با استفاده از شاخص برداری
آنچه شما نیاز دارید
- یک حساب Google Cloud و پروژه Google Cloud
- یک مرورگر وب مانند کروم
2. راه اندازی و الزامات
تنظیم محیط خود به خود
- به Google Cloud Console وارد شوید و یک پروژه جدید ایجاد کنید یا از یک موجود استفاده مجدد کنید. اگر قبلاً یک حساب Gmail یا Google Workspace ندارید، باید یک حساب ایجاد کنید .
- نام پروژه نام نمایشی برای شرکت کنندگان این پروژه است. این یک رشته کاراکتری است که توسط API های Google استفاده نمی شود. همیشه می توانید آن را به روز کنید.
- شناسه پروژه در تمام پروژههای Google Cloud منحصربهفرد است و تغییرناپذیر است (پس از تنظیم نمیتوان آن را تغییر داد). Cloud Console به طور خودکار یک رشته منحصر به فرد تولید می کند. معمولاً برای شما مهم نیست که چیست. در اکثر کدها، باید شناسه پروژه خود را ارجاع دهید (معمولاً با نام
PROJECT_ID
شناخته می شود). اگر شناسه تولید شده را دوست ندارید، ممکن است یک شناسه تصادفی دیگر ایجاد کنید. از طرف دیگر، میتوانید خودتان را امتحان کنید، و ببینید آیا در دسترس است یا خیر. پس از این مرحله نمی توان آن را تغییر داد و در طول مدت پروژه باقی می ماند. - برای اطلاع شما، یک مقدار سوم وجود دارد، یک شماره پروژه ، که برخی از API ها از آن استفاده می کنند. در مورد هر سه این مقادیر در مستندات بیشتر بیاموزید.
- در مرحله بعد، برای استفاده از منابع Cloud/APIها باید صورتحساب را در کنسول Cloud فعال کنید . اجرا کردن از طریق این کد لبه هزینه زیادی نخواهد داشت. برای خاموش کردن منابع برای جلوگیری از تحمیل صورتحساب فراتر از این آموزش، میتوانید منابعی را که ایجاد کردهاید حذف کنید یا پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان 300 دلاری هستند.
Cloud Shell را راه اندازی کنید
در حالی که Google Cloud را می توان از راه دور از لپ تاپ شما کار کرد، در این کد لبه از Google Cloud Shell استفاده خواهید کرد، یک محیط خط فرمان که در Cloud اجرا می شود.
از Google Cloud Console ، روی نماد Cloud Shell در نوار ابزار بالا سمت راست کلیک کنید:
تهیه و اتصال به محیط فقط چند لحظه طول می کشد. وقتی تمام شد، باید چیزی شبیه به این را ببینید:
این ماشین مجازی با تمام ابزارهای توسعه که شما نیاز دارید بارگذاری شده است. این یک فهرست اصلی 5 گیگابایتی دائمی را ارائه می دهد و در Google Cloud اجرا می شود و عملکرد و احراز هویت شبکه را تا حد زیادی افزایش می دهد. تمام کارهای شما در این کد لبه را می توان در یک مرورگر انجام داد. شما نیازی به نصب چیزی ندارید.
3. قبل از شروع
فعال کردن API
خروجی:
در داخل Cloud Shell، مطمئن شوید که ID پروژه شما تنظیم شده است:
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 پیکربندی کنید. درباره مکانهای موجود برای Vertex AI بیشتر بخوانید. در مثال ما از منطقه us-central1 استفاده می کنیم.
gcloud config set compute/region us-central1
4. AlloyDB را مستقر کنید
قبل از ایجاد یک خوشه AlloyDB، ما به یک محدوده IP خصوصی در دسترس در VPC خود نیاز داریم تا توسط نمونه آینده AlloyDB استفاده شود. اگر آن را نداریم، باید آن را ایجاد کنیم، آن را اختصاص دهیم تا توسط سرویسهای داخلی گوگل استفاده شود و پس از آن میتوانیم خوشه و نمونه را ایجاد کنیم.
محدوده 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 برای خوشه خود ایجاد کنید. اگر اتصال شما قطع شده است، باید دوباره متغیرهای محیط نام منطقه و خوشه را تعریف کنید.
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 با استفاده از یک اتصال فقط خصوصی مستقر شده است، بنابراین ما به یک VM با سرویس گیرنده PostgreSQL نصب شده برای کار با پایگاه داده نیاز داریم.
GCE VM را مستقر کنید
یک GCE VM در همان منطقه و 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 Client را نصب کنید
نرم افزار مشتری PostgreSQL را روی ماشین مجازی مستقر شده نصب کنید
اتصال به VM:
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) ...
به Instance متصل شوید
با استفاده از psql از VM به نمونه اولیه متصل شوید.
در همان برگه Cloud Shell با جلسه SSH باز شده به instance-1 VM شما.
از مقدار مشخص شده کلمه عبور AlloyDB (PGPASSWORD) و شناسه خوشه AlloyDB برای اتصال به AlloyDB از GCE VM استفاده کنید:
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 را با استفاده از علامت "+" در بالا باز کنید.
در تب جدید پوسته ابری اجرا کنید:
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 و پسوندهای pgvector را در پایگاه داده فعال کنید.
در 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 نشان می دهد، دریافت کردیم. ما باید داده های برداری را بر اساس توضیحات برای محصولات خود محاسبه کنیم و می خواهیم از تعبیه تابع برای آن استفاده کنیم. با استفاده از تابع، میخواهیم از ادغام Vertex AI برای محاسبه دادههای برداری بر اساس توضیحات محصولات خود و اضافه کردن آن به جدول استفاده کنیم. شما می توانید اطلاعات بیشتری در مورد تکنولوژی مورد استفاده در مستندات بخوانید.
ایجاد ستون جاسازی
با استفاده از psql به پایگاه داده متصل شوید و با استفاده از تابع embedding در جدول cymbal_products یک ستون مجازی با داده های برداری ایجاد کنید. تابع embedding داده های برداری را از 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. Similarity Search را اجرا کنید
اکنون میتوانیم جستجوی خود را با استفاده از جستجوی شباهت بر اساس مقادیر برداری محاسبهشده برای توضیحات و مقدار برداری که برای درخواست خود دریافت میکنیم، اجرا کنیم.
پرس و جوی SQL را می توان از همان رابط خط فرمان psql یا به عنوان جایگزین، از استودیو AlloyDB اجرا کرد. هر خروجی چند ردیفه و پیچیده ممکن است در AlloyDB Studio بهتر به نظر برسد.
به AlloyDB Studio متصل شوید
در فصلهای بعدی، تمام دستورات SQL که نیاز به اتصال به پایگاه داده دارند را میتوان در استودیو AlloyDB اجرا کرد. برای اجرای دستور باید رابط کنسول وب را برای خوشه AlloyDB خود با کلیک بر روی نمونه اولیه باز کنید.
سپس روی AlloyDB Studio در سمت چپ کلیک کنید:
پایگاه داده quickstart_db، user postgres را انتخاب کنید و رمز عبوری را که هنگام ایجاد کلاستر ذکر شده است، ارائه دهید. سپس بر روی دکمه "Authenticate" کلیک کنید.
رابط AlloyDB Studio را باز می کند. برای اجرای دستورات در پایگاه داده، روی تب "Editor 1" در سمت راست کلیک کنید.
این رابط را باز می کند که در آن می توانید دستورات SQL را اجرا کنید
اگر ترجیح می دهید از خط فرمان psql استفاده کنید، مسیر جایگزین را دنبال کنید و همانطور که در فصل های قبلی توضیح داده شد، از جلسه VM SSH خود به پایگاه داده متصل شوید.
Similarity Search را از psql اجرا کنید
اگر جلسه دیتابیس شما قطع شد، دوباره با استفاده از psql یا استودیو AlloyDB به پایگاه داده متصل شوید.
اتصال به پایگاه داده:
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 تست می کنیم و در مرحله آخر آن را در یک دستور 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 تولید شده برای ارائه آن به عنوان بخشی از مدل متنی AI مولد در Vertex AI Studio استفاده کنیم.
Vertex AI Studio را در کنسول ابری باز کنید.
ممکن است از شما بخواهد API های اضافی را فعال کنید، اما می توانید درخواست را نادیده بگیرید. ما برای تکمیل آزمایشگاه خود به API اضافی نیاز نداریم.
در اینجا دستوری است که ما می خواهیم استفاده کنیم:
شما یک مشاور دوستانه هستید که به یافتن محصولی بر اساس نیازهای مشتری کمک می کنید.
بر اساس درخواست مشتری، ما لیستی از محصولاتی را بارگذاری کرده ایم که نزدیک به جستجو هستند.
فهرست در قالب JSON با فهرست مقادیری مانند {"product_name":"name", "description":"some description","sale_price":10,"zip_code": 10234, "produt_id": "02056727942aeb714dc9a2313654"}e1b
در اینجا لیست محصولات آمده است:
[مکانی برای JSON ما]
مشتری پرسید: چه درختی اینجا بهتر رشد می کند؟
شما باید اطلاعات مربوط به محصول، قیمت و برخی اطلاعات تکمیلی را در صورت درخواست ارائه دهید
و زمانی که دستور را با مقادیر JSON خود و با استفاده از مدل gemini-1.5-flash اجرا می کنیم، نتیجه این است:
پاسخی که از مدل در این مثال گرفتیم به شرح زیر است. توجه داشته باشید که پاسخ شما ممکن است به دلیل تغییر مدل و پارامترها در طول زمان متفاوت باشد:
"من می بینم که شما به دنبال درختی هستید که در منطقه خود رشد کند. بر اساس کد پستی شما، 93230، درخت گیلاس گزینه عالی به نظر می رسد!
این درخت به عنوان یک درخت زیبا توصیف شده است که گیلاس های خوشمزه تولید می کند. در حال حاضر با قیمت 75.00 دلار به فروش می رسد.
در حالی که من جزئیات خاصی در مورد میزان رشد آن در منطقه شما ندارم، می توانم به شما بگویم که درختان گیلاس عموماً خاک با زهکشی خوب و آفتاب کامل را ترجیح می دهند.
برای اطمینان از بهترین نتایج، توصیه میکنم با یک متخصص باغبانی یا مهد کودک محلی مشورت کنید که میتواند توصیههای مناسبتری را برای موقعیت مکانی خاص و شرایط خاک شما ارائه دهد. آنها همچنین می توانند به شما کمک کنند تا بهترین تنوع را برای نیازهای خود انتخاب کنید و نکاتی در مورد کاشت و مراقبت ارائه دهند."
دستور را در PSQL اجرا کنید
ما میتوانیم از ادغام AlloyDB AI با 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 تولید شده در یک جستوجو فرعی برای ارائه آن به عنوان بخشی از مدل متنی AI مولد با استفاده از 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 رابط کاربری را برای کار با شاخص برداری نوع ANN با استفاده از الگوریتم Google ScaNN فراهم می کند.
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
خروجی مورد انتظار:
quickstart_db=> CREATE EXTENSION IF NOT EXISTS alloydb_scann; CREATE EXTENSION Time: 27.468 ms quickstart_db=>
حالا می توانیم ایندکس را ایجاد کنیم. در مثال زیر اکثر پارامترها را به عنوان پیش فرض می گذارم و فقط تعدادی پارتیشن (num_leaves) برای ایندکس ارائه می کنم:
CREATE INDEX cymbal_products_embeddings_scann ON cymbal_products
USING scann (embedding cosine)
WITH (num_leaves=31, max_num_levels = 2);
شما می توانید در مورد پارامترهای شاخص تنظیم در اسناد مطالعه کنید.
خروجی مورد انتظار:
quickstart_db=> CREATE INDEX cymbal_products_embeddings_scann ON cymbal_products USING scann (embedding cosine) WITH (num_leaves=31, max_num_levels = 2); CREATE INDEX quickstart_db=>
مقایسه پاسخ
اکنون می توانیم پرس و جو جستجوی برداری را در حالت EXPLAIN اجرا کنیم و بررسی کنیم که آیا از ایندکس استفاده شده است یا خیر.
EXPLAIN (analyze)
WITH trees as (
SELECT
cp.product_name,
left(cp.product_description,80) as description,
cp.sale_price,
cs.zip_code,
cp.uniq_id as product_id
FROM
cymbal_products cp
JOIN cymbal_inventory ci on
ci.uniq_id=cp.uniq_id
JOIN cymbal_stores cs on
cs.store_id=ci.store_id
AND ci.inventory>0
AND cs.store_id = 1583
ORDER BY
(cp.embedding <=> embedding('text-embedding-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))
از خروجی میتوانیم به وضوح ببینیم که پرسوجو از "Index Scan using cymbal_products_embeddings_scann on 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"}]
میتوانیم ببینیم که نتیجه کمی متفاوت است و نه درخت گیلاس که در جستجوی ما در بالای صفحه بدون فهرست بود، بلکه انتخاب دوم درخت لیمو مایر را برمیگردانیم. بنابراین این شاخص به ما عملکردی می دهد اما هنوز به اندازه کافی دقیق است که نتایج خوبی ارائه دهد.
میتوانید نمایههای مختلف موجود برای بردارها و آزمایشگاهها و نمونههای بیشتری را با ادغام زنجیرهای که در صفحه مستندات موجود است، امتحان کنید.
11. محیط را تمیز کنید
پس از اتمام کار با آزمایشگاه، نمونه ها و خوشه های AlloyDB را نابود کنید
خوشه AlloyDB و همه نمونه ها را حذف کنید
خوشه با نیروی گزینه از بین می رود که همچنین تمام نمونه های متعلق به خوشه را حذف می کند.
در پوسته ابری، متغیرهای پروژه و محیط را تعریف کنید، اگر اتصال شما قطع شده و تمام تنظیمات قبلی از بین رفته است:
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.
حالا می توانیم VM خود را نابود کنیم
GCE VM را حذف کنید
در 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 VM
- نحوه ایجاد پایگاه داده و فعال کردن AlloyDB AI
- نحوه بارگذاری اطلاعات در پایگاه داده
- نحوه استفاده از مدل جاسازی هوش مصنوعی Vertex در AlloyDB
- نحوه غنی سازی نتیجه با استفاده از مدل مولد Vertex AI
- نحوه بهبود عملکرد با استفاده از شاخص برداری
13. نظرسنجی
خروجی: