1. بررسی اجمالی
در چشم انداز خرده فروشی پرشتاب امروزی، ارائه خدمات استثنایی به مشتریان و در عین حال امکان تجربه خرید شخصی سازی شده بسیار مهم است. ما شما را به یک سفر فنی از طریق ایجاد یک برنامه چت مبتنی بر دانش می بریم که برای پاسخ به سؤالات مشتری، راهنمای کشف محصول و تنظیم نتایج جستجو طراحی شده است. این راه حل نوآورانه قدرت AlloyDB برای ذخیره سازی داده ها، یک موتور تجزیه و تحلیل داخلی برای درک زمینه، Gemini (مدل زبان بزرگ) برای اعتبارسنجی ارتباط و Agent Builder Google برای راه اندازی سریع یک دستیار مکالمه هوشمند را ترکیب می کند.
چالش: مشتریان خردهفروشی مدرن انتظار پاسخهای فوری و توصیههای محصولی را دارند که با ترجیحات منحصربهفرد آنها هماهنگ باشد. روش های جستجوی سنتی اغلب در ارائه این سطح از شخصی سازی کوتاهی می کنند.
راه حل: برنامه چت مبتنی بر دانش ما با این چالش مقابله می کند. این یک پایگاه دانش غنی حاصل از دادههای خردهفروشی شما را برای درک مقصود مشتری، پاسخ هوشمندانه و ارائه نتایج بسیار مرتبط به کار میگیرد.
چیزی که خواهی ساخت
به عنوان بخشی از این آزمایشگاه (قسمت 1)، شما:
- یک نمونه AlloyDB ایجاد کنید و مجموعه داده های تجارت الکترونیک را بارگیری کنید
- pgvector و پسوندهای مدل AI مولد را در AlloyDB فعال کنید
- جاسازی ها را از توضیحات محصول ایجاد کنید
- جستجوی شباهت کسینوس در زمان واقعی را برای متن جستجوی کاربر انجام دهید
- راه حل را در توابع اجرای ابری بدون سرور مستقر کنید
قسمت دوم آزمایشگاه مراحل Agent Builder را پوشش می دهد.
الزامات
2. معماری
جریان داده: بیایید نگاهی دقیق تر به نحوه حرکت داده ها در سیستم خود بیندازیم:
بلع :
اولین قدم ما این است که داده های خرده فروشی (موجودی، توضیحات محصول، تعاملات مشتری) را در AlloyDB وارد کنیم.
موتور تجزیه و تحلیل:
ما از AlloyDB به عنوان موتور تجزیه و تحلیل برای انجام موارد زیر استفاده خواهیم کرد:
- استخراج زمینه: موتور دادههای ذخیرهشده در AlloyDB را برای درک روابط بین محصولات، دستهها، رفتار مشتری و غیره تجزیه و تحلیل میکند.
- ایجاد جاسازی: جاسازی ها (نمایش های ریاضی متن) هم برای درخواست کاربر و هم برای اطلاعات ذخیره شده در AlloyDB ایجاد می شوند.
- جستجوی برداری: موتور جستجوی مشابهی را انجام میدهد و جاسازی پرس و جو را با تعبیههای توضیحات محصول، بررسیها و سایر دادههای مرتبط مقایسه میکند. این 25 مرتبط ترین "نزدیک ترین همسایه" را شناسایی می کند.
اعتبار سنجی جوزا:
این پاسخ های بالقوه برای ارزیابی به Gemini ارسال می شود. Gemini تعیین می کند که آیا آنها واقعاً مرتبط و ایمن هستند تا با کاربر به اشتراک بگذارند.
تولید پاسخ:
پاسخ های تایید شده در یک آرایه JSON ساختار یافته و کل موتور در یک تابع اجرای ابری بدون سرور بسته بندی می شود که از Agent Builder فراخوانی می شود.
تعامل مکالمه:
Agent Builder پاسخ ها را در قالب زبان طبیعی به کاربر ارائه می دهد و گفتگوی رفت و برگشت را تسهیل می کند. این بخش در یک آزمایشگاه پیگیری پوشش داده خواهد شد.
3. قبل از شروع
یک پروژه ایجاد کنید
- در Google Cloud Console ، در صفحه انتخاب پروژه، یک پروژه Google Cloud را انتخاب یا ایجاد کنید.
- مطمئن شوید که صورتحساب برای پروژه Cloud شما فعال است. با نحوه بررسی فعال بودن صورتحساب در پروژه آشنا شوید.
- شما از Cloud Shell استفاده خواهید کرد، یک محیط خط فرمان در حال اجرا در Google Cloud که با bq از قبل بارگذاری شده است. روی Activate Cloud Shell در بالای کنسول Google Cloud کلیک کنید.
- پس از اتصال به Cloud Shell، با استفاده از دستور زیر بررسی میکنید که قبلاً احراز هویت شدهاید و پروژه به ID پروژه شما تنظیم شده است:
gcloud auth list
- دستور زیر را در Cloud Shell اجرا کنید تا تأیید کنید که دستور gcloud از پروژه شما اطلاع دارد.
gcloud config list project
- اگر پروژه شما تنظیم نشده است، از دستور زیر برای تنظیم آن استفاده کنید:
gcloud config set project <YOUR_PROJECT_ID>
- 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 به اسناد مراجعه کنید.
4. راه اندازی پایگاه داده
در این آزمایشگاه از AlloyDB به عنوان پایگاه داده برای نگهداری داده های خرده فروشی استفاده می کنیم. از خوشهها برای نگهداری همه منابع مانند پایگاههای داده و گزارشها استفاده میکند. هر خوشه دارای یک نمونه اولیه است که یک نقطه دسترسی به داده ها را فراهم می کند. جداول داده های واقعی را نگه می دارند.
بیایید یک خوشه، نمونه و جدول AlloyDB ایجاد کنیم که مجموعه داده تجارت الکترونیک در آن بارگذاری شود.
یک خوشه و نمونه ایجاد کنید
- صفحه AlloyDB را در Cloud Console پیمایش کنید. یک راه آسان برای یافتن بیشتر صفحات در Cloud Console این است که آنها را با استفاده از نوار جستجوی کنسول جستجو کنید.
- CREATE CLUSTER را از آن صفحه انتخاب کنید:
- صفحه ای مانند تصویر زیر خواهید دید. یک خوشه و نمونه با مقادیر زیر ایجاد کنید:
- شناسه خوشه: "
shopping-cluster
" - رمز عبور: "
alloydb
" - سازگار با PostgreSQL 15
- منطقه: "
us-central1
" - شبکه سازی: "
default
"
- وقتی شبکه پیشفرض را انتخاب میکنید، صفحهای مانند تصویر زیر خواهید دید. SET UP CONNECTION را انتخاب کنید.
- از آنجا، "Use an automatically allocated IP range" و Continue را انتخاب کنید. پس از بررسی اطلاعات، CREATE CONNECTION را انتخاب کنید.
- هنگامی که شبکه شما راه اندازی شد، می توانید به ایجاد خوشه خود ادامه دهید. بر روی CREATE CLUSTER کلیک کنید تا تنظیمات خوشه را مطابق شکل زیر تکمیل کنید:
مطمئن شوید که شناسه نمونه را به " shopping-instance"
تغییر دهید.
توجه داشته باشید که ایجاد Cluster حدود 10 دقیقه طول خواهد کشید. پس از موفقیت آمیز بودن، باید صفحه ای را مشاهده کنید که شبیه به این صفحه است:
5. بلع داده ها
اکنون زمان اضافه کردن یک جدول با داده های مربوط به فروشگاه است. به AlloyDB بروید، خوشه اصلی و سپس AlloyDB Studio را انتخاب کنید:
ممکن است لازم باشد منتظر بمانید تا ایجاد نمونه شما به پایان برسد. پس از آن، با استفاده از اعتبارنامه هایی که هنگام ایجاد کلاستر ایجاد کردید، وارد AlloyDB شوید. از داده های زیر برای احراز هویت در PostgreSQL استفاده کنید:
- نام کاربری: "
postgres
" - پایگاه داده: "
postgres
" - رمز عبور: "
alloydb
"
هنگامی که با موفقیت در AlloyDB Studio احراز هویت شدید، دستورات SQL در ویرایشگر وارد می شوند. میتوانید چندین پنجره ویرایشگر را با استفاده از علامت مثبت در سمت راست آخرین پنجره اضافه کنید.
در صورت لزوم با استفاده از گزینههای Run، Format و Clear، دستورات AlloyDB را در پنجرههای ویرایشگر وارد میکنید.
برنامه های افزودنی را فعال کنید
برای ساخت این برنامه از پسوندهای 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) );
در صورت اجرای موفقیت آمیز دستور فوق، باید بتوانید جدول را در پایگاه داده مشاهده کنید. نمونه اسکرین شات در زیر نشان داده شده است:
داده ها را بلعید
برای این آزمایشگاه، ما داده های آزمایشی حدود 200 رکورد را در این فایل SQL داریم. این شامل id, category, sub_category, uri, image
و content
است. فیلدهای دیگر بعداً در آزمایشگاه پر خواهند شد.
20 سطر را از آنجا کپی کنید و سپس آن خطوط را در یک برگه ویرایشگر خالی قرار دهید و RUN را انتخاب کنید.
برای دیدن محتویات جدول، بخش Explorer را گسترش دهید تا زمانی که جدولی به نام apparels را ببینید. برای مشاهده گزینه Query جدول، سه ویرگول (⋮) را انتخاب کنید. یک عبارت SELECT در یک تب جدید ویرایشگر باز می شود.
اعطای مجوز
دستور زیر را اجرا کنید تا حقوق اجرای تابع embedding
را به کاربر postgres
اعطا کنید:
GRANT EXECUTE ON FUNCTION embedding TO postgres;
ROLE کاربر 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"
6. زمینه
به صفحه نمونه 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 یک خلاصه زمینه ساده با استفاده از اطلاعات تمام فیلدهای موجود در جدول و سایر وابستگی ها (در صورت وجود در مورد استفاده شما) ایجاد می کند. برای مجموعهای دقیقتر از اطلاعات و ایجاد زمینه، آزادانه دادهها را به هر نحوی که برای کسبوکارتان معنادار میدانید مهندسی کنید.
7. تعبیه هایی برای زمینه ایجاد کنید
پردازش اعداد برای رایانه ها بسیار آسان تر از پردازش متن است. یک سیستم جاسازی متن را به یک سری اعداد ممیز شناور تبدیل میکند که باید متن را نشان دهند، مهم نیست که چگونه کلمهبندی شده است، از چه زبانی استفاده میکند و غیره.
یک مکان ساحلی را توصیف کنید. ممکن است به آن "روی آب"، "کنار ساحل"، "از اتاق خود تا اقیانوس راه بروید"، "سور لا مر"، "на берегу океана" و غیره گفته می شود. این اصطلاحات همه متفاوت به نظر می رسند، اما معنای معنایی آنها یا در ماشین در یادگیری اصطلاحات، جاسازی آنها باید بسیار نزدیک به یکدیگر باشد.
اکنون که داده ها و زمینه آماده هستند، 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;
این باید بردار embeddings را که مانند آرایه ای از شناورها به نظر می رسد، برای متن نمونه در پرس و جو برگرداند، همانطور که در زیر نشان داده شده است:
توجه: پروژههای Google Cloud جدید ایجاد شده در سطح رایگان ممکن است در مورد تعداد درخواستهای جاسازی مجاز در هر ثانیه به مدلهای Embedding با مشکلات سهمیهای مواجه شوند. پیشنهاد ما این است که از یک پرس و جو فیلتر برای شناسه استفاده کنید و سپس همزمان با ایجاد جاسازی، 1-5 رکورد و غیره را انتخاب کنید.
8. جستجوی برداری را انجام دهید
اکنون که جدول، دادهها و جاسازیها همه آماده هستند، بیایید جستجوی برداری واقعی را برای متن جستجوی کاربر انجام دهیم.
فرض کنید کاربر بپرسد:
"من می خواهم تاپ زنانه، صورتی غیر رسمی فقط پنبه خالص."
با اجرای پرس و جو زیر می توانید موارد منطبق برای این مورد را پیدا کنید:
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;
بیایید به این پرس و جو با جزئیات نگاه کنیم:
در این پرس و جو،
- متن جستجوی کاربر این است: "من می خواهم تاپ زنانه، صورتی گاه به گاه فقط پنبه خالص."
- ما آن را با استفاده از مدل:
text-embedding-004
به embeddings در متدembedding()
تبدیل می کنیم. این مرحله باید بعد از آخرین مرحله آشنا به نظر برسد، جایی که ما تابع embedding را برای همه موارد در جدول اعمال کردیم. - "
<=>
" نشان دهنده استفاده از روش فاصله COSINE SIMILARITY است. شما می توانید تمام معیارهای شباهت موجود در مستندات pgvector را بیابید. - ما در حال تبدیل نتیجه روش embedding به نوع برداری هستیم تا آن را با بردارهای ذخیره شده در پایگاه داده سازگار کنیم.
- LIMIT 5 نشان می دهد که ما می خواهیم 5 نزدیکترین همسایه را برای متن جستجو استخراج کنیم.
نتیجه به این صورت است:
همانطور که در نتایج خود مشاهده می کنید، مطابقت ها بسیار نزدیک به متن جستجو هستند. سعی کنید رنگ را تغییر دهید تا ببینید نتایج چگونه تغییر می کند.
9. مطابقت اعتبار با LLM
قبل از حرکت و ایجاد سرویسی برای بازگرداندن بهترین موارد منطبق به یک برنامه، بیایید از یک مدل هوش مصنوعی مولد استفاده کنیم تا تأیید کنیم که آیا این پاسخهای بالقوه واقعاً مرتبط و ایمن برای به اشتراک گذاشتن با کاربر هستند یا خیر.
اطمینان از تنظیم نمونه برای Gemini
ابتدا بررسی کنید که آیا Google ML Integration قبلاً برای Cluster و Instance شما فعال است یا خیر. در AlloyDB Studio دستور زیر را بدهید:
show google_ml_integration.enable_model_support;
اگر مقدار به صورت "روشن" نشان داده شد، می توانید 2 مرحله بعدی را رد کنید و مستقیماً به راه اندازی AlloyDB و Vertex AI Model بروید.
- به نمونه اولیه خوشه AlloyDB خود بروید و روی EDIT PRIMARY INSTANCE کلیک کنید.
- در قسمت Advanced Configuration Options به بخش Flags بروید. و مطمئن شوید که
google_ml_integration.enable_model_support flag
روی "on
" مطابق شکل زیر تنظیم شده است:
اگر روی "روشن" تنظیم نشده است، آن را روی "روشن" تنظیم کنید و سپس روی دکمه 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 AI اجرا کنند. دستور زیر را اجرا کنید:
GRANT EXECUTE ON FUNCTION ml_predict_row to postgres;
توجه: اگر از یک پروژه Google Cloud موجود و یک خوشه/نمونه موجود از AlloyDB که مدتی پیش ایجاد شده استفاده میکنید، ممکن است لازم باشد ارجاعات قدیمی را به مدل gemini-1.5 رها کنید و دوباره با عبارت CALL بالا ایجاد کنید و اجرای grant execute را اجرا کنید. در صورتی که در فراخوانی های آینده gemini-1.5 با مشکل مواجه شوید، دوباره روی تابع ml_predict_row قرار دهید.
ارزیابی پاسخ ها
در حالی که برای اطمینان از معقول بودن پاسخ های پرس و جو، در پایان از یک پرس و جو بزرگ در بخش بعدی استفاده می کنیم، درک این پرس و جو ممکن است دشوار باشد. ما اکنون به قطعات نگاه می کنیم و می بینیم که چگونه آنها در چند دقیقه با هم جمع می شوند.
- ابتدا درخواستی را به پایگاه داده ارسال می کنیم تا 5 مورد منطبق با یک جستجوی کاربر را دریافت کند. ما در حال کدگذاری سخت کوئری هستیم تا ساده بماند، اما نگران نباشید، بعداً آن را در پرس و جو قرار می دهیم. ما شرح محصول را از جدول
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;
خروجی این پرس و جو 5 ردیف مشابه مربوط به پرس و جو کاربران خواهد بود. جدول جدید xyz شامل 5 ردیف است که هر سطر دارای ستون های زیر است:
-
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-004',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5 ) AS xyz ) AS X;
اگرچه هنوز ممکن است دلهره آور به نظر برسد، امیدواریم که بتوانید کمی بیشتر از آن استفاده کنید. نتایج نشان می دهد که آیا مطابقت وجود دارد یا خیر، چند درصد تطابق است، و توضیحی در مورد رتبه بندی.
توجه داشته باشید که مدل Gemini به طور پیشفرض پخش جریانی دارد، بنابراین پاسخ واقعی در چندین خط پخش میشود:
10. برنامه را به وب ببرید
برای بردن این برنامه به وب آماده هستید؟ برای ساختن این موتور دانش بدون سرور با توابع اجرای ابری، مراحل زیر را دنبال کنید:
- برای ایجاد یک عملکرد Cloud Run جدید، به Cloud Run Functions در Google Cloud Console بروید یا از پیوند استفاده کنید: https://console.cloud.google.com/functions/add .
- Environment را به عنوان " عملکرد Cloud Run " انتخاب کنید. نام تابع " retail-engine " را وارد کنید و منطقه را به عنوان "us-central1" انتخاب کنید. Authentication را روی "Allow unauthenticated invocation" تنظیم کنید و روی NEXT کلیک کنید. جاوا 17 را به عنوان زمان اجرا و ویرایشگر داخلی را برای کد منبع انتخاب کنید.
- به طور پیش فرض نقطه ورودی را روی "
gcfv2.HelloHttpFunction
" تنظیم می کند. کد مکان نگهدار درHelloHttpFunction.java
وpom.xml
تابع Cloud Run خود را به ترتیب با کد فایل جاوا و XML جایگزین کنید. - به یاد داشته باشید که مکاننمای $PROJECT_ID و اعتبار اتصال AlloyDB را با مقادیر خود در فایل جاوا تغییر دهید. اعتبارنامه های AlloyDB آنهایی هستند که در ابتدای این کد لبه استفاده کرده بودیم. اگر از مقادیر متفاوتی استفاده کرده اید، لطفاً همان را در فایل جاوا تغییر دهید.
- روی Deploy کلیک کنید.
پس از استقرار، برای اینکه به تابع Cloud اجازه دهیم به نمونه پایگاه داده AlloyDB ما دسترسی پیدا کند، رابط VPC را ایجاد می کنیم.
گام مهم:
هنگامی که برای استقرار راه افتادید، باید بتوانید عملکردها را در کنسول Google Cloud Run Functions مشاهده کنید. تابع تازه ایجاد شده ( retail-engine
) را جستجو کنید، روی آن کلیک کنید، سپس روی EDIT کلیک کنید و موارد زیر را تغییر دهید:
- به Runtime، ساخت، اتصالات و تنظیمات امنیتی بروید
- تایم اوت را به 180 ثانیه افزایش دهید
- به تب اتصالات بروید:
- در تنظیمات Ingress، مطمئن شوید که "Allow all traffic" انتخاب شده است.
- در زیر تنظیمات Egress، روی منوی کشویی Network کلیک کنید و گزینه "Add New VPC Connector" را انتخاب کنید و دستورالعمل هایی را که در کادر محاوره ای ظاهر می شود دنبال کنید:
- نامی برای اتصال VPC ارائه دهید و مطمئن شوید که منطقه با نمونه شما یکسان است. مقدار Network را به عنوان پیش فرض بگذارید و Subnet را به عنوان محدوده IP سفارشی با محدوده IP 10.8.0.0 یا چیزی مشابه که در دسترس است تنظیم کنید.
- SHOW SCALING SETTINGS را باز کنید و مطمئن شوید که پیکربندی دقیقاً روی موارد زیر تنظیم شده است:
- روی CREATE کلیک کنید و این رابط باید اکنون در تنظیمات خروج لیست شود.
- کانکتور تازه ایجاد شده را انتخاب کنید
- انتخاب کنید که تمام ترافیک از طریق این رابط VPC هدایت شود.
- روی NEXT و سپس DEPLOY کلیک کنید.
11. برنامه را تست کنید
پس از به روز رسانی Cloud Function، باید نقطه پایانی را در قالب زیر مشاهده کنید:
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 .
و نتیجه:
همین! انجام جستجوی بردار تشابه با استفاده از مدل Embeddings در داده های AlloyDB بسیار ساده است.
ساخت عامل مکالمه!
عامل در قسمت 2 این آزمایشگاه ساخته شده است.
12. پاکسازی کنید
اگر قصد دارید قسمت 2 این آزمایشگاه را تکمیل کنید، این مرحله را رد کنید زیرا با این کار پروژه فعلی حذف می شود.
برای جلوگیری از تحمیل هزینه به حساب Google Cloud خود برای منابع استفاده شده در این پست، این مراحل را دنبال کنید:
- در کنسول Google Cloud، به صفحه مدیریت منابع بروید.
- در لیست پروژه، پروژه ای را که می خواهید حذف کنید انتخاب کنید و سپس روی Delete کلیک کنید.
- در محاوره، شناسه پروژه را تایپ کنید و سپس روی Shut down کلیک کنید تا پروژه حذف شود.
13. تبریک می گویم
تبریک می گویم! شما با موفقیت جستجوی مشابهی را با استفاده از AlloyDB، pgvector و جستجوی برداری انجام دادید. با ترکیب قابلیتهای AlloyDB ، Vertex AI ، و Vector Search ، ما جهشی بزرگ در ایجاد جستجوهای متنی و برداری در دسترس، کارآمد و واقعاً معنادار برداشتهایم. قسمت بعدی این آزمایشگاه مراحل ساخت عامل را پوشش می دهد.
1. بررسی اجمالی
در چشم انداز خرده فروشی پرشتاب امروزی، ارائه خدمات استثنایی به مشتریان و در عین حال امکان تجربه خرید شخصی سازی شده بسیار مهم است. ما شما را به یک سفر فنی از طریق ایجاد یک برنامه چت مبتنی بر دانش می بریم که برای پاسخ به سؤالات مشتری، راهنمای کشف محصول و تنظیم نتایج جستجو طراحی شده است. این راه حل نوآورانه قدرت AlloyDB برای ذخیره سازی داده ها، یک موتور تجزیه و تحلیل داخلی برای درک زمینه، Gemini (مدل زبان بزرگ) برای اعتبارسنجی ارتباط و Agent Builder Google برای راه اندازی سریع یک دستیار مکالمه هوشمند را ترکیب می کند.
چالش: مشتریان خردهفروشی مدرن انتظار پاسخهای فوری و توصیههای محصولی را دارند که با ترجیحات منحصربهفرد آنها هماهنگ باشد. روش های جستجوی سنتی اغلب در ارائه این سطح از شخصی سازی کوتاهی می کنند.
راه حل: برنامه چت مبتنی بر دانش ما با این چالش مقابله می کند. این یک پایگاه دانش غنی حاصل از دادههای خردهفروشی شما را برای درک مقصود مشتری، پاسخ هوشمندانه و ارائه نتایج بسیار مرتبط به کار میگیرد.
چیزی که خواهی ساخت
به عنوان بخشی از این آزمایشگاه (قسمت 1)، شما:
- یک نمونه AlloyDB ایجاد کنید و مجموعه داده های تجارت الکترونیک را بارگیری کنید
- pgvector و پسوندهای مدل AI مولد را در AlloyDB فعال کنید
- جاسازی ها را از توضیحات محصول ایجاد کنید
- جستجوی شباهت کسینوس در زمان واقعی را برای متن جستجوی کاربر انجام دهید
- راه حل را در توابع اجرای ابری بدون سرور مستقر کنید
قسمت دوم آزمایشگاه مراحل Agent Builder را پوشش می دهد.
الزامات
2. معماری
جریان داده: بیایید نگاهی دقیق تر به نحوه حرکت داده ها در سیستم خود بیندازیم:
بلع :
اولین قدم ما این است که داده های خرده فروشی (موجودی، توضیحات محصول، تعاملات مشتری) را در AlloyDB وارد کنیم.
موتور تجزیه و تحلیل:
ما از AlloyDB به عنوان موتور تجزیه و تحلیل برای انجام موارد زیر استفاده خواهیم کرد:
- استخراج زمینه: موتور دادههای ذخیرهشده در AlloyDB را برای درک روابط بین محصولات، دستهها، رفتار مشتری و غیره تجزیه و تحلیل میکند.
- ایجاد جاسازی: جاسازی ها (نمایش های ریاضی متن) هم برای درخواست کاربر و هم برای اطلاعات ذخیره شده در AlloyDB ایجاد می شوند.
- جستجوی برداری: موتور جستجوی مشابهی را انجام میدهد و جاسازی پرس و جو را با تعبیههای توضیحات محصول، بررسیها و سایر دادههای مرتبط مقایسه میکند. این 25 مرتبط ترین "نزدیک ترین همسایه" را شناسایی می کند.
اعتبار سنجی جوزا:
این پاسخ های بالقوه برای ارزیابی به Gemini ارسال می شود. Gemini تعیین می کند که آیا آنها واقعاً مرتبط و ایمن هستند تا با کاربر به اشتراک بگذارند.
تولید پاسخ:
پاسخ های تایید شده در یک آرایه JSON ساختار یافته و کل موتور در یک تابع اجرای ابری بدون سرور بسته بندی می شود که از Agent Builder فراخوانی می شود.
تعامل مکالمه:
Agent Builder پاسخ ها را در قالب زبان طبیعی به کاربر ارائه می دهد و گفتگوی رفت و برگشت را تسهیل می کند. این بخش در یک آزمایشگاه پیگیری پوشش داده خواهد شد.
3. قبل از شروع
یک پروژه ایجاد کنید
- در Google Cloud Console ، در صفحه انتخاب پروژه، یک پروژه Google Cloud را انتخاب یا ایجاد کنید.
- مطمئن شوید که صورتحساب برای پروژه Cloud شما فعال است. با نحوه بررسی فعال بودن صورتحساب در پروژه آشنا شوید.
- شما از Cloud Shell استفاده خواهید کرد، یک محیط خط فرمان در حال اجرا در Google Cloud که با bq از قبل بارگذاری شده است. روی Activate Cloud Shell در بالای کنسول Google Cloud کلیک کنید.
- پس از اتصال به Cloud Shell، با استفاده از دستور زیر بررسی میکنید که قبلاً احراز هویت شدهاید و پروژه به ID پروژه شما تنظیم شده است:
gcloud auth list
- دستور زیر را در Cloud Shell اجرا کنید تا تأیید کنید که دستور gcloud از پروژه شما اطلاع دارد.
gcloud config list project
- اگر پروژه شما تنظیم نشده است، از دستور زیر برای تنظیم آن استفاده کنید:
gcloud config set project <YOUR_PROJECT_ID>
- 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 به اسناد مراجعه کنید.
4. راه اندازی پایگاه داده
در این آزمایشگاه از AlloyDB به عنوان پایگاه داده برای نگهداری داده های خرده فروشی استفاده می کنیم. از خوشهها برای نگهداری همه منابع مانند پایگاههای داده و گزارشها استفاده میکند. هر خوشه دارای یک نمونه اولیه است که یک نقطه دسترسی به داده ها را فراهم می کند. جداول داده های واقعی را نگه می دارند.
بیایید یک خوشه، نمونه و جدول AlloyDB ایجاد کنیم که مجموعه داده تجارت الکترونیک در آن بارگذاری شود.
یک خوشه و نمونه ایجاد کنید
- صفحه AlloyDB را در Cloud Console پیمایش کنید. یک راه آسان برای یافتن بیشتر صفحات در Cloud Console این است که آنها را با استفاده از نوار جستجوی کنسول جستجو کنید.
- CREATE CLUSTER را از آن صفحه انتخاب کنید:
- صفحه ای مانند تصویر زیر خواهید دید. یک خوشه و نمونه با مقادیر زیر ایجاد کنید:
- شناسه خوشه: "
shopping-cluster
" - رمز عبور: "
alloydb
" - سازگار با PostgreSQL 15
- منطقه: "
us-central1
" - شبکه سازی: "
default
"
- وقتی شبکه پیشفرض را انتخاب میکنید، صفحهای مانند تصویر زیر خواهید دید. SET UP CONNECTION را انتخاب کنید.
- از آنجا، "Use an automatically allocated IP range" و Continue را انتخاب کنید. پس از بررسی اطلاعات، CREATE CONNECTION را انتخاب کنید.
- هنگامی که شبکه شما راه اندازی شد، می توانید به ایجاد خوشه خود ادامه دهید. بر روی CREATE CLUSTER کلیک کنید تا تنظیمات خوشه را مطابق شکل زیر تکمیل کنید:
مطمئن شوید که شناسه نمونه را به " shopping-instance"
تغییر دهید.
توجه داشته باشید که ایجاد Cluster حدود 10 دقیقه طول خواهد کشید. پس از موفقیت آمیز بودن، باید صفحه ای را مشاهده کنید که شبیه به این صفحه است:
5. بلع داده ها
اکنون زمان اضافه کردن یک جدول با داده های مربوط به فروشگاه است. به AlloyDB بروید، خوشه اصلی و سپس AlloyDB Studio را انتخاب کنید:
ممکن است لازم باشد منتظر بمانید تا ایجاد نمونه شما به پایان برسد. پس از آن، با استفاده از اعتبارنامه هایی که هنگام ایجاد کلاستر ایجاد کردید، وارد AlloyDB شوید. از داده های زیر برای احراز هویت در PostgreSQL استفاده کنید:
- نام کاربری: "
postgres
" - پایگاه داده: "
postgres
" - رمز عبور: "
alloydb
"
هنگامی که با موفقیت در AlloyDB Studio احراز هویت شدید، دستورات SQL در ویرایشگر وارد می شوند. میتوانید چندین پنجره ویرایشگر را با استفاده از علامت مثبت در سمت راست آخرین پنجره اضافه کنید.
در صورت لزوم با استفاده از گزینههای Run، Format و Clear، دستورات AlloyDB را در پنجرههای ویرایشگر وارد میکنید.
برنامه های افزودنی را فعال کنید
برای ساخت این برنامه از پسوندهای 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) );
در صورت اجرای موفقیت آمیز دستور فوق، باید بتوانید جدول را در پایگاه داده مشاهده کنید. نمونه اسکرین شات در زیر نشان داده شده است:
داده ها را بلعید
برای این آزمایشگاه، ما داده های آزمایشی حدود 200 رکورد را در این فایل SQL داریم. این شامل id, category, sub_category, uri, image
و content
است. فیلدهای دیگر بعداً در آزمایشگاه پر خواهند شد.
20 سطر را از آنجا کپی کنید و سپس آن خطوط را در یک برگه ویرایشگر خالی قرار دهید و RUN را انتخاب کنید.
برای دیدن محتویات جدول، بخش Explorer را گسترش دهید تا زمانی که جدولی به نام apparels را ببینید. برای مشاهده گزینه Query جدول، سه ویرگول (⋮) را انتخاب کنید. یک عبارت SELECT در یک تب جدید ویرایشگر باز می شود.
اعطای مجوز
دستور زیر را اجرا کنید تا حقوق اجرای تابع embedding
را به کاربر postgres
اعطا کنید:
GRANT EXECUTE ON FUNCTION embedding TO postgres;
ROLE کاربر 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"
6. زمینه
به صفحه نمونه 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 یک خلاصه زمینه ساده با استفاده از اطلاعات تمام فیلدهای موجود در جدول و سایر وابستگی ها (در صورت وجود در مورد استفاده شما) ایجاد می کند. برای مجموعهای دقیقتر از اطلاعات و ایجاد زمینه، آزادانه دادهها را به هر نحوی که برای کسبوکارتان معنادار میدانید مهندسی کنید.
7. تعبیه هایی برای زمینه ایجاد کنید
پردازش اعداد برای رایانه ها بسیار آسان تر از پردازش متن است. یک سیستم جاسازی متن را به یک سری اعداد ممیز شناور تبدیل میکند که باید متن را نشان دهند، مهم نیست که چگونه کلمهبندی شده است، از چه زبانی استفاده میکند و غیره.
یک مکان ساحلی را توصیف کنید. ممکن است به آن "روی آب"، "کنار ساحل"، "از اتاق خود تا اقیانوس راه بروید"، "سور لا مر"، "на берегу океана" و غیره گفته می شود. این اصطلاحات همه متفاوت به نظر می رسند، اما معنای معنایی آنها یا در ماشین در یادگیری اصطلاحات، جاسازی آنها باید بسیار نزدیک به یکدیگر باشد.
اکنون که داده ها و زمینه آماده هستند، 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;
این باید بردار embeddings را که مانند آرایه ای از شناورها به نظر می رسد، برای متن نمونه در پرس و جو برگرداند، همانطور که در زیر نشان داده شده است:
توجه: پروژههای Google Cloud جدید ایجاد شده در سطح رایگان ممکن است در مورد تعداد درخواستهای جاسازی مجاز در هر ثانیه به مدلهای Embedding با مشکلات سهمیهای مواجه شوند. پیشنهاد ما این است که از یک پرس و جو فیلتر برای شناسه استفاده کنید و سپس همزمان با ایجاد جاسازی، 1-5 رکورد و غیره را انتخاب کنید.
8. جستجوی برداری را انجام دهید
اکنون که جدول، دادهها و جاسازیها همه آماده هستند، بیایید جستجوی برداری واقعی را برای متن جستجوی کاربر انجام دهیم.
فرض کنید کاربر بپرسد:
"من می خواهم تاپ زنانه، صورتی غیر رسمی فقط پنبه خالص."
با اجرای پرس و جو زیر می توانید موارد منطبق برای این مورد را پیدا کنید:
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;
بیایید به این پرس و جو با جزئیات نگاه کنیم:
در این پرس و جو،
- متن جستجوی کاربر این است: "من می خواهم تاپ زنانه، صورتی گاه به گاه فقط پنبه خالص."
- ما آن را با استفاده از مدل:
text-embedding-004
به embeddings در متدembedding()
تبدیل می کنیم. این مرحله باید بعد از آخرین مرحله آشنا به نظر برسد، جایی که ما تابع embedding را برای همه موارد در جدول اعمال کردیم. - "
<=>
" نشان دهنده استفاده از روش فاصله COSINE SIMILARITY است. شما می توانید تمام معیارهای شباهت موجود در مستندات pgvector را بیابید. - ما در حال تبدیل نتیجه روش embedding به نوع برداری هستیم تا آن را با بردارهای ذخیره شده در پایگاه داده سازگار کنیم.
- LIMIT 5 نشان می دهد که ما می خواهیم 5 نزدیکترین همسایه را برای متن جستجو استخراج کنیم.
نتیجه به این صورت است:
همانطور که در نتایج خود مشاهده می کنید، مطابقت ها بسیار نزدیک به متن جستجو هستند. سعی کنید رنگ را تغییر دهید تا ببینید نتایج چگونه تغییر می کند.
9. مطابقت اعتبار با LLM
قبل از حرکت و ایجاد سرویسی برای بازگرداندن بهترین موارد منطبق به یک برنامه، بیایید از یک مدل هوش مصنوعی مولد استفاده کنیم تا تأیید کنیم که آیا این پاسخهای بالقوه واقعاً مرتبط و ایمن برای به اشتراک گذاشتن با کاربر هستند یا خیر.
اطمینان از تنظیم نمونه برای Gemini
ابتدا بررسی کنید که آیا Google ML Integration قبلاً برای Cluster و Instance شما فعال است یا خیر. در AlloyDB Studio دستور زیر را بدهید:
show google_ml_integration.enable_model_support;
اگر مقدار به صورت "روشن" نشان داده شد، می توانید 2 مرحله بعدی را رد کنید و مستقیماً به راه اندازی AlloyDB و Vertex AI Model بروید.
- به نمونه اولیه خوشه AlloyDB خود بروید و روی EDIT PRIMARY INSTANCE کلیک کنید.
- در قسمت Advanced Configuration Options به بخش Flags بروید. و مطمئن شوید که
google_ml_integration.enable_model_support flag
روی "on
" مطابق شکل زیر تنظیم شده است:
اگر روی "روشن" تنظیم نشده است، آن را روی "روشن" تنظیم کنید و سپس روی دکمه 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 AI اجرا کنند. دستور زیر را اجرا کنید:
GRANT EXECUTE ON FUNCTION ml_predict_row to postgres;
توجه: اگر از یک پروژه Google Cloud موجود و یک خوشه/نمونه موجود از AlloyDB که مدتی پیش ایجاد شده استفاده میکنید، ممکن است لازم باشد ارجاعات قدیمی را به مدل gemini-1.5 رها کنید و دوباره با عبارت CALL بالا ایجاد کنید و اجرای grant execute را اجرا کنید. در صورتی که در فراخوانی های آینده gemini-1.5 با مشکل مواجه شوید، دوباره روی تابع ml_predict_row قرار دهید.
ارزیابی پاسخ ها
در حالی که برای اطمینان از معقول بودن پاسخ های پرس و جو، در پایان از یک پرس و جو بزرگ در بخش بعدی استفاده می کنیم، درک این پرس و جو ممکن است دشوار باشد. ما اکنون به قطعات نگاه می کنیم و می بینیم که چگونه آنها در چند دقیقه با هم جمع می شوند.
- ابتدا درخواستی را به پایگاه داده ارسال می کنیم تا 5 مورد منطبق با یک جستجوی کاربر را دریافت کند. ما در حال کدگذاری سخت کوئری هستیم تا ساده بماند، اما نگران نباشید، بعداً آن را در پرس و جو قرار می دهیم. ما شرح محصول را از جدول
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;
خروجی این پرس و جو 5 ردیف مشابه مربوط به پرس و جو کاربران خواهد بود. جدول جدید xyz شامل 5 ردیف است که هر سطر دارای ستون های زیر است:
-
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-004',
'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5 ) AS xyz ) AS X;
اگرچه هنوز ممکن است دلهره آور به نظر برسد، امیدواریم که بتوانید کمی بیشتر از آن استفاده کنید. نتایج نشان می دهد که آیا مطابقت وجود دارد یا خیر، چند درصد تطابق است، و توضیحی در مورد رتبه بندی.
توجه داشته باشید که مدل Gemini به طور پیشفرض پخش جریانی دارد، بنابراین پاسخ واقعی در چندین خط پخش میشود:
10. برنامه را به وب ببرید
برای بردن این برنامه به وب آماده هستید؟ برای ساختن این موتور دانش بدون سرور با توابع اجرای ابری، مراحل زیر را دنبال کنید:
- برای ایجاد یک عملکرد Cloud Run جدید، به Cloud Run Functions در Google Cloud Console بروید یا از پیوند استفاده کنید: https://console.cloud.google.com/functions/add .
- Environment را به عنوان " عملکرد Cloud Run " انتخاب کنید. نام تابع " retail-engine " را وارد کنید و منطقه را به عنوان "us-central1" انتخاب کنید. Authentication را روی "Allow unauthenticated invocation" تنظیم کنید و روی NEXT کلیک کنید. جاوا 17 را به عنوان زمان اجرا و ویرایشگر داخلی را برای کد منبع انتخاب کنید.
- به طور پیش فرض نقطه ورودی را روی "
gcfv2.HelloHttpFunction
" تنظیم می کند. کد مکان نگهدار درHelloHttpFunction.java
وpom.xml
تابع Cloud Run خود را به ترتیب با کد فایل جاوا و XML جایگزین کنید. - به یاد داشته باشید که مکاننمای $PROJECT_ID و اعتبار اتصال AlloyDB را با مقادیر خود در فایل جاوا تغییر دهید. اعتبارنامه های AlloyDB آنهایی هستند که در ابتدای این کد لبه استفاده کرده بودیم. اگر از مقادیر متفاوتی استفاده کرده اید، لطفاً همان را در فایل جاوا تغییر دهید.
- روی Deploy کلیک کنید.
پس از استقرار، برای اینکه به تابع Cloud اجازه دهیم به نمونه پایگاه داده AlloyDB ما دسترسی پیدا کند، رابط VPC را ایجاد می کنیم.
گام مهم:
هنگامی که برای استقرار راه افتادید، باید بتوانید عملکردها را در کنسول Google Cloud Run Functions مشاهده کنید. تابع تازه ایجاد شده ( retail-engine
) را جستجو کنید، روی آن کلیک کنید، سپس روی EDIT کلیک کنید و موارد زیر را تغییر دهید:
- به Runtime، ساخت، اتصالات و تنظیمات امنیتی بروید
- تایم اوت را به 180 ثانیه افزایش دهید
- به تب اتصالات بروید:
- در تنظیمات Ingress، مطمئن شوید که "Allow all traffic" انتخاب شده است.
- در زیر تنظیمات Egress، روی منوی کشویی Network کلیک کنید و گزینه "Add New VPC Connector" را انتخاب کنید و دستورالعمل هایی را که در کادر محاوره ای ظاهر می شود دنبال کنید:
- نامی برای اتصال VPC ارائه دهید و مطمئن شوید که منطقه با نمونه شما یکسان است. مقدار Network را به عنوان پیش فرض بگذارید و Subnet را به عنوان محدوده IP سفارشی با محدوده IP 10.8.0.0 یا چیزی مشابه که در دسترس است تنظیم کنید.
- SHOW SCALING SETTINGS را باز کنید و مطمئن شوید که پیکربندی دقیقاً روی موارد زیر تنظیم شده است:
- روی CREATE کلیک کنید و این رابط باید اکنون در تنظیمات خروج لیست شود.
- کانکتور تازه ایجاد شده را انتخاب کنید
- انتخاب کنید که تمام ترافیک از طریق این رابط VPC هدایت شود.
- روی NEXT و سپس DEPLOY کلیک کنید.
11. برنامه را تست کنید
پس از به روز رسانی Cloud Function، باید نقطه پایانی را در قالب زیر مشاهده کنید:
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 .
و نتیجه:
همین! انجام جستجوی بردار تشابه با استفاده از مدل Embeddings در داده های AlloyDB بسیار ساده است.
ساخت عامل مکالمه!
عامل در قسمت 2 این آزمایشگاه ساخته شده است.
12. پاکسازی کنید
اگر قصد دارید قسمت 2 این آزمایشگاه را تکمیل کنید، این مرحله را رد کنید زیرا با این کار پروژه فعلی حذف می شود.
برای جلوگیری از تحمیل هزینه به حساب Google Cloud خود برای منابع استفاده شده در این پست، این مراحل را دنبال کنید:
- در کنسول Google Cloud، به صفحه مدیریت منابع بروید.
- در لیست پروژه، پروژه ای را که می خواهید حذف کنید انتخاب کنید و سپس روی Delete کلیک کنید.
- در محاوره، شناسه پروژه را تایپ کنید و سپس روی Shut down کلیک کنید تا پروژه حذف شود.
13. تبریک می گویم
تبریک می گویم! شما با موفقیت جستجوی مشابهی را با استفاده از AlloyDB، pgvector و جستجوی برداری انجام دادید. با ترکیب قابلیتهای AlloyDB ، Vertex AI ، و Vector Search ، ما جهشی بزرگ در ایجاد جستجوهای متنی و برداری در دسترس، کارآمد و واقعاً معنادار برداشتهایم. قسمت بعدی این آزمایشگاه مراحل ساخت عامل را پوشش می دهد.