এই কোডল্যাব সম্পর্কে
1. ওভারভিউ
বিভিন্ন শিল্প জুড়ে, প্রাসঙ্গিক অনুসন্ধান একটি গুরুত্বপূর্ণ কার্যকারিতা যা তাদের অ্যাপ্লিকেশনগুলির হৃদয় এবং কেন্দ্র গঠন করে। পুনরুদ্ধার অগমেন্টেড জেনারেশন তার জেনারেটিভ এআই চালিত পুনরুদ্ধার প্রক্রিয়ার সাথে বেশ কিছুদিন ধরে এই গুরুত্বপূর্ণ প্রযুক্তি বিবর্তনের একটি মূল চালক। জেনারেটিভ মডেল, তাদের বৃহৎ প্রসঙ্গ উইন্ডো এবং চিত্তাকর্ষক আউটপুট গুণমান সহ, এআইকে রূপান্তরিত করছে। RAG এআই অ্যাপ্লিকেশান এবং এজেন্টগুলিতে প্রসঙ্গ ইনজেক্ট করার একটি পদ্ধতিগত উপায় প্রদান করে, সেগুলিকে স্ট্রাকচার্ড ডাটাবেস বা বিভিন্ন মিডিয়ার তথ্যে ভিত্তি করে। এই প্রাসঙ্গিক তথ্যটি সত্যের স্বচ্ছতা এবং আউটপুটের নির্ভুলতার জন্য অত্যন্ত গুরুত্বপূর্ণ, কিন্তু সেই ফলাফলগুলি কতটা সঠিক? আপনার ব্যবসা কি মূলত এই প্রাসঙ্গিক মিল এবং প্রাসঙ্গিকতার নির্ভুলতার উপর নির্ভর করে? তাহলে এই প্রকল্পটি আপনাকে সুড়সুড়ি দেবে!
ভেক্টর অনুসন্ধানের নোংরা রহস্যটি কেবল এটি তৈরি করছে না, এটি আপনার ভেক্টর মিলগুলি আসলে ভাল কিনা তা জানা। আমরা সবাই সেখানে ছিলাম, ফলাফলের তালিকার দিকে শূন্য দৃষ্টিতে তাকিয়ে আছি, ভাবছি, 'এটা কি কাজ করছে?!' আসুন কীভাবে আপনার ভেক্টর মিলগুলির গুণমানকে প্রকৃতপক্ষে মূল্যায়ন করতে হয় সে সম্পর্কে ডুব দেওয়া যাক। "তাহলে আরএজিতে কি পরিবর্তন হয়েছে?", আপনি জিজ্ঞাসা করেন? সবকিছু! বছরের পর বছর ধরে, পুনরুদ্ধার অগমেন্টেড জেনারেশন (RAG) একটি প্রতিশ্রুতিশীল কিন্তু অধরা লক্ষ্যের মতো মনে হয়েছিল। এখন, অবশেষে, আমাদের কাছে কর্মক্ষমতা এবং মিশন-গুরুত্বপূর্ণ কাজগুলির জন্য প্রয়োজনীয় নির্ভরযোগ্যতার সাথে RAG অ্যাপ্লিকেশনগুলি তৈরি করার সরঞ্জাম রয়েছে।
এখন আমরা ইতিমধ্যেই 3টি জিনিসের মৌলিক ধারণা পেয়েছি:
- আপনার এজেন্টের জন্য প্রাসঙ্গিক অনুসন্ধানের অর্থ কী এবং ভেক্টর অনুসন্ধান ব্যবহার করে কীভাবে তা সম্পন্ন করা যায়।
- আমরা আপনার ডেটার পরিধির মধ্যে ভেক্টর অনুসন্ধান অর্জনে গভীরভাবে কাজ করেছি, যা আপনার ডাটাবেসের মধ্যেই রয়েছে (সমস্ত Google ক্লাউড ডেটাবেস এটিকে সমর্থন করে, যদি আপনি ইতিমধ্যে না জানতেন!)
- ScaNN সূচক দ্বারা চালিত AlloyDB ভেক্টর অনুসন্ধান ক্ষমতার সাথে উচ্চ কার্যকারিতা এবং গুণমানের সাথে এই ধরনের একটি হালকা-ওজন ভেক্টর অনুসন্ধান RAG সক্ষমতা কীভাবে সম্পন্ন করা যায় তা জানাতে আমরা বাকি বিশ্বের তুলনায় আরও এক ধাপ এগিয়েছি।
আপনি যদি সেই মৌলিক, মধ্যবর্তী এবং সামান্য উন্নত RAG পরীক্ষাগুলি না দেখে থাকেন, আমি আপনাকে সেই 3টি এখানে , এখানে এবং এখানে তালিকাভুক্ত ক্রমে পড়তে উত্সাহিত করব৷
পেটেন্ট অনুসন্ধান ব্যবহারকারীকে তাদের অনুসন্ধান পাঠ্যের প্রাসঙ্গিকভাবে প্রাসঙ্গিক পেটেন্ট খুঁজে পেতে সহায়তা করে এবং আমরা ইতিমধ্যে অতীতে এর একটি সংস্করণ তৈরি করেছি। এখন আমরা এটিকে নতুন এবং উন্নত RAG বৈশিষ্ট্যগুলির সাথে তৈরি করব যা সেই অ্যাপ্লিকেশনটির জন্য একটি মান নিয়ন্ত্রিত প্রাসঙ্গিক অনুসন্ধান সক্ষম করে৷ এর মধ্যে ডুব দেওয়া যাক!
নীচের ছবিটি এই অ্যাপ্লিকেশনটিতে যা ঘটছে তার সামগ্রিক প্রবাহ দেখায়৷~৷
উদ্দেশ্য
AlloyDB এর সর্বশেষ RAG বৈশিষ্ট্যগুলি ব্যবহার করে জেনারেট হওয়া ম্যাচগুলির গুণমান মূল্যায়ন করতে সক্ষম হওয়ার সাথে সাথে একজন ব্যবহারকারীকে উন্নত কর্মক্ষমতা এবং আরও ভাল মানের একটি পাঠ্য বিবরণের উপর ভিত্তি করে পেটেন্ট অনুসন্ধান করার অনুমতি দিন।
আপনি কি নির্মাণ করবেন
এই ল্যাবের অংশ হিসাবে, আপনি করবেন:
- একটি AlloyDB উদাহরণ তৈরি করুন এবং পেটেন্ট পাবলিক ডেটাসেট লোড করুন
- মেটাডেটা সূচক এবং ScaNN সূচক তৈরি করুন
- ScaNN এর ইনলাইন ফিল্টারিং পদ্ধতি ব্যবহার করে AlloyDB-তে উন্নত ভেক্টর অনুসন্ধান প্রয়োগ করুন
- Recall eval বৈশিষ্ট্য প্রয়োগ করুন
- প্রশ্নের উত্তর মূল্যায়ন
প্রয়োজনীয়তা
- একটি ব্রাউজার, যেমন ক্রোম বা ফায়ারফক্স
- বিলিং সক্ষম সহ একটি Google ক্লাউড প্রকল্প৷
2. আপনি শুরু করার আগে
একটি প্রকল্প তৈরি করুন
- Google ক্লাউড কনসোলে , প্রকল্প নির্বাচক পৃষ্ঠায়, একটি Google ক্লাউড প্রকল্প নির্বাচন করুন বা তৈরি করুন।
- নিশ্চিত করুন যে আপনার ক্লাউড প্রকল্পের জন্য বিলিং সক্ষম করা আছে৷ একটি প্রকল্পে বিলিং সক্ষম কিনা তা পরীক্ষা করতে শিখুন।
- আপনি Cloud Shell ব্যবহার করবেন, Google ক্লাউডে চলমান একটি কমান্ড-লাইন পরিবেশ। গুগল ক্লাউড কনসোলের শীর্ষে সক্রিয় ক্লাউড শেল ক্লিক করুন।
- একবার ক্লাউড শেলের সাথে সংযুক্ত হয়ে গেলে, আপনি পরীক্ষা করে দেখুন যে আপনি ইতিমধ্যেই প্রমাণীকৃত হয়েছেন এবং নিম্নলিখিত কমান্ডটি ব্যবহার করে প্রকল্পটি আপনার প্রকল্প আইডিতে সেট করা আছে:
gcloud auth list
- gcloud কমান্ড আপনার প্রকল্প সম্পর্কে জানে তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান।
gcloud config list project
- যদি আপনার প্রজেক্ট সেট করা না থাকে, তাহলে এটি সেট করতে নিম্নলিখিত কমান্ডটি ব্যবহার করুন:
gcloud config set project <YOUR_PROJECT_ID>
- প্রয়োজনীয় API সক্রিয় করুন। আপনি ক্লাউড শেল টার্মিনালে একটি gcloud কমান্ড ব্যবহার করতে পারেন:
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 কমান্ডের বিকল্প হল কনসোলের মাধ্যমে প্রতিটি পণ্য অনুসন্ধান করে বা এই লিঙ্কটি ব্যবহার করে।
জিক্লাউড কমান্ড এবং ব্যবহারের জন্য ডকুমেন্টেশন পড়ুন।
3. ডাটাবেস সেটআপ
এই ল্যাবে আমরা পেটেন্ট ডেটার ডাটাবেস হিসাবে AlloyDB ব্যবহার করব। এটি ডাটাবেস এবং লগগুলির মতো সমস্ত সংস্থান ধরে রাখতে ক্লাস্টার ব্যবহার করে। প্রতিটি ক্লাস্টারের একটি প্রাথমিক উদাহরণ রয়েছে যা ডেটাতে অ্যাক্সেস পয়েন্ট সরবরাহ করে। টেবিলে প্রকৃত তথ্য থাকবে।
আসুন একটি AlloyDB ক্লাস্টার, উদাহরণ এবং টেবিল তৈরি করি যেখানে পেটেন্ট ডেটাসেট লোড করা হবে।
একটি ক্লাস্টার এবং উদাহরণ তৈরি করুন
- ক্লাউড কনসোলে AlloyDB পৃষ্ঠাটি নেভিগেট করুন। ক্লাউড কনসোলে বেশিরভাগ পৃষ্ঠাগুলি খুঁজে পাওয়ার একটি সহজ উপায় হল কনসোলের অনুসন্ধান বার ব্যবহার করে সেগুলি অনুসন্ধান করা৷
- সেই পৃষ্ঠা থেকে ক্লাস্টার তৈরি করুন নির্বাচন করুন:
- আপনি নীচের মত একটি পর্দা দেখতে পাবেন. নিম্নলিখিত মানগুলির সাথে একটি ক্লাস্টার এবং উদাহরণ তৈরি করুন (আপনি রেপো থেকে অ্যাপ্লিকেশন কোড ক্লোন করার ক্ষেত্রে মানগুলি মেলে তা নিশ্চিত করুন):
- ক্লাস্টার আইডি : "
vector-cluster
" - পাসওয়ার্ড : "
alloydb
" - PostgreSQL 15 / সর্বশেষ প্রস্তাবিত
- অঞ্চল : "
us-central1
" - নেটওয়ার্কিং : "
default
"
- আপনি যখন ডিফল্ট নেটওয়ার্ক নির্বাচন করেন, আপনি নীচের মত একটি স্ক্রীন দেখতে পাবেন।
সংযোগ সেট আপ নির্বাচন করুন।
- সেখান থেকে, " একটি স্বয়ংক্রিয়ভাবে বরাদ্দকৃত IP পরিসর ব্যবহার করুন " নির্বাচন করুন এবং চালিয়ে যান। তথ্য পর্যালোচনা করার পরে, সংযোগ তৈরি করুন নির্বাচন করুন।
- আপনার নেটওয়ার্ক সেট আপ হয়ে গেলে, আপনি আপনার ক্লাস্টার তৈরি করা চালিয়ে যেতে পারেন। নীচে দেখানো হিসাবে ক্লাস্টার সেট আপ সম্পূর্ণ করতে CLUSTER তৈরি করুন ক্লিক করুন:
ইনস্ট্যান্স আইডি (যা আপনি ক্লাস্টার/ইনস্ট্যান্স কনফিগারেশনের সময় খুঁজে পেতে পারেন) পরিবর্তন করতে ভুলবেন না
vector-instance
আপনি যদি এটি পরিবর্তন করতে না পারেন তবে সমস্ত আসন্ন রেফারেন্সে আপনার ইনস্ট্যান্স আইডি ব্যবহার করতে ভুলবেন না।
মনে রাখবেন ক্লাস্টার তৈরি হতে প্রায় 10 মিনিট সময় লাগবে। একবার এটি সফল হলে, আপনি একটি স্ক্রীন দেখতে পাবেন যা আপনার তৈরি করা ক্লাস্টারটির ওভারভিউ দেখায়।
4. ডেটা ইনজেশন
এখন স্টোর সম্পর্কে ডেটা সহ একটি টেবিল যুক্ত করার সময়। AlloyDB-তে নেভিগেট করুন, প্রাথমিক ক্লাস্টার নির্বাচন করুন এবং তারপর AlloyDB স্টুডিও:
আপনার উদাহরণ তৈরি করা শেষ হওয়ার জন্য আপনাকে অপেক্ষা করতে হতে পারে। এটি হয়ে গেলে, আপনি ক্লাস্টার তৈরি করার সময় আপনার তৈরি শংসাপত্রগুলি ব্যবহার করে AlloyDB-এ সাইন ইন করুন৷ PostgreSQL এ প্রমাণীকরণের জন্য নিম্নলিখিত ডেটা ব্যবহার করুন:
- ব্যবহারকারীর নাম: "
postgres
" - ডাটাবেস : "
postgres
" - পাসওয়ার্ড: "
alloydb
"
একবার আপনি সফলভাবে অ্যালোয়ডিবি স্টুডিওতে প্রমাণীকৃত হয়ে গেলে, এসকিউএল কমান্ড এডিটরে প্রবেশ করানো হয়। আপনি শেষ উইন্ডোর ডানদিকে প্লাস ব্যবহার করে একাধিক সম্পাদক উইন্ডো যোগ করতে পারেন।
আপনি প্রয়োজন অনুসারে রান, ফরম্যাট এবং সাফ বিকল্পগুলি ব্যবহার করে সম্পাদক উইন্ডোতে AlloyDB-এর জন্য কমান্ড লিখবেন।
এক্সটেনশন সক্রিয় করুন
এই অ্যাপটি তৈরি করার জন্য, আমরা pgvector
এবং google_ml_integration
এক্সটেনশনগুলি ব্যবহার করব। pgvector এক্সটেনশন আপনাকে ভেক্টর এম্বেডিং সংরক্ষণ এবং অনুসন্ধান করতে দেয়। google_ml_integration এক্সটেনশন এমন ফাংশন প্রদান করে যা আপনি SQL-এ ভবিষ্যদ্বাণী পেতে Vertex AI পূর্বাভাস শেষ পয়েন্ট অ্যাক্সেস করতে ব্যবহার করেন। নিম্নলিখিত ডিডিএলগুলি চালিয়ে এই এক্সটেনশনগুলিকে সক্ষম করুন :
CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector;
আপনি যদি আপনার ডাটাবেসে সক্ষম করা এক্সটেনশনগুলি পরীক্ষা করতে চান তবে এই SQL কমান্ডটি চালান:
select extname, extversion from pg_extension;
একটি টেবিল তৈরি করুন
আপনি AlloyDB স্টুডিওতে নীচের DDL স্টেটমেন্ট ব্যবহার করে একটি টেবিল তৈরি করতে পারেন:
CREATE TABLE patents_data ( id VARCHAR(25), type VARCHAR(25), number VARCHAR(20), country VARCHAR(2), date VARCHAR(20), abstract VARCHAR(300000), title VARCHAR(100000), kind VARCHAR(5), num_claims BIGINT, filename VARCHAR(100), withdrawn BIGINT, abstract_embeddings vector(768)) ;
বিমূর্ত_এম্বেডিং কলামটি পাঠ্যের ভেক্টর মানের জন্য সঞ্চয়ের অনুমতি দেবে।
অনুমতি দিন
"এম্বেডিং" ফাংশনে কার্যকর করার জন্য নীচের বিবৃতিটি চালান:
GRANT EXECUTE ON FUNCTION embedding TO postgres;
AlloyDB পরিষেবা অ্যাকাউন্টে Vertex AI ব্যবহারকারীর ভূমিকা মঞ্জুর করুন
Google ক্লাউড IAM কনসোল থেকে, AlloyDB পরিষেবা অ্যাকাউন্টটি মঞ্জুর করুন (যেটি এইরকম দেখাচ্ছে: service-<<PROJECT_NUMBER>>@gcp-sa-alloydb.iam.gserviceaccount.com) ভূমিকা "Vertex AI ব্যবহারকারী"-তে অ্যাক্সেস করুন৷ PROJECT_NUMBER এ আপনার প্রকল্প নম্বর থাকবে৷
বিকল্পভাবে আপনি ক্লাউড শেল টার্মিনাল থেকে নীচের কমান্ডটি চালাতে পারেন:
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"
ডাটাবেসে পেটেন্ট ডেটা লোড করুন
BigQuery-এ Google Patents পাবলিক ডেটাসেটগুলি আমাদের ডেটাসেট হিসাবে ব্যবহার করা হবে৷ আমরা আমাদের প্রশ্নগুলি চালানোর জন্য AlloyDB স্টুডিও ব্যবহার করব। তথ্যটি এই insert_scripts.sql
ফাইলে পাওয়া যায় এবং আমরা পেটেন্ট ডেটা লোড করতে এটি চালাব।
- Google ক্লাউড কনসোলে, AlloyDB পৃষ্ঠাটি খুলুন।
- আপনার নতুন তৈরি ক্লাস্টার নির্বাচন করুন এবং উদাহরণে ক্লিক করুন।
- AlloyDB নেভিগেশন মেনুতে, AlloyDB Studio এ ক্লিক করুন। আপনার শংসাপত্র দিয়ে সাইন ইন করুন.
- ডানদিকের নতুন ট্যাব আইকনে ক্লিক করে একটি নতুন ট্যাব খুলুন।
- উপরে উল্লিখিত
insert_scripts.sql
স্ক্রিপ্ট থেকেinsert
ক্যোয়ারী স্টেটমেন্ট কপি করুন সম্পাদকে। আপনি এই ব্যবহারের ক্ষেত্রে একটি দ্রুত ডেমোর জন্য 10-50টি সন্নিবেশ বিবৃতি অনুলিপি করতে পারেন। - রান এ ক্লিক করুন। আপনার প্রশ্নের ফলাফল ফলাফল সারণীতে প্রদর্শিত হবে।
দ্রষ্টব্য: আপনি লক্ষ্য করতে পারেন যে সন্নিবেশ স্ক্রিপ্টে প্রচুর ডেটা রয়েছে। কারণ আমরা সন্নিবেশ স্ক্রিপ্টে এম্বেডিং অন্তর্ভুক্ত করেছি। গিথুবে ফাইলটি লোড করতে সমস্যা হলে "কাঁচা দেখুন" এ ক্লিক করুন। আপনি যদি Google ক্লাউডের জন্য একটি ট্রায়াল ক্রেডিট বিলিং অ্যাকাউন্ট ব্যবহার করেন তবে কয়েকটি এম্বেডিং (সর্বোচ্চ 20-25 বলুন) জেনারেট করার ঝামেলা (আসন্ন ধাপে) বাঁচানোর জন্য এটি করা হয়েছে।
5. পেটেন্ট ডেটার জন্য এমবেডিং তৈরি করুন
প্রথমে নিম্নলিখিত নমুনা ক্যোয়ারী চালিয়ে এমবেডিং ফাংশন পরীক্ষা করা যাক:
SELECT embedding('text-embedding-005', 'AlloyDB is a managed, cloud-hosted SQL database service.');
এটি ক্যোয়ারীতে নমুনা পাঠ্যের জন্য এমবেডিং ভেক্টর ফেরত দিতে হবে, যা ফ্লোটগুলির একটি অ্যারের মতো দেখায়। এই মত দেখায়:
বিমূর্ত_এম্বেডিং ভেক্টর ক্ষেত্র আপডেট করুন
যদি আপনি সন্নিবেশ স্ক্রিপ্টের অংশ হিসাবে বিমূর্ত_এম্বেডিং ডেটা সন্নিবেশ না করে থাকেন তবেই সংশ্লিষ্ট এমবেডিংয়ের সাথে টেবিলে পেটেন্ট বিমূর্তগুলি আপডেট করতে নীচের ডিএমএলটি চালান:
UPDATE patents_data set abstract_embeddings = embedding( 'text-embedding-005', abstract);
আপনি যদি Google ক্লাউডের জন্য একটি ট্রায়াল ক্রেডিট বিলিং অ্যাকাউন্ট ব্যবহার করেন তবে কয়েকটি এম্বেডিং (সর্বোচ্চ বলুন 20-25) তৈরি করতে আপনার সমস্যা হতে পারে। তাই সেই কারণে, আমি ইতিমধ্যেই সন্নিবেশ স্ক্রিপ্টগুলিতে এমবেডিংগুলি অন্তর্ভুক্ত করেছি এবং আপনি যদি "ডাটাবেসের মধ্যে পেটেন্ট ডেটা লোড করুন" পদক্ষেপটি সম্পন্ন করেন তবে আপনার টেবিলে এটি লোড করা উচিত।
6. AlloyDB এর নতুন বৈশিষ্ট্যগুলির সাথে উন্নত RAG সম্পাদন করুন৷
এখন যেহেতু টেবিল, ডেটা, এম্বেডিং সবই প্রস্তুত, চলুন ব্যবহারকারীর সার্চ টেক্সটের জন্য রিয়েল টাইম ভেক্টর সার্চ করা যাক। আপনি নীচের ক্যোয়ারী চালিয়ে এটি পরীক্ষা করতে পারেন:
SELECT id || ' - ' || title as title FROM patents_data ORDER BY abstract_embeddings <=> embedding('text-embedding-005', 'Sentiment Analysis')::vector LIMIT 10;
এই প্রশ্নে,
- ব্যবহারকারীর অনুসন্ধান করা পাঠ্য হল: "সেন্টিমেন্ট বিশ্লেষণ"।
- আমরা মডেলটি ব্যবহার করে এমবেডিং() পদ্ধতিতে এম্বেডিং-এ রূপান্তর করছি: text-embeding-005।
- "<=>" COSINE SIMILARITY দূরত্ব পদ্ধতির ব্যবহার প্রতিনিধিত্ব করে।
- ডাটাবেসে সংরক্ষিত ভেক্টরের সাথে সামঞ্জস্যপূর্ণ করতে আমরা এম্বেডিং পদ্ধতির ফলাফলকে ভেক্টর টাইপে রূপান্তর করছি।
- LIMIT 10 প্রতিনিধিত্ব করে যে আমরা অনুসন্ধান পাঠ্যের 10টি নিকটতম মিল নির্বাচন করছি।
AlloyDB ভেক্টর অনুসন্ধান RAG পরবর্তী স্তরে নিয়ে যায়:
সেখানে একটি ভাল সংখ্যক জিনিস চালু আছে. ডেভেলপার-কেন্দ্রিক দুটি হল:
- ইনলাইন ফিল্টারিং
- মূল্যায়নকারীকে স্মরণ করুন
ইনলাইন ফিল্টারিং
পূর্বে একজন বিকাশকারী হিসাবে, আপনাকে ভেক্টর অনুসন্ধান ক্যোয়ারী সম্পাদন করতে হবে এবং ফিল্টারিং এবং প্রত্যাহার করার সাথে ডিল করতে হবে। AlloyDB ক্যোয়ারী অপ্টিমাইজার কিভাবে ফিল্টার সহ একটি ক্যোয়ারী চালাতে হয় তার উপর পছন্দ করে। ইনলাইন ফিল্টারিং হল একটি নতুন ক্যোয়ারী অপ্টিমাইজেশান কৌশল যা AlloyDB ক্যোয়ারী অপ্টিমাইজারকে মেটাডেটা ফিল্টারিং অবস্থা এবং পাশাপাশি ভেক্টর অনুসন্ধান উভয়ই মূল্যায়ন করতে দেয়, মেটাডেটা কলামে ভেক্টর সূচী এবং সূচী উভয়ই ব্যবহার করে। এটি প্রত্যাহার কর্মক্ষমতা বৃদ্ধি করেছে, যা ডেভেলপারদের বাক্সের বাইরে AlloyDB যা অফার করে তার সুবিধা নিতে দেয়।
মাঝারি সিলেক্টিভিটির ক্ষেত্রে ইনলাইন ফিল্টারিং সবচেয়ে ভালো। যেহেতু AlloyDB ভেক্টর সূচকের মাধ্যমে অনুসন্ধান করে, এটি কেবলমাত্র মেটাডেটা ফিল্টারিং অবস্থার সাথে মেলে এমন ভেক্টরগুলির জন্য দূরত্ব গণনা করে (কোয়েরিতে আপনার কার্যকরী ফিল্টারগুলি সাধারণত WHERE ক্লজে পরিচালনা করা হয়)। এটি পোস্ট-ফিল্টার বা প্রি-ফিল্টারের সুবিধার পরিপূরক এই প্রশ্নের জন্য কর্মক্ষমতা ব্যাপকভাবে উন্নত করে।
- pgvector এক্সটেনশন ইনস্টল বা আপডেট করুন
CREATE EXTENSION IF NOT EXISTS vector WITH VERSION '0.8.0.google-3';
যদি pgvector এক্সটেনশনটি ইতিমধ্যেই ইনস্টল করা থাকে, তাহলে ভেক্টর এক্সটেনশনটিকে 0.8.0.google-3 সংস্করণে আপগ্রেড করুন বা রিকল মূল্যায়নকারীর ক্ষমতা পেতে।
ALTER EXTENSION vector UPDATE TO '0.8.0.google-3';
আপনার ভেক্টর এক্সটেনশন <0.8.0.google-3> হলেই এই ধাপটি কার্যকর করা দরকার।
গুরুত্বপূর্ণ নোট: আপনার সারি সংখ্যা 100-এর কম হলে, আপনাকে প্রথমে স্ক্যানএন সূচক তৈরি করতে হবে না কারণ এটি কম সারির জন্য প্রযোজ্য হবে না। সেই ক্ষেত্রে অনুগ্রহ করে নিম্নলিখিত পদক্ষেপগুলি এড়িয়ে যান৷
- ScaNN সূচক তৈরি করতে, alloydb_scann এক্সটেনশন ইনস্টল করুন।
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
- প্রথমে সূচী ছাড়া এবং ইনলাইন ফিল্টার সক্রিয় না করে ভেক্টর অনুসন্ধান ক্যোয়ারী চালান:
SELECT id || ' - ' || title as title FROM patents_data
WHERE num_claims >= 15
ORDER BY abstract_embeddings <=> embedding('text-embedding-005', 'Sentiment Analysis')::vector LIMIT 10;
ফলাফল অনুরূপ হওয়া উচিত:
- এটিতে ব্যাখ্যা বিশ্লেষণ চালান: (কোনও সূচক বা ইনলাইন ফিল্টারিং ছাড়াই)
কার্যকর করার সময় হল 2.4 ms
- আসুন num_claims ক্ষেত্রে একটি নিয়মিত সূচক তৈরি করি যাতে আমরা এটি দ্বারা ফিল্টার করতে পারি:
CREATE INDEX idx_patents_data_num_claims ON patents_data (num_claims);
- আমাদের পেটেন্ট অনুসন্ধান অ্যাপ্লিকেশনের জন্য ScaNN সূচক তৈরি করা যাক। আপনার AlloyDB স্টুডিও থেকে নিম্নলিখিত চালান:
CREATE INDEX patent_index ON patents_data
USING scann (abstract_embeddings cosine)
WITH (num_leaves=32);
গুরুত্বপূর্ণ নোট: (num_leaves=32)
1000+ সারি সহ আমাদের মোট ডেটাসেটের জন্য প্রযোজ্য। আপনার সারি সংখ্যা 100-এর কম হলে, আপনাকে প্রথমে একটি সূচক তৈরি করতে হবে না কারণ এটি কম সারির জন্য প্রযোজ্য হবে না।
- ScaNN ইনডেক্সে সক্ষম ইনলাইন ফিল্টারিং সেট করুন:
SET scann.enable_inline_filtering = on
- এখন, ফিল্টার এবং ভেক্টর অনুসন্ধানের সাথে একই কোয়েরি চালানো যাক:
SELECT id || ' - ' || title as title FROM patents_data
WHERE num_claims >= 15
ORDER BY abstract_embeddings <=> embedding('text-embedding-005', 'Sentiment Analysis')::vector LIMIT 10;
আপনি দেখতে পাচ্ছেন যে একই ভেক্টর অনুসন্ধানের জন্য কার্যকর করার সময় উল্লেখযোগ্যভাবে হ্রাস পেয়েছে। ভেক্টর অনুসন্ধানে ইনলাইন ফিল্টারিং ইনফিউজড স্ক্যানএন সূচক এটিকে সম্ভব করেছে!!!
এর পরে, আসুন এই ScaNN সক্ষম ভেক্টর অনুসন্ধানের জন্য প্রত্যাহার মূল্যায়ন করি।
মূল্যায়নকারীকে স্মরণ করুন
রিকল ইন সাদৃশ্য অনুসন্ধান হল প্রাসঙ্গিক দৃষ্টান্তের শতাংশ যা একটি অনুসন্ধান থেকে পুনরুদ্ধার করা হয়েছে, অর্থাৎ সত্য ইতিবাচক সংখ্যা। এটি অনুসন্ধানের গুণমান পরিমাপের জন্য ব্যবহৃত সবচেয়ে সাধারণ মেট্রিক। প্রত্যাহার ক্ষতির একটি উৎস আনুমানিক নিকটতম প্রতিবেশী অনুসন্ধান, বা aNN, এবং k (সঠিক) নিকটতম প্রতিবেশী অনুসন্ধান, বা kNN এর মধ্যে পার্থক্য থেকে আসে। AlloyDB-এর ScaNN-এর মতো ভেক্টর সূচীগুলি aNN অ্যালগরিদম প্রয়োগ করে, যা আপনাকে প্রত্যাহারে একটি ছোট ট্রেডঅফের বিনিময়ে বড় ডেটাসেটে ভেক্টর অনুসন্ধানের গতি বাড়াতে দেয়। এখন, AlloyDB আপনাকে পৃথক প্রশ্নের জন্য ডাটাবেসে সরাসরি এই ট্রেডঅফ পরিমাপ করার ক্ষমতা প্রদান করে এবং নিশ্চিত করে যে এটি সময়ের সাথে স্থিতিশীল। আপনি আরও ভাল ফলাফল এবং কর্মক্ষমতা অর্জন করতে এই তথ্যের প্রতিক্রিয়া হিসাবে ক্যোয়ারী এবং সূচক প্যারামিটার আপডেট করতে পারেন।
অনুসন্ধান ফলাফল প্রত্যাহার পিছনে যুক্তি কি?
ভেক্টর অনুসন্ধানের পরিপ্রেক্ষিতে, প্রত্যাহার ভেক্টরের শতাংশকে বোঝায় যা সূচকটি প্রদান করে যা সত্য নিকটতম প্রতিবেশী। উদাহরণস্বরূপ, যদি 20টি নিকটতম প্রতিবেশীর জন্য একটি নিকটতম প্রতিবেশীর প্রশ্ন 19টি গ্রাউন্ড ট্রুথ নিকটতম প্রতিবেশীদের প্রদান করে, তাহলে প্রত্যাহার 19/20x100 = 95%। রিকল হল সার্চ কোয়ালিটির জন্য ব্যবহৃত মেট্রিক, এবং প্রত্যাবর্তিত ফলাফলের শতাংশ হিসাবে সংজ্ঞায়িত করা হয় যেগুলি বস্তুনিষ্ঠভাবে কোয়েরি ভেক্টরের কাছাকাছি।
আপনি evaluate_query_recall ফাংশন ব্যবহার করে একটি প্রদত্ত কনফিগারেশনের জন্য একটি ভেক্টর সূচকে একটি ভেক্টর কোয়েরির জন্য রিকল খুঁজে পেতে পারেন। এই ফাংশনটি আপনাকে ভেক্টর কোয়েরি রিকল ফলাফলগুলি অর্জন করতে আপনার প্যারামিটারগুলি টিউন করতে দেয় যা আপনি চান।
গুরুত্বপূর্ণ নোট:
আপনি যদি নিম্নলিখিত ধাপে HNSW সূচকে অনুমতি অস্বীকার ত্রুটির সম্মুখীন হন, তাহলে আপাতত এই সম্পূর্ণ প্রত্যাহার মূল্যায়ন বিভাগটি এড়িয়ে যান। এটি এই সময়ে অ্যাক্সেস বিধিনিষেধের সাথে করতে হতে পারে কারণ এই কোডল্যাবটি নথিভুক্ত করার সময় এটি প্রকাশিত হয়েছে।
- ScaNN সূচক এবং HNSW সূচকে সক্ষম সূচক স্ক্যান পতাকা সেট করুন:
SET scann.enable_indexscan = on
SET hnsw.enable_index_scan = on
- AlloyDB স্টুডিওতে নিম্নলিখিত ক্যোয়ারী চালান:
SELECT
*
FROM
evaluate_query_recall($$
SELECT
id || ' - ' || title AS title,
abstract
FROM
patents_data
where num_claims >= 15
ORDER BY
abstract_embeddings <=> embedding('text-embedding-005',
'sentiment analysis')::vector
LIMIT 25 $$,
'{"scann.num_leaves_to_search":1, "scann.pre_reordering_num_neighbors":10}',
ARRAY['scann']);
evaluate_query_recall ফাংশনটি একটি প্যারামিটার হিসাবে ক্যোয়ারী নেয় এবং এটির প্রত্যাহার করে। আমি একই ক্যোয়ারী ব্যবহার করছি যা আমি ফাংশন ইনপুট ক্যোয়ারী হিসাবে কর্মক্ষমতা পরীক্ষা করতে ব্যবহার করছি। আমি সূচী পদ্ধতি হিসাবে SCaNN যোগ করেছি। আরও প্যারামিটার বিকল্পের জন্য ডকুমেন্টেশন পড়ুন।
এই ভেক্টর অনুসন্ধান ক্যোয়ারীটির প্রত্যাহার আমরা ব্যবহার করছি:
আমি দেখতে পাচ্ছি যে RECALL 70%। এখন আমি সূচক প্যারামিটার, পদ্ধতি এবং ক্যোয়ারী প্যারামিটার পরিবর্তন করতে এবং এই ভেক্টর অনুসন্ধানের জন্য আমার প্রত্যাহার উন্নত করতে এই তথ্য ব্যবহার করতে পারি!
7. পরিবর্তিত ক্যোয়ারী এবং সূচক প্যারামিটার দিয়ে এটি পরীক্ষা করুন
এখন প্রাপ্ত রিকলের উপর ভিত্তি করে ক্যোয়ারী পরামিতি পরিবর্তন করে ক্যোয়ারী পরীক্ষা করা যাক।
- আমি ফলাফলে সারির সংখ্যা 7 এ পরিবর্তন করেছি (আগে 25টি থেকে) এবং আমি একটি উন্নত RECALL দেখতে পাচ্ছি, অর্থাৎ 86%।
এর মানে হল রিয়েল-টাইমে আমি ব্যবহারকারীদের সার্চের প্রেক্ষাপট অনুসারে ম্যাচের প্রাসঙ্গিকতা উন্নত করতে আমার ব্যবহারকারীরা দেখতে পাওয়া ম্যাচের সংখ্যা পরিবর্তন করতে পারি।
- সূচী পরামিতি সংশোধন করে আবার চেষ্টা করা যাক:
এই পরীক্ষার জন্য, আমি "কোসাইন" সাদৃশ্য দূরত্ব ফাংশনের পরিবর্তে "L2 দূরত্ব" ব্যবহার করতে যাচ্ছি। সার্চের ফলাফলের গুণমানে যদি উন্নতি হয়, এমনকি সার্চের ফলাফল সেটের সংখ্যা বৃদ্ধির সাথেও তা দেখানোর জন্য আমি কোয়েরির সীমা 10-এ পরিবর্তন করব।
[আগে] কোসাইন সাদৃশ্য দূরত্ব ফাংশন ব্যবহার করে এমন প্রশ্ন:
SELECT
*
FROM
evaluate_query_recall($$
SELECT
id || ' - ' || title AS title,
abstract
FROM
patents_data
where num_claims >= 15
ORDER BY
abstract_embeddings <=> embedding('text-embedding-005',
'sentiment analysis')::vector
LIMIT 10 $$,
'{"scann.num_leaves_to_search":1, "scann.pre_reordering_num_neighbors":10}',
ARRAY['scann']);
অত্যন্ত গুরুত্বপূর্ণ দ্রষ্টব্য: "আমরা কিভাবে জানি যে এই প্রশ্নটি COSINE সাদৃশ্য ব্যবহার করে?" আপনি জিজ্ঞাসা করুন আপনি কোসাইন দূরত্ব উপস্থাপন করতে "<=>" ব্যবহার করে দূরত্ব ফাংশন সনাক্ত করতে পারেন।
ভেক্টর অনুসন্ধান দূরত্ব ফাংশন জন্য ডক্স লিঙ্ক .
উপরের প্রশ্নের ফলাফল হল:
আপনি দেখতে পাচ্ছেন, আমাদের সূচক যুক্তিতে কোনো পরিবর্তন ছাড়াই RECALL 70% । ইনলাইন ফিল্টারিং বিভাগের ধাপ 6-এ আমরা যে ScaNN সূচকটি তৈরি করেছি তা মনে আছে, " patent_index
"? আমরা উপরের প্রশ্নটি চালানোর সময় একই সূচকটি এখনও কার্যকর।
এখন একটি ভিন্ন দূরত্ব ফাংশন কোয়েরি সহ একটি সূচক তৈরি করা যাক: L2 দূরত্ব: <->
drop index patent_index;
CREATE INDEX patent_index_L2 ON patents_data
USING scann (abstract_embeddings L2)
WITH (num_leaves=32);
ড্রপ ইনডেক্স বিবৃতিটি শুধুমাত্র টেবিলে কোন অপ্রয়োজনীয় সূচক নেই তা নিশ্চিত করার জন্য।
এখন, আমি আমার ভেক্টর অনুসন্ধান কার্যকারিতার দূরত্ব ফাংশন পরিবর্তন করার পরে RECALL মূল্যায়ন করতে নিম্নলিখিত ক্যোয়ারীটি চালাতে পারি।
[পরে] কোসাইন সাদৃশ্য দূরত্ব ফাংশন ব্যবহার করে এমন প্রশ্ন:
SELECT
*
FROM
evaluate_query_recall($$
SELECT
id || ' - ' || title AS title,
abstract
FROM
patents_data
where num_claims >= 15
ORDER BY
abstract_embeddings <-> embedding('text-embedding-005',
'sentiment analysis')::vector
LIMIT 10 $$,
'{"scann.num_leaves_to_search":1, "scann.pre_reordering_num_neighbors":10}',
ARRAY['scann']);
উপরের প্রশ্নের ফলাফল হল:
প্রত্যাহার মান কি একটি রূপান্তর, 90%!!!
অন্যান্য পরামিতি রয়েছে যা আপনি সূচকে পরিবর্তন করতে পারেন, যেমন num_leaves ইত্যাদি। পছন্দসই রিকল মান এবং আপনার অ্যাপ্লিকেশন ব্যবহার করা ডেটাসেটের উপর ভিত্তি করে।
8. পরিষ্কার করুন
এই পোস্টে ব্যবহৃত সংস্থানগুলির জন্য আপনার Google ক্লাউড অ্যাকাউন্টে চার্জ এড়াতে, এই পদক্ষেপগুলি অনুসরণ করুন:
- Google ক্লাউড কনসোলে, রিসোর্স ম্যানেজার পৃষ্ঠায় যান।
- প্রকল্প তালিকায়, আপনি যে প্রকল্পটি মুছতে চান সেটি নির্বাচন করুন এবং তারপরে মুছুন ক্লিক করুন।
- ডায়ালগে, প্রজেক্ট আইডি টাইপ করুন এবং তারপরে প্রোজেক্ট মুছে ফেলতে শাট ডাউন ক্লিক করুন।
- বিকল্পভাবে, আপনি কেবলমাত্র AlloyDB ক্লাস্টারটি মুছে ফেলতে পারেন (যদি আপনি কনফিগারেশনের সময় ক্লাস্টারের জন্য us-central1 বেছে না নেন তবে এই হাইপারলিংকের অবস্থানটি পরিবর্তন করুন) যেটি আমরা এই প্রকল্পের জন্য তৈরি করেছি ডিলিট ক্লাস্টার বোতামে ক্লিক করে।
9. অভিনন্দন
অভিনন্দন! উচ্চ কার্যক্ষমতার জন্য এবং এটিকে সত্যিকার অর্থে চালিত করতে AlloyDB-এর উন্নত ভেক্টর অনুসন্ধানের মাধ্যমে আপনি সফলভাবে আপনার প্রাসঙ্গিক পেটেন্ট অনুসন্ধান ক্যোয়ারী তৈরি করেছেন। আমি একটি মান-নিয়ন্ত্রিত মাল্টি-টুল এজেন্টিক অ্যাপ্লিকেশন একত্রিত করেছি যা ADK এবং সমস্ত AlloyDB স্টাফ ব্যবহার করে যা আমরা এখানে আলোচনা করেছি একটি উচ্চ পারফরম্যান্স এবং মানের পেটেন্ট ভেক্টর অনুসন্ধান এবং বিশ্লেষক এজেন্ট তৈরি করতে যা আপনি এখানে দেখতে পারেন: https://youtu.be/Y9fvVY0yZTY
আপনি যদি সেই এজেন্ট তৈরি করতে শিখতে চান, অনুগ্রহ করে এই কোডল্যাবটি পড়ুন।