تعبیه‌های چندوجهی در AlloyDB

1. مقدمه

a7e7c1d2afe05e68.png

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

پیش نیازها

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

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

  • نحوه استقرار AlloyDB برای Postgres
  • نحوه استفاده از جستجوی برداری چندوجهی
  • چگونه اپراتورهای هوش مصنوعی AlloyDB را فعال کنیم
  • نحوه استفاده از عملگرهای مختلف هوش مصنوعی AlloyDB برای جستجوی چند وجهی
  • نحوه استفاده از AlloyDB AI برای ترکیب نتایج جستجوی متن و تصویر

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

  • یک حساب Google Cloud و پروژه Google Cloud
  • یک مرورگر وب مانند کروم که از کنسول Google Cloud و Cloud Shell پشتیبانی می کند

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 \
                       discoveryengine.googleapis.com \
                       secretmanager.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.

4. AlloyDB را مستقر کنید

خوشه AlloyDB و نمونه اولیه ایجاد کنید. روش زیر نحوه ایجاد یک خوشه و نمونه AlloyDB با استفاده از Google Cloud SDK را توضیح می دهد. اگر رویکرد کنسول را ترجیح می دهید، می توانید مستندات را در اینجا دنبال کنید.

قبل از ایجاد یک خوشه 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

برای اتصال به نمونه به عنوان کاربر postgres در آینده به آن رمز عبور نیاز خواهید داشت. پیشنهاد می کنم آن را یادداشت کنید یا در جایی کپی کنید تا بعدا بتوانید از آن استفاده کنید.

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

student@cloudshell:~ (test-project-402417)$ echo $PGPASSWORD
bbefbfde7601985b0dee5723

یک کلاستر آزمایشی رایگان ایجاد کنید

اگر قبلاً از AlloyDB استفاده نکرده‌اید، می‌توانید یک کلاستر آزمایشی رایگان ایجاد کنید:

منطقه و نام خوشه 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 \
    --subscription-type=TRIAL

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

export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
gcloud alloydb clusters create $ADBCLUSTER \
    --password=$PGPASSWORD \
    --network=default \
    --region=$REGION \
    --subscription-type=TRIAL
Operation ID: operation-1697655441138-6080235852277-9e7f04f5-2012fce4
Creating cluster...done.                                                                                                                                                                                                                                                           

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

gcloud alloydb instances create $ADBCLUSTER-pr \
    --instance-type=PRIMARY \
    --cpu-count=8 \
    --region=$REGION \
    --cluster=$ADBCLUSTER

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

student@cloudshell:~ (test-project-402417)$ gcloud alloydb instances create $ADBCLUSTER-pr \
    --instance-type=PRIMARY \
    --cpu-count=8 \
    --region=$REGION \
    --availability-type ZONAL \
    --cluster=$ADBCLUSTER
Operation ID: operation-1697659203545-6080315c6e8ee-391805db-25852721
Creating instance...done.                                                                                                                                                                                                                                                     

خوشه استاندارد AlloyDB را ایجاد کنید

اگر اولین خوشه AlloyDB شما در پروژه نیست، با ایجاد یک خوشه استاندارد ادامه دهید.

منطقه و نام خوشه 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 برای خوشه خود ایجاد کنید. اگر اتصال شما قطع شده است، باید دوباره متغیرهای محیط نام منطقه و خوشه را تعریف کنید.

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. پایگاه داده را آماده کنید

ما باید یک پایگاه داده ایجاد کنیم، یکپارچه سازی 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

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

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

ef4bfbcf0ed2ef3a.png

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

5c155cbcd7d43a1.png

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

1c9dab73c6836798.png

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

b36c28f8165119ca.png

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

cf43aa20f292797e.png

ایجاد پایگاه داده

ایجاد شروع سریع پایگاه داده

در ویرایشگر AlloyDB Studio دستور زیر را اجرا کنید.

ایجاد پایگاه داده:

CREATE DATABASE quickstart_db

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

Statement executed successfully

به Quickstart_db متصل شوید

با استفاده از دکمه تغییر کاربر/پایگاه داده، دوباره به استودیو متصل شوید.

e826ad973eb23a74.png

پایگاه داده جدید quickstart_db را از لیست کشویی انتخاب کنید و از همان کاربر و رمز عبور قبلی استفاده کنید.

1ca70c59b5aea8c1.png

این یک اتصال جدید را باز می کند که در آن می توانید با اشیاء از پایگاه داده quickstart_db کار کنید.

6. نمونه داده ها

حالا باید آبجکت هایی را در پایگاه داده ایجاد کنیم و داده ها را بارگذاری کنیم. ما قصد داریم از یک فروشگاه خیالی "Cymbal" با داده های ساختگی استفاده کنیم.

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

در استودیو AlloyDB که به Quickstart_db متصل می شود اجرا کنید.

CREATE EXTENSION IF NOT EXISTS vector;
CREATE EXTENSION IF NOT EXISTS alloydb_scann;

مجموعه داده آماده شده و به عنوان یک فایل SQL قرار می گیرد که می تواند با استفاده از رابط واردات در پایگاه داده بارگذاری شود. در پوسته ابری دستورات زیر را اجرا کنید:

export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
gcloud alloydb clusters import $ADBCLUSTER --region=$REGION --database=quickstart_db --gcs-uri='gs://sample-data-and-media/ecomm-retail/ecom_generic_vectors.sql' --user=postgres --sql

این دستور از AlloyDB SDK استفاده می کند و یک کاربر با نام agentspace_user ایجاد می کند و سپس داده های نمونه را مستقیماً از سطل GCS به پایگاه داده وارد می کند و تمام اشیاء لازم را ایجاد می کند و داده ها را درج می کند.

پس از وارد کردن، می توانیم جداول را در استودیو AlloyDB بررسی کنیم. جداول در طرح ecomm هستند:

9ee57986d4cdf20f.png

و تعداد ردیف های یکی از جداول را بررسی کنید.

51c3c55881157da3.png

ما داده‌های نمونه خود را با موفقیت وارد کردیم و می‌توانیم به مراحل بعدی ادامه دهیم.

7. جستجوی معنایی با استفاده از جاسازی متن

در این فصل سعی خواهیم کرد از جستجوی معنایی با استفاده از جاسازی متن استفاده کنیم و آن را با متن سنتی Postgres و جستجوی کامل متن مقایسه کنیم.

بیایید ابتدا جستجوی کلاسیک را با استفاده از استاندارد PostgreSQL SQL با عملگر LIKE امتحان کنیم.

اگر بخواهیم یک ژاکت بارانی را با استفاده از عبارت زیر جستجو کنیم:

SET session.my_search_var='%wet%conditions%jacket%';
SELECT
  name,
  product_description,
  retail_price,   replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url
FROM
  ecomm.products
WHERE
  name ILIKE current_setting('session.my_search_var')
  OR product_description ILIKE current_setting('session.my_search_var')
LIMIT
  10;

پرس و جو هیچ ردیفی را بر نمی گرداند زیرا به کلمات دقیقی مانند شرایط مرطوب و ژاکت نیاز دارد تا در نام محصول یا توضیحات باشد. و "ژاکت شرایط مرطوب" با "ژاکت شرایط بارانی" یکسان نیست.

می‌توانیم سعی کنیم تمام تغییرات ممکن را در جستجو لحاظ کنیم. بیایید سعی کنیم فقط دو کلمه را وارد کنیم. به عنوان مثال:

SELECT
  name,
  product_description,
  retail_price,
   replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url
FROM
  ecomm.products
WHERE
  name ILIKE '%wet%jacket%'
  OR name ILIKE '%jacket%wet%'
  OR name ILIKE '%jacket%'
  OR name ILIKE '%%wet%'
  OR product_description ILIKE '%wet%jacket%'
  OR product_description ILIKE '%jacket%wet%'
  OR product_description ILIKE '%jacket%'
  OR product_description ILIKE '%wet%'
LIMIT
  10;

این چند ردیف را برمی گرداند، اما همه آنها کاملاً با درخواست ما برای ژاکت ها مطابقت ندارند و مرتب کردن بر اساس ارتباط دشوار است. و به عنوان مثال، اگر شرایط بیشتری مانند "برای مردان" و دیگران را اضافه کنیم، پیچیدگی پرس و جو را به طور قابل توجهی افزایش می دهد. از طرف دیگر، می‌توانیم جستجوی متن کامل را امتحان کنیم، اما حتی در آنجا محدودیت‌های مربوط به کلمات کم و بیش دقیق و ارتباط پاسخ را داریم.

اکنون می توانیم جستجوی مشابهی را با استفاده از embedding انجام دهیم. ما قبلاً تعبیه‌های محصولات خود را با استفاده از مدل‌های مختلف از قبل محاسبه کرده‌ایم. ما قصد داریم از آخرین مدل gemini-embedding-001 گوگل استفاده کنیم. ما آنها را در ستون " product_embedding " جدول ecomm.products ذخیره کرده ایم. اگر یک پرس و جو برای شرط جستجوی "کت بارانی مردانه" خود با استفاده از عبارت زیر انجام دهیم:

SELECT
  name,
  product_description,
  retail_price,
   replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url,
  product_embedding <=> embedding ('gemini-embedding-001','wet conditions jacket for men')::vector AS distance
FROM
  ecomm.products
ORDER BY distance
LIMIT
  10;

نه تنها ژاکت ها را برای شرایط مرطوب باز می گرداند، بلکه همه نتایج مرتب شده اند و مرتبط ترین نتایج را در بالا قرار می دهند.

پرس و جو با جاسازی‌ها به 90-150 میلی‌ثانیه برمی‌گردد که بخشی از زمان صرف دریافت داده‌ها از مدل جاسازی ابری می‌شود. اگر به طرح اجرا نگاه کنیم، درخواست مدل در زمان برنامه ریزی لحاظ می شود. بخشی از پرس و جو که خود جستجو را انجام می دهد بسیار کوتاه است. کمتر از 7 میلی‌ثانیه طول می‌کشد تا با استفاده از فهرست AlloyDB ScaNN جستجو در 29 هزار رکورد انجام شود.

Limit  (cost=2709.20..2718.82 rows=10 width=490) (actual time=6.966..7.049 rows=10 loops=1)
   ->  Index Scan using embedding_scann on products  (cost=2709.20..30736.40 rows=29120 width=490) (actual time=6.964..7.046 rows=10 loops=1)
         Order By: (product_embedding <=> '[-0.0020264734,-0.016582033,0.027258193
...
-0.0051468653,-0.012440448]'::vector)
         Limit: 10
 Planning Time: 136.579 ms
 Execution Time: 6.791 ms
(6 rows)

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

8. استفاده از جستجوی چندوجهی

در حالی که جستجوی معنایی مبتنی بر متن مفید است، توصیف جزئیات پیچیده می تواند چالش برانگیز باشد. جستجوی چندوجهی AlloyDB با امکان کشف محصول از طریق ورودی تصویر، مزیتی را ارائه می دهد. این امر به ویژه زمانی مفید است که نمایش بصری هدف جستجو را به طور مؤثرتر از توضیحات متنی به تنهایی روشن می کند. به عنوان مثال - "یک کت مانند این در تصویر برای من پیدا کنید".

بیایید به نمونه ژاکت خود برگردیم. اگر تصویری از ژاکتی شبیه آنچه می‌خواهم پیدا کنم دارم، می‌توانم آن را به مدل تعبیه چندوجهی Google ارسال کنم و آن را با جاسازی‌های تصاویر محصولاتم مقایسه کنم. در جدول ما قبلاً تعبیه‌های تصاویر محصولات خود را در ستون product_image_embedding محاسبه کرده‌ایم و می‌توانید مدل استفاده شده در ستون product_image_embedding_model را ببینید.

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

بیایید نسخه برنامه افزودنی فعلی را تأیید کنیم. در استودیو AlloyDB اجرا کنید.

SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';
  

اگر نسخه کمتر از 1.4.4 است، روش زیر را اجرا کنید.

CALL google_ml.upgrade_to_preview_version();

و نسخه افزونه را دوباره بررسی کنید. باید 1.4.4 باشد.

در اینجا تصویر نمونه من برای جستجو است اما می توانید از هر تصویر سفارشی استفاده کنید. فقط باید آن را در فضای ذخیره سازی Google یا سایر منابع در دسترس عموم آپلود کنید و URI را در پرس و جو قرار دهید.

9f33ca0c73ea2b19.png

و در gs://pr-public-demo-data/alloydb-retail-demo/user_photos/4.png آپلود می شود

جستجوی تصویر بر اساس تصاویر

ابتدا سعی می کنیم فقط با تصویر جستجو کنیم:

SELECT
  name,
  product_description,
  retail_price,
  replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url,
  product_image_embedding <=> google_ml.image_embedding (model_id => 'multimodalembedding@001',image => 'gs://pr-public-demo-data/alloydb-retail-demo/user_photos/4.png', mimetype => 'image/png')::vector AS distance
FROM
  ecomm.products
ORDER BY distance
LIMIT
  4;

و ما توانستیم چند ژاکت گرم در موجودی پیدا کنیم.

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

ما از مدل "multimodalembedding@001" گوگل برای جستجوی تصویر خود استفاده کرده ایم. تابع image_embedding ما تصویر را به Vertex AI می فرستد، آن را به بردار تبدیل می کند و برای مقایسه با بردارهای ذخیره شده برای تصاویر در پایگاه داده ما برمی گردد.

ما همچنین می‌توانیم با استفاده از "Explain ANALYZE" بررسی کنیم که با شاخص AlloyDB ScaNN چقدر سریع کار می‌کند.

Limit  (cost=971.70..975.55 rows=4 width=490) (actual time=2.453..2.477 rows=4 loops=1)
   ->  Index Scan using product_image_embedding_scann on products  (cost=971.70..28998.90 rows=29120 width=490) (actual time=2.451..2.475 rows=4 loops=1)
         Order By: (product_image_embedding <=> '[0.02119865,0.034206174,0.030682731,
...
,-0.010307034,-0.010053742]'::vector)
         Limit: 4
 Planning Time: 913.322 ms
 Execution Time: 2.517 ms
(6 rows)

و دوباره مانند مثال قبلی می‌توانیم ببینیم که بیشترین زمان برای تبدیل تصویر ما به جاسازی‌ها با استفاده از نقطه پایانی ابری صرف شده است و خود جستجوی برداری فقط 2.5 میلی‌ثانیه طول می‌کشد.

جستجوی تصویر بر اساس متن

با multimodal ما همچنین می‌توانیم یک توضیح متنی از ژاکتی را که می‌خواهیم جستجو کنیم با استفاده از google_ml.text_embedding برای همان مدل به مدل منتقل کنیم و با جاسازی‌های تصاویر مقایسه کنیم تا ببینیم چه تصاویری را برمی‌گرداند.

SELECT
  name,
  product_description,
  retail_price,
  replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url,
  product_image_embedding <=> google_ml.text_embedding (model_id => 'multimodalembedding@001',content => 'puffy jacket for men, grey or dark colour')::vector AS distance
FROM
  ecomm.products
ORDER BY distance
LIMIT
  4;

و ما مجموعه ای از کت های پفی با رنگ های خاکستری یا تیره گرفتیم.

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

بیایید راه دیگری را برای جستجو در میان توضیحات با استفاده از تعبیه تصویر جستجو امتحان کنیم.

جستجوی متن بر اساس تصاویر

ما سعی کردیم تصاویری را که از جاسازی تصویر خود عبور می کنند جستجو کنیم و با جاسازی تصاویر از پیش محاسبه شده برای محصولات خود مقایسه کنیم. ما همچنین سعی کردیم تصاویری را که از جاسازی عبور می کنند برای درخواست متن خود جستجو کنیم و در بین همان جاسازی برای تصاویر محصولات جستجو کنیم. بیایید اکنون سعی کنیم از جاسازی برای تصویر خود استفاده کنیم و با جاسازی‌های متنی برای توضیحات محصول مقایسه کنیم. جاسازی در ستون product_description_embedding ذخیره می‌شود و از همان مدل multimodalembedding@001 استفاده می‌کند.

سوال ما اینجاست:

SELECT
  name,
  product_description,
  retail_price,
  replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url,
  product_description_embedding <=> google_ml.image_embedding (model_id => 'multimodalembedding@001',image => 'gs://pr-public-demo-data/alloydb-retail-demo/user_photos/4.png', mimetype => 'image/png')::vector AS distance

FROM
  ecomm.products
ORDER BY distance
LIMIT
  4;

و در اینجا ما یک مجموعه کمی متفاوت از ژاکت ها با رنگ های خاکستری یا تیره دریافت کردیم که برخی از آنها یکسان یا بسیار نزدیک به انتخاب با روش های مختلف جستجو هستند.

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

همچنین می‌توانید ترکیب متن و جاسازی تصویر را با هم با استفاده از ترکیب رتبه‌ای متقابل آزمایش کنید. در اینجا نمونه ای از چنین پرس و جوی آورده شده است که در آن ما دو جستجو را با هم ترکیب کرده ایم که به هر رتبه یک امتیاز اختصاص می دهد و نتایج را بر اساس امتیاز ترکیبی مرتب می کند.

WITH image_search AS (
            SELECT id,
                RANK () OVER (ORDER BY  product_image_embedding <=>google_ml.image_embedding(model_id => 'multimodalembedding@001',image => 'gs://pr-public-demo-data/alloydb-retail-demo/user_photos/4.png', mimetype => 'image/png')::vector) AS rank
                FROM ecomm.products
                ORDER BY product_image_embedding <=>google_ml.image_embedding(model_id => 'multimodalembedding@001',image => 'gs://pr-public-demo-data/alloydb-retail-demo/user_photos/4.png', mimetype => 'image/png')::vector LIMIT 5
        ),
      text_search AS (
            SELECT id,
                RANK () OVER (ORDER BY product_description_embedding <=>google_ml.text_embedding(model_id => 'multimodalembedding@001',content => 'puffy jacket for men, grey or dark colour'
    )::vector) AS rank
            FROM ecomm.products
            ORDER BY product_description_embedding <=>google_ml.text_embedding(model_id => 'multimodalembedding@001',content => 'puffy jacket for men, grey or dark colour'
    )::vector LIMIT 5
        ),
      rrf_score AS (
        SELECT
            COALESCE(image_search.id, text_search.id) AS id,
            COALESCE(1.0 / (60 + image_search.rank), 0.0) + COALESCE(1.0 / (60 + text_search.rank), 0.0) AS rrf_score
        FROM image_search FULL OUTER JOIN text_search ON image_search.id = text_search.id
        ORDER BY rrf_score DESC
      )
      SELECT 
        ep.name,
        ep.product_description,
        ep.retail_price,
        replace(ep.product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url
      FROM ecomm.products ep, rrf_score 
      WHERE 
        ep.id=rrf_score.id 
      ORDER by rrf_score DESC
      LIMIT 4;

می توانید سعی کنید با پارامترهای مختلف در پرس و جو بازی کنید و ببینید که آیا می تواند نتایج جستجوی شما را بهبود بخشد.

این کار آزمایشگاه را به پایان می رساند و برای جلوگیری از هزینه های غیرمنتظره توصیه می شود منابع استفاده نشده را حذف کنید.

علاوه بر آن می توانید از سایر اپراتورهای هوش مصنوعی برای رتبه بندی نتایج همانطور که در مستندات توضیح داده شده است استفاده کنید.

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

پس از اتمام کار با آزمایشگاه، نمونه ها و خوشه های 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.                                                                                                                                                                                                                                                            

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

برای تکمیل کد لبه تبریک می گویم. شما یاد گرفته اید که چگونه از جستجوی چندوجهی در AlloyDB با استفاده از توابع جاسازی متون و تصاویر استفاده کنید. می‌توانید جستجوی چندوجهی را آزمایش کنید و آن را با عملکرد google_ml.rank با استفاده از Codelab برای اپراتورهای هوش مصنوعی AlloyDB بهبود دهید.

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

  • نحوه استقرار AlloyDB برای Postgres
  • نحوه استفاده از جستجوی برداری چندوجهی
  • چگونه اپراتورهای هوش مصنوعی AlloyDB را فعال کنیم
  • نحوه استفاده از عملگرهای مختلف هوش مصنوعی AlloyDB برای جستجوی چند وجهی
  • نحوه استفاده از AlloyDB AI برای ترکیب نتایج جستجوی متن و تصویر

11. نظرسنجی

خروجی:

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

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