1. সংক্ষিপ্ত বিবরণ
আজকের দ্রুতগতির খুচরা বাজারে, ব্যক্তিগতকৃত কেনাকাটার অভিজ্ঞতা প্রদানের পাশাপাশি ব্যতিক্রমী গ্রাহক পরিষেবা প্রদান অত্যন্ত গুরুত্বপূর্ণ। আমরা আপনাকে একটি জ্ঞান-চালিত চ্যাট অ্যাপ্লিকেশন তৈরির মাধ্যমে একটি প্রযুক্তিগত যাত্রায় নিয়ে যাব যা গ্রাহকদের প্রশ্নের উত্তর দেওয়ার জন্য, পণ্য আবিষ্কারের জন্য নির্দেশনা দেওয়ার জন্য এবং অনুসন্ধানের ফলাফলগুলি কাস্টমাইজ করার জন্য ডিজাইন করা হয়েছে। এই উদ্ভাবনী সমাধানটিতে ডেটা স্টোরেজের জন্য AlloyDB, প্রাসঙ্গিক বোঝার জন্য একটি অভ্যন্তরীণ বিশ্লেষণ ইঞ্জিন, প্রাসঙ্গিকতা যাচাইয়ের জন্য জেমিনি (বৃহৎ ভাষা মডেল) এবং একটি বুদ্ধিমান কথোপকথন সহকারীকে দ্রুত বুটস্ট্র্যাপ করার জন্য Google এর এজেন্ট বিল্ডারের শক্তি একত্রিত করা হয়েছে।
চ্যালেঞ্জ: আধুনিক খুচরা গ্রাহকরা তাৎক্ষণিক উত্তর এবং তাদের অনন্য পছন্দের সাথে সামঞ্জস্যপূর্ণ পণ্যের সুপারিশ আশা করেন। ঐতিহ্যবাহী অনুসন্ধান পদ্ধতিগুলি প্রায়শই এই স্তরের ব্যক্তিগতকরণ প্রদানে ব্যর্থ হয়।
সমাধান: আমাদের জ্ঞান-চালিত চ্যাট অ্যাপ্লিকেশনটি এই চ্যালেঞ্জটি সরাসরি মোকাবেলা করে। এটি আপনার খুচরা বিক্রেতাদের তথ্য থেকে প্রাপ্ত সমৃদ্ধ জ্ঞানের ভিত্তি ব্যবহার করে গ্রাহকের উদ্দেশ্য বুঝতে, বুদ্ধিমত্তার সাথে প্রতিক্রিয়া জানাতে এবং অতি-প্রাসঙ্গিক ফলাফল প্রদান করে।
তুমি কী তৈরি করবে
এই ল্যাবের (পর্ব ১) অংশ হিসেবে, আপনি:
- একটি AlloyDB ইনস্ট্যান্স তৈরি করুন এবং ইকমার্স ডেটাসেট লোড করুন
- AlloyDB-তে pgvector এবং generative AI মডেল এক্সটেনশন সক্রিয় করুন।
- পণ্যের বিবরণ থেকে এম্বেডিং তৈরি করুন
- ব্যবহারকারী অনুসন্ধান পাঠ্যের জন্য রিয়েল টাইম কোসাইন সাদৃশ্য অনুসন্ধান সম্পাদন করুন
- সার্ভারলেস ক্লাউড রান ফাংশনে সমাধানটি স্থাপন করুন
ল্যাবের দ্বিতীয় অংশে এজেন্ট বিল্ডারের ধাপগুলি অন্তর্ভুক্ত থাকবে।
আবশ্যকতা
- একটি ব্রাউজার, যেমন ক্রোম বা ফায়ারফক্স
- বিলিং সক্ষম করা একটি Google ক্লাউড প্রকল্প।
2. স্থাপত্য
ডেটা প্রবাহ: আসুন আমরা আমাদের সিস্টেমের মাধ্যমে ডেটা কীভাবে স্থানান্তরিত হয় তা ঘনিষ্ঠভাবে দেখে নিই:
আহার :
আমাদের প্রথম পদক্ষেপ হল খুচরা তথ্য (ইনভেন্টরি, পণ্যের বিবরণ, গ্রাহকের মিথস্ক্রিয়া) AlloyDB-তে অন্তর্ভুক্ত করা।
অ্যানালিটিক্স ইঞ্জিন:
আমরা নিম্নলিখিত কাজগুলি সম্পাদন করার জন্য অ্যানালিটিক্স ইঞ্জিন হিসেবে AlloyDB ব্যবহার করব:
- প্রসঙ্গ নিষ্কাশন: ইঞ্জিনটি AlloyDB-এর মধ্যে সংরক্ষিত ডেটা বিশ্লেষণ করে পণ্য, বিভাগ, গ্রাহক আচরণ ইত্যাদির মধ্যে সম্পর্ক বোঝার জন্য প্রযোজ্য।
- এম্বেডিং তৈরি: ব্যবহারকারীর কোয়েরি এবং AlloyDB-তে সংরক্ষিত তথ্য উভয়ের জন্যই এম্বেডিং (পাঠ্যের গাণিতিক উপস্থাপনা) তৈরি করা হয়।
- ভেক্টর অনুসন্ধান: ইঞ্জিনটি একটি সাদৃশ্য অনুসন্ধান সম্পাদন করে, কোয়েরি এম্বেডিংকে পণ্যের বিবরণ, পর্যালোচনা এবং অন্যান্য প্রাসঙ্গিক ডেটা এম্বেডিংয়ের সাথে তুলনা করে। এটি 25টি সবচেয়ে প্রাসঙ্গিক "নিকটতম প্রতিবেশী" চিহ্নিত করে।
মিথুন রাশির বৈধতা:
এই সম্ভাব্য প্রতিক্রিয়াগুলি মূল্যায়নের জন্য জেমিনির কাছে পাঠানো হয়। জেমিনি নির্ধারণ করে যে এগুলি সত্যিই প্রাসঙ্গিক এবং ব্যবহারকারীর সাথে ভাগ করে নেওয়া নিরাপদ কিনা।
প্রতিক্রিয়া তৈরি:
যাচাইকৃত প্রতিক্রিয়াগুলি একটি JSON অ্যারেতে গঠন করা হয় এবং পুরো ইঞ্জিনটি একটি সার্ভারলেস ক্লাউড রান ফাংশনে প্যাকেজ করা হয় যা এজেন্ট বিল্ডার থেকে আহ্বান করা হয়।
কথোপকথনমূলক মিথস্ক্রিয়া:
এজেন্ট বিল্ডার ব্যবহারকারীদের কাছে উত্তরগুলি একটি স্বাভাবিক ভাষা বিন্যাসে উপস্থাপন করে, যা সামনে-পিছনে সংলাপকে সহজতর করে। এই অংশটি একটি ফলো-আপ ল্যাবে কভার করা হবে।
৩. শুরু করার আগে
একটি প্রকল্প তৈরি করুন
- গুগল ক্লাউড কনসোলে , প্রজেক্ট সিলেক্টর পৃষ্ঠায়, একটি গুগল ক্লাউড প্রজেক্ট নির্বাচন করুন বা তৈরি করুন।
- আপনার ক্লাউড প্রোজেক্টের জন্য বিলিং সক্ষম আছে কিনা তা নিশ্চিত করুন। কোনও প্রোজেক্টে বিলিং সক্ষম আছে কিনা তা কীভাবে পরীক্ষা করবেন তা শিখুন।
- আপনি ক্লাউড শেল ব্যবহার করবেন, এটি গুগল ক্লাউডে চলমান একটি কমান্ড-লাইন পরিবেশ যা bq সহ প্রিলোডেড আসে। গুগল ক্লাউড কনসোলের শীর্ষে অ্যাক্টিভেট ক্লাউড শেল ক্লিক করুন।

- ক্লাউড শেলের সাথে সংযুক্ত হয়ে গেলে, আপনি নিম্নলিখিত কমান্ড ব্যবহার করে পরীক্ষা করতে পারবেন যে আপনি ইতিমধ্যেই প্রমাণীকরণপ্রাপ্ত এবং প্রকল্পটি আপনার প্রকল্প আইডিতে সেট করা আছে কিনা:
gcloud auth list
- 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 কমান্ড এবং ব্যবহারের জন্য ডকুমেন্টেশন দেখুন।
৪. ডাটাবেস সেটআপ
এই ল্যাবে আমরা খুচরা ডেটা ধরে রাখার জন্য ডাটাবেস হিসেবে AlloyDB ব্যবহার করব। এটি ডাটাবেস এবং লগের মতো সমস্ত রিসোর্স ধরে রাখার জন্য ক্লাস্টার ব্যবহার করে। প্রতিটি ক্লাস্টারের একটি প্রাথমিক উদাহরণ থাকে যা ডেটাতে একটি অ্যাক্সেস পয়েন্ট প্রদান করে। টেবিলগুলি প্রকৃত ডেটা ধরে রাখবে।
চলুন একটি AlloyDB ক্লাস্টার, ইনস্ট্যান্স এবং টেবিল তৈরি করি যেখানে ই-কমার্স ডেটাসেট লোড করা হবে।
একটি ক্লাস্টার এবং ইনস্ট্যান্স তৈরি করুন
- ক্লাউড কনসোলে AlloyDB পৃষ্ঠাটি নেভিগেট করুন। ক্লাউড কনসোলে বেশিরভাগ পৃষ্ঠা খুঁজে পাওয়ার একটি সহজ উপায় হল কনসোলের অনুসন্ধান বার ব্যবহার করে সেগুলি অনুসন্ধান করা।
- সেই পৃষ্ঠা থেকে CREATE CLUSTER নির্বাচন করুন:

- আপনি নীচের মত একটি স্ক্রিন দেখতে পাবেন। নিম্নলিখিত মানগুলি ব্যবহার করে একটি ক্লাস্টার এবং ইনস্ট্যান্স তৈরি করুন:
- ক্লাস্টার আইডি: "
shopping-cluster" - পাসওয়ার্ড: "
alloydb" - PostgreSQL 15 সামঞ্জস্যপূর্ণ
- অঞ্চল: "
us-central1" - নেটওয়ার্কিং: "
default"

- যখন আপনি ডিফল্ট নেটওয়ার্ক নির্বাচন করবেন, তখন আপনি নীচের মত একটি স্ক্রিন দেখতে পাবেন। SET UP CONNECTION নির্বাচন করুন।

- সেখান থেকে, "Use an automatic allocated IP range" নির্বাচন করুন এবং Continue করুন। তথ্য পর্যালোচনা করার পরে, CREATE CONNECTION নির্বাচন করুন।

- একবার আপনার নেটওয়ার্ক সেট আপ হয়ে গেলে, আপনি আপনার ক্লাস্টার তৈরি করা চালিয়ে যেতে পারেন। নীচে দেখানো হিসাবে ক্লাস্টার সেট আপ সম্পূর্ণ করতে CREATE CLUSTER এ ক্লিক করুন:

ইনস্ট্যান্স আইডিটি " shopping-instance" এ পরিবর্তন করতে ভুলবেন না।
মনে রাখবেন যে ক্লাস্টার তৈরি করতে প্রায় ১০ মিনিট সময় লাগবে। এটি সফল হয়ে গেলে, আপনি এই স্ক্রিনের মতো দেখতে একটি স্ক্রিন দেখতে পাবেন:

৫. ডেটা ইনজেশন
এবার স্টোর সম্পর্কে তথ্য সহ একটি টেবিল যোগ করার সময়। AlloyDB-তে নেভিগেট করুন, প্রাথমিক ক্লাস্টার নির্বাচন করুন এবং তারপর AlloyDB স্টুডিও:

আপনার ইনস্ট্যান্স তৈরি শেষ না হওয়া পর্যন্ত আপনাকে অপেক্ষা করতে হতে পারে। একবার এটি হয়ে গেলে, ক্লাস্টার তৈরি করার সময় তৈরি করা শংসাপত্রগুলি ব্যবহার করে AlloyDB-তে সাইন ইন করুন। PostgreSQL-এ প্রমাণীকরণের জন্য নিম্নলিখিত ডেটা ব্যবহার করুন:
- ব্যবহারকারীর নাম: "
postgres" - ডাটাবেস: "
postgres" - পাসওয়ার্ড: "
alloydb"
AlloyDB স্টুডিওতে সফলভাবে প্রমাণীকরণ করার পরে, SQL কমান্ডগুলি এডিটরে প্রবেশ করানো হবে। আপনি শেষ উইন্ডোর ডানদিকে প্লাস ব্যবহার করে একাধিক এডিটর উইন্ডো যুক্ত করতে পারেন।

আপনি এডিটর উইন্ডোতে AlloyDB-এর জন্য কমান্ড লিখবেন, প্রয়োজনে Run, Format এবং Clear অপশন ব্যবহার করে।
এক্সটেনশনগুলি সক্ষম করুন
এই অ্যাপটি তৈরির জন্য, আমরা pgvector এবং google_ml_integration এক্সটেনশনগুলি ব্যবহার করব। pgvector এক্সটেনশন আপনাকে ভেক্টর এম্বেডিংগুলি সংরক্ষণ এবং অনুসন্ধান করতে দেয়। google_ml_integration এক্সটেনশনটি SQL-এ ভবিষ্যদ্বাণী পেতে Vertex AI ভবিষ্যদ্বাণী এন্ডপয়েন্টগুলি অ্যাক্সেস করার জন্য আপনি যে ফাংশনগুলি ব্যবহার করেন তা প্রদান করে। নিম্নলিখিত 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 রয়েছে। অন্যান্য ক্ষেত্রগুলি ল্যাবে পরে পূরণ করা হবে।
সেখান থেকে ২০টি লাইন কপি করুন/বিবৃতি সন্নিবেশ করুন এবং তারপর সেই লাইনগুলিকে একটি ফাঁকা সম্পাদক ট্যাবে পেস্ট করুন এবং RUN নির্বাচন করুন।
টেবিলের বিষয়বস্তু দেখতে, এক্সপ্লোরার বিভাগটি প্রসারিত করুন যতক্ষণ না আপনি apparels নামের টেবিলটি দেখতে পান। টেবিলটি জিজ্ঞাসা করার বিকল্পটি দেখতে ট্রাইকোলন (⋮) নির্বাচন করুন। একটি নতুন এডিটর ট্যাবে একটি SELECT স্টেটমেন্ট খুলবে।

অনুমতি দিন
ব্যবহারকারী postgres কে embedding ফাংশনে এক্সিকিউট করার অধিকার প্রদান করতে নিচের স্টেটমেন্টটি চালান:
GRANT EXECUTE ON FUNCTION embedding TO postgres;
AlloyDB পরিষেবা অ্যাকাউন্টে Vertex AI ব্যবহারকারীর ভূমিকা প্রদান করুন
ক্লাউড শেল টার্মিনালে যান এবং নিম্নলিখিত কমান্ডটি দিন:
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 টেবিলে উপলব্ধ সমস্ত ক্ষেত্র এবং অন্যান্য নির্ভরতা (যদি আপনার ব্যবহারের ক্ষেত্রে থাকে) থেকে তথ্য ব্যবহার করে একটি সহজ প্রসঙ্গ সারাংশ তৈরি করে। তথ্যের আরও সুনির্দিষ্ট ভাণ্ডার এবং প্রসঙ্গ তৈরির জন্য, আপনার ব্যবসার জন্য অর্থপূর্ণ মনে হয় এমন যেকোনো উপায়ে ডেটা ইঞ্জিনিয়ার করতে দ্বিধা করবেন না।
৭. প্রেক্ষাপটের জন্য এম্বেডিং তৈরি করুন
কম্পিউটারের জন্য টেক্সট প্রক্রিয়া করার চেয়ে সংখ্যা প্রক্রিয়া করা অনেক সহজ। একটি এম্বেডিং সিস্টেম টেক্সটকে ফ্লোটিং পয়েন্ট সংখ্যার একটি সিরিজে রূপান্তরিত করে যা টেক্সটকে প্রতিনিধিত্ব করে, তা সে যেভাবেই লেখা হোক না কেন, কোন ভাষা ব্যবহার করা হোক না কেন, ইত্যাদি।
সমুদ্রতীরবর্তী একটি স্থানের বর্ণনা দেওয়ার কথা বিবেচনা করুন। এটিকে "জলের উপর", "সৈকতের ধারে", "তোমার ঘর থেকে সমুদ্রে হেঁটে যাও", "সুর লা মের", "না বর্গু ওকেনা" ইত্যাদি বলা যেতে পারে। এই শব্দগুলি দেখতে আলাদা, তবে তাদের অর্থগত অর্থ বা মেশিন লার্নিং পরিভাষায়, তাদের এম্বেডিংগুলি একে অপরের খুব কাছাকাছি হওয়া উচিত।
এখন যেহেতু ডেটা এবং প্রসঙ্গ প্রস্তুত, আমরা embedding ক্ষেত্রের টেবিলে পণ্যের বর্ণনার এম্বেডিং যোগ করার জন্য SQL চালাবো। আপনি বিভিন্ন ধরণের এম্বেডিং মডেল ব্যবহার করতে পারেন। আমরা Vertex AI থেকে text-embedding-004 ব্যবহার করছি। পুরো প্রকল্প জুড়ে একই এম্বেডিং মডেল ব্যবহার করতে ভুলবেন না!
দ্রষ্টব্য: যদি আপনি কিছুক্ষণ আগে তৈরি করা কোনও বিদ্যমান গুগল ক্লাউড প্রজেক্ট ব্যবহার করেন, তাহলে আপনাকে টেক্সট-এমবেডিং মডেলের পুরানো সংস্করণ যেমন টেক্সটএমবেডিং-গেকো ব্যবহার চালিয়ে যেতে হতে পারে।
UPDATE
apparels
SET
embedding = embedding( 'text-embedding-004',
pdt_desc)
WHERE
TRUE;
কিছু এম্বেডিং দেখতে আবার apparels টেবিলটি দেখুন। পরিবর্তনগুলি দেখতে SELECT স্টেটমেন্টটি পুনরায় চালাতে ভুলবেন না।
SELECT
id,
category,
sub_category,
content,
embedding
FROM
apparels;
এটি নীচে দেখানো কোয়েরির নমুনা টেক্সটের জন্য এম্বেডিং ভেক্টরটি ফিরিয়ে দেবে, যা দেখতে ফ্লোটের একটি অ্যারের মতো:

দ্রষ্টব্য: ফ্রি টিয়ারের অধীনে নতুন তৈরি গুগল ক্লাউড প্রজেক্টগুলি এম্বেডিং মডেলগুলিতে প্রতি সেকেন্ডে অনুমোদিত এম্বেডিং অনুরোধের সংখ্যার ক্ষেত্রে কোটা সংক্রান্ত সমস্যার সম্মুখীন হতে পারে। আমরা পরামর্শ দিচ্ছি যে আপনি এম্বেডিং তৈরি করার সময় আইডির জন্য একটি ফিল্টার কোয়েরি ব্যবহার করুন এবং তারপরে বেছে বেছে ১-৫টি রেকর্ড ইত্যাদি বেছে নিন।
৮. ভেক্টর অনুসন্ধান করুন
এখন যেহেতু টেবিল, ডেটা এবং এম্বেডিং সব প্রস্তুত, আসুন ব্যবহারকারী অনুসন্ধান পাঠ্যের জন্য রিয়েল টাইম ভেক্টর অনুসন্ধান করি।
ধরুন ব্যবহারকারী জিজ্ঞাসা করলেন:
"আমি মহিলাদের টপস চাই, গোলাপী ক্যাজুয়াল, শুধুমাত্র খাঁটি সুতির।"
নিচের কোয়েরিটি চালিয়ে আপনি এর জন্য মিল খুঁজে পেতে পারেন:
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;
আসুন এই প্রশ্নটি বিস্তারিতভাবে দেখি:
এই প্রশ্নের মধ্যে,
- ব্যবহারকারীর অনুসন্ধানের টেক্সট হল: "আমি মহিলাদের টপস চাই, গোলাপী ক্যাজুয়াল শুধুমাত্র খাঁটি সুতির।"
- আমরা
embedding()পদ্ধতিতে এটিকে embeddings এ রূপান্তর করছি:text-embedding-004মডেলটি ব্যবহার করে। এই ধাপটি শেষ ধাপের পরে পরিচিত দেখাবে, যেখানে আমরা টেবিলের সমস্ত আইটেমে embeding ফাংশন প্রয়োগ করেছি। - "
<=>" COSINE SIMILARITY দূরত্ব পদ্ধতির ব্যবহারকে প্রতিনিধিত্ব করে। আপনি pgvector এর ডকুমেন্টেশনে উপলব্ধ সমস্ত সাদৃশ্য পরিমাপ খুঁজে পেতে পারেন। - ডাটাবেসে সংরক্ষিত ভেক্টরগুলির সাথে সামঞ্জস্যপূর্ণ করার জন্য আমরা এম্বেডিং পদ্ধতির ফলাফলকে ভেক্টর টাইপে রূপান্তর করছি।
- LIMIT 5 ইঙ্গিত করে যে আমরা অনুসন্ধান পাঠ্যের জন্য 5টি নিকটতম প্রতিবেশী বের করতে চাই।
ফলাফলটি এরকম দেখাচ্ছে:

আপনার ফলাফলে আপনি লক্ষ্য করতে পারেন যে, মিলগুলি অনুসন্ধানের পাঠ্যের সাথে বেশ কাছাকাছি। ফলাফল কীভাবে পরিবর্তিত হয় তা দেখতে রঙ পরিবর্তন করার চেষ্টা করুন।
গুরুত্বপূর্ণ তথ্য:
এখন ধরা যাক আমরা 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 হল সূচকের নাম
"পোশাক" আমার টেবিল
"স্ক্যান" হল সূচক পদ্ধতি
"এমবেডিং" হল টেবিলের সেই কলাম যা আমি সূচী করতে চাই
"কোসাইন" হল দূরত্ব পদ্ধতি যা আমি সূচকের সাথে ব্যবহার করতে চাই
"54" হল এই সূচকে প্রয়োগ করার জন্য পার্টিশনের সংখ্যা। 1 থেকে 1048576 এর মধ্যে যেকোনো মান সেট করুন। এই মানটি কীভাবে নির্ধারণ করবেন সে সম্পর্কে আরও তথ্যের জন্য, Tune a ScaNN index দেখুন।
আমি ScaNN রেপোতে সুপারিশকৃত ডেটা পয়েন্টের সংখ্যার একটি SQUARE ROOT ব্যবহার করেছি (পার্টিশন করার সময়, num_leaves ডেটাপয়েন্টের সংখ্যার মোটামুটি বর্গমূল হওয়া উচিত।)।
- কোয়েরি ব্যবহার করে সূচকটি তৈরি করা হয়েছে কিনা তা পরীক্ষা করুন:
SELECT * FROM pg_stat_ann_indexes;
- ইনডেক্স ছাড়াই আমরা যে কোয়েরিটি ব্যবহার করেছি তা ব্যবহার করে ভেক্টর অনুসন্ধান করুন:
select * from apparels
BY embedding <=> CAST(embedding('textembedding-gecko', 'white tops for girls without any print') as vector(768)) ORDER )
LIMIT 20
উপরের কোয়েরিটি আমরা ৮ম ধাপে ল্যাবে যে কোয়েরিটি ব্যবহার করেছিলাম, সেই একই কোয়েরি। তবে এখন আমরা ফিল্ডটি ইনডেক্স করেছি।
- সূচক সহ এবং ছাড়াই একটি সহজ অনুসন্ধান কোয়েরি দিয়ে পরীক্ষা করুন (সূচক বাদ দিয়ে):
white tops for girls without any print
INDEXED এম্বেডিং ডেটার উপর ভেক্টর অনুসন্ধান কোয়েরিতে উপরের অনুসন্ধান পাঠ্যটি মানসম্পন্ন অনুসন্ধান ফলাফল এবং দক্ষতার ফলাফল দেয়। সূচকের সাথে দক্ষতা ব্যাপকভাবে উন্নত হয়েছে (কার্যকরনের সময়: ScaNN ছাড়া 10.37ms এবং ScaNN সহ 0.87ms)। এই বিষয়ে আরও তথ্যের জন্য, দয়া করে এই ব্লগটি দেখুন।
৯. এলএলএম-এর সাথে ম্যাচ ভ্যালিডেশন
কোনও অ্যাপ্লিকেশনে সেরা মিলগুলি ফিরিয়ে দেওয়ার জন্য একটি পরিষেবা তৈরি করার আগে, আসুন একটি জেনারেটিভ এআই মডেল ব্যবহার করে যাচাই করি যে এই সম্ভাব্য প্রতিক্রিয়াগুলি সত্যিই প্রাসঙ্গিক এবং ব্যবহারকারীর সাথে ভাগ করে নেওয়া নিরাপদ কিনা।
মিথুন রাশির জন্য ইনস্ট্যান্স সেট আপ করা হয়েছে তা নিশ্চিত করা
প্রথমে আপনার ক্লাস্টার এবং ইনস্ট্যান্সের জন্য Google ML ইন্টিগ্রেশন ইতিমধ্যেই সক্রিয় আছে কিনা তা পরীক্ষা করুন। AlloyDB স্টুডিওতে, নিম্নলিখিত কমান্ডটি দিন:
show google_ml_integration.enable_model_support;
যদি মানটি "on" হিসাবে দেখানো হয়, তাহলে আপনি পরবর্তী 2টি ধাপ এড়িয়ে যেতে পারেন এবং সরাসরি AlloyDB এবং Vertex AI মডেল ইন্টিগ্রেশন সেট আপ করতে পারেন।
- আপনার AlloyDB ক্লাস্টারের প্রাইমারি ইনস্ট্যান্সে যান এবং EDIT PRIMARY INSTANCE এ ক্লিক করুন।

- অ্যাডভান্সড কনফিগারেশন অপশনের "ফ্ল্যাগস" বিভাগে যান এবং নিশ্চিত করুন যে
google_ml_integration.enable_model_support flag"on" তে সেট করা আছে যেমনটি নীচে দেখানো হয়েছে:

যদি এটি "চালু" তে সেট না থাকে, তাহলে এটি "চালু" তে সেট করুন এবং তারপর UPDATE INSTANCE বোতামে ক্লিক করুন। এই ধাপটি সম্পন্ন হতে কয়েক মিনিট সময় লাগবে।
অ্যালয়ডিবি এবং ভার্টেক্স এআই মডেল ইন্টিগ্রেশন
এখন আপনি AlloyDB স্টুডিওতে সংযোগ করতে পারেন এবং নির্দেশিত স্থানে আপনার প্রজেক্ট আইডি ব্যবহার করে AlloyDB থেকে জেমিনি মডেল অ্যাক্সেস সেট আপ করতে নিম্নলিখিত DML স্টেটমেন্টটি চালাতে পারেন। কমান্ডটি চালানোর আগে আপনাকে একটি সিনট্যাক্স ত্রুটি সম্পর্কে সতর্ক করা হতে পারে, তবে এটি ঠিকঠাকভাবে চলবে।
প্রথমে, আমরা নীচে দেখানো হিসাবে Gemini 1.5 মডেল সংযোগ তৈরি করি। নীচের কমান্ডে $PROJECT_ID আপনার Google Cloud Project Id দিয়ে প্রতিস্থাপন করতে ভুলবেন না।
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 স্টুডিওতে নিম্নলিখিত কমান্ডের মাধ্যমে অ্যাক্সেসের জন্য কনফিগার করা মডেলগুলি পরীক্ষা করতে পারেন:
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 Project এবং কিছুক্ষণ আগে তৈরি করা AlloyDB-এর একটি বিদ্যমান ক্লাস্টার/ইনস্ট্যান্স ব্যবহার করেন, তাহলে আপনাকে gemini-1.5 মডেলের পুরানো রেফারেন্সগুলি বাদ দিয়ে উপরের CALL স্টেটমেন্টটি দিয়ে আবার create করতে হতে পারে এবং gemini-1.5-এর আসন্ন আমন্ত্রণে সমস্যার সম্মুখীন হলে ml_predict_row ফাংশনে grant execute আবার চালাতে হতে পারে।
প্রতিক্রিয়া মূল্যায়ন করা
যদিও পরবর্তী বিভাগে আমরা একটি বড় কোয়েরি ব্যবহার করব যাতে কোয়েরির উত্তরগুলি যুক্তিসঙ্গত হয় তা নিশ্চিত করা যায়, তবে কোয়েরিটি বোঝা কঠিন হতে পারে। আমরা এখন অংশগুলি দেখব এবং দেখব কিভাবে কয়েক মিনিটের মধ্যে সেগুলি একত্রিত হয়।
- প্রথমে আমরা ডাটাবেসে একটি অনুরোধ পাঠাবো যাতে ব্যবহারকারীর প্রশ্নের সাথে ৫টি সবচেয়ে কাছাকাছি মিল পাওয়া যায়। আমরা এটিকে সহজ রাখার জন্য কোয়েরিটি হার্ডকোড করছি, কিন্তু চিন্তা করবেন না, আমরা পরে এটিকে কোয়েরিতে ইন্টারপোলেট করব। আমরা
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
- উত্তরগুলি কতটা বৈধ তা নির্ধারণ করতে, আমরা একটি জটিল কোয়েরি ব্যবহার করব যেখানে আমরা ব্যাখ্যা করব কিভাবে উত্তরগুলি মূল্যায়ন করতে হয়। এটি কোয়েরির অংশ হিসাবে
xyzটেবিলেরuser_textএবংcontentব্যবহার করে।
"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;
- এটিকে নিম্নলিখিতভাবে একটি পরবর্তী প্রশ্নের সাথে একত্রিত করা যেতে পারে।
যদি আপনি উপরের কোয়েরিগুলি চালিয়ে থাকেন তাহলে মধ্যবর্তী ফলাফল পরীক্ষা করার জন্য AlloyDB ডাটাবেস থেকে xyz এবং x টেবিলগুলি মুছে ফেলতে/সরাতে হবে।
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;
যদিও এটি এখনও কঠিন মনে হতে পারে, আশা করি আপনি এটি থেকে আরও কিছুটা অর্থবহ হতে পারবেন। ফলাফলগুলি বলে দেয় যে কোনও মিল আছে কিনা, মিলটি কত শতাংশ এবং রেটিং সম্পর্কে কিছু ব্যাখ্যা।
লক্ষ্য করুন যে জেমিনি মডেলটি ডিফল্টভাবে স্ট্রিমিং চালু আছে, তাই প্রকৃত প্রতিক্রিয়া একাধিক লাইনে ছড়িয়ে আছে: 
১০. অ্যাপ্লিকেশনটি ওয়েবে নিয়ে যান
এই অ্যাপটি ওয়েবে নিয়ে যাওয়ার জন্য প্রস্তুত? ক্লাউড রান ফাংশন সহ এই নলেজ ইঞ্জিনকে সার্ভারলেস করতে নীচের পদক্ষেপগুলি অনুসরণ করুন:
- একটি নতুন ক্লাউড রান ফাংশন তৈরি করতে গুগল ক্লাউড কনসোলের ক্লাউড রান ফাংশনে যান অথবা https://console.cloud.google.com/functions/add লিঙ্কটি ব্যবহার করুন।
- " Cloud Run function " হিসেবে Environment নির্বাচন করুন। " retail-engine " ফাংশনের নাম দিন এবং "us-central1" হিসেবে Region নির্বাচন করুন। Authentication কে "Allow unauthenticated invocations" হিসেবে সেট করুন এবং NEXT এ ক্লিক করুন। রানটাইম হিসেবে Java 17 এবং সোর্স কোডের জন্য Inline Editor নির্বাচন করুন।
- ডিফল্টরূপে এটি এন্ট্রি পয়েন্টটিকে "
gcfv2.HelloHttpFunction" তে সেট করবে। আপনার ক্লাউড রান ফাংশনেরHelloHttpFunction.javaএবংpom.xmlএ প্লেসহোল্ডার কোডটি যথাক্রমে জাভা ফাইল এবং XML ফাইলের কোড দিয়ে প্রতিস্থাপন করুন। - জাভা ফাইলে আপনার মানগুলির সাথে $PROJECT_ID প্লেসহোল্ডার এবং AlloyDB সংযোগ শংসাপত্রগুলি পরিবর্তন করতে ভুলবেন না। AlloyDB শংসাপত্রগুলি হল সেইগুলি যা আমরা এই কোডল্যাবের শুরুতে ব্যবহার করেছিলাম। যদি আপনি ভিন্ন মান ব্যবহার করে থাকেন, তাহলে দয়া করে জাভা ফাইলে একই মান পরিবর্তন করুন।
- Deploy এ ক্লিক করুন।
একবার স্থাপন করা হলে, ক্লাউড ফাংশনকে আমাদের AlloyDB ডাটাবেস ইনস্ট্যান্স অ্যাক্সেস করার অনুমতি দেওয়ার জন্য, আমরা VPC সংযোগকারী তৈরি করব।
গুরুত্বপূর্ণ পদক্ষেপ:
একবার আপনি স্থাপনার জন্য প্রস্তুত হয়ে গেলে, আপনি Google Cloud Run Functions কনসোলে ফাংশনগুলি দেখতে সক্ষম হবেন। নতুন তৈরি ফাংশনটি ( retail-engine ) অনুসন্ধান করুন, এটিতে ক্লিক করুন, তারপর EDIT এ ক্লিক করুন এবং নিম্নলিখিতগুলি পরিবর্তন করুন:
- রানটাইম, বিল্ড, সংযোগ এবং নিরাপত্তা সেটিংসে যান।
- টাইমআউট ১৮০ সেকেন্ডে বাড়ান
- সংযোগ ট্যাবে যান:

- ইনগ্রেস সেটিংসের অধীনে, নিশ্চিত করুন যে "সকল ট্র্যাফিকের অনুমতি দিন" নির্বাচন করা আছে।
- Egress সেটিংসের অধীনে, Network ড্রপডাউনে ক্লিক করুন এবং "Add New VPC Connector" বিকল্পটি নির্বাচন করুন এবং পপ-আপ হওয়া ডায়ালগ বক্সে আপনি যে নির্দেশাবলী দেখবেন তা অনুসরণ করুন:

- VPC Connector এর জন্য একটি নাম দিন এবং নিশ্চিত করুন যে অঞ্চলটি আপনার ইনস্ট্যান্সের মতোই। নেটওয়ার্ক মানটি ডিফল্ট হিসেবে রেখে দিন এবং সাবনেটকে কাস্টম আইপি রেঞ্জ হিসেবে সেট করুন যার আইপি রেঞ্জ 10.8.0.0 অথবা অনুরূপ কিছু উপলব্ধ।
- SHOW SCALING SETTINGS প্রসারিত করুন এবং নিশ্চিত করুন যে আপনার কনফিগারেশনটি ঠিক নিম্নলিখিতটিতে সেট করা আছে:

- CREATE এ ক্লিক করুন এবং এই সংযোগকারীটি এখন বহির্গমন সেটিংসে তালিকাভুক্ত হওয়া উচিত।
- নতুন তৈরি সংযোগকারীটি নির্বাচন করুন
- এই VPC সংযোগকারীর মাধ্যমে সমস্ত ট্র্যাফিক রাউটেড করার জন্য বেছে নিন।
- NEXT এ ক্লিক করুন এবং তারপর DEPLOY এ ক্লিক করুন।
১১. আবেদনপত্র পরীক্ষা করুন
আপডেট করা ক্লাউড ফাংশনটি স্থাপন করা হয়ে গেলে, আপনি নিম্নলিখিত ফর্ম্যাটে এন্ডপয়েন্টটি দেখতে পাবেন:
https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/retail-engine
আপনি নিম্নলিখিত কমান্ডটি চালিয়ে ক্লাউড শেল টার্মিনাল থেকে এটি পরীক্ষা করতে পারেন:
gcloud functions call retail-engine --region=us-central1 --gen2 --data '{"search": "I want some kids clothes themed on Disney"}'
বিকল্পভাবে, আপনি নিম্নরূপ ক্লাউড রান ফাংশন পরীক্ষা করতে পারেন:
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 .
এবং ফলাফল:

ব্যস! AlloyDB ডেটাতে Embeddings মডেল ব্যবহার করে Similarity Vector Search করা খুবই সহজ।
কথোপকথনকারী এজেন্ট তৈরি করা!
এজেন্ট এই ল্যাবের অংশ ২-এ তৈরি।
১২. পরিষ্কার করা
যদি আপনি এই ল্যাবের দ্বিতীয় অংশটি সম্পূর্ণ করার পরিকল্পনা করেন, তাহলে এই ধাপটি এড়িয়ে যান কারণ এটি বর্তমান প্রকল্পটি মুছে ফেলবে।
এই পোস্টে ব্যবহৃত রিসোর্সের জন্য আপনার Google ক্লাউড অ্যাকাউন্টে চার্জ এড়াতে, এই পদক্ষেপগুলি অনুসরণ করুন:
- গুগল ক্লাউড কনসোলে, রিসোর্স পরিচালনা পৃষ্ঠায় যান।
- প্রকল্পের তালিকায়, আপনি যে প্রকল্পটি মুছতে চান তা নির্বাচন করুন এবং তারপরে মুছুন ক্লিক করুন।
- ডায়ালগে, প্রজেক্ট আইডি টাইপ করুন, এবং তারপর প্রজেক্টটি মুছে ফেলতে Shut down এ ক্লিক করুন।
১৩. অভিনন্দন
অভিনন্দন! আপনি AlloyDB, pgvector এবং Vector অনুসন্ধান ব্যবহার করে একটি সাদৃশ্য অনুসন্ধান সফলভাবে সম্পন্ন করেছেন। AlloyDB , Vertex AI এবং Vector অনুসন্ধানের ক্ষমতা একত্রিত করে, আমরা প্রাসঙ্গিক এবং ভেক্টর অনুসন্ধানগুলিকে অ্যাক্সেসযোগ্য, দক্ষ এবং সত্যিকার অর্থে অর্থ-চালিত করার ক্ষেত্রে এক বিশাল অগ্রগতি অর্জন করেছি। এই ল্যাবের পরবর্তী অংশে এজেন্ট তৈরির ধাপগুলি অন্তর্ভুক্ত করা হয়েছে।