1. ভূমিকা
এই কোডল্যাবটি অ্যালোয়ডিবি স্থাপন এবং মাল্টিমোডাল এম্বেডিং ব্যবহার করে শব্দার্থক অনুসন্ধানের জন্য এআই ইন্টিগ্রেশনের সুবিধা প্রদানের জন্য একটি নির্দেশিকা প্রদান করে। এই ল্যাবটি অ্যালোয়ডিবি এআই বৈশিষ্ট্যের জন্য নিবেদিত একটি ল্যাব সংগ্রহের অংশ। আপনি ডকুমেন্টেশনে AlloyDB AI পৃষ্ঠায় আরও পড়তে পারেন।
পূর্বশর্ত
- Google ক্লাউড, কনসোলের একটি প্রাথমিক ধারণা
- কমান্ড লাইন ইন্টারফেস এবং ক্লাউড শেলের প্রাথমিক দক্ষতা
আপনি কি শিখবেন
- পোস্টগ্রেসের জন্য কীভাবে অ্যালয়ডিবি স্থাপন করবেন
- মাল্টিমডাল ভেক্টর অনুসন্ধান কিভাবে ব্যবহার করবেন
- কিভাবে AlloyDB AI অপারেটর সক্ষম করবেন
- মাল্টিমোডাল অনুসন্ধানের জন্য কিভাবে বিভিন্ন AlloyDB AI অপারেটর ব্যবহার করবেন
- কিভাবে টেক্সট এবং ইমেজ সার্চ ফলাফল একত্রিত করতে AlloyDB AI ব্যবহার করবেন
আপনি কি প্রয়োজন হবে
- একটি Google ক্লাউড অ্যাকাউন্ট এবং Google ক্লাউড প্রকল্প
- একটি ওয়েব ব্রাউজার যেমন ক্রোম সমর্থন করে গুগল ক্লাউড কনসোল এবং ক্লাউড শেল
2. সেটআপ এবং প্রয়োজনীয়তা
স্ব-গতিসম্পন্ন পরিবেশ সেটআপ
- Google ক্লাউড কনসোলে সাইন-ইন করুন এবং একটি নতুন প্রকল্প তৈরি করুন বা বিদ্যমান একটি পুনরায় ব্যবহার করুন৷ আপনার যদি ইতিমধ্যেই একটি Gmail বা Google Workspace অ্যাকাউন্ট না থাকে, তাহলে আপনাকে অবশ্যই একটি তৈরি করতে হবে।
- প্রকল্পের নাম এই প্রকল্পের অংশগ্রহণকারীদের জন্য প্রদর্শনের নাম। এটি একটি অক্ষর স্ট্রিং যা Google API দ্বারা ব্যবহৃত হয় না। আপনি সবসময় এটি আপডেট করতে পারেন.
- প্রোজেক্ট আইডি সমস্ত Google ক্লাউড প্রোজেক্ট জুড়ে অনন্য এবং অপরিবর্তনীয় (সেট করার পরে পরিবর্তন করা যাবে না)। ক্লাউড কনসোল স্বয়ংক্রিয়ভাবে একটি অনন্য স্ট্রিং তৈরি করে; সাধারণত আপনি এটা কি যত্ন না. বেশিরভাগ কোডল্যাবে, আপনাকে আপনার প্রকল্প আইডি উল্লেখ করতে হবে (সাধারণত
PROJECT_ID
হিসাবে চিহ্নিত)। আপনি যদি জেনারেট করা আইডি পছন্দ না করেন, তাহলে আপনি অন্য একটি এলোমেলো আইডি তৈরি করতে পারেন। বিকল্পভাবে, আপনি নিজের চেষ্টা করতে পারেন, এবং এটি উপলব্ধ কিনা দেখতে পারেন। এই ধাপের পরে এটি পরিবর্তন করা যাবে না এবং প্রকল্পের সময়কালের জন্য থাকে। - আপনার তথ্যের জন্য, একটি তৃতীয় মান আছে, একটি প্রকল্প নম্বর , যা কিছু API ব্যবহার করে। ডকুমেন্টেশনে এই তিনটি মান সম্পর্কে আরও জানুন।
- এরপরে, ক্লাউড রিসোর্স/এপিআই ব্যবহার করতে আপনাকে ক্লাউড কনসোলে বিলিং সক্ষম করতে হবে। এই কোডল্যাবের মাধ্যমে চালানোর জন্য খুব বেশি খরচ হবে না, যদি কিছু হয়। এই টিউটোরিয়ালের বাইরে বিলিং এড়াতে সংস্থানগুলি বন্ধ করতে, আপনি আপনার তৈরি করা সংস্থানগুলি মুছতে বা প্রকল্প মুছতে পারেন। নতুন Google ক্লাউড ব্যবহারকারীরা $300 USD বিনামূল্যের ট্রায়াল প্রোগ্রামের জন্য যোগ্য৷
ক্লাউড শেল শুরু করুন
যদিও Google ক্লাউড আপনার ল্যাপটপ থেকে দূরবর্তীভাবে পরিচালিত হতে পারে, এই কোডল্যাবে আপনি Google ক্লাউড শেল ব্যবহার করবেন, একটি কমান্ড লাইন পরিবেশ যা ক্লাউডে চলছে।
Google ক্লাউড কনসোল থেকে, উপরের ডানদিকে টুলবারে ক্লাউড শেল আইকনে ক্লিক করুন:
পরিবেশের ব্যবস্থা করতে এবং সংযোগ করতে এটি শুধুমাত্র কয়েক মুহূর্ত নিতে হবে। এটি সমাপ্ত হলে, আপনি এই মত কিছু দেখতে হবে:
এই ভার্চুয়াল মেশিনটি আপনার প্রয়োজনীয় সমস্ত ডেভেলপমেন্ট টুল দিয়ে লোড করা হয়েছে। এটি একটি ক্রমাগত 5GB হোম ডিরেক্টরি অফার করে এবং Google ক্লাউডে চলে, যা নেটওয়ার্ক কর্মক্ষমতা এবং প্রমাণীকরণকে ব্যাপকভাবে উন্নত করে। এই কোডল্যাবে আপনার সমস্ত কাজ একটি ব্রাউজারে করা যেতে পারে। আপনার কিছু ইন্সটল করার দরকার নেই।
3. আপনি শুরু করার আগে
API সক্ষম করুন
ক্লাউড শেলের ভিতরে, নিশ্চিত করুন যে আপনার প্রকল্প আইডি সেটআপ করা আছে:
gcloud config set project [YOUR-PROJECT-ID]
পরিবেশ পরিবর্তনশীল PROJECT_ID সেট করুন:
PROJECT_ID=$(gcloud config get-value project)
সমস্ত প্রয়োজনীয় পরিষেবাগুলি সক্ষম করুন:
gcloud services enable alloydb.googleapis.com \
compute.googleapis.com \
cloudresourcemanager.googleapis.com \
servicenetworking.googleapis.com \
aiplatform.googleapis.com \
discoveryengine.googleapis.com \
secretmanager.googleapis.com
প্রত্যাশিত আউটপুট
student@cloudshell:~ (test-project-001-402417)$ gcloud config set project test-project-001-402417 Updated property [core/project]. student@cloudshell:~ (test-project-001-402417)$ PROJECT_ID=$(gcloud config get-value project) Your active configuration is: [cloudshell-14650] student@cloudshell:~ (test-project-001-402417)$ student@cloudshell:~ (test-project-001-402417)$ gcloud services enable alloydb.googleapis.com \ compute.googleapis.com \ cloudresourcemanager.googleapis.com \ servicenetworking.googleapis.com \ aiplatform.googleapis.com Operation "operations/acat.p2-4470404856-1f44ebd8-894e-4356-bea7-b84165a57442" finished successfully.
4. AlloyDB স্থাপন করুন
AlloyDB ক্লাস্টার এবং প্রাথমিক উদাহরণ তৈরি করুন। Google ক্লাউড SDK ব্যবহার করে কীভাবে একটি AlloyDB ক্লাস্টার এবং উদাহরণ তৈরি করা যায় তা নিম্নলিখিত পদ্ধতিটি বর্ণনা করে। আপনি যদি কনসোল পদ্ধতি পছন্দ করেন তবে আপনি এখানে ডকুমেন্টেশন অনুসরণ করতে পারেন।
একটি AlloyDB ক্লাস্টার তৈরি করার আগে আমাদের VPC-তে একটি উপলব্ধ প্রাইভেট আইপি পরিসর প্রয়োজন যাতে ভবিষ্যতে AlloyDB দৃষ্টান্ত ব্যবহার করা যায়। যদি আমাদের কাছে এটি না থাকে তবে আমাদের এটি তৈরি করতে হবে, এটিকে অভ্যন্তরীণ Google পরিষেবাগুলির দ্বারা ব্যবহার করার জন্য বরাদ্দ করতে হবে এবং তারপরে আমরা ক্লাস্টার এবং উদাহরণ তৈরি করতে সক্ষম হব।
ব্যক্তিগত আইপি পরিসীমা তৈরি করুন
AlloyDB-এর জন্য আমাদের VPC-তে আমাদের ব্যক্তিগত পরিষেবা অ্যাক্সেস কনফিগারেশন কনফিগার করতে হবে। এখানে অনুমান হল যে আমাদের প্রকল্পে "ডিফল্ট" VPC নেটওয়ার্ক আছে এবং এটি সমস্ত কর্মের জন্য ব্যবহার করা হবে।
ব্যক্তিগত আইপি পরিসীমা তৈরি করুন:
gcloud compute addresses create psa-range \
--global \
--purpose=VPC_PEERING \
--prefix-length=24 \
--description="VPC private service access" \
--network=default
বরাদ্দকৃত আইপি পরিসর ব্যবহার করে ব্যক্তিগত সংযোগ তৈরি করুন:
gcloud services vpc-peerings connect \
--service=servicenetworking.googleapis.com \
--ranges=psa-range \
--network=default
প্রত্যাশিত কনসোল আউটপুট:
student@cloudshell:~ (test-project-402417)$ gcloud compute addresses create psa-range \ --global \ --purpose=VPC_PEERING \ --prefix-length=24 \ --description="VPC private service access" \ --network=default Created [https://www.googleapis.com/compute/v1/projects/test-project-402417/global/addresses/psa-range]. student@cloudshell:~ (test-project-402417)$ gcloud services vpc-peerings connect \ --service=servicenetworking.googleapis.com \ --ranges=psa-range \ --network=default Operation "operations/pssn.p24-4470404856-595e209f-19b7-4669-8a71-cbd45de8ba66" finished successfully. student@cloudshell:~ (test-project-402417)$
AlloyDB ক্লাস্টার তৈরি করুন
এই বিভাগে আমরা us-central1 অঞ্চলে একটি AlloyDB ক্লাস্টার তৈরি করছি।
পোস্টগ্রেস ব্যবহারকারীর জন্য পাসওয়ার্ড নির্ধারণ করুন। আপনি আপনার নিজের পাসওয়ার্ড সংজ্ঞায়িত করতে পারেন বা একটি তৈরি করতে একটি র্যান্ডম ফাংশন ব্যবহার করতে পারেন
export PGPASSWORD=`openssl rand -hex 12`
প্রত্যাশিত কনসোল আউটপুট:
student@cloudshell:~ (test-project-402417)$ export PGPASSWORD=`openssl rand -hex 12`
ভবিষ্যতে ব্যবহারের জন্য PostgreSQL পাসওয়ার্ডটি নোট করুন।
echo $PGPASSWORD
পোস্টগ্রেস ব্যবহারকারী হিসাবে উদাহরণের সাথে সংযোগ করার জন্য ভবিষ্যতে আপনার সেই পাসওয়ার্ডের প্রয়োজন হবে। পরে ব্যবহার করতে সক্ষম হওয়ার জন্য আমি এটি লিখতে বা কোথাও অনুলিপি করার পরামর্শ দিই।
প্রত্যাশিত কনসোল আউটপুট:
student@cloudshell:~ (test-project-402417)$ echo $PGPASSWORD bbefbfde7601985b0dee5723
একটি বিনামূল্যে ট্রায়াল ক্লাস্টার তৈরি করুন
আপনি একটি বিনামূল্যে ট্রায়াল ক্লাস্টার তৈরি করার আগে AlloyDB ব্যবহার না করে থাকলে:
অঞ্চল এবং AlloyDB ক্লাস্টার নাম সংজ্ঞায়িত করুন। আমরা একটি ক্লাস্টার নাম হিসাবে us-central1 অঞ্চল এবং alloydb-aip-01 ব্যবহার করতে যাচ্ছি:
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
ক্লাস্টার তৈরি করতে কমান্ড চালান:
gcloud alloydb clusters create $ADBCLUSTER \
--password=$PGPASSWORD \
--network=default \
--region=$REGION \
--subscription-type=TRIAL
প্রত্যাশিত কনসোল আউটপুট:
export REGION=us-central1 export ADBCLUSTER=alloydb-aip-01 gcloud alloydb clusters create $ADBCLUSTER \ --password=$PGPASSWORD \ --network=default \ --region=$REGION \ --subscription-type=TRIAL Operation ID: operation-1697655441138-6080235852277-9e7f04f5-2012fce4 Creating cluster...done.
একই ক্লাউড শেল সেশনে আমাদের ক্লাস্টারের জন্য একটি AlloyDB প্রাথমিক উদাহরণ তৈরি করুন। আপনি সংযোগ বিচ্ছিন্ন হলে আপনাকে আবার অঞ্চল এবং ক্লাস্টার নাম পরিবেশ ভেরিয়েবল সংজ্ঞায়িত করতে হবে।
gcloud alloydb instances create $ADBCLUSTER-pr \
--instance-type=PRIMARY \
--cpu-count=8 \
--region=$REGION \
--cluster=$ADBCLUSTER
প্রত্যাশিত কনসোল আউটপুট:
student@cloudshell:~ (test-project-402417)$ gcloud alloydb instances create $ADBCLUSTER-pr \ --instance-type=PRIMARY \ --cpu-count=8 \ --region=$REGION \ --availability-type ZONAL \ --cluster=$ADBCLUSTER Operation ID: operation-1697659203545-6080315c6e8ee-391805db-25852721 Creating instance...done.
AlloyDB স্ট্যান্ডার্ড ক্লাস্টার তৈরি করুন
যদি এটি প্রকল্পে আপনার প্রথম AlloyDB ক্লাস্টার না হয় তবে একটি স্ট্যান্ডার্ড ক্লাস্টার তৈরির সাথে এগিয়ে যান।
অঞ্চল এবং AlloyDB ক্লাস্টার নাম সংজ্ঞায়িত করুন। আমরা একটি ক্লাস্টার নাম হিসাবে us-central1 অঞ্চল এবং alloydb-aip-01 ব্যবহার করতে যাচ্ছি:
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
ক্লাস্টার তৈরি করতে কমান্ড চালান:
gcloud alloydb clusters create $ADBCLUSTER \
--password=$PGPASSWORD \
--network=default \
--region=$REGION
প্রত্যাশিত কনসোল আউটপুট:
export REGION=us-central1 export ADBCLUSTER=alloydb-aip-01 gcloud alloydb clusters create $ADBCLUSTER \ --password=$PGPASSWORD \ --network=default \ --region=$REGION Operation ID: operation-1697655441138-6080235852277-9e7f04f5-2012fce4 Creating cluster...done.
একই ক্লাউড শেল সেশনে আমাদের ক্লাস্টারের জন্য একটি AlloyDB প্রাথমিক উদাহরণ তৈরি করুন। আপনি সংযোগ বিচ্ছিন্ন হলে আপনাকে আবার অঞ্চল এবং ক্লাস্টার নাম পরিবেশ ভেরিয়েবল সংজ্ঞায়িত করতে হবে।
gcloud alloydb instances create $ADBCLUSTER-pr \
--instance-type=PRIMARY \
--cpu-count=2 \
--region=$REGION \
--cluster=$ADBCLUSTER
প্রত্যাশিত কনসোল আউটপুট:
student@cloudshell:~ (test-project-402417)$ gcloud alloydb instances create $ADBCLUSTER-pr \ --instance-type=PRIMARY \ --cpu-count=2 \ --region=$REGION \ --availability-type ZONAL \ --cluster=$ADBCLUSTER Operation ID: operation-1697659203545-6080315c6e8ee-391805db-25852721 Creating instance...done.
5. ডাটাবেস প্রস্তুত করুন
আমাদের একটি ডাটাবেস তৈরি করতে হবে, ভার্টেক্স এআই ইন্টিগ্রেশন সক্ষম করতে হবে, ডাটাবেস অবজেক্ট তৈরি করতে হবে এবং ডেটা আমদানি করতে হবে।
AlloyDB কে প্রয়োজনীয় অনুমতি দিন
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"
প্রত্যাশিত কনসোল আউটপুট:
student@cloudshell:~ (test-project-001-402417)$ PROJECT_ID=$(gcloud config get-value project) Your active configuration is: [cloudshell-11039] student@cloudshell:~ (test-project-001-402417)$ 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" Updated IAM policy for project [test-project-001-402417]. bindings: - members: - serviceAccount:service-4470404856@gcp-sa-alloydb.iam.gserviceaccount.com role: roles/aiplatform.user - members: ... etag: BwYIEbe_Z3U= version: 1
ট্যাবে "প্রস্থান" কমান্ড দ্বারা ট্যাবটি বন্ধ করুন:
exit
AlloyDB স্টুডিওতে সংযোগ করুন
নিম্নলিখিত অধ্যায়গুলিতে ডাটাবেসের সাথে সংযোগের প্রয়োজন এমন সমস্ত SQL কমান্ডগুলি বিকল্পভাবে AlloyDB স্টুডিওতে কার্যকর করা যেতে পারে। কমান্ডটি চালানোর জন্য আপনাকে প্রাথমিক উদাহরণে ক্লিক করে আপনার AlloyDB ক্লাস্টারের জন্য ওয়েব কনসোল ইন্টারফেস খুলতে হবে।
তারপরে বাম দিকে AlloyDB স্টুডিওতে ক্লিক করুন:
পোস্টগ্রেস ডাটাবেস, ব্যবহারকারীর পোস্টগ্রেস চয়ন করুন এবং যখন আমরা ক্লাস্টার তৈরি করি তখন উল্লিখিত পাসওয়ার্ড প্রদান করুন। তারপর "প্রমাণিত করুন" বোতামে ক্লিক করুন।
এটি AlloyDB স্টুডিও ইন্টারফেস খুলবে। ডাটাবেসে কমান্ড চালানোর জন্য আপনি ডানদিকে "Editor 1" ট্যাবে ক্লিক করুন।
এটি ইন্টারফেস খোলে যেখানে আপনি SQL কমান্ড চালাতে পারেন
ডাটাবেস তৈরি করুন
ডাটাবেস কুইকস্টার্ট তৈরি করুন।
AlloyDB স্টুডিও এডিটরে নিম্নলিখিত কমান্ডটি চালান।
ডাটাবেস তৈরি করুন:
CREATE DATABASE quickstart_db
প্রত্যাশিত আউটপুট:
Statement executed successfully
Quickstart_db-এ সংযোগ করুন
ব্যবহারকারী/ডাটাবেস পরিবর্তন করতে বোতামটি ব্যবহার করে স্টুডিওতে পুনরায় সংযোগ করুন।
ড্রপডাউন তালিকা থেকে নতুন quickstart_db ডাটাবেস নিন এবং আগের মতো একই ব্যবহারকারী এবং পাসওয়ার্ড ব্যবহার করুন।
এটি একটি নতুন সংযোগ খুলবে যেখানে আপনি quickstart_db ডাটাবেস থেকে বস্তুর সাথে কাজ করতে পারবেন।
6. নমুনা ডেটা
এখন আমাদের ডাটাবেসে অবজেক্ট তৈরি করতে হবে এবং ডেটা লোড করতে হবে। আমরা কাল্পনিক তথ্য সহ একটি কাল্পনিক "Cymbal" স্টোর ব্যবহার করতে যাচ্ছি।
ডেটা আমদানি করার আগে আমাদের ডেটাটাইপ এবং সূচী সমর্থনকারী এক্সটেনশনগুলি সক্ষম করতে হবে। আমাদের দুটি এক্সটেনশন দরকার যেখানে একটি ভেক্টর ডেটা টাইপ সমর্থন করে এবং অন্যটি AlloyDB ScaNN সূচক সমর্থন করে।
AlloyDB স্টুডিওতে quickstart_db এক্সিকিউটের সাথে সংযোগ করা হচ্ছে।
CREATE EXTENSION IF NOT EXISTS vector;
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
ডেটাসেট প্রস্তুত করা হয় এবং একটি SQL ফাইল হিসাবে স্থাপন করা হয় যা আমদানি ইন্টারফেস ব্যবহার করে ডাটাবেসে লোড করা যেতে পারে। ক্লাউড শেলে নিম্নলিখিত কমান্ডগুলি চালান:
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
gcloud alloydb clusters import $ADBCLUSTER --region=$REGION --database=quickstart_db --gcs-uri='gs://sample-data-and-media/ecomm-retail/ecom_generic_vectors.sql' --user=postgres --sql
কমান্ডটি AlloyDB SDK ব্যবহার করে এবং agentspace_user নামের একজন ব্যবহারকারী তৈরি করে এবং তারপর GCS বালতি থেকে ডাটাবেসে সরাসরি নমুনা ডেটা আমদানি করে এবং সমস্ত প্রয়োজনীয় বস্তু তৈরি করে এবং ডেটা সন্নিবেশ করে।
আমদানির পরে আমরা AlloyDB স্টুডিওতে টেবিলগুলি পরীক্ষা করতে পারি। টেবিলগুলি ইকম স্কিমাতে রয়েছে:
এবং টেবিলের একটিতে সারির সংখ্যা যাচাই করুন।
আমরা সফলভাবে আমাদের নমুনা ডেটা আমদানি করেছি এবং পরবর্তী পদক্ষেপগুলি চালিয়ে যেতে পারি৷
7. টেক্সট এমবেডিং ব্যবহার করে শব্দার্থিক অনুসন্ধান
এই অধ্যায়ে আমরা টেক্সট এম্বেডিং ব্যবহার করে শব্দার্থিক অনুসন্ধান ব্যবহার করার চেষ্টা করব এবং এটিকে ঐতিহ্যগত পোস্টগ্রেস টেক্সট এবং ফুলটেক্সট অনুসন্ধানের সাথে তুলনা করব।
আসুন প্রথমে LIKE অপারেটরের সাথে স্ট্যান্ডার্ড PostgreSQL SQL ব্যবহার করে ক্লাসিক অনুসন্ধানের চেষ্টা করি।
যদি আমরা নিম্নলিখিত ক্যোয়ারী ব্যবহার করে একটি রেইন জ্যাকেট অনুসন্ধান করার চেষ্টা করি:
SET session.my_search_var='%wet%conditions%jacket%';
SELECT
name,
product_description,
retail_price, replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url
FROM
ecomm.products
WHERE
name ILIKE current_setting('session.my_search_var')
OR product_description ILIKE current_setting('session.my_search_var')
LIMIT
10;
কোয়েরিটি কোনো সারি ফেরত দেয় না কারণ পণ্যের নাম বা বিবরণে ভেজা অবস্থা এবং জ্যাকেটের মতো সঠিক শব্দের প্রয়োজন হবে। আর 'ওয়েট কন্ডিশন জ্যাকেট' 'রেইন কন্ডিশন জ্যাকেট' এর মতো নয়।
আমরা অনুসন্ধানে সম্ভাব্য সমস্ত বৈচিত্র অন্তর্ভুক্ত করার চেষ্টা করতে পারি। এর মাত্র দুটি শব্দ অন্তর্ভুক্ত করার চেষ্টা করা যাক. যেমন:
SELECT
name,
product_description,
retail_price,
replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url
FROM
ecomm.products
WHERE
name ILIKE '%wet%jacket%'
OR name ILIKE '%jacket%wet%'
OR name ILIKE '%jacket%'
OR name ILIKE '%%wet%'
OR product_description ILIKE '%wet%jacket%'
OR product_description ILIKE '%jacket%wet%'
OR product_description ILIKE '%jacket%'
OR product_description ILIKE '%wet%'
LIMIT
10;
এটি একাধিক সারি ফিরিয়ে দেবে কিন্তু সেগুলির সবগুলি জ্যাকেটগুলির জন্য আমাদের অনুরোধের সাথে পুরোপুরি মেলে না এবং প্রাসঙ্গিকতা অনুসারে বাছাই করা কঠিন৷ এবং, উদাহরণস্বরূপ, যদি আমরা "পুরুষদের জন্য" এবং অন্যদের মতো আরও শর্ত যোগ করি তবে এটি প্রশ্নের জটিলতা উল্লেখযোগ্যভাবে বৃদ্ধি করবে। বিকল্পভাবে আমরা সম্পূর্ণ পাঠ্য অনুসন্ধানের চেষ্টা করতে পারি তবে সেখানেও আমরা কমবেশি সঠিক শব্দ এবং প্রতিক্রিয়ার প্রাসঙ্গিকতার সাথে সম্পর্কিত সীমাবদ্ধতাগুলিকে আঘাত করি।
এখন আমরা এমবেডিং ব্যবহার করে অনুরূপ অনুসন্ধান করতে পারি। আমরা ইতিমধ্যেই বিভিন্ন মডেল ব্যবহার করে আমাদের পণ্যগুলির জন্য এম্বেডিংয়ের পূর্ব গণনা করেছি৷ আমরা সর্বশেষ Google-এর জেমিনি-এম্বেডিং-001 মডেল ব্যবহার করতে যাচ্ছি। আমরা এগুলিকে ecomm.products টেবিলের " product_embedding " কলামে সংরক্ষণ করেছি৷ যদি আমরা নিম্নলিখিত ক্যোয়ারী ব্যবহার করে আমাদের "পুরুষদের জন্য বৃষ্টি জ্যাকেট" অনুসন্ধান অবস্থার জন্য একটি ক্যোয়ারী চালাই:
SELECT
name,
product_description,
retail_price,
replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url,
product_embedding <=> embedding ('gemini-embedding-001','wet conditions jacket for men')::vector AS distance
FROM
ecomm.products
ORDER BY distance
LIMIT
10;
এটি শুধুমাত্র ভিজা অবস্থার জন্য জ্যাকেটগুলিই ফেরত দেবে না, তবে সমস্ত ফলাফলগুলি শীর্ষে সর্বাধিক প্রাসঙ্গিক ফলাফল রেখে সাজানো হয়েছে৷
এমবেডিং সহ ক্যোয়ারী 90-150ms এর ফলাফল দেয় যেখানে ক্লাউড এম্বেডিং মডেল থেকে ডেটা পেতে সময়ের কিছু অংশ ব্যয় করা হয়। আমরা যদি এক্সিকিউশন প্ল্যানের দিকে তাকাই তাহলে মডেলের অনুরোধটি পরিকল্পনার সময় অন্তর্ভুক্ত করা হয়েছে। অনুসন্ধান নিজেই করছেন প্রশ্নের অংশ বেশ সংক্ষিপ্ত. AlloyDB ScaNN সূচক ব্যবহার করে 29k রেকর্ডে অনুসন্ধান করতে 7 ms এর কম সময় লাগে।
Limit (cost=2709.20..2718.82 rows=10 width=490) (actual time=6.966..7.049 rows=10 loops=1)
-> Index Scan using embedding_scann on products (cost=2709.20..30736.40 rows=29120 width=490) (actual time=6.964..7.046 rows=10 loops=1)
Order By: (product_embedding <=> '[-0.0020264734,-0.016582033,0.027258193
...
-0.0051468653,-0.012440448]'::vector)
Limit: 10
Planning Time: 136.579 ms
Execution Time: 6.791 ms
(6 rows)
এটি ছিল পাঠ্য এমবেডিং অনুসন্ধান কেবলমাত্র পাঠ্য এমবেডিং মডেল ব্যবহার করে। কিন্তু আমাদের কাছে আমাদের পণ্যগুলির জন্য ছবিও রয়েছে এবং আমরা অনুসন্ধানের সাথে এটি ব্যবহার করতে পারি। পরবর্তী অধ্যায়ে আমরা দেখাব কিভাবে মাল্টিমোডাল মডেল অনুসন্ধানের জন্য ছবি ব্যবহার করে।
8. মাল্টিমোডাল অনুসন্ধান ব্যবহার করা
যদিও টেক্সট-ভিত্তিক শব্দার্থিক অনুসন্ধান দরকারী, জটিল বিবরণ বর্ণনা করা চ্যালেঞ্জিং হতে পারে। AlloyDB এর মাল্টিমোডাল অনুসন্ধান ইমেজ ইনপুটের মাধ্যমে পণ্য আবিষ্কার সক্ষম করে একটি সুবিধা প্রদান করে। এটি বিশেষভাবে সহায়ক যখন চাক্ষুষ উপস্থাপনা শুধুমাত্র পাঠ্য বর্ণনার চেয়ে আরও কার্যকরভাবে অনুসন্ধানের অভিপ্রায়কে স্পষ্ট করে। উদাহরণস্বরূপ - "আমাকে ছবির মতো একটি কোট খুঁজুন"।
আমাদের জ্যাকেট উদাহরণ ফিরে আসা যাক. যদি আমার কাছে একটি জ্যাকেটের ছবি থাকে যা আমি খুঁজে পেতে চাই তাহলে আমি এটিকে Google মাল্টিমোডাল এম্বেডিং মডেলে পাঠাতে পারি এবং এটিকে আমার পণ্যের ছবির জন্য এমবেডিংয়ের সাথে তুলনা করতে পারি। আমাদের টেবিলে আমরা ইতিমধ্যেই পণ্য_চিত্র_এমবেডিং কলামে আমাদের পণ্যের চিত্রের জন্য এমবেডিং গণনা করেছি এবং আপনি পণ্য_চিত্র_এমবেডিং_মডেল কলামে ব্যবহৃত মডেলটি দেখতে পারেন।
আমাদের অনুসন্ধানের জন্য আমরা আমাদের চিত্রের জন্য এম্বেডিং পেতে image_embedding ফাংশন ব্যবহার করতে পারি এবং এটিকে পূর্বনির্ধারিত এম্বেডিংয়ের সাথে তুলনা করতে পারি। ফাংশনটি সক্ষম করার জন্য আমাদের নিশ্চিত করতে হবে যে আমরা google_ml_integration এক্সটেনশনের সঠিক সংস্করণ ব্যবহার করছি।
চলুন বর্তমান এক্সটেনশন সংস্করণ যাচাই করা যাক. AlloyDB স্টুডিওতে এক্সিকিউট করুন।
SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';
সংস্করণটি 1.4.4 এর কম হলে নিম্নলিখিত পদ্ধতিটি চালান।
CALL google_ml.upgrade_to_preview_version();
এবং এক্সটেনশনের সংস্করণটি পুনরায় পরীক্ষা করুন। এটি 1.4.4 হওয়া উচিত।
এখানে অনুসন্ধানের জন্য আমার নমুনা চিত্র কিন্তু আপনি যেকোনো কাস্টম ছবি ব্যবহার করতে পারেন। আপনাকে কেবল এটিকে Google স্টোরেজ বা অন্যান্য সর্বজনীনভাবে উপলব্ধ সংস্থানে আপলোড করতে হবে এবং ক্যোয়ারীতে URI রাখতে হবে৷
এবং এটি gs://pr-public-demo-data/alloydb-retail-demo/user_photos/4.png এ আপলোড করা হয়েছে
ছবি দ্বারা চিত্র অনুসন্ধান
প্রথমত, আমরা শুধু চিত্র দ্বারা অনুসন্ধান করার চেষ্টা করি:
SELECT
name,
product_description,
retail_price,
replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url,
product_image_embedding <=> google_ml.image_embedding (model_id => 'multimodalembedding@001',image => 'gs://pr-public-demo-data/alloydb-retail-demo/user_photos/4.png', mimetype => 'image/png')::vector AS distance
FROM
ecomm.products
ORDER BY distance
LIMIT
4;
এবং আমরা জায় কিছু উষ্ণ জ্যাকেট খুঁজে পেতে সক্ষম ছিল.
চিত্র অনুসন্ধান আমাদের এমন আইটেমগুলি ফেরত দেয় যা তুলনা করার জন্য দেওয়া আমাদের চিত্রের সাথে সাদৃশ্যপূর্ণ। আমি ইতিমধ্যে উল্লেখ করেছি যে আপনি একটি পাবলিক বালতিতে আপনার নিজের ছবি আপলোড করার চেষ্টা করতে পারেন এবং এটি বিভিন্ন ধরণের জামাকাপড় খুঁজে পেতে পারে কিনা তা দেখতে পারেন।
আমরা আমাদের ছবি অনুসন্ধানের জন্য Google এর 'multimodalembedding@001' মডেল ব্যবহার করেছি। আমাদের ইমেজ_এমবেডিং ফাংশনটি ইমেজটিকে ভার্টেক্স এআইতে পাঠায়, এটিকে ভেক্টরে রূপান্তর করে এবং আমাদের ডাটাবেসের ইমেজের জন্য সংরক্ষিত ভেক্টরের সাথে তুলনা করতে ফিরে আসে।
আমরা "ব্যাখ্যা বিশ্লেষণ" ব্যবহার করে পরীক্ষা করতে পারি যে এটি আমাদের AlloyDB ScaNN সূচকের সাথে কত দ্রুত কাজ করে।
Limit (cost=971.70..975.55 rows=4 width=490) (actual time=2.453..2.477 rows=4 loops=1)
-> Index Scan using product_image_embedding_scann on products (cost=971.70..28998.90 rows=29120 width=490) (actual time=2.451..2.475 rows=4 loops=1)
Order By: (product_image_embedding <=> '[0.02119865,0.034206174,0.030682731,
...
,-0.010307034,-0.010053742]'::vector)
Limit: 4
Planning Time: 913.322 ms
Execution Time: 2.517 ms
(6 rows)
এবং আবার আগের উদাহরণের মতো আমরা দেখতে পাচ্ছি যে ক্লাউড এন্ডপয়েন্ট ব্যবহার করে আমাদের ইমেজকে এম্বেডিং-এ রূপান্তর করার জন্য বেশিরভাগ সময় ব্যয় করা হয়েছে এবং ভেক্টর অনুসন্ধান নিজেই মাত্র 2.5 ms নেয়।
টেক্সট দ্বারা চিত্র অনুসন্ধান
মাল্টিমোডাল দিয়ে আমরা জ্যাকেটের একটি পাঠ্য বিবরণও পাস করতে পারি আমরা একই মডেলের জন্য google_ml.text_embedding ব্যবহার করে মডেলটিতে অনুসন্ধান করার চেষ্টা করছি এবং এটি কী চিত্রগুলি ফিরে আসে তা দেখতে চিত্র এমবেডিংয়ের সাথে তুলনা করতে পারি।
SELECT
name,
product_description,
retail_price,
replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url,
product_image_embedding <=> google_ml.text_embedding (model_id => 'multimodalembedding@001',content => 'puffy jacket for men, grey or dark colour')::vector AS distance
FROM
ecomm.products
ORDER BY distance
LIMIT
4;
এবং আমরা ধূসর বা গাঢ় রঙের একটি পাফি জ্যাকেট পেয়েছি।
আমরা জ্যাকেটের একটি সামান্য ভিন্ন সেট পেয়েছি কিন্তু এটি আমাদের বর্ণনার উপর ভিত্তি করে এবং ইমেজ এম্বেডিংয়ের মাধ্যমে অনুসন্ধানের উপর ভিত্তি করে সঠিকভাবে জ্যাকেট সংগ্রহ করেছে।
আসুন অনুসন্ধান চিত্রের জন্য আমাদের এম্বেডিং ব্যবহার করে বর্ণনাগুলির মধ্যে অনুসন্ধান করার অন্য উপায় চেষ্টা করি।
ছবি দ্বারা পাঠ্য অনুসন্ধান
আমরা আমাদের ছবির জন্য এমবেডিং পাস করা ছবিগুলি অনুসন্ধান করার চেষ্টা করেছি এবং আমাদের পণ্যগুলির জন্য পূর্বনির্ধারিত চিত্র এমবেডিংয়ের সাথে তুলনা করেছি৷ আমরা আমাদের পাঠ্য অনুরোধের জন্য এমবেডিং পাস করা চিত্রগুলি অনুসন্ধান করার চেষ্টা করেছি এবং পণ্যের চিত্রগুলির জন্য একই এম্বেডিংয়ের মধ্যে অনুসন্ধান করেছি৷ আসুন এখন আমাদের ছবির জন্য এম্বেডিং ব্যবহার করার চেষ্টা করি এবং পণ্যের বিবরণের জন্য টেক্সট এম্বেডিংয়ের সাথে তুলনা করি এম্বেডিংটি product_description_embedding কলামে সংরক্ষণ করা হয় এবং একই multimodalembedding@001 মডেল ব্যবহার করে।
এখানে আমাদের প্রশ্ন:
SELECT
name,
product_description,
retail_price,
replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url,
product_description_embedding <=> google_ml.image_embedding (model_id => 'multimodalembedding@001',image => 'gs://pr-public-demo-data/alloydb-retail-demo/user_photos/4.png', mimetype => 'image/png')::vector AS distance
FROM
ecomm.products
ORDER BY distance
LIMIT
4;
এবং এখানে আমরা ধূসর বা গাঢ় রঙের জ্যাকেটগুলির একটি সামান্য ভিন্ন সেট পেয়েছি যেখানে তাদের মধ্যে কিছু একই বা খুব কাছাকাছি বিভিন্ন অনুসন্ধানের মাধ্যমে বেছে নেওয়া হয়েছে।
এবং এটি উপরের মতো একই জ্যাকেটগুলিকে কিছুটা ভিন্ন ক্রমে ফিরিয়ে দেয়। চিত্রগুলির জন্য আমাদের এমবেডিংয়ের উপর ভিত্তি করে এটি পাঠ্য বিবরণের জন্য গণনাকৃত এমবেডিংয়ের সাথে তুলনা করতে পারে এবং পণ্যের সঠিক সেটটি ফেরত দিতে পারে।
হাইব্রিড পাঠ্য এবং চিত্র অনুসন্ধান
আপনি উদাহরণস্বরূপ পারস্পরিক র্যাঙ্ক ফিউশন ব্যবহার করে টেক্সট এবং ইমেজ এম্বেডিং উভয়কে একত্রিত করে পরীক্ষা করতে পারেন। এখানে এমন একটি প্রশ্নের উদাহরণ রয়েছে যেখানে আমরা দুটি অনুসন্ধানকে একত্রিত করেছি যা প্রতিটি র্যাঙ্কের জন্য একটি স্কোর নির্ধারণ করে এবং সম্মিলিত স্কোরের উপর ভিত্তি করে ফলাফলগুলিকে ক্রম করে।
WITH image_search AS (
SELECT id,
RANK () OVER (ORDER BY product_image_embedding <=>google_ml.image_embedding(model_id => 'multimodalembedding@001',image => 'gs://pr-public-demo-data/alloydb-retail-demo/user_photos/4.png', mimetype => 'image/png')::vector) AS rank
FROM ecomm.products
ORDER BY product_image_embedding <=>google_ml.image_embedding(model_id => 'multimodalembedding@001',image => 'gs://pr-public-demo-data/alloydb-retail-demo/user_photos/4.png', mimetype => 'image/png')::vector LIMIT 5
),
text_search AS (
SELECT id,
RANK () OVER (ORDER BY product_description_embedding <=>google_ml.text_embedding(model_id => 'multimodalembedding@001',content => 'puffy jacket for men, grey or dark colour'
)::vector) AS rank
FROM ecomm.products
ORDER BY product_description_embedding <=>google_ml.text_embedding(model_id => 'multimodalembedding@001',content => 'puffy jacket for men, grey or dark colour'
)::vector LIMIT 5
),
rrf_score AS (
SELECT
COALESCE(image_search.id, text_search.id) AS id,
COALESCE(1.0 / (60 + image_search.rank), 0.0) + COALESCE(1.0 / (60 + text_search.rank), 0.0) AS rrf_score
FROM image_search FULL OUTER JOIN text_search ON image_search.id = text_search.id
ORDER BY rrf_score DESC
)
SELECT
ep.name,
ep.product_description,
ep.retail_price,
replace(ep.product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url
FROM ecomm.products ep, rrf_score
WHERE
ep.id=rrf_score.id
ORDER by rrf_score DESC
LIMIT 4;
আপনি ক্যোয়ারীতে বিভিন্ন পরামিতি নিয়ে খেলার চেষ্টা করতে পারেন এবং এটি আপনার অনুসন্ধান ফলাফল উন্নত করতে পারে কিনা তা দেখতে পারেন।
এটি ল্যাবটি শেষ করবে এবং অপ্রত্যাশিত চার্জ রোধ করতে অব্যবহৃত সংস্থানগুলি মুছে ফেলার পরামর্শ দেওয়া হচ্ছে।
এর পাশাপাশি আপনি অন্যান্য AI অপারেটরগুলিকে ডকুমেন্টেশনে বর্ণিত ফলাফলের র্যাঙ্ক করার জন্য ব্যবহার করতে পারেন।
9. পরিবেশ পরিষ্কার করুন
আপনি ল্যাব দিয়ে সম্পন্ন হলে AlloyDB দৃষ্টান্ত এবং ক্লাস্টার ধ্বংস করুন
AlloyDB ক্লাস্টার এবং সমস্ত দৃষ্টান্ত মুছুন
ক্লাস্টারটি অপশন ফোর্স দিয়ে ধ্বংস করা হয় যা ক্লাস্টারের সাথে সম্পর্কিত সমস্ত দৃষ্টান্ত মুছে দেয়।
ক্লাউড শেলে প্রকল্প এবং পরিবেশের ভেরিয়েবলগুলি সংজ্ঞায়িত করুন যদি আপনি সংযোগ বিচ্ছিন্ন হয়ে থাকেন এবং সমস্ত পূর্ববর্তী সেটিংস হারিয়ে যায়:
gcloud config set project <your project id>
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
export PROJECT_ID=$(gcloud config get-value project)
ক্লাস্টার মুছুন:
gcloud alloydb clusters delete $ADBCLUSTER --region=$REGION --force
প্রত্যাশিত কনসোল আউটপুট:
student@cloudshell:~ (test-project-001-402417)$ gcloud alloydb clusters delete $ADBCLUSTER --region=$REGION --force All of the cluster data will be lost when the cluster is deleted. Do you want to continue (Y/n)? Y Operation ID: operation-1697820178429-6082890a0b570-4a72f7e4-4c5df36f Deleting cluster...done.
AlloyDB ব্যাকআপ মুছুন
ক্লাস্টারের জন্য সমস্ত AlloyDB ব্যাকআপ মুছুন:
for i in $(gcloud alloydb backups list --filter="CLUSTER_NAME: projects/$PROJECT_ID/locations/$REGION/clusters/$ADBCLUSTER" --format="value(name)" --sort-by=~createTime) ; do gcloud alloydb backups delete $(basename $i) --region $REGION --quiet; done
প্রত্যাশিত কনসোল আউটপুট:
student@cloudshell:~ (test-project-001-402417)$ for i in $(gcloud alloydb backups list --filter="CLUSTER_NAME: projects/$PROJECT_ID/locations/$REGION/clusters/$ADBCLUSTER" --format="value(name)" --sort-by=~createTime) ; do gcloud alloydb backups delete $(basename $i) --region $REGION --quiet; done Operation ID: operation-1697826266108-60829fb7b5258-7f99dc0b-99f3c35f Deleting backup...done.
10. অভিনন্দন
কোডল্যাব সম্পূর্ণ করার জন্য অভিনন্দন। আপনি পাঠ্য এবং চিত্রের জন্য এমবেডিং ফাংশন ব্যবহার করে AlloyDB-তে মাল্টিমোডাল অনুসন্ধান কীভাবে ব্যবহার করবেন তা শিখেছেন। আপনি AlloyDB AI অপারেটরদের জন্য কোডল্যাব ব্যবহার করে google_ml.rank ফাংশনের মাধ্যমে মাল্টিমোডাল অনুসন্ধান পরীক্ষা করতে এবং এটিকে উন্নত করার চেষ্টা করতে পারেন।
আমরা কভার করেছি কি
- পোস্টগ্রেসের জন্য কীভাবে অ্যালয়ডিবি স্থাপন করবেন
- মাল্টিমডাল ভেক্টর অনুসন্ধান কিভাবে ব্যবহার করবেন
- কিভাবে AlloyDB AI অপারেটর সক্ষম করবেন
- মাল্টিমোডাল অনুসন্ধানের জন্য কিভাবে বিভিন্ন AlloyDB AI অপারেটর ব্যবহার করবেন
- কিভাবে টেক্সট এবং ইমেজ সার্চ ফলাফল একত্রিত করতে AlloyDB AI ব্যবহার করবেন
11. সমীক্ষা
আউটপুট: