۱. مرور کلی
یک اپلیکیشن مد را تصور کنید که نه تنها به شما در یافتن لباس ایدهآل کمک میکند، بلکه به لطف قدرت ادغام پیشرفته genAI، مشاوره استایل را نیز به صورت بلادرنگ ارائه میدهد! در این سخنرانی، بررسی خواهیم کرد که چگونه چنین اپلیکیشنی را با استفاده از قابلیتهای جستجوی برداری AlloyDB، همراه با شاخص ScaNN گوگل، ساختهایم که امکان جستجوی سریع لباسهای منطبق و ارائه توصیههای فوری مد را فراهم میکند.
همچنین بررسی خواهیم کرد که چگونه شاخص ScaNN در AlloyDB، پرسوجوهای پیچیده را برای تولید پیشنهادهای سبک شخصیسازیشده بهینه میکند. همچنین از مدلهای قدرتمند هوش مصنوعی مولد Gemini و Imagen برای ارائه الهامبخشی خلاقانه در سبکها و حتی تجسم ظاهر شخصیسازیشده شما استفاده خواهیم کرد. کل این برنامه بر اساس معماری بدون سرور ساخته شده است که تجربهای یکپارچه و مقیاسپذیر را برای کاربران تضمین میکند.
چالش: این اپلیکیشن با ارائه پیشنهادهای شخصیسازیشده برای لباس، قصد دارد به افرادی که در انتخاب مد با تردید مواجه هستند کمک کند. همچنین به جلوگیری از خستگی ناشی از تصمیمگیری در برنامهریزی لباس کمک میکند.
راه حل: این اپلیکیشن پیشنهاد دهنده لباس، مشکل ارائه یک تجربه مد هوشمند، شخصیسازی شده و جذاب به کاربران را حل میکند و در عین حال قابلیتهای AlloyDB، هوش مصنوعی مولد و فناوریهای بدون سرور را به نمایش میگذارد.
آنچه خواهید ساخت
به عنوان بخشی از این آزمایشگاه، شما:
- یک نمونه AlloyDB ایجاد کنید و مجموعه دادههای تجارت الکترونیک را بارگذاری کنید
- فعال کردن افزونههای pgvector و مدل هوش مصنوعی مولد در AlloyDB
- ایجاد جاسازیها از توضیحات محصول
- راهکار را در Cloud Run Functions بدون سرور مستقر کنید
- تصویری را در Gemini بارگذاری کنید و یک توضیح سریع برای تصویر ایجاد کنید.
- نتایج جستجو را بر اساس اعلانها همراه با تعبیه مجموعه دادههای تجارت الکترونیک تولید کنید.
- برای سفارشیسازی اعلان و ایجاد توصیههای سبک، اعلانهای اضافی اضافه کنید.
- راهکار را در Cloud Run Functions بدون سرور مستقر کنید
الزامات
۲. معماری
معماری سطح بالای برنامه به شرح زیر است:

بخشهای زیر جریان محتوایی آموزش را برجسته میکنند:
بلعیدن :
اولین قدم ما وارد کردن دادههای خردهفروشی (موجودی، توضیحات محصول، تعاملات مشتری) به AlloyDB است.
موتور تجزیه و تحلیل:
ما از AlloyDB به عنوان موتور تحلیلی برای انجام موارد زیر استفاده خواهیم کرد:
- استخراج محتوا: موتور، دادههای ذخیره شده در AlloyDB را تجزیه و تحلیل میکند تا روابط بین محصولات، دستهها، رفتار مشتری و غیره را در صورت لزوم درک کند.
- ایجاد جاسازی: جاسازیها (نمایشهای ریاضی متن) هم برای پرسوجوی کاربر و هم برای اطلاعات ذخیره شده در AlloyDB ایجاد میشوند.
- جستجوی برداری: موتور جستجویی بر اساس شباهت انجام میدهد و جاسازی پرسوجو را با جاسازیهای توضیحات محصول، نقدها و سایر دادههای مرتبط مقایسه میکند. این کار ۲۵ مورد از مرتبطترین «همسایههای نزدیک» را شناسایی میکند.
توصیه جوزا:
آرایه بایت تصویر از طریق رابط برنامهنویسی کاربردی هوش مصنوعی Vertex به مدل Gemini ارسال میشود، به همراه پیامی که درخواست توصیف متنی از پوشش بالایی به همراه پیشنهادهای توصیه برای پوشش پایینی را دارد.
جستجوی RAG و بردار AlloyDB:
از توضیحات مربوط به لباسهای رویی برای پرسوجو در پایگاه داده استفاده میشود. پرسوجو، متن جستجو (توصیه از مدل Gemini برای تطبیق لباسهای زیرین) را به جاسازیها تبدیل میکند و یک جستجوی برداری روی جاسازیهای ذخیره شده در پایگاه داده انجام میدهد تا نزدیکترین همسایهها (نتایج تطبیق) را پیدا کند. جاسازیهای برداری در پایگاه داده AlloyDB برای یادآوری بهتر با استفاده از شاخص ScaNN فهرستبندی میشوند.
تولید تصویر پاسخ:
پاسخهای اعتبارسنجیشده در یک آرایه JSON ساختاردهی میشوند و کل موتور در یک تابع Cloud Run بدون سرور بستهبندی میشود که از Agent Builder فراخوانی میشود.
تولید تصویر Imagen:
درخواست کاربر برای استایلبندی، پیشنهاد انتخابشده توسط کاربر و هرگونه درخواست شخصیسازی با هم ترکیب میشوند تا Imagen 3 را با یک تصویر موجود فراخوانی کنند. تصویر استایلبندی بر اساس این درخواست و با استفاده از API هوش مصنوعی Vertex تولید میشود.
۳. قبل از شروع
ایجاد یک پروژه
- در کنسول گوگل کلود ، در صفحه انتخاب پروژه، یک پروژه گوگل کلود را انتخاب یا ایجاد کنید.
- مطمئن شوید که صورتحساب برای پروژه ابری شما فعال است. یاد بگیرید که چگونه بررسی کنید که آیا صورتحساب در یک پروژه فعال است یا خیر .
- شما از Cloud Shell ، یک محیط خط فرمان که در Google Cloud اجرا میشود و bq از قبل روی آن بارگذاری شده است، استفاده خواهید کرد. روی Activate Cloud Shell ( کلیک کنید.
) در بالای کنسول گوگل کلود. - پس از اتصال به Cloud Shell، با استفاده از دستور زیر تأیید کنید که از قبل احراز هویت شدهاید و پروژه روی شناسه پروژه شما تنظیم شده است:
gcloud auth list
- برای اطمینان از اینکه دستورات بعدی gcloud پروژه شما را به درستی شناسایی میکنند، دستور زیر را اجرا کنید.
gcloud config list project
- اگر پروژه شما تنظیم نشده است، از دستور زیر برای تنظیم صریح آن استفاده کنید:
gcloud config set project <YOUR_PROJECT_ID>
- فعال کردن API های مورد نیاز
برای فعال کردن APIها، روی لینک کلیک کنید.
اگر فعال کردن هر API را فراموش کردید، میتوانید همیشه آن را در طول پیادهسازی فعال کنید.
برای اطلاعات بیشتر در مورد دستورات و کاربردهای gcloud، به مستندات مراجعه کنید.
۴. تنظیم پایگاه داده
در این آزمایش، ما از AlloyDB به عنوان پایگاه داده برای ذخیره مجموعه دادههای تجارت الکترونیک خردهفروشی استفاده خواهیم کرد. این پایگاه داده از خوشهها برای ذخیره تمام منابع، مانند پایگاههای داده و گزارشها، استفاده میکند. هر خوشه یک نمونه اصلی دارد که یک نقطه دسترسی به دادهها را فراهم میکند. جداول منبع واقعی ذخیره دادهها هستند.
بیایید یک کلاستر، نمونه و جدول AlloyDB ایجاد کنیم که مجموعه دادههای تجارت الکترونیک در آن بارگذاری شود.
ایجاد یک کلاستر و نمونه
- در کنسول ابری گوگل، AlloyDB را جستجو کنید. یک راه آسان برای یافتن اکثر صفحات در کنسول ابری، جستجوی آنها با استفاده از نوار جستجوی کنسول است.
- روی ایجاد خوشه کلیک کنید.

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

- در بخش شبکه، وقتی شبکه پیشفرض را انتخاب میکنید، گزینه زیر ظاهر میشود. برای تنظیم شبکه پیشفرض، روی SET UP CONNECTION کلیک کنید.

- گزینه « استفاده از یک محدوده IP اختصاص داده شده خودکار» را انتخاب کرده و روی «ادامه» کلیک کنید. پس از بررسی اطلاعات، روی «ایجاد اتصال» کلیک کنید.

منتظر بمانید تا ایجاد شبکه پیشفرض تکمیل شود.
- در پیکربندی نمونه اصلی خود، شناسه نمونه را روی "
shopping-instance"تنظیم کنید.

- برای تکمیل تنظیمات خوشه، روی CREATE CLUSTER کلیک کنید:

۵. دریافت دادهها
اکنون زمان آن رسیده است که یک جدول با دادههای مربوط به فروشگاه اضافه کنید. منتظر بمانید تا نمونه شما ایجاد شود. پس از ایجاد، میتوانید با استفاده از اعتبارنامههایی که هنگام ایجاد خوشه تنظیم کردهاید، وارد AlloyDB شوید.
احراز هویت در پایگاه داده AlloyDB
- در کنسول گوگل کلود، به AlloyDB بروید. خوشه اصلی را انتخاب کنید و سپس در منوی سمت چپ روی AlloyDB Studio کلیک کنید:

- برای احراز هویت در پایگاه داده AlloyDB، جزئیات زیر را وارد کنید:
- نام کاربری: "
postgres" - پایگاه داده: "
postgres" - رمز عبور: "
alloydb"
پس از احراز هویت موفقیتآمیز در AlloyDB Studio، دستورات SQL در تبهای Editor وارد میشوند. میتوانید با استفاده از علامت + در سمت راست اولین تب Editor، چندین پنجره Editor اضافه کنید.

شما میتوانید دستورات 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) );
پس از اجرای موفقیتآمیز دستور فوق، باید بتوانید جدول را در
تصویر زیر یک مثال را نشان میدهد:

دریافت داده
برای این تمرین، ما دادههای آزمایشی حدود ۲۰۰ رکورد در این فایل SQL داریم. این فایل شامل id, category, sub_category, uri, image و content است. فیلدهای دیگر بعداً در تمرین پر خواهند شد.
- عبارتهای ۲۰ خطی/درج شده را از فایل SQL در یک تب جدید ویرایشگر در AlloyDB Studio کپی کنید و روی RUN کلیک کنید.
- بخش «کاوشگر» را گسترش دهید تا بتوانید جدولی با نام
apparelsرا ببینید. - روی آیکون منو [ ⋮ ] کلیک کنید و سپس روی Query کلیک کنید. یک دستور SELECT در یک تب جدید Editor باز خواهد شد.

- برای تأیید درج ردیفها، روی «اجرا» کلیک کنید.
اعطای مجوز به کاربر
ما به کاربر postgres اجازه میدهیم تا از درون AlloyDB، جاسازیها را ایجاد کند . در AlloyDB Studio، دستور زیر را اجرا کنید تا به کاربر postgres اجازه اجرای تابع embedding داده شود:
GRANT EXECUTE ON FUNCTION embedding TO postgres;
اعطای نقش کاربری Vertex AI به حساب سرویس AlloyDB
ما از مدلهای جاسازی متن از Vertex AI برای تولید جاسازیهایی استفاده خواهیم کرد که نقش کاربر Vertex AI را در حساب سرویس AlloyDB تعیین میکنند.
در کنسول گوگل کلود، روی ترمینال کلود شل کلیک کنید [
آیکون ] را انتخاب کرده و دستور زیر را اجرا کنید:
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"
۶. زمینهسازی کنید
برای ایجاد یک جاسازی، به یک context نیاز داریم، یعنی تمام اطلاعاتی که میخواهیم در یک فیلد واحد بگنجانیم. ما این کار را با ایجاد یک شرح محصول که در ستون pdt_desc در جدول apparels ذخیره خواهیم کرد، انجام خواهیم داد.
در مورد ما، ما از تمام اطلاعات مربوط به هر محصول استفاده خواهیم کرد، اما وقتی شما این کار را با دادههای خودتان انجام میدهید، میتوانید دادهها را به هر روشی که برای کسبوکارتان معنادار میدانید، مهندسی کنید.
در تب AlloyDB Studio Editor، دستور زیر را اجرا کنید که فیلد 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 با استفاده از اطلاعات تمام فیلدهای موجود در جدول و سایر وابستگیها (در صورت وجود در مورد استفاده شما)، یک خلاصه زمینه ساده ایجاد میکند. برای دستهبندی دقیقتر اطلاعات و ایجاد زمینه، میتوانید دادهها را به هر روشی که برای کسبوکارتان معنادار میدانید، مهندسی کنید.
۷. ایجاد جاسازیها برای متن
پردازش اعداد برای کامپیوترها بسیار آسانتر از پردازش متن است. یک سیستم جاسازی، متن را به مجموعهای از اعداد اعشاری تبدیل میکند که باید متن را نمایش دهند، صرف نظر از اینکه متن چگونه نوشته شده باشد، از چه زبانی استفاده شود و غیره.
توصیف یک مکان ساحلی را در نظر بگیرید. ممکن است به آن "on the water »، « beachfront »، « walk from your room to the ocean »، « sur la mer »، « на берегу океана » و غیره گفته شود. همه این اصطلاحات متفاوت به نظر میرسند، اما معنای معنایی آنها یا در اصطلاحات یادگیری ماشین، جاسازیهای آنها باید بسیار نزدیک به یکدیگر باشد.
اکنون که دادهها و متن آماده هستند، SQL را اجرا میکنیم تا جاسازیهای ستون توضیحات محصول (pdt_desc ) را به جدول در فیلد embedding اضافه کنیم. مدلهای جاسازی متنوعی وجود دارد که میتوانید استفاده کنید. ما از text-embedding-005 از Vertex AI استفاده میکنیم.
- در AlloyDB Studio، دستور زیر را برای تولید جاسازیها اجرا کنید و ستون
pdt_descرا با جاسازیهایی برای دادههایی که ذخیره میکند، بهروزرسانی کنید:
UPDATE
apparels
SET
embedding = embedding( 'text-embedding-005',
pdt_desc)
WHERE
TRUE;
- با اجرای دستور زیر، تأیید کنید که جاسازیها ایجاد شدهاند:
SELECT
id,
category,
sub_category,
content,
embedding
FROM
Apparels
LIMIT 5;
در ادامه، یک بردار جاسازی نمونه، که شبیه آرایهای از اعداد اعشاری است، برای متن نمونه در کوئری به صورت زیر آمده است:

۸. جستجوی برداری انجام دهید
اکنون که جدول، دادهها و جاسازیها آماده هستند، بیایید جستجوی برداری بلادرنگ را برای متن جستجوی کاربر انجام دهیم.
فرض کنید متن جستجوی کاربر « pink color, casual, pure cotton tops for women » است.
برای یافتن موارد منطبق با این پرسوجو، پرسوجوی SQL زیر را اجرا کنید:
SELECT
id,
category,
sub_category,
content,
pdt_desc AS description
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-005',
'pink color, casual, pure cotton tops for women')::vector
LIMIT
5;
بیایید این پرس و جو را با جزئیات بررسی کنیم:
در این پرس و جو،
- متن جستجوی کاربر این است: «
I want womens tops, pink casual only pure cotton.» - ما این متن جستجو را با استفاده از متد
embedding()به همراه مدلtext-embedding-005به جاسازی تبدیل میکنیم. این مرحله باید پس از مرحله قبل، که در آن تابع جاسازی را روی همه موارد موجود در جدول اعمال کردیم، آشنا به نظر برسد. - «
<=>» نشان دهنده استفاده از روش فاصله COSINE SIMILARITY است. میتوانید تمام معیارهای شباهت موجود را در مستندات pgvector بیابید. - ما در حال تبدیل نتیجه روش جاسازی به نوع داده برداری هستیم تا آن را با بردارهای ذخیره شده در پایگاه داده سازگار کنیم.
- محدودیت ۵ نشان میدهد که میخواهیم ۵ همسایه نزدیک برای متن جستجو استخراج کنیم.
مثال زیر پاسخ این کوئری SQL را نشان میدهد:

همانطور که در نتایج خود مشاهده میکنید، نتایج جستجو بسیار نزدیک به متن جستجو هستند. سعی کنید رنگ را تغییر دهید تا ببینید نتایج چگونه تغییر میکنند.
شاخص AlloyDB ScaNN برای عملکرد پرس و جو
حال فرض کنید میخواهیم عملکرد (زمان پرسوجو)، کارایی و میزان فراخوانی این نتیجهی جستجوی برداری را با استفاده از شاخص ScaNN افزایش دهیم.
اگر میخواهید از شاخص ScaNN استفاده کنید، مراحل زیر را امتحان کنید:
- از آنجایی که ما از قبل کلاستر، نمونه، زمینه و جاسازیها را ایجاد کردهایم، فقط باید افزونه ScaNN را با استفاده از دستور زیر نصب کنیم:
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
- ایجاد شاخص ScaNN:
CREATE INDEX apparel_index ON apparels
USING scann (embedding cosine)
WITH (num_leaves=54);
در DDL فوق:
-
apparel_indexنام ایندکس است. - نام میز
apparelsاست. -
scannمتد شاخص است. -
embeddingستونی در جدول است که میخواهید آن را اندیسگذاری کنید. -
cosineروش فاصلهای است که میخواهید با شاخص استفاده کنید. -
54تعداد پارتیشنهایی است که باید به این شاخص اعمال شود. میتوانید آن را روی هر مقداری بین ۱ تا ۱۰۴۸۵۷۶ تنظیم کنید. برای اطلاعات بیشتر در مورد نحوه تعیین این مقدار، به بخش تنظیم شاخص ScaNN مراجعه کنید.
طبق توصیهی موجود در مخزن ScaNN ، ما از جذر تعداد نقاط داده استفاده کردهایم. هنگام پارتیشنبندی، num_leaves باید تقریباً برابر با جذر تعداد نقاط داده باشد.
- بررسی کنید که آیا ایندکس با استفاده از پرس و جو ایجاد شده است یا خیر:
SELECT * FROM pg_stat_ann_indexes;
- جستجوی برداری را با استفاده از همان پرسوجویی که بدون اندیس استفاده کردیم، انجام دهید:
select * from apparels
ORDER BY embedding <=> CAST(embedding('textembedding-gecko', 'white tops for girls without any print') as vector(768))
LIMIT 20
پرسوجوی بالا همان پرسوجویی است که در مرحله ۸ در آزمایش استفاده کردیم. با این حال، اکنون فیلد با استفاده از شاخص ScaNN اندیسگذاری شده است.
- با یک کوئری جستجوی ساده با و بدون اندیس تست کنید. برای تست بدون اندیس، باید اندیس را حذف کنید:
white tops for girls without any print
متن جستجوی بالا در عبارت جستجوی برداری (Vector Search) روی دادههای جاسازیشدهی INDEXED منجر به نتایج جستجوی باکیفیت و کارایی میشود. کارایی با استفاده از ایندکس به میزان قابل توجهی بهبود یافته است (از نظر زمان اجرا: ۱۰.۳۷ میلیثانیه بدون ScaNN و ۰.۸۷ میلیثانیه با ScaNN). برای اطلاعات بیشتر در مورد این موضوع، لطفاً به این وبلاگ مراجعه کنید.
۹. اعتبارسنجی را با LLM مطابقت دهید
قبل از ادامه و ایجاد سرویسی برای بازگرداندن بهترین تطابقها به یک برنامه، بیایید از یک مدل هوش مصنوعی مولد برای اعتبارسنجی استفاده کنیم که آیا این پاسخهای بالقوه واقعاً مرتبط و برای اشتراکگذاری با کاربر ایمن هستند یا خیر.
اطمینان از راهاندازی نمونه برای Gemini
- تأیید کنید که
google_ml_integrationاز قبل برای کلاستر و نمونه شما فعال شده است. در AlloyDB Studio، دستور زیر را اجرا کنید:
show google_ml_integration.enable_model_support;
اگر مقدار به صورت "روشن" نشان داده شده است، میتوانید از دو مرحله بعدی صرف نظر کنید و مستقیماً به تنظیمات بروید.
ادغام مدل AlloyDB و Vertex AI.
- به نمونه اصلی کلاستر AlloyDB خود بروید و روی ویرایش نمونه اصلی (EDIT PRIMARY INSTANCE) کلیک کنید.

- در گزینههای پیکربندی پیشرفته (Advanced configuration options) ، بخش پرچم پایگاه داده جدید (New database flag) را گسترش دهید و مطمئن شوید که
google_ml_integration.enable_model_support flagبه صورت زیر روی «on» تنظیم شده باشد:
۳. اگر روی « on » تنظیم نشده است، آن را روی « on » تنظیم کنید و سپس روی «بهروزرسانی نمونه » کلیک کنید.
این مرحله چند دقیقه طول خواهد کشید.
ادغام مدل AlloyDB و Vertex AI
اکنون میتوانید به AlloyDB Studio متصل شوید و دستور DML زیر را برای تنظیم دسترسی مدل Gemini از AlloyDB، با استفاده از شناسه پروژه خود که در آن مشخص شده است، اجرا کنید. ممکن است قبل از اجرای دستور، یک خطای نحوی به شما هشدار داده شود، اما باید به خوبی اجرا شود.
- در کنسول گوگل کلود، به AlloyDB بروید. خوشه اصلی را انتخاب کنید و سپس در منوی سمت چپ روی AlloyDB Studio کلیک کنید.
- ما از
gemini-1.5-pro:generateContentکه به طور پیشفرض با افزونهgoogle_ml_integrationدر دسترس است، استفاده خواهیم کرد.
- میتوانید مدلهای پیکربندیشده برای دسترسی را از طریق دستور زیر در 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;
ارزیابی پاسخها
اگرچه در بخش بعدی که برنامه را به Cloud Run میبریم، برای اطمینان از منطقی بودن پاسخهای حاصل از پرسوجو، از یک پرسوجوی بزرگ استفاده خواهیم کرد، اما درک پرسوجو میتواند دشوار باشد.
ما به بخشهای جداگانهای که در نهایت پرسوجوی بزرگتری را که استفاده خواهیم کرد، میسازند، نگاهی خواهیم انداخت.
- ابتدا یک درخواست به پایگاه داده ارسال میکنیم تا ۵ مورد از نزدیکترین موارد منطبق با جستجوی کاربر را دریافت کنیم. برای ساده نگه داشتن این کار، کوئری را به صورت کدنویسی شده در میآوریم، اما نگران نباشید، بعداً آن را در کوئری وارد خواهیم کرد.
ما توضیحات محصول را از جدول 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-005',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5;
خروجی این پرسوجو، ۵ ردیف از ردیفهایی خواهد بود که بیشترین شباهت را به پرسوجوی کاربران دارند.
جدول جدید xyz شامل ۵ ردیف خواهد بود که هر ردیف ستونهای زیر را خواهد داشت:
-
literature -
content -
user_text
- برای تعیین میزان اعتبار پاسخها، از یک پرسوجوی پیچیده استفاده خواهیم کرد که در آن نحوه ارزیابی پاسخها را توضیح میدهیم. این پرسوجو
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."
- با استفاده از آن پرس و جو، «خوبی» پاسخها را در جدول
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;
- تابع
predict_rowنتیجه خود را در قالب JSON برمیگرداند. کد "-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'"برای استخراج متن واقعی از آن JSON استفاده میشود. برای مشاهده JSON واقعی که برگردانده میشود، میتوانید این کد را حذف کنید. - در نهایت، برای دریافت فیلد LLM، فقط باید آن را از جدول x استخراج کنید:
SELECT
LLM_RESPONSE
FROM
x;
- این را میتوان به صورت زیر در یک پرسوجوی واحد ترکیب کرد:
هشدار : اگر کوئریهای بالا را برای بررسی نتایج میانی اجرا کردهاید،
قبل از اجرای این کوئری، مطمئن شوید که جداول 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-005',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5 ) AS xyz ) AS X;
پرسوجوی بزرگتر ترکیبی از تمام پرسوجوهایی است که در مراحل قبلی اجرا کردهایم. نتایج نشان میدهد که آیا تطابقی وجود دارد یا خیر، درصد تطابق چقدر است و توضیحی در مورد رتبهبندی ارائه میدهد.
توجه داشته باشید که مدل Gemini به طور پیشفرض streaming را فعال کرده است، بنابراین پاسخ واقعی در چندین خط پخش میشود: 
۱۰. برنامه را به وب ببرید
اکنون این برنامه را میزبانی خواهیم کرد تا بتوان از طریق اینترنت به آن دسترسی داشت.
تابع Cloud Run را ایجاد کنید
- در کنسول گوگل کلود، با استفاده از لینک زیر به Cloud Run Functions بروید:
https://console.cloud.google.com/run/create?deploymentType=function
- در پیکربندی، نام تابع را روی « retail-engine » تنظیم کنید و منطقه را روی « us-central1 » انتخاب کنید.
- در Endpoint URL، زمان اجرا را Java 17 انتخاب کنید.
- در بخش احراز هویت، گزینهی «مجاز کردن فراخوانیهای احراز هویت نشده» را انتخاب کنید.
- گزینههای Container(s)، Volumes، Networking، Security را باز کنید و روی تب Networking کلیک کنید.
- برای ترافیک خروجی، گزینه «اتصال به یک VPC» را انتخاب کنید و سپس روی «استفاده از رابطهای دسترسی VPC بدون سرور» کلیک کنید.
- در بخش شبکه، روی افزودن رابط VPC جدید کلیک کنید. اگر Serverless VPC Access API فعال نیست، آن را فعال کنید.
- در کانکتور Create، نام را روی
alloydb-test-connتنظیم کنید. - منطقه را روی
us-centralتنظیم کنید. - مقدار Network را به صورت پیشفرض باقی بگذارید و Subnet را روی Custom IP Range با محدوده IP 10.8.0.0 یا چیزی مشابه آن که در دسترس است، تنظیم کنید.
- نمایش تنظیمات مقیاسبندی را گسترش دهید و حداقل نمونهها را روی ۲ و حداکثر نمونهها را روی ۳ تنظیم کنید.
- نوع Instance را f1-micro انتخاب کنید. موارد زیر گزینههای Create connector را نشان میدهد:

- برای ایجاد کانکتور، روی Create کلیک کنید.
- در بخش مسیریابی ترافیک، گزینهی «مسیریابی تمام ترافیک به VPC» را انتخاب کنید.
- برای ایجاد تابع، روی «ایجاد» کلیک کنید.
برنامه را مستقر کنید
پس از ایجاد تابع، منبع را بهروزرسانی کرده و برنامه را مجدداً مستقر کنید.
- در Cloud Run ، روی تب Services کلیک کنید و سپس روی تابع retail-engine کلیک کنید.
- روی تب Source کلیک کنید. مقدار پیشفرض ورودی Function را روی «
gcfv2.HelloHttpFunction» بگذارید. - محتویات فایل HelloHttpFunction.java را با محتویات این فایل جاوا جایگزین کنید.
- جزئیات AlloyDbJdbcConnector را در فایل مطابق با جزئیات نمونه و کلاستر AlloyDB خود بهروزرسانی کنید.
$PROJECT_IDرا با شناسه پروژه کلاستر و نمونه AlloyDB خود جایگزین کنید.

- محتویات فایل pom.xml را با محتویات این فایل XML جایگزین کنید.
- برای استقرار عملکرد، روی ذخیره و استقرار مجدد کلیک کنید.
۱۱. اپلیکیشن موتور خردهفروشی را آزمایش کنید
پس از استقرار تابع ابری بهروزرسانیشده، باید نقطه پایانی را در قالب زیر مشاهده کنید:
https://retail-engine-PROJECT_NUMBER.us-central1.run.app
میتوانید با اجرای دستور زیر، آن را از ترمینال 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://retail-engine-$PROJECT_NUMBER.us-central1.run.app \
-H 'Content-Type: application/json' \
-d '{"search":"I want some kids clothes themed on Disney"}' \
| jq .
و نتیجه:

اکنون که جستجوی بردار شباهت را با استفاده از مدل جاسازیها روی دادههای AlloyDB اجرا کردهایم، میتوانیم به سمت ایجاد برنامهای برویم که از این جاسازیها به همراه تصویر شما استفاده میکند و از شما میخواهد پیشنهادهای استایلدهی ایجاد کنید.
۱۲. جریان توصیه لباس را درک کنید
اپلیکیشن پیشنهاد لباس، یک اپلیکیشن بوت سریع است که طوری پیکربندی شده تا با جاسازیهایی که ما در اپلیکیشن موتور خردهفروشی AlloyDB به همراه Gemini و Imagen ایجاد کردهایم، کار کند تا گزینههای بصری برای استایل لباس ایجاد کند. همچنین به شما امکان میدهد تا پیشنهادهای سفارشی اضافه کنید و پیشنهاد را بداههسازی کنید.
به این شکل به آن فکر کنید، شما تصویری از یک تاپ صورتی پررنگ در کمد لباس خود را در این برنامه آپلود میکنید. وقتی روی «نمایش» کلیک میکنید، بر اساس دستورالعمل تنظیمشده در کد برنامه و جاسازیها در پایگاه داده AlloyDB، برنامه چندین گزینه مطابق با تصویر اصلی تولید میکند. حالا شما به این فکر میکنید که گزینههای پیشنهادی با یک گردنبند آبی چگونه به نظر میرسند، بنابراین یک دستورالعمل در آن خطوط اضافه میکنید و روی «سبک» کلیک میکنید. تصویر نهایی تولید میشود که ترکیبی قدرتمند از تصویر اصلی و توصیهها را برای ایجاد یک لباس مطابق با آن ترکیب میکند.
برای شروع ایجاد برنامه توصیه لباس، این مراحل را دنبال کنید:
- در Cloud Run ، برنامه retail-engine را باز کنید و URL برنامه خود را یادداشت کنید. این مخزن جاسازیها است که ما برای تولید پیشنهادهای مشابه از آن استفاده خواهیم کرد.
- در IDE خود، مخزن https://github.com/AbiramiSukumaran/outfit-recommender/ را کپی کنید. برای این تمرین، مراحل نشان داده شده در IDE ویژوال استودیو کد انجام میشوند.
git clone https://github.com/AbiramiSukumaran/outfit-recommender/
در زیر برخی از فایلهای مهم موجود در دایرکتوری برنامه آمده است:
-
src/main: دایرکتوری منبع که فایلهای برنامه و HTML در آن قرار دارند: -
HelloWorldApplication.java: نقطه ورودی اصلی برای برنامه بوت اسپرینگ. -
HelloWorldController.java: کنترلر Spring Boot REST که درخواستهای HTTP مربوط به یک برنامه توصیهگر لباس را مدیریت میکند. این فایل درخواستهای GET و POST را مدیریت میکند، اعلانهای کاربر را پردازش میکند، تصاویر را تجزیه و تحلیل میکند، با جاسازیهای AlloyDB تعامل دارد و پاسخ نهایی را به رابط کاربری برمیگرداند. این کنترلر کلاس GenerateImageSample را فراخوانی میکند. -
GenerateImageSample.java: شامل کلاس تولید تصویر است که به Vertex AI متصل میشود، اعلان کاربر را قالببندی میکند، فراخوانیهای API را به مدل Imagen انجام میدهد و تصویر پیشبینیشده را به کلاس کنترلر برمیگرداند. -
Resources: این دایرکتوری شامل تصاویر و فایلهای HTML مورد نیاز برای تولید رابط کاربری برنامه است. -
Pom.xml: وابستگیها و پیکربندیهای پروژه را تعریف میکند.
- در ویژوال استودیو کد، فایل
HelloWorldController.javaرا باز کنید و نمونههایی از شناسه پروژه و مکان را مطابق با جایی که نمونه AlloyDB شما ایجاد شده است، بهروزرسانی کنید.

-
endpointبه آدرس اینترنتی برنامه موتور خرده فروشی که قبلاً میزبانی کردهاید، بهروزرسانی کنید.

- فایل
GenerateImageSample.javaرا باز کنید و شناسه پروژه و مکان را مطابق با جایی که نمونه AlloyDB شما ایجاد شده است، بهروزرسانی کنید.

- تمام فایلها را ذخیره کنید.
اکنون این برنامه را در فضای ابری بدون سرور Cloud Run مستقر خواهیم کرد.
۱۳. اپلیکیشن را به وب ببرید
اکنون که جزئیات مربوط به پروژه، مکان و موتور خردهفروشی را به برنامهی spring boot پیشنهاددهندهی لباس اضافه کردهایم، میتوانیم برنامه را در Cloud Run مستقر کنیم.
ما از دستور gcloud run deploy در ترمینال Visual Code Studio برای استقرار برنامه استفاده خواهیم کرد. برای Visual Studio Code، میتوانید افزونه Google Cloud Code را نصب کنید تا از gcloud CLI استفاده کنید.
برای استقرار برنامه، مراحل زیر را دنبال کنید:
- در IDE خود، پوشهی کلونشده را باز کنید و ترمینال را اجرا کنید. برای Visual Code Studio، روی Terminal > New Terminal کلیک کنید.
- برای نصب رابط خط فرمان gcloud، دستورالعملهای موجود در این سند را دنبال کنید.
- اگر از Visual Code Studio استفاده میکنید، روی Extensions کلیک کنید، Google Cloud Code را جستجو کنید و افزونه را نصب کنید.
- در ترمینال IDE خود، با اجرای دستور زیر، حساب گوگل خود را تأیید کنید:
gcloud auth application-default login
- شناسه پروژه خود را روی همان پروژهای که نمونه AlloyDB شما در آن قرار دارد، تنظیم کنید.
gcloud config set project PROJECT_ID
- فرآیند استقرار را آغاز کنید.
gcloud run deploy
- در
Source code location، کلید Enter را فشار دهید تا دایرکتوری GitHub کپی شده انتخاب شود. - در
Service name، نامی برای سرویس وارد کنید، مانند outfit-recommender، و Enter را فشار دهید. - در قسمت
Please specify a region، مکانی را که نمونه AlloyDB و برنامه retail-engine شما در آن میزبانی میشود، وارد کنید، مانند ۳۲ برای us-central1، و Enter را فشار دهید.

- در قسمت
Allow unauthenticated invocations to [..]، حرف Y را وارد کنید و Enter را بزنید.
تصویر زیر روند نصب و راهاندازی اپلیکیشن شما را نشان میدهد:

۱۴. اپلیکیشن پیشنهاد لباس را امتحان کنید
پس از اینکه برنامه با موفقیت در Cloud Run مستقر شد، میتوانید سرویس را در کنسول Google Cloud به صورت زیر مشاهده کنید:
- در کنسول گوگل کلود، به Cloud Run بروید.
- در بخش سرویسها، روی سرویس توصیهگر لباسی که راهاندازی کردهاید کلیک کنید. باید هم موتور خردهفروشی و هم سرویس توصیهگر لباس را به صورت زیر ببینید:

- برای باز کردن رابط کاربری برنامهی توصیهگر، روی آدرس اینترنتی (URL) برنامه کلیک کنید.

The following is a sample URL that you will use:
https://outfit-recommender-22905290964.us-central1.run.app/style
برنامهی اجرا شده را میتوان به شکل زیر مشاهده کرد:

با استفاده از برنامه
برای شروع استفاده از برنامه، مراحل زیر را دنبال کنید:
- روی آپلود کلیک کنید و تصویری از یک لباس را آپلود کنید.
- پس از آپلود تصویر، روی Style کلیک کنید. برنامه از تصویر به عنوان یک اعلان استفاده میکند و گزینههای پایینی را بر اساس اعلان برنامه موتور خردهفروشی تولید میکند که شامل جاسازیهایی برای مجموعه دادههای خردهفروشی است.
این اپلیکیشن پیشنهادهای تصویری به همراه یک راهنما بر اساس تصویر و توصیههای استایل ارائه میدهد. برای مثال، A white semi-sheer button up blouse with pink floral patterns on it, with balloon sleeves.
- میتوانید پیشنهادهای بیشتری را به این پیشنهاد سبک که به صورت خودکار تولید میشود، ارسال کنید. برای مثال،
STYLE RECOMMENDATION: Cute brown skirt on a curly updo. Make it photo realistic. Accessorize with cherry earrings and burgundy plastic case sling bag. - برای دیدن استایل نهایی، روی نمایش کلیک کنید.

۱۵. تمیز کردن
برای جلوگیری از تحمیل هزینه به حساب Google Cloud خود برای منابع استفاده شده در این پست، این مراحل را دنبال کنید:
- در کنسول گوگل کلود، به صفحه مدیریت منابع بروید.
- در لیست پروژهها، پروژهای را که میخواهید حذف کنید انتخاب کنید و سپس روی «حذف» کلیک کنید.
- در کادر محاورهای، شناسه پروژه را تایپ کنید و سپس برای حذف پروژه، روی خاموش کردن کلیک کنید.
۱۶. تبریک
تبریک! شما با موفقیت جستجوی شباهت را با استفاده از AlloyDB، pgvector و Vector search انجام دادید و از نتیجه جستجو با مدل قدرتمند Imagen برای تولید توصیههای استایل استفاده کردید.