شروع کار با Vector Embeddings با AlloyDB AI

1. معرفی

در این کد لبه، نحوه استفاده از AlloyDB AI را با ترکیب جستجوی برداری با جاسازی‌های Vertex AI خواهید آموخت.

17e86406ab251142.png

پیش نیازها

  • درک اولیه از Google Cloud، کنسول
  • مهارت های اولیه در رابط خط فرمان و پوسته گوگل

چیزی که یاد خواهید گرفت

  • نحوه استقرار خوشه AlloyDB و نمونه اولیه
  • نحوه اتصال به AlloyDB از Google Compute Engine VM
  • نحوه ایجاد پایگاه داده و فعال کردن AlloyDB AI
  • نحوه بارگذاری اطلاعات در پایگاه داده
  • نحوه استفاده از مدل جاسازی هوش مصنوعی Vertex در AlloyDB
  • نحوه غنی سازی نتیجه با استفاده از مدل مولد Vertex AI

آنچه شما نیاز دارید

  • یک حساب Google Cloud و پروژه Google Cloud
  • یک مرورگر وب مانند کروم

2. راه اندازی و الزامات

تنظیم محیط خود به خود

  1. به Google Cloud Console وارد شوید و یک پروژه جدید ایجاد کنید یا از یک موجود استفاده مجدد کنید. اگر قبلاً یک حساب Gmail یا Google Workspace ندارید، باید یک حساب ایجاد کنید .

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • نام پروژه نام نمایشی برای شرکت کنندگان این پروژه است. این یک رشته کاراکتری است که توسط API های Google استفاده نمی شود. همیشه می توانید آن را به روز کنید.
  • شناسه پروژه در تمام پروژه‌های Google Cloud منحصربه‌فرد است و تغییرناپذیر است (پس از تنظیم نمی‌توان آن را تغییر داد). Cloud Console به طور خودکار یک رشته منحصر به فرد تولید می کند. معمولاً برای شما مهم نیست که چیست. در اکثر کدها، باید شناسه پروژه خود را ارجاع دهید (معمولاً با نام PROJECT_ID شناخته می شود). اگر شناسه تولید شده را دوست ندارید، ممکن است یک شناسه تصادفی دیگر ایجاد کنید. از طرف دیگر، می‌توانید خودتان را امتحان کنید، و ببینید آیا در دسترس است یا خیر. پس از این مرحله نمی توان آن را تغییر داد و در طول مدت پروژه باقی می ماند.
  • برای اطلاع شما، یک مقدار سوم وجود دارد، یک شماره پروژه ، که برخی از API ها از آن استفاده می کنند. در مورد هر سه این مقادیر در مستندات بیشتر بیاموزید.
  1. در مرحله بعد، برای استفاده از منابع Cloud/APIها باید صورتحساب را در کنسول Cloud فعال کنید . اجرا کردن از طریق این کد لبه هزینه زیادی نخواهد داشت. برای خاموش کردن منابع برای جلوگیری از تحمیل صورت‌حساب فراتر از این آموزش، می‌توانید منابعی را که ایجاد کرده‌اید حذف کنید یا پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان 300 دلاری هستند.

Cloud Shell را راه اندازی کنید

در حالی که Google Cloud را می توان از راه دور از لپ تاپ شما کار کرد، در این کد لبه از Google Cloud Shell استفاده خواهید کرد، یک محیط خط فرمان که در Cloud اجرا می شود.

از Google Cloud Console ، روی نماد Cloud Shell در نوار ابزار بالا سمت راست کلیک کنید:

55efc1aaa7a4d3ad.png

تهیه و اتصال به محیط فقط چند لحظه طول می کشد. وقتی تمام شد، باید چیزی شبیه به این را ببینید:

7ffe5cbb04455448.png

این ماشین مجازی با تمام ابزارهای توسعه که شما نیاز دارید بارگذاری شده است. این یک فهرست اصلی 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 را با استفاده از علامت "+" در بالا باز کنید.

4ca978f5142bb6ce.png

در تب جدید پوسته ابری اجرا کنید:

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 GENERATED ALWAYS AS (embedding('text-embedding-004',product_description)) STORED;

دستور ستون مجازی را ایجاد می کند و آن را با داده های برداری پر می کند.

خروجی کنسول مورد انتظار:

student@instance-1:~$ psql "host=$INSTANCE_IP user=postgres dbname=quickstart_db"
psql (13.11 (Debian 13.11-0+deb11u1), server 14.7)
WARNING: psql major version 13, server major version 14.
         Some psql features might not work.
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.

quickstart_db=> ALTER TABLE cymbal_products ADD COLUMN embedding vector GENERATED ALWAYS AS (embedding('text-embedding-004',product_description)) STORED;
ALTER TABLE
quickstart_db=> 

8. Similarity Search را اجرا کنید

اکنون می‌توانیم جستجوی خود را با استفاده از جستجوی شباهت بر اساس مقادیر برداری محاسبه‌شده برای توضیحات و مقدار برداری که برای درخواست خود دریافت می‌کنیم، اجرا کنیم.

پرس و جوی SQL را می توان از همان رابط خط فرمان psql یا به عنوان جایگزین، از استودیو AlloyDB اجرا کرد. هر خروجی چند ردیفه و پیچیده ممکن است در AlloyDB Studio بهتر به نظر برسد.

به AlloyDB Studio متصل شوید

در فصل‌های بعدی، تمام دستورات SQL که نیاز به اتصال به پایگاه داده دارند را می‌توان در استودیو AlloyDB اجرا کرد. برای اجرای دستور باید رابط کنسول وب را برای خوشه AlloyDB خود با کلیک بر روی نمونه اولیه باز کنید.

ef4bfbcf0ed2ef3a.png

سپس روی AlloyDB Studio در سمت چپ کلیک کنید:

5c155cbcd7d43a1.png

پایگاه داده quickstart_db، user postgres را انتخاب کنید و رمز عبوری را که هنگام ایجاد کلاستر ذکر شده است، ارائه دهید. سپس بر روی دکمه "Authenticate" کلیک کنید.

432613065cac864f.png

رابط AlloyDB Studio را باز می کند. برای اجرای دستورات در پایگاه داده، روی تب "Editor 1" در سمت راست کلیک کنید.

b36c28f8165119ca.png

این رابط را باز می کند که در آن می توانید دستورات SQL را اجرا کنید

cf43aa20f292797e.png

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

quickstart_db=> 

9. بهبود پاسخ

می توانید با استفاده از نتیجه پرس و جو پاسخ به یک برنامه مشتری را بهبود بخشید و با استفاده از نتایج پرس و جو ارائه شده به عنوان بخشی از درخواست مدل زبان پایه مولد Vertex 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 را در کنسول ابری باز کنید.

e514b176aef7945e.png

54712e5ade7121f.png

ممکن است از شما بخواهد 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 اجرا می کنیم، نتیجه این است:

30e5072cd2975685.png

پاسخی که از مدل در این مثال گرفتیم به شرح زیر است. توجه داشته باشید که پاسخ شما ممکن است به دلیل تغییر مدل و پارامترها در طول زمان متفاوت باشد:

"من می بینم که شما به دنبال درختی هستید که در منطقه خود رشد کند. بر اساس کد پستی شما، 93230، درخت گیلاس گزینه عالی به نظر می رسد!

این درخت به عنوان یک درخت زیبا توصیف شده است که گیلاس های خوشمزه تولید می کند. در حال حاضر با قیمت 75.00 دلار به فروش می رسد.

در حالی که من جزئیات خاصی در مورد میزان رشد آن در منطقه شما ندارم، می توانم به شما بگویم که درختان گیلاس عموماً خاک با زهکشی خوب و آفتاب کامل را ترجیح می دهند.

برای اطمینان از بهترین نتایج، توصیه می‌کنم با یک متخصص باغبانی یا مهد کودک محلی مشورت کنید که می‌تواند توصیه‌های مناسب‌تری را برای موقعیت مکانی خاص و شرایط خاک شما ارائه دهد. آنها همچنین می توانند به شما کمک کنند تا بهترین تنوع را برای نیازهای خود انتخاب کنید و نکاتی در مورد کاشت و مراقبت ارائه دهند."

دستور را در PSQL اجرا کنید

ما می‌توانیم از ادغام AlloyDB AI با Vertex AI برای دریافت پاسخ مشابه از یک مدل تولیدی با استفاده از SQL به طور مستقیم در پایگاه داده استفاده کنیم. اما برای استفاده از مدل gemini-1.5-flash ابتدا باید آن را ثبت کنیم.

افزونه را به نسخه 1.3 ارتقا دهید. همانطور که قبلا نشان داده شده است به پایگاه داده quickstart_db از pSQL متصل شوید (یا از AlloyDB Studio استفاده کنید) و اجرا کنید:

ALTER EXTENSION google_ml_integration UPDATE TO '1.3'

سپس باید پرچم پایگاه داده google_ml_integration.enable_model_support را روی "روشن" تنظیم کنیم. برای انجام این کار، می‌توانید از رابط کنسول وب AlloyDB استفاده کنید یا دستور gcloud زیر را اجرا کنید.

PROJECT_ID=$(gcloud config get-value project)
REGION=us-central1
ADBCLUSTER=alloydb-aip-01
gcloud beta alloydb instances update $ADBCLUSTER-pr \
  --database-flags google_ml_integration.enable_model_support=on \
  --region=$REGION \
  --cluster=$ADBCLUSTER \
  --project=$PROJECT_ID \
  --update-mode=FORCE_APPLY

اجرای دستور در پس‌زمینه حدود 3-5 دقیقه طول می‌کشد. سپس می توانید پرچم جدید را در جلسه psql یا با استفاده از AlloyDB Studio که به پایگاه داده quickstart_db متصل می شود تأیید کنید.

show google_ml_integration.enable_model_support;

خروجی مورد انتظار از جلسه psql "روشن" است:

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

سپس باید دو مدل را ثبت کنیم. اولین مورد، مدل text-embedding-004 از قبل استفاده شده است. از آنجایی که ما قابلیت های ثبت مدل را فعال کرده ایم، باید ثبت شود.

برای ثبت مدل در psql یا AlloyDB Studio کد زیر را اجرا کنید:

CALL
  google_ml.create_model(
    model_id => 'text-embedding-004',
    model_provider => 'google',
    model_qualified_name => 'text-embedding-004',
    model_type => 'text_embedding',
    model_auth_type => 'alloydb_service_agent_iam',
    model_in_transform_fn => 'google_ml.vertexai_text_embedding_input_transform',
    model_out_transform_fn => 'google_ml.vertexai_text_embedding_output_transform');

و مدل بعدی که باید ثبت کنیم gemini-1.5-flash-001 است که برای تولید خروجی کاربرپسند استفاده خواهد شد.

CALL
  google_ml.create_model(
    model_id => 'gemini-1.5-flash-001',
    model_request_url => 'https://$REGION-aiplatform.googleapis.com/v1/projects/$PROJECT_ID/locations/$REGION/publishers/google/models/gemini-1.5-flash-001:streamGenerateContent',
    model_provider => 'google',
    model_auth_type => 'alloydb_service_agent_iam');

همیشه می‌توانید فهرست مدل‌های ثبت‌شده را با انتخاب اطلاعات از google_ml.model_info_view تأیید کنید.

select model_id,model_type from google_ml.model_info_view;

در اینجا خروجی نمونه است

quickstart_db=> select model_id,model_type from google_ml.model_info_view;
        model_id         |   model_type   
-------------------------+----------------
 textembedding-gecko     | text_embedding
 textembedding-gecko@001 | text_embedding
 text-embedding-004      | text_embedding
 gemini-1.5-flash-001    | generic
(4 rows)

اکنون می‌توانیم از JSON تولید شده در یک جست‌وجو فرعی برای ارائه آن به عنوان بخشی از مدل متنی 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-001',
        request_body => json_build_object('contents',
        json_build_object('role',
        'user',
        'parts',
        json_build_object('text',
        prompt_text)))))->'candidates'->0->'content'->'parts'->0->'text' AS resp
FROM
        prompt)
SELECT
        string_agg(resp::text,
        ' ')
FROM
        response;

و در اینجا خروجی مورد انتظار است. ممکن است خروجی شما بسته به نسخه مدل و پارامترها متفاوت باشد.:

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

10. محیط را تمیز کنید

پس از اتمام کار با آزمایشگاه، نمونه ها و خوشه های AlloyDB را نابود کنید

خوشه AlloyDB و همه نمونه ها را حذف کنید

خوشه با نیروی گزینه از بین می رود که همچنین تمام نمونه های متعلق به خوشه را حذف می کند.

در پوسته ابری، متغیرهای پروژه و محیط را تعریف کنید، اگر اتصال شما قطع شده و تمام تنظیمات قبلی از بین رفته است:

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 

11. تبریک می گویم

برای تکمیل کد لبه تبریک می گویم.

آنچه را پوشش داده ایم

  • نحوه استقرار خوشه AlloyDB و نمونه اولیه
  • نحوه اتصال به AlloyDB از Google Compute Engine VM
  • نحوه ایجاد پایگاه داده و فعال کردن AlloyDB AI
  • نحوه بارگذاری اطلاعات در پایگاه داده
  • نحوه استفاده از مدل جاسازی هوش مصنوعی Vertex در AlloyDB
  • نحوه غنی سازی نتیجه با استفاده از مدل مولد Vertex AI

12. نظرسنجی

خروجی:

چگونه از این آموزش استفاده خواهید کرد؟

فقط آن را بخوانید آن را بخوانید و تمرینات را کامل کنید