با AlloyDB و Vertex AI Agent Builder یک دستیار خرید هوشمند بسازید - قسمت 1

۱. مرور کلی

در چشم‌انداز پرشتاب خرده‌فروشی امروزی، ارائه خدمات استثنایی به مشتریان و در عین حال فراهم کردن تجربیات خرید شخصی‌سازی‌شده از اهمیت بالایی برخوردار است. ما شما را در یک سفر فنی به سوی ایجاد یک اپلیکیشن چت دانش‌محور که برای پاسخ به سوالات مشتری، هدایت کشف محصول و سفارشی‌سازی نتایج جستجو طراحی شده است، همراهی خواهیم کرد. این راهکار نوآورانه، قدرت AlloyDB را برای ذخیره‌سازی داده‌ها، یک موتور تحلیلی داخلی برای درک زمینه‌ای، Gemini (مدل زبان بزرگ) برای اعتبارسنجی مرتبط بودن و Agent Builder گوگل را برای راه‌اندازی سریع یک دستیار مکالمه هوشمند ترکیب می‌کند.

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

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

آنچه خواهید ساخت

به عنوان بخشی از این آزمایشگاه (بخش 1)، شما:

  1. یک نمونه AlloyDB ایجاد کنید و مجموعه داده‌های تجارت الکترونیک را بارگذاری کنید
  2. فعال کردن افزونه‌های pgvector و مدل هوش مصنوعی مولد در AlloyDB
  3. ایجاد جاسازی‌ها از توضیحات محصول
  4. جستجوی شباهت کسینوسی را به صورت بلادرنگ برای متن جستجوی کاربر انجام دهید
  5. راهکار را در Cloud Run Functions بدون سرور مستقر کنید

بخش دوم این آزمایش، مراحل سازنده عامل (Agent Builder) را پوشش خواهد داد.

الزامات

  • یک مرورگر، مانند کروم یا فایرفاکس
  • یک پروژه گوگل کلود با قابلیت پرداخت.

۲. معماری

جریان داده‌ها: بیایید نگاهی دقیق‌تر به نحوه‌ی حرکت داده‌ها در سیستم خود بیندازیم:

بلعیدن :

اولین قدم ما وارد کردن داده‌های خرده‌فروشی (موجودی، توضیحات محصول، تعاملات مشتری) به AlloyDB است.

موتور تجزیه و تحلیل:

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

  1. استخراج محتوا: موتور، داده‌های ذخیره شده در AlloyDB را تجزیه و تحلیل می‌کند تا روابط بین محصولات، دسته‌ها، رفتار مشتری و غیره را در صورت لزوم درک کند.
  2. ایجاد جاسازی: جاسازی‌ها (نمایش‌های ریاضی متن) هم برای پرس‌وجوی کاربر و هم برای اطلاعات ذخیره شده در AlloyDB ایجاد می‌شوند.
  3. جستجوی برداری: موتور جستجویی بر اساس شباهت انجام می‌دهد و جاسازی پرس‌وجو را با جاسازی‌های توضیحات محصول، نقدها و سایر داده‌های مرتبط مقایسه می‌کند. این کار ۲۵ مورد از مرتبط‌ترین «همسایه‌های نزدیک» را شناسایی می‌کند.

اعتبارسنجی جمینی:

این پاسخ‌های بالقوه برای ارزیابی به Gemini ارسال می‌شوند. Gemini تعیین می‌کند که آیا آنها واقعاً مرتبط و برای اشتراک‌گذاری با کاربر ایمن هستند یا خیر.

تولید پاسخ:

پاسخ‌های اعتبارسنجی‌شده در یک آرایه JSON ساختاردهی می‌شوند و کل موتور در یک تابع Cloud Run بدون سرور بسته‌بندی می‌شود که از Agent Builder فراخوانی می‌شود.

تعامل مکالمه‌ای:

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

۳. قبل از شروع

ایجاد یک پروژه

  1. در کنسول گوگل کلود ، در صفحه انتخاب پروژه، یک پروژه گوگل کلود را انتخاب یا ایجاد کنید.
  2. مطمئن شوید که صورتحساب برای پروژه ابری شما فعال است. یاد بگیرید که چگونه بررسی کنید که آیا صورتحساب در یک پروژه فعال است یا خیر .
  3. شما از Cloud Shell ، یک محیط خط فرمان که در Google Cloud اجرا می‌شود و bq از قبل روی آن بارگذاری شده است، استفاده خواهید کرد. روی Activate Cloud Shell در بالای کنسول Google Cloud کلیک کنید.

تصویر دکمه فعال کردن Cloud Shell

  1. پس از اتصال به Cloud Shell، با استفاده از دستور زیر بررسی می‌کنید که آیا از قبل احراز هویت شده‌اید و پروژه روی شناسه پروژه شما تنظیم شده است یا خیر:
gcloud auth list
  1. دستور زیر را در Cloud Shell اجرا کنید تا تأیید شود که دستور gcloud از پروژه شما اطلاع دارد.
gcloud config list project
  1. اگر پروژه شما تنظیم نشده است، از دستور زیر برای تنظیم آن استفاده کنید:
gcloud config set project <YOUR_PROJECT_ID>
  1. فعال کردن API های مورد نیاز
gcloud services enable alloydb.googleapis.com \
                       compute.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       servicenetworking.googleapis.com \
                       run.googleapis.com \
                       cloudbuild.googleapis.com \
                       cloudfunctions.googleapis.com \
                       aiplatform.googleapis.com

جایگزین دستور gcloud از طریق کنسول با جستجوی هر محصول یا استفاده از این لینک است.

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

برای دستورات و نحوه‌ی استفاده از gcloud به مستندات مراجعه کنید.

۴. راه‌اندازی پایگاه داده

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

بیایید یک کلاستر، نمونه و جدول AlloyDB ایجاد کنیم که مجموعه داده‌های تجارت الکترونیک در آن بارگذاری شود.

ایجاد یک کلاستر و نمونه

  1. در کنسول ابری، صفحه AlloyDB را پیمایش کنید. یک راه آسان برای یافتن اکثر صفحات در کنسول ابری، جستجوی آنها با استفاده از نوار جستجوی کنسول است.
  2. از آن صفحه، گزینه CREATE CLUSTER را انتخاب کنید:

f76ff480c8c889aa.png

  1. صفحه‌ای مانند تصویر زیر خواهید دید. یک کلاستر و نمونه با مقادیر زیر ایجاد کنید:
  • شناسه خوشه: " shopping-cluster "
  • رمز عبور: " alloydb "
  • سازگار با PostgreSQL 15
  • منطقه: " us-central1 "
  • شبکه: « default »

538dba58908162fb.png

  1. وقتی شبکه پیش‌فرض را انتخاب می‌کنید، صفحه‌ای مانند تصویر زیر خواهید دید. گزینه SET UP CONNECTION را انتخاب کنید.
    7939bbb6802a91bf.png
  2. از آنجا، گزینه «استفاده از یک محدوده IP اختصاص داده شده خودکار» را انتخاب کرده و ادامه دهید. پس از بررسی اطلاعات، گزینه «ایجاد اتصال» را انتخاب کنید. 768ff5210e79676f.png
  3. پس از راه‌اندازی شبکه، می‌توانید به ایجاد خوشه خود ادامه دهید. برای تکمیل راه‌اندازی خوشه، مطابق شکل زیر، روی CREATE CLUSTER کلیک کنید:

e06623e55195e16e.png

مطمئن شوید که شناسه نمونه را به " shopping-instance" تغییر می‌دهید.

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

24eec29fa5cfdb3e.png

۵. دریافت داده‌ها

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

847e35f1bf8a8bd8.png

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

  • نام کاربری: " postgres "
  • پایگاه داده: " postgres "
  • رمز عبور: " alloydb "

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

۹۱a۸۶d۹۴۶۹d۴۹۹c۴.png

شما می‌توانید دستورات AlloyDB را در پنجره‌های ویرایشگر وارد کنید و در صورت لزوم از گزینه‌های Run، Format و Clear استفاده کنید.

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

برای ساخت این برنامه، از افزونه‌های pgvector و google_ml_integration استفاده خواهیم کرد. افزونه pgvector به شما امکان ذخیره و جستجوی جاسازی‌های برداری را می‌دهد. افزونه google_ml_integration توابعی را ارائه می‌دهد که برای دسترسی به نقاط پایانی پیش‌بینی هوش مصنوعی Vertex برای دریافت پیش‌بینی‌ها در SQL استفاده می‌کنید. این افزونه‌ها را با اجرای DDL های زیر فعال کنید :

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

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

select extname, extversion from pg_extension;

ایجاد یک جدول

با استفاده از دستور DDL زیر، یک جدول ایجاد کنید:

CREATE TABLE
 apparels ( id BIGINT,
   category VARCHAR(100),
   sub_category VARCHAR(50),
   uri VARCHAR(200),
   image VARCHAR(100),
   content VARCHAR(2000),
   pdt_desc VARCHAR(5000),
   embedding vector(768) );

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

908e33bbff58a6d.png

دریافت داده

برای این تمرین، ما داده‌های آزمایشی حدود ۲۰۰ رکورد در این فایل SQL داریم. این فایل شامل id, category, sub_category, uri, image و content است. فیلدهای دیگر بعداً در تمرین پر خواهند شد.

۲۰ خط/عبارت‌های درج‌شده را از آنجا کپی کنید و سپس آن خطوط را در یک برگه ویرایشگر خالی جای‌گذاری کنید و RUN را انتخاب کنید.

برای مشاهده‌ی محتوای جدول، بخش Explorer را باز کنید تا جدولی به نام apparels را ببینید. برای مشاهده‌ی گزینه‌ی Query the table، علامت سه‌کلون (⋮) را انتخاب کنید. یک عبارت SELECT در یک تب جدید Editor باز خواهد شد.

b31ece70e670ab89.png

اعطای مجوز

دستور زیر را اجرا کنید تا به کاربر postgres اجازه اجرای تابع embedding داده شود:

GRANT EXECUTE ON FUNCTION embedding TO postgres;

اعطای نقش کاربری Vertex AI به حساب سرویس AlloyDB

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

PROJECT_ID=$(gcloud config get-value project)

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"

۶. زمینه

به صفحه نمونه AlloyDB برگردید.

برای ایجاد یک جاسازی، به یک context نیاز داریم، یعنی تمام اطلاعاتی که می‌خواهیم در یک فیلد واحد بگنجانیم. ما این کار را با ایجاد یک شرح محصول (که آن را pdt_desc می‌نامیم) انجام خواهیم داد. در مورد ما، از تمام اطلاعات مربوط به هر محصول استفاده خواهیم کرد، اما وقتی این کار را با داده‌های خودتان انجام می‌دهید، می‌توانید داده‌ها را به هر روشی که برای کسب‌وکارتان معنادار می‌دانید، مهندسی کنید.

دستور زیر را از استودیوی AlloyDB مربوط به نمونه تازه ایجاد شده خود اجرا کنید. این کار فیلد pdt_desc را با داده‌های زمینه‌ای به‌روزرسانی می‌کند:

UPDATE
 apparels
SET
 pdt_desc = CONCAT('This product category is: ', category, ' and sub_category is: ', sub_category, '. The description of the product is as follows: ', content, '. The product image is stored at: ', uri)
WHERE
 id IS NOT NULL;

این DML با استفاده از اطلاعات تمام فیلدهای موجود در جدول و سایر وابستگی‌ها (در صورت وجود در مورد استفاده شما)، یک خلاصه زمینه ساده ایجاد می‌کند. برای دسته‌بندی دقیق‌تر اطلاعات و ایجاد زمینه، می‌توانید داده‌ها را به هر روشی که برای کسب‌وکارتان معنادار می‌دانید، مهندسی کنید.

۷. برای متن، جاسازی‌هایی ایجاد کنید

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

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

اکنون که داده‌ها و متن آماده هستند، SQL را اجرا می‌کنیم تا جاسازی‌های توضیحات محصول را به جدول در فیلد embedding اضافه کنیم. مدل‌های جاسازی متنوعی وجود دارد که می‌توانید از آنها استفاده کنید. ما text-embedding-004 از Vertex AI استفاده می‌کنیم. حتماً در طول پروژه از همان مدل جاسازی استفاده کنید!

توجه: اگر از یک پروژه Google Cloud موجود که مدتی پیش ایجاد شده است استفاده می‌کنید، ممکن است لازم باشد به استفاده از نسخه‌های قدیمی‌تر مدل جاسازی متن مانند textembedding-gecko ادامه دهید.

UPDATE
 apparels
SET
 embedding = embedding( 'text-embedding-004',
   pdt_desc)
WHERE
 TRUE;

دوباره به جدول apparels نگاه کنید تا برخی از جاسازی‌ها را ببینید. حتماً دستور SELECT را دوباره اجرا کنید تا تغییرات را ببینید.

SELECT
 id,
 category,
 sub_category,
 content,
 embedding
FROM
 apparels;

این باید بردار جاسازی‌ها را که شبیه آرایه‌ای از اعداد اعشاری است، برای متن نمونه در پرس‌وجو، مطابق شکل زیر، برگرداند:

c69c08d085389f74.png

توجه: پروژه‌های جدید Google Cloud که تحت سطح رایگان ایجاد شده‌اند، ممکن است در مورد تعداد درخواست‌های جاسازی مجاز در هر ثانیه برای مدل‌های جاسازی، با مشکلات سهمیه‌بندی مواجه شوند. پیشنهاد می‌کنیم هنگام ایجاد جاسازی، از یک پرس‌وجوی فیلتر برای شناسه استفاده کنید و سپس به صورت انتخابی ۱ تا ۵ رکورد و به همین ترتیب را انتخاب کنید.

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

اکنون که جدول، داده‌ها و جاسازی‌ها آماده هستند، بیایید جستجوی برداری بلادرنگ را برای متن جستجوی کاربر انجام دهیم.

فرض کنید کاربر می‌پرسد:

«من تاپ زنانه می‌خوام، صورتی غیررسمی، فقط از جنس پنبه خالص.»

با اجرای کوئری زیر می‌توانید موارد منطبق با این مورد را پیدا کنید:

SELECT
id,
category,
sub_category,
content,
pdt_desc AS description
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-004',
  'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5;

بیایید این پرس و جو را با جزئیات بررسی کنیم:

در این پرس و جو،

  1. متن جستجوی کاربر این است: «من تاپ زنانه، صورتی غیررسمی، فقط از جنس پنبه خالص می‌خواهم.»
  2. ما آن را در متد embedding() با استفاده از مدل text-embedding-004 به embedding تبدیل می‌کنیم. این مرحله باید پس از مرحله قبل، که در آن تابع embedding را روی همه موارد موجود در جدول اعمال کردیم، آشنا به نظر برسد.
  3. « <=> » نشان دهنده استفاده از روش فاصله COSINE SIMILARITY است. می‌توانید تمام معیارهای شباهت موجود را در مستندات pgvector بیابید.
  4. ما در حال تبدیل نتیجه روش جاسازی به نوع بردار هستیم تا آن را با بردارهای ذخیره شده در پایگاه داده سازگار کنیم.
  5. محدودیت ۵ نشان می‌دهد که می‌خواهیم ۵ همسایه نزدیک برای متن جستجو استخراج کنیم.

نتیجه به این شکل است:

4193a68737400535.png

همانطور که در نتایج خود مشاهده می‌کنید، نتایج جستجو بسیار نزدیک به متن جستجو هستند. سعی کنید رنگ را تغییر دهید تا ببینید نتایج چگونه تغییر می‌کنند.

نکته مهم:

حال فرض کنید می‌خواهیم عملکرد (زمان پرس‌وجو)، کارایی و میزان فراخوانی این نتیجه جستجوی برداری را با استفاده از شاخص ScaNN افزایش دهیم. لطفاً مراحل موجود در این وبلاگ را برای مقایسه تفاوت نتیجه با و بدون شاخص مطالعه کنید. فقط برای راحتی، مراحل ایجاد شاخص را در اینجا فهرست می‌کنم:

  1. از آنجایی که ما از قبل کلاستر، نمونه، زمینه و جاسازی‌ها را ایجاد کرده‌ایم، فقط باید افزونه ScaNN را با استفاده از دستور زیر نصب کنیم:

CREATE EXTENSION IF NOT EXISTS alloydb_scann;

  1. در مرحله بعد، شاخص (ScaNN) را ایجاد خواهیم کرد:

CREATE INDEX apparel_index ON apparels

USING scann (embedding cosine)

WITH (num_leaves=54);

در DDL بالا، apparel_index نام اندیس است.

«پوشاک» میز من است

"scann" متد اندیس است

«جاسازی» ستونی در جدول است که می‌خواهم آن را ایندکس کنم.

«کسینوس» روش فاصله‌ای است که می‌خواهم با اندیس استفاده کنم.

"54" تعداد پارتیشن‌هایی است که باید به این شاخص اعمال شود. می‌توانید آن را روی هر مقداری بین 1 تا 1048576 تنظیم کنید. برای اطلاعات بیشتر در مورد نحوه تعیین این مقدار، به تنظیم شاخص ScaNN مراجعه کنید.

من از جذر تعداد نقاط داده، همانطور که در مخزن ScaNN توصیه شده است، استفاده کردم (هنگام پارتیشن‌بندی، num_leaves باید تقریباً برابر با جذر تعداد نقاط داده باشد.)

  1. بررسی کنید که آیا ایندکس با استفاده از پرس و جو ایجاد شده است یا خیر:

SELECT * FROM pg_stat_ann_indexes;

  1. جستجوی برداری را با استفاده از همان پرس‌وجویی که بدون اندیس استفاده کردیم، انجام دهید:

select * from apparels

ORDER BY embedding <=> CAST(embedding('textembedding-gecko', 'white tops for girls without any print') as vector(768))

LIMIT 20

کوئری بالا همان کوئری‌ای است که در تمرین مرحله ۸ استفاده کردیم. با این حال، اکنون فیلد را اندیس‌گذاری کرده‌ایم.

  1. با یک کوئری جستجوی ساده با و بدون اندیس (با حذف اندیس) تست کنید:

white tops for girls without any print

متن جستجوی بالا در عبارت جستجوی برداری (Vector Search) روی داده‌های جاسازی‌شده‌ی INDEXED منجر به نتایج جستجوی باکیفیت و کارایی می‌شود. کارایی با استفاده از ایندکس به میزان قابل توجهی بهبود یافته است (از نظر زمان اجرا: ۱۰.۳۷ میلی‌ثانیه بدون ScaNN و ۰.۸۷ میلی‌ثانیه با ScaNN). برای اطلاعات بیشتر در مورد این موضوع، لطفاً به این وبلاگ مراجعه کنید.

۹. اعتبارسنجی را با LLM مطابقت دهید

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

اطمینان از راه‌اندازی نمونه برای Gemini

ابتدا بررسی کنید که آیا ادغام Google ML برای کلاستر و نمونه شما از قبل فعال شده است یا خیر. در AlloyDB Studio، دستور زیر را اجرا کنید:

show google_ml_integration.enable_model_support;

اگر مقدار به صورت "روشن" نشان داده شده است، می‌توانید از دو مرحله بعدی صرف نظر کنید و مستقیماً به تنظیمات ادغام AlloyDB و Vertex AI Model بروید.

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

456ffdf292d3c0e0.png

  1. به بخش پرچم‌ها در گزینه‌های پیکربندی پیشرفته بروید و مطمئن شوید که google_ml_integration.enable_model_support flag مطابق شکل زیر روی « on » تنظیم شده باشد:

6a59351fcd2a9d35.png

اگر روی "روشن" تنظیم نشده است، آن را روی "روشن" تنظیم کنید و سپس روی دکمه‌ی UPDATE INSTANCE کلیک کنید. این مرحله چند دقیقه طول خواهد کشید.

ادغام مدل AlloyDB و Vertex AI

اکنون می‌توانید به AlloyDB Studio متصل شوید و دستور DML زیر را برای تنظیم دسترسی مدل Gemini از AlloyDB، با استفاده از شناسه پروژه خود که در آن مشخص شده است، اجرا کنید. ممکن است قبل از اجرای دستور، یک خطای نحوی به شما هشدار داده شود، اما باید به خوبی اجرا شود.

ابتدا، اتصال مدل Gemini 1.5 را مطابق شکل زیر ایجاد می‌کنیم. به یاد داشته باشید که $PROJECT_ID در دستور زیر با شناسه پروژه Google Cloud خود جایگزین کنید.

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

می‌توانید مدل‌های پیکربندی‌شده برای دسترسی را از طریق دستور زیر در AlloyDB Studio بررسی کنید:

select model_id,model_type from google_ml.model_info_view;        

در نهایت، باید به کاربران پایگاه داده اجازه اجرای تابع ml_predict_row را بدهیم تا پیش‌بینی‌ها از طریق مدل‌های هوش مصنوعی Google Vertex اجرا شوند. دستور زیر را اجرا کنید:

GRANT EXECUTE ON FUNCTION ml_predict_row to postgres;

توجه: اگر از یک پروژه Google Cloud موجود و یک کلاستر/نمونه AlloyDB که مدتی پیش ایجاد شده است استفاده می‌کنید، ممکن است لازم باشد ارجاعات قدیمی به مدل gemini-1.5 را حذف کرده و دوباره با دستور CALL بالا ایجاد کنید و دستور grant execute on function ml_predict_row را دوباره اجرا کنید تا در صورت بروز مشکل در فراخوانی‌های بعدی gemini-1.5، بتوانید آن را اجرا کنید.

ارزیابی پاسخ‌ها

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

  1. ابتدا یک درخواست به پایگاه داده ارسال می‌کنیم تا ۵ مورد از نزدیک‌ترین موارد منطبق با درخواست کاربر را دریافت کنیم. ما برای ساده نگه داشتن این کار، پرس‌وجو را به صورت کدنویسی شده در می‌آوریم، اما نگران نباشید، بعداً آن را در پرس‌وجو وارد خواهیم کرد. ما توضیحات محصول را از جدول apparels وارد می‌کنیم و دو فیلد جدید اضافه می‌کنیم - یکی که توضیحات را با اندیس ترکیب می‌کند و دیگری با درخواست اصلی. همه اینها در جدولی به نام xyz (فقط یک نام موقت جدول) ذخیره می‌شود.
CREATE TABLE
 xyz AS
SELECT
 id || ' - ' || pdt_desc AS literature,
 pdt_desc AS content,
 'I want womens tops, pink casual only pure cotton.' AS  user_text
FROM
 apparels
ORDER BY
 embedding <=> embedding('text-embedding-004',
   'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
 5;

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

  • literature
  • content
  • user_text
  1. برای تعیین میزان اعتبار پاسخ‌ها، از یک پرس‌وجوی پیچیده استفاده خواهیم کرد که در آن نحوه ارزیابی پاسخ‌ها را توضیح می‌دهیم. این پرس‌وجو user_text و content جدول xyz به عنوان بخشی از پرس‌وجو استفاده می‌کند.
"Read this user search text: ', user_text, 
' Compare it against the product inventory data set: ', content, 
' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
  1. با استفاده از آن پرس و جو، «خوبی» پاسخ‌ها را در جدول xyz بررسی خواهیم کرد.
CREATE TABLE
  x AS
SELECT
  json_array_elements( google_ml.predict_row( model_id => 'gemini-1.5',
      request_body => CONCAT('{
 "contents": [ 
        { "role": "user", 
          "parts": 
             [ { "text": "Read this user search text: ', user_text, ' Compare it against the product inventory data set: ', content, ' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match." 
             } ]
         } 
] }'
)::json))-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'
AS LLM_RESPONSE
FROM
    xyz;
  1. تابع predict_row نتیجه خود را در قالب JSON برمی‌گرداند. کد " -> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'" برای استخراج متن واقعی از آن JSON استفاده می‌شود. برای مشاهده JSON واقعی که برگردانده می‌شود، می‌توانید این کد را حذف کنید.
  2. در نهایت، برای دریافت فیلد LLM، فقط باید آن را از جدول x استخراج کنید:
SELECT 
LLM_RESPONSE 
FROM 
        x;
  1. این را می‌توان به صورت زیر در یک کوئری واحد بعدی ترکیب کرد.

اگر کوئری‌های بالا را برای بررسی نتایج میانی اجرا کرده‌اید، قبل از اجرای این دستور، باید جداول xyz و x را از پایگاه داده AlloyDB حذف/حذف کنید.

SELECT
 LLM_RESPONSE
FROM (
 SELECT
 json_array_elements( google_ml.predict_row( model_id => 'gemini-1.5',
     request_body => CONCAT('{
     "contents": [
       { "role": "user",
         "parts":
            [ { "text": "Read this user search text: ', user_text, ' Compare it against the product inventory data set: ', content, ' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
            } ]
        }
] }'
)::json))-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'
AS LLM_RESPONSE
   FROM (
         SELECT
           id || ' - ' || pdt_desc AS literature,
           pdt_desc AS content,
         'I want womens tops, pink casual only pure cotton.' user_text
         FROM
           apparels
         ORDER BY
             embedding <=> embedding('text-embedding-004',
             'I want womens tops, pink casual only pure cotton.')::vector
         LIMIT
           5 ) AS xyz ) AS X;

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

توجه داشته باشید که مدل Gemini به طور پیش‌فرض streaming را فعال کرده است، بنابراین پاسخ واقعی در چندین خط پخش می‌شود: ۱۴e۷۴d۷۱۲۹۳b۷b۹.png

۱۰. برنامه را به وب ببرید

آماده‌اید که این برنامه را به وب ببرید؟ مراحل زیر را دنبال کنید تا این موتور دانش را بدون سرور و با استفاده از توابع ابری اجرا کنید:

  1. برای ایجاد یک تابع Cloud Run جدید، به Cloud Run Functions در کنسول Google Cloud بروید یا از لینک https://console.cloud.google.com/functions/add استفاده کنید.
  2. محیط را به عنوان " تابع اجرای ابری " انتخاب کنید. نام تابع را " retail-engine " و منطقه را " us-central1 " انتخاب کنید. Authentication را روی " Allow unauthenticated invocations " تنظیم کنید و روی NEXT کلیک کنید. Java 17 را به عنوان زمان اجرا و Inline Editor را برای کد منبع انتخاب کنید.
  3. به طور پیش‌فرض، نقطه ورود (Entry Point) را روی " gcfv2.HelloHttpFunction " تنظیم می‌کند. کد جای‌نگهدار (placeholder) در HelloHttpFunction.java و pom.xml از تابع Cloud Run خود را به ترتیب با کد فایل جاوا و XML جایگزین کنید.
  4. به یاد داشته باشید که متغیر $PROJECT_ID و اعتبارنامه‌های اتصال AlloyDB را با مقادیر خود در فایل جاوا تغییر دهید. اعتبارنامه‌های AlloyDB همان‌هایی هستند که در ابتدای این آزمایشگاه کد استفاده کرده‌ایم. اگر از مقادیر متفاوتی استفاده کرده‌اید، لطفاً همان‌ها را در فایل جاوا تغییر دهید.
  5. روی استقرار کلیک کنید.

پس از استقرار، برای اینکه تابع ابری بتواند به نمونه پایگاه داده AlloyDB ما دسترسی پیدا کند، رابط VPC را ایجاد خواهیم کرد.

مرحله مهم:

پس از آماده شدن برای استقرار، باید بتوانید توابع را در کنسول Google Cloud Run Functions مشاهده کنید. تابع تازه ایجاد شده ( retail-engine ) را جستجو کنید، روی آن کلیک کنید، سپس روی ویرایش کلیک کنید و موارد زیر را تغییر دهید:

  1. به تنظیمات زمان اجرا، ساخت، اتصالات و امنیت بروید
  2. افزایش زمان انتظار به ۱۸۰ ثانیه
  3. به برگه اتصالات بروید:

4e83ec8a339cda08.png

  1. در تنظیمات Ingress، مطمئن شوید که گزینه «Allow all traffic» انتخاب شده است.
  2. در تنظیمات Egress، روی منوی کشویی Network کلیک کنید و گزینه "Add New VPC Connector" را انتخاب کنید و دستورالعمل‌های نمایش داده شده در کادر محاوره‌ای را دنبال کنید:

8126ec78c343f199.png

  1. یک نام برای رابط VPC انتخاب کنید و مطمئن شوید که منطقه آن با منطقه شما یکسان است. مقدار Network را به صورت پیش‌فرض رها کنید و Subnet را روی Custom IP Range با محدوده IP 10.8.0.0 یا چیزی مشابه آن که در دسترس است، تنظیم کنید.
  2. SHOW SCALINING SETTINGS را باز کنید و مطمئن شوید که پیکربندی دقیقاً روی موارد زیر تنظیم شده است:

7baf980463a86a5c.png

  1. روی CREATE کلیک کنید و این کانکتور اکنون باید در تنظیمات خروجی فهرست شده باشد.
  2. کانکتور تازه ایجاد شده را انتخاب کنید
  3. انتخاب کنید که تمام ترافیک از طریق این کانکتور VPC هدایت شود.
  4. روی NEXT و سپس DEPLOY کلیک کنید.

۱۱. برنامه را آزمایش کنید

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

https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/retail-engine

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

gcloud functions call retail-engine --region=us-central1 --gen2 --data '{"search": "I want some kids clothes themed on Disney"}'

روش دیگر، می‌توانید تابع Cloud Run را به صورت زیر آزمایش کنید:

PROJECT_ID=$(gcloud config get-value project)

curl -X POST https://us-central1-$PROJECT_ID.cloudfunctions.net/retail-engine \
  -H 'Content-Type: application/json' \
  -d '{"search":"I want some kids clothes themed on Disney"}' \
  | jq .

و نتیجه:

88bc1ddfb5644a28.png

همین! انجام جستجوی بردار شباهت با استفاده از مدل Embeddings روی داده‌های AlloyDB به همین سادگی است.

ساخت عامل مکالمه‌ای!

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

۱۲. تمیز کردن

اگر قصد دارید بخش دوم این آزمایش را تکمیل کنید، از این مرحله صرف نظر کنید زیرا پروژه فعلی حذف خواهد شد.

برای جلوگیری از تحمیل هزینه به حساب Google Cloud خود برای منابع استفاده شده در این پست، این مراحل را دنبال کنید:

  1. در کنسول گوگل کلود، به صفحه مدیریت منابع بروید.
  2. در لیست پروژه‌ها، پروژه‌ای را که می‌خواهید حذف کنید انتخاب کنید و سپس روی «حذف» کلیک کنید.
  3. در کادر محاوره‌ای، شناسه پروژه را تایپ کنید و سپس برای حذف پروژه، روی خاموش کردن کلیک کنید.

۱۳. تبریک

تبریک! شما با موفقیت یک جستجوی شباهت را با استفاده از AlloyDB، pgvector و Vector search انجام دادید. با ترکیب قابلیت‌های AlloyDB ، Vertex AI و Vector Search ، ما جهش بزرگی در قابل دسترس، کارآمد و واقعاً معنادار کردن جستجوهای متنی و برداری برداشته‌ایم. بخش بعدی این آزمایش مراحل ساخت عامل را پوشش می‌دهد.