شروع کار با جاسازی های برداری در Cloud SQL برای PostgreSQL

۱. مقدمه

در این آزمایشگاه کد، نحوه استفاده از Cloud SQL برای ادغام هوش مصنوعی PostgreSQL را با ترکیب جستجوی برداری با تعبیه‌های هوش مصنوعی Vertex خواهید آموخت.

8aa6ba3bc12a1593.png

پیش‌نیازها

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

آنچه یاد خواهید گرفت

  • نحوه استقرار Cloud SQL برای نمونه PostgreSQL
  • نحوه ایجاد پایگاه داده و فعال کردن ادغام Cloud SQL AI
  • نحوه بارگذاری داده‌ها در پایگاه داده
  • نحوه استفاده از کلود اس کیو ال استودیو
  • نحوه استفاده از مدل تعبیه هوش مصنوعی Vertex در Cloud SQL
  • نحوه استفاده از استودیوی هوش مصنوعی ورتکس
  • چگونه با استفاده از مدل مولد هوش مصنوعی Vertex، نتیجه را غنی کنیم؟
  • چگونه با استفاده از شاخص برداری، عملکرد را بهبود بخشیم؟

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

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

۲. تنظیمات و الزامات

راه‌اندازی پروژه

  1. وارد کنسول ابری گوگل شوید. اگر از قبل حساب جیمیل یا گوگل ورک‌اسپیس ندارید، باید یکی ایجاد کنید .

به جای حساب کاری یا تحصیلی از حساب شخصی استفاده کنید.

  1. یک پروژه جدید ایجاد کنید یا از یک پروژه موجود دوباره استفاده کنید. برای ایجاد یک پروژه جدید در کنسول Google Cloud، در سربرگ، روی دکمه «انتخاب پروژه» کلیک کنید که یک پنجره بازشو باز می‌شود.

۲۹۵۰۰۴۸۲۱bab6a87.png

در پنجره انتخاب پروژه، دکمه «پروژه جدید» را فشار دهید که یک کادر محاوره‌ای برای پروژه جدید باز می‌کند.

37d264871000675d.png

در کادر محاوره‌ای، نام پروژه مورد نظر خود را وارد کرده و مکان را انتخاب کنید.

۹۶d86d3d5655cdbe.png

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

فعال کردن صورتحساب

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

استفاده از اعتبار ۵ دلاری گوگل کلود (اختیاری)

برای اجرای این کارگاه، به یک حساب صورتحساب با مقداری اعتبار نیاز دارید. اگر قصد دارید از صورتحساب خودتان استفاده کنید، می‌توانید از این مرحله صرف نظر کنید.

  1. روی این لینک کلیک کنید و با یک حساب گوگل شخصی وارد شوید.
  2. چیزی شبیه به این خواهید دید:

f54628965f465486.png

  1. روی دکمه‌ی «برای دسترسی به اعتبارات خود اینجا کلیک کنید» کلیک کنید. این کار شما را به صفحه‌ای می‌برد که می‌توانید پروفایل صورتحساب خود را تنظیم کنید. اگر با صفحه‌ی ثبت‌نام آزمایشی رایگان مواجه شدید، روی لغو کلیک کنید و به پیوند صورتحساب ادامه دهید.

20e88842cf2a732e.png

  1. روی تأیید کلیک کنید. اکنون به حساب پرداخت آزمایشی پلتفرم گوگل کلود متصل شده‌اید.

cdc87f1c57777951.png

یک حساب پرداخت شخصی تنظیم کنید

اگر صورتحساب را با استفاده از اعتبارهای Google Cloud تنظیم کرده‌اید، می‌توانید از این مرحله صرف نظر کنید.

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

برخی نکات:

  • تکمیل این آزمایشگاه باید کمتر از ۳ دلار آمریکا از طریق منابع ابری هزینه داشته باشد.
  • شما می‌توانید مراحل انتهای این آزمایش را برای حذف منابع دنبال کنید تا از هزینه‌های بیشتر جلوگیری شود.
  • کاربران جدید واجد شرایط استفاده از دوره آزمایشی رایگان ۳۰۰ دلاری هستند.

شروع پوسته ابری

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

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

فعال کردن پوسته ابری

همچنین می‌توانید دکمه‌های G و سپس S را فشار دهید. اگر در کنسول ابری گوگل باشید یا از این لینک استفاده کنید، این توالی، Cloud Shell را فعال می‌کند.

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

تصویر صفحه ترمینال Google Cloud Shell که نشان می‌دهد محیط متصل شده است

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

۳. قبل از شروع

فعال کردن API

خروجی:

برای استفاده از Cloud SQL ، Compute Engine ، Networking services و Vertex AI ، باید API های مربوط به آنها را در پروژه Google Cloud خود فعال کنید.

در داخل ترمینال Cloud Shell، مطمئن شوید که شناسه پروژه شما تنظیم شده است:

gcloud config set project [YOUR-PROJECT-ID]

متغیر محیطی PROJECT_ID را تنظیم کنید:

PROJECT_ID=$(gcloud config get-value project)

فعال کردن تمام سرویس‌های لازم:

gcloud services enable sqladmin.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 sqladmin.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.

معرفی API ها

  • رابط برنامه‌نویسی کاربردی مدیریت SQL ابری ( sqladmin.googleapis.com ) به شما امکان می‌دهد نمونه‌های SQL ابری را به صورت برنامه‌نویسی‌شده ایجاد، پیکربندی و مدیریت کنید. این رابط، صفحه کنترلی را برای سرویس پایگاه داده رابطه‌ای کاملاً مدیریت‌شده گوگل (با پشتیبانی از MySQL، PostgreSQL و SQL Server) فراهم می‌کند و وظایفی مانند تأمین، پشتیبان‌گیری، دسترسی‌پذیری بالا و مقیاس‌پذیری را مدیریت می‌کند.
  • رابط برنامه‌نویسی کاربردی موتور محاسبات (compute Engine API ) ( compute.googleapis.com ) به شما امکان می‌دهد ماشین‌های مجازی (VM)، دیسک‌های پایدار و تنظیمات شبکه را ایجاد و مدیریت کنید. این رابط، پایه و اساس زیرساخت به عنوان سرویس (IaaS) مورد نیاز برای اجرای بارهای کاری شما و میزبانی زیرساخت‌های اساسی برای بسیاری از سرویس‌های مدیریت‌شده را فراهم می‌کند.
  • رابط برنامه‌نویسی کاربردی مدیریت منابع ابری ( cloudresourcemanager.googleapis.com ) به شما امکان می‌دهد تا به صورت برنامه‌نویسی، فراداده‌ها و پیکربندی پروژه گوگل کلود خود را مدیریت کنید. این رابط به شما امکان می‌دهد منابع را سازماندهی کنید، سیاست‌های مدیریت هویت و دسترسی (IAM) را مدیریت کنید و مجوزها را در سلسله مراتب پروژه اعتبارسنجی کنید.
  • API شبکه‌سازی سرویس ( servicenetworking.googleapis.com ) به شما امکان می‌دهد تا راه‌اندازی اتصال خصوصی بین شبکه ابر خصوصی مجازی (VPC) و سرویس‌های مدیریت‌شده گوگل را خودکار کنید. این API به‌طور خاص برای ایجاد دسترسی IP خصوصی برای سرویس‌هایی مانند AlloyDB لازم است تا بتوانند به‌طور ایمن با سایر منابع شما ارتباط برقرار کنند.
  • رابط برنامه‌نویسی کاربردی هوش مصنوعی ورتکس ( aiplatform.googleapis.com ) به برنامه‌های شما امکان ساخت، استقرار و مقیاس‌بندی مدل‌های یادگیری ماشین را می‌دهد. این رابط، رابط یکپارچه‌ای را برای همه سرویس‌های هوش مصنوعی گوگل کلود، از جمله دسترسی به مدل‌های هوش مصنوعی مولد (مانند Gemini) و آموزش مدل‌های سفارشی، فراهم می‌کند.

۴. یک نمونه SQL ابری ایجاد کنید

ایجاد نمونه Cloud SQL با ادغام پایگاه داده با Vertex AI.

ایجاد رمز عبور پایگاه داده

برای کاربر پیش‌فرض پایگاه داده، رمز عبور تعریف کنید. می‌توانید رمز عبور خودتان را تعریف کنید یا از یک تابع تصادفی برای تولید آن استفاده کنید:

export CLOUDSQL_PASSWORD=`openssl rand -hex 12`

به مقدار تولید شده برای رمز عبور توجه کنید:

echo $CLOUDSQL_PASSWORD

ایجاد Cloud SQL برای PostgreSQL Instance

نمونه‌های SQL ابری را می‌توان به روش‌های مختلفی مانند کنسول Google Cloud، ابزارهای اتوماسیون مانند terraform یا Google Cloud SDK ایجاد کرد. در این آزمایشگاه، ما عمدتاً از ابزار gcloud مربوط به Google Cloud SDK استفاده خواهیم کرد. می‌توانید در مستندات نحوه ایجاد یک نمونه با استفاده از ابزارهای دیگر را مطالعه کنید.

در جلسه Cloud Shell دستور زیر را اجرا کنید:

gcloud sql instances create my-cloudsql-instance \
--database-version=POSTGRES_17 \
--tier=db-custom-1-3840 \
--region=us-central1 \
--edition=ENTERPRISE \
--enable-google-ml-integration \
--database-flags cloudsql.enable_google_ml_integration=on

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

gcloud sql users set-password postgres \
    --instance=my-cloudsql-instance \
    --password=$CLOUDSQL_PASSWORD

دستور " gcloud sql connect" را همانطور که در کادر نشان داده شده است اجرا کنید و وقتی آماده اتصال شد، رمز عبور خود را در اعلان وارد کنید.

gcloud sql connect my-cloudsql-instance --user=postgres

فعلاً با استفاده از میانبر صفحه‌کلید ctrl+d یا اجرای دستور exit از جلسه psql خارج شوید.

exit

ادغام هوش مصنوعی Vertex را فعال کنید

امتیازات لازم را به حساب سرویس ابری داخلی SQL اعطا کنید تا بتواند از ادغام Vertex AI استفاده کند.

ایمیل حساب کاربری سرویس داخلی Cloud SQL را پیدا کنید و آن را به عنوان یک متغیر خروجی بگیرید.

SERVICE_ACCOUNT_EMAIL=$(gcloud sql instances describe my-cloudsql-instance --format="value(serviceAccountEmailAddress)")
echo $SERVICE_ACCOUNT_EMAIL

دسترسی به Vertex AI را به حساب سرویس Cloud SQL اعطا کنید:

PROJECT_ID=$(gcloud config get-value project)
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$SERVICE_ACCOUNT_EMAIL" \
  --role="roles/aiplatform.user"

اطلاعات بیشتر در مورد ایجاد و پیکربندی نمونه را در مستندات Cloud SQL اینجا بخوانید.

۵. آماده‌سازی پایگاه داده

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

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

یک پایگاه داده با نام quickstart_db ایجاد کنید. برای انجام این کار، گزینه‌های مختلفی مانند کلاینت‌های پایگاه داده خط فرمان مانند psql برای PostgreSQL، SDK یا Cloud SQL Studio داریم. ما از SDK (gcloud) برای ایجاد پایگاه‌های داده و اتصال به نمونه استفاده خواهیم کرد.

در Cloud Shell دستور ایجاد پایگاه داده را اجرا کنید

gcloud sql databases create quickstart_db --instance=my-cloudsql-instance

فعال کردن افزونه‌ها

برای اینکه بتوانیم با Vertex AI و بردارها کار کنیم، باید دو افزونه را در پایگاه داده ایجاد شده خود فعال کنیم.

در Cloud Shell دستور را اجرا کنید تا به پایگاه داده ایجاد شده متصل شوید (باید رمز عبور خود را وارد کنید)

gcloud sql connect my-cloudsql-instance --database quickstart_db --user=postgres

سپس، پس از اتصال موفقیت‌آمیز، در جلسه sql باید دو دستور را اجرا کنید:

CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector CASCADE;

خروج از جلسه SQL:

exit;

۶. بارگذاری داده‌ها

حالا باید اشیاء را در پایگاه داده ایجاد کنیم و داده‌ها را بارگذاری کنیم. ما قصد داریم از داده‌های فرضی Cymbal Store استفاده کنیم. داده‌ها در مخزن ذخیره‌سازی عمومی گوگل با فرمت CSV موجود هستند.

ابتدا باید تمام اشیاء مورد نیاز را در پایگاه داده خود ایجاد کنیم. برای انجام این کار، از دستورات gcloud sql connect و gcloud storage که از قبل با آنها آشنا هستیم، برای دانلود و وارد کردن اشیاء طرحواره به پایگاه داده خود استفاده خواهیم کرد.

در پوسته ابری، رمز عبوری که هنگام ایجاد نمونه یادداشت کردیم را اجرا و ارائه دهید:

gcloud storage cat gs://cloud-training/gcc/gcc-tech-004/cymbal_demo_schema.sql |gcloud sql connect my-cloudsql-instance --database quickstart_db --user=postgres

دقیقاً در دستور قبلی چه کاری انجام دادیم؟ به پایگاه داده خود متصل شدیم و کد SQL دانلود شده را اجرا کردیم که جداول، ایندکس‌ها و توالی‌ها را ایجاد می‌کرد.

مرحله بعدی بارگذاری داده‌ها است و برای انجام این کار باید فایل‌های CSV را از فضای ذخیره‌سازی ابری گوگل دانلود کنیم.

gcloud storage cp gs://cloud-training/gcc/gcc-tech-004/cymbal_products.csv .
gcloud storage cp gs://cloud-training/gcc/gcc-tech-004/cymbal_inventory.csv .
gcloud storage cp gs://cloud-training/gcc/gcc-tech-004/cymbal_stores.csv .

سپس باید به پایگاه داده متصل شویم.

gcloud sql connect my-cloudsql-instance --database quickstart_db --user=postgres

و داده‌ها را از فایل‌های CSV ما وارد کنید.

\copy cymbal_products from 'cymbal_products.csv' csv header
\copy cymbal_inventory from 'cymbal_inventory.csv' csv header
\copy cymbal_stores from 'cymbal_stores.csv' csv header

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

۷. ایجاد جاسازی‌ها

مرحله بعدی ساخت جاسازی‌ها برای توضیحات محصول با استفاده از مدل textembedding-004 از Google Vertex AI و ذخیره آنها به عنوان داده‌های برداری است.

اتصال به پایگاه داده (اگر از پایگاه داده خارج شده‌اید یا جلسه قبلی شما قطع شده است):

gcloud sql connect my-cloudsql-instance --database quickstart_db --user=postgres

و با استفاده از تابع embedding ، یک ستون مجازی در جدول cymbal_products خود ایجاد کنید. این دستور یک ستون مجازی " embedding " ایجاد می‌کند که بردارهای ما را با embeddingهای تولید شده بر اساس ستون " product_description " ذخیره می‌کند. همچنین embeddingهایی را برای تمام ردیف‌های موجود در جدول ایجاد می‌کند. مدل به عنوان اولین پارامتر برای تابع embedding و داده‌های منبع به عنوان دومین پارامتر تعریف می‌شوند.

ALTER TABLE cymbal_products ADD COLUMN embedding vector(768) GENERATED ALWAYS AS (embedding('text-embedding-005',product_description)) STORED;

ممکن است کمی طول بکشد، اما برای ۹۰۰ تا ۱۰۰۰ ردیف نباید بیشتر از ۵ دقیقه طول بکشد و معمولاً خیلی سریع‌تر است.

وقتی یک ردیف جدید به جدول اضافه می‌کنیم یا product_description را برای هر ردیف موجود به‌روزرسانی می‌کنیم، داده‌های ستون مجازی برای ستون « embedding » دوباره بر اساس « product_description » تولید می‌شوند.

۸. جستجوی شباهت را اجرا کنید

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

کوئری SQL را می‌توان از همان رابط خط فرمان با استفاده از gcloud sql connect یا به عنوان جایگزین، از Cloud SQL Studio اجرا کرد. مدیریت هر کوئری چند سطری و پیچیده در Cloud SQL Studio بهتر است.

شروع به کار با Cloud SQL Studio

در کنسول، روی نمونه‌ی Cloud SQL که قبلاً ایجاد کرده‌ایم کلیک کنید.

903eeb9bbaf4a419.png

وقتی در پنل سمت راست باز شد، می‌توانیم Cloud SQL Studio را ببینیم. روی آن کلیک کنید.

7874a11b28519b71.png

یک کادر محاوره‌ای باز می‌شود که در آن نام پایگاه داده و اطلاعات کاربری خود را وارد می‌کنید:

  • پایگاه داده: quickstart_db
  • کاربر: پستگرس
  • رمز عبور: رمز عبور یادداشت شده شما برای کاربر اصلی پایگاه داده

و روی دکمه "تایید هویت" کلیک کنید.

d5ee9e56dfef3905.png

پنجره بعدی باز می‌شود که در آن روی تب "Editor" در سمت راست کلیک کنید تا ویرایشگر SQL باز شود.

۱۹a6ebd18ef6ae34.png

حالا ما آماده‌ایم تا کوئری‌هایمان را اجرا کنیم.

اجرای کوئری

یک کوئری اجرا کنید تا لیستی از محصولات موجود که بیشترین ارتباط را با درخواست مشتری دارند، دریافت کنید. درخواستی که قرار است برای دریافت مقدار بردار به Vertex AI ارسال کنیم، چیزی شبیه به این است: «چه نوع درختان میوه‌ای اینجا خوب رشد می‌کنند؟»

این کوئری است که می‌توانید برای انتخاب ۱۰ مورد اول که برای درخواست ما مناسب‌تر هستند، اجرا کنید:

SELECT
        cp.product_name,
        left(cp.product_description,80) as description,
        cp.sale_price,
        cs.zip_code,
        (cp.embedding <=> embedding('text-embedding-005','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;

کوئری را کپی کرده و در ویرایشگر Cloud SQL Studio پیست کنید و دکمه "RUN" را فشار دهید یا آن را در جلسه خط فرمان خود که به پایگاه داده quickstart_db متصل می‌شود، پیست کنید.

a8a2f83593aa5f37.png

و در اینجا لیستی از محصولات انتخاب شده مطابق با عبارت جستجو شده آمده است.

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
(10 rows)

۹. بهبود پاسخ LLM با استفاده از داده‌های بازیابی شده

ما می‌توانیم پاسخ Gen AI LLM به یک برنامه کلاینت را با استفاده از نتیجه پرس‌وجوی اجرا شده بهبود بخشیم و با استفاده از نتایج پرس‌وجوی ارائه شده به عنوان بخشی از اعلان به یک مدل زبان پایه مولد Vertex AI، یک خروجی معنادار تهیه کنیم.

برای دستیابی به این هدف، باید یک JSON با نتایج حاصل از جستجوی برداری تولید کنیم، سپس از آن JSON تولید شده به عنوان یک اعلان برای یک مدل LLM در Vertex AI استفاده کنیم تا یک خروجی معنادار ایجاد کنیم. در مرحله اول، JSON را تولید می‌کنیم، سپس آن را در Vertex AI Studio آزمایش می‌کنیم و در مرحله آخر، آن را در یک عبارت SQL که می‌تواند در یک برنامه استفاده شود، قرار می‌دهیم.

تولید خروجی با فرمت JSON

پرس‌وجو را طوری تغییر دهید که خروجی را با فرمت JSON تولید کند و فقط یک ردیف برای ارسال به Vertex AI برگرداند.

SQL ابری برای PostgreSQL

در اینجا مثالی از پرس و جو آمده است:

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-005','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 تولید شده برای ارائه آن به عنوان بخشی از prompt به مدل متنی هوش مصنوعی مولد در Vertex AI Studio استفاده کنیم.

برنامه‌ی Vertex AI Studio را در کنسول ابری باز کنید.

d48549b1b0f449b4.png

ممکن است از شما بخواهد APIهای اضافی را فعال کنید، اما می‌توانید این درخواست را نادیده بگیرید. ما برای تکمیل آزمایش خود به هیچ API اضافی نیاز نداریم.

یک دستور در استودیو قرار دهید.

2a6f5a338fefd229.png

این دستوری است که قرار است از آن استفاده کنیم:

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","description":"some description","sale_price":10,"zip_code": 10234, "produt_id": "02056727942aeb714dc9a2313654e1b0"}
Here is the list of products:
[place your JSON here]
The customer asked "What tree is growing the best here?"
You should give information about the product, price and some supplemental information.
Do not ask any additional questions and assume location based on the zip code provided in the list of products.

و در اینجا نحوه نمایش آن را مشاهده می‌کنید وقتی که جای‌نگهدار JSON را با پاسخ حاصل از پرس‌وجو جایگزین می‌کنیم:

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","description":"some description","sale_price":10,"zip_code": 10234, "produt_id": "02056727942aeb714dc9a2313654e1b0"}
Here is the list of products:
[{"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"}]
The customer asked "What tree is growing the best here?"
You should give information about the product, price and some supplemental information.
Do not ask any additional questions and assume location based on the zip code provided in the list of products.

و این نتیجه‌ای است که وقتی اعلان را با مقادیر JSON خود اجرا می‌کنیم، حاصل می‌شود:

a0f7ead40d0a1d62.png

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

«بر اساس کد پستی ارائه شده در لیست محصولات ما (۹۳۲۳۰)، به نظر می‌رسد که شما در منطقه هنفورد، کالیفرنیا واقع شده‌اید.» ۱۳۴۶ این منطقه که در دره سن خواکین واقع شده است، در واقع یکی از مکان‌های برتر کشور برای پرورش میوه‌های هسته‌دار است.

برای پاسخ به سوال شما، بهترین درختی که از بین درختان انتخاب شده ما در منطقه شما رشد می‌کند، درخت گیلاس است.

در اینجا جزئیات برای شما آورده شده است:

محصول: درخت گیلاس

قیمت: ۷۵٫۰۰ دلار

توضیحات: این یک درخت گیلاس زیباست که گیلاس‌های خوشمزه‌ای تولید خواهد کرد.2

چرا اینجا بهتر رشد می‌کند: آب و هوای دره سن خواکین شرایط خاصی را که گیلاس برای رشد نیاز دارد، فراهم می‌کند: روزهای گرم و طولانی تابستان برای رشد میوه و شب‌های خنک.5 از آنجایی که هانفورد در یک قطب کشاورزی بزرگ قرار دارد که به خاطر تولید میوه‌های هسته‌دارش شناخته شده است، می‌توانید انتظار داشته باشید که این درخت در خاک محلی شما بسیار پربار باشد. فقط مطمئن شوید که آن را در مکانی با آفتاب کامل و خاک زهکشی شده بکارید تا بهترین برداشت را داشته باشید.

اجرای اعلان در PSQL

ما همچنین می‌توانیم از ادغام Cloud SQL AI با Vertex AI برای دریافت پاسخ مشابه از یک مدل مولد با استفاده از SQL مستقیماً در پایگاه داده استفاده کنیم. اما برای استفاده از مدل gemini-2.0-flash-exp ابتدا باید آن را ثبت کنیم.

اجرا در Cloud SQL برای PostgreSQL

افزونه را به نسخه ۱.۴.۲ یا بالاتر ارتقا دهید (اگر نسخه فعلی پایین‌تر است). همانطور که قبلاً نشان داده شده است (یا از Cloud SQL Studio استفاده کنید) از gcloud sql connect به پایگاه داده quickstart_db متصل شوید و دستور زیر را اجرا کنید:

SELECT extversion from pg_extension where extname='google_ml_integration';

اگر مقدار برگشتی کمتر از ۱.۴.۳ باشد، آنگاه اجرا کنید:

ALTER EXTENSION google_ml_integration UPDATE TO '1.4.3';

سپس باید پرچم پایگاه داده google_ml_integration.enable_model_support را روی "روشن" تنظیم کنیم. برای تأیید تنظیمات فعلی، اجرا کنید.

show google_ml_integration.enable_model_support;

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

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

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

gcloud sql instances patch my-cloudsql-instance \
--database-flags google_ml_integration.enable_model_support=on,cloudsql.enable_google_ml_integration=on

اجرای این دستور در پس‌زمینه حدود ۱ تا ۳ دقیقه طول می‌کشد. سپس می‌توانید پرچم جدید را در جلسه psql یا با استفاده از Cloud SQL Studio با اتصال به پایگاه داده quickstart_db تأیید کنید.

show google_ml_integration.enable_model_support;

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

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

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

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

CALL
  google_ml.create_model(
    model_id => 'text-embedding-005',
    model_provider => 'google',
    model_qualified_name => 'text-embedding-005',
    model_type => 'text_embedding',
    model_auth_type => 'cloudsql_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-2.0-flash-001 است که برای تولید خروجی کاربرپسند استفاده خواهد شد.

CALL
  google_ml.create_model(
    model_id => 'gemini-2.5-flash',
    model_request_url => 'https://us-central1-aiplatform.googleapis.com/v1/projects/$PROJECT_ID/locations/us-central1/publishers/google/models/gemini-2.5-flash:streamGenerateContent',
    model_provider => 'google',
    model_auth_type => 'cloudsql_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
 gemini-1.5-pro:streamGenerateContent | generic
 gemini-1.5-pro:generateContent       | generic
 gemini-1.0-pro:generateContent       | generic
 text-embedding-005                   | text_embedding
 gemini-2.5-flash                     | generic

اکنون می‌توانیم از JSON تولید شده در یک subquery برای ارائه آن به عنوان بخشی از prompt به مدل متنی هوش مصنوعی مولد با استفاده از SQL استفاده کنیم.

در جلسه psql یا Cloud SQL 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 <=> google_ml.embedding('text-embedding-005',
        '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-2.5-flash',
        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! It sounds like you're looking to add some delicious fruit to your garden.\n\nBased on the products we have that are closely related to your search, I can tell you about a fantastic option:\n\n**Cherry Tree**" "\n* **Description:** This beautiful deciduous tree will produce delicious cherries. It grows to be about 15 feet tall, with dark green leaves in summer that turn a beautiful red in the fall. Cherry trees are known for their beauty, shade, and privacy. They prefer a cool, moist climate and sandy soil." "\n* **Price:** $75.00\n* **Grows well in:** USDA Zones 4-9.\n\nTo confirm if this Cherry Tree will thrive in your specific location, you might want to check which USDA Hardiness Zone your area falls into. If you're in zones 4-9, this" " could be a wonderful addition to your yard!"

۱۰. ایجاد یک شاخص نزدیکترین همسایه

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

ایجاد فهرست HNSW

ما قصد داریم نوع شاخص HNSW را برای آزمایش خود امتحان کنیم. HNSW مخفف Hierarchical Navigable Small World است و یک شاخص گراف چندلایه را نشان می‌دهد.

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

CREATE INDEX cymbal_products_embeddings_hnsw ON cymbal_products
  USING hnsw (embedding vector_cosine_ops)
  WITH (m = 16, ef_construction = 64);

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

quickstart_db=> CREATE INDEX cymbal_products_embeddings_hnsw ON cymbal_products
  USING hnsw (embedding vector_cosine_ops)
  WITH (m = 16, ef_construction = 64);
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-005','What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1)
SELECT json_agg(trees) FROM trees;

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

 Aggregate  (cost=779.12..779.13 rows=1 width=32) (actual time=1.066..1.069 rows=1 loops=1)
   ->  Subquery Scan on trees  (cost=769.05..779.12 rows=1 width=142) (actual time=1.038..1.041 rows=1 loops=1)
         ->  Limit  (cost=769.05..779.11 rows=1 width=158) (actual time=1.022..1.024 rows=1 loops=1)
               ->  Nested Loop  (cost=769.05..9339.69 rows=852 width=158) (actual time=1.020..1.021 rows=1 loops=1)
                     ->  Nested Loop  (cost=768.77..9316.48 rows=852 width=945) (actual time=0.858..0.859 rows=1 loops=1)
                           ->  Index Scan using cymbal_products_embeddings_hnsw on cymbal_products cp  (cost=768.34..2572.47 rows=941 width=941) (actual time=0.532..0.539 rows=3 loops=1)
                                 Order By: (embedding <=> '[0.008864171,0.03693164,-0.024245683,...
<redacted>
...,0.017593635,-0.040275685,-0.03914233,-0.018452475,0.00826032,-0.07372604
]'::vector)
                           ->  Index Scan using product_inventory_pkey on cymbal_inventory ci  (cost=0.42..7.17 rows=1 width=37) (actual time=0.104..0.104 rows=0 loops=3)
                                 Index Cond: ((store_id = 1583) AND (uniq_id = (cp.uniq_id)::text))
                                 Filter: (inventory > 0)
                                 Rows Removed by Filter: 1
                     ->  Materialize  (cost=0.28..8.31 rows=1 width=8) (actual time=0.133..0.134 rows=1 loops=1)
                           ->  Index Scan using product_stores_pkey on cymbal_stores cs  (cost=0.28..8.30 rows=1 width=8) (actual time=0.129..0.129 rows=1 loops=1)
                                 Index Cond: (store_id = 1583)
 Planning Time: 112.398 ms
 Execution Time: 1.221 ms

از خروجی می‌توانیم به وضوح ببینیم که کوئری از «اسکن شاخص با استفاده از cymbal_products_embeddings_hnsw» استفاده می‌کرده است.

و اگر کوئری را بدون توضیح اجرا کنیم:

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-005','What kind of fruit trees grow well here?')::vector) ASC
LIMIT 1)
SELECT json_agg(trees) FROM trees;

خروجی مورد انتظار (خروجی می‌تواند بر اساس مدل و شاخص متفاوت باشد):

[{"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"}]

می‌توانیم ببینیم که نتیجه یکسان است و همان درخت گیلاسی را که در جستجوی بدون اندیس در صدر قرار داشت، برمی‌گرداند. بسته به پارامترها و نوع اندیس، ممکن است نتیجه کمی متفاوت باشد و رکورد برتر متفاوتی برای درخت برگردانده شود. در طول آزمایش‌های من، پرس‌وجوی اندیس‌گذاری شده نتایجی در ۱۳۱.۳۰۱ میلی‌ثانیه در مقابل ۱۶۷.۶۳۱ میلی‌ثانیه بدون هیچ اندیسی برگرداند، اما ما با یک مجموعه داده بسیار کوچک سروکار داشتیم و این تفاوت در داده‌های بزرگتر قابل توجه‌تر خواهد بود.

می‌توانید شاخص‌های مختلف موجود برای بردارها و آزمایش‌ها و مثال‌های بیشتر با ادغام langchain را که در مستندات موجود است، امتحان کنید.

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

نمونه Cloud SQL را حذف کنید

وقتی کارتان با آزمایشگاه تمام شد، نمونه Cloud SQL را از بین ببرید.

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

export INSTANCE_NAME=my-cloudsql-instance
export PROJECT_ID=$(gcloud config get-value project)

حذف نمونه:

gcloud sql instances delete $INSTANCE_NAME --project=$PROJECT_ID

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

student@cloudshell:~$ gcloud sql instances delete $INSTANCE_NAME --project=$PROJECT_ID
All of the instance data will be lost when the instance is deleted.

Do you want to continue (Y/n)?  y

Deleting Cloud SQL instance...done.                                                                                                                
Deleted [https://sandbox.googleapis.com/v1beta4/projects/test-project-001-402417/instances/my-cloudsql-instance].

۱۲. تبریک

تبریک می‌گویم که آزمایشگاه کد را تمام کردی.

این آزمایشگاه بخشی از پروژه «هوش مصنوعی آماده تولید با مسیر یادگیری ابری گوگل» است.

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

  • نحوه استقرار Cloud SQL برای نمونه PostgreSQL
  • نحوه ایجاد پایگاه داده و فعال کردن ادغام Cloud SQL AI
  • نحوه بارگذاری داده‌ها در پایگاه داده
  • نحوه استفاده از کلود اس کیو ال استودیو
  • نحوه استفاده از مدل تعبیه هوش مصنوعی Vertex در Cloud SQL
  • نحوه استفاده از استودیوی هوش مصنوعی ورتکس
  • چگونه با استفاده از مدل مولد هوش مصنوعی Vertex، نتیجه را غنی کنیم؟
  • چگونه با استفاده از شاخص برداری، عملکرد را بهبود بخشیم؟

به جای HNSW، codelab مشابه را برای AlloyDB با شاخص ScaNN امتحان کنید

۱۳. نظرسنجی

خروجی:

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

فقط آن را بخوانید آن را بخوانید و تمرین‌ها را انجام دهید