জাভাতে শক্তিশালী, স্টেটফুল, E2E AI এজেন্ট অ্যাপস তৈরি করুন ADK, AlloyDB & মিথুন!!

1. সংক্ষিপ্ত বিবরণ

বিভিন্ন শিল্পে, প্রাসঙ্গিক অনুসন্ধান একটি গুরুত্বপূর্ণ কার্যকারিতা যা তাদের অ্যাপ্লিকেশনের হৃদয় এবং কেন্দ্রবিন্দু গঠন করে। Retrieval Augmented Generation বেশ কিছুদিন ধরেই এই গুরুত্বপূর্ণ প্রযুক্তিগত বিবর্তনের একটি মূল চালিকাশক্তি হয়ে দাঁড়িয়েছে, যার জেনারেটিভ AI চালিত পুনরুদ্ধার প্রক্রিয়া রয়েছে। জেনারেটিভ মডেলগুলি, তাদের বৃহৎ প্রসঙ্গ উইন্ডো এবং চিত্তাকর্ষক আউটপুট মানের সাথে, AI কে রূপান্তরিত করছে। RAG AI অ্যাপ্লিকেশন এবং এজেন্টগুলিতে প্রসঙ্গ প্রবেশ করার একটি পদ্ধতিগত উপায় প্রদান করে, বিভিন্ন মিডিয়া থেকে কাঠামোগত ডাটাবেস বা তথ্যের মধ্যে তাদের ভিত্তি করে। এই প্রাসঙ্গিক তথ্য সত্যের স্পষ্টতা এবং আউটপুটের নির্ভুলতার জন্য অত্যন্ত গুরুত্বপূর্ণ, কিন্তু সেই ফলাফলগুলি কতটা সঠিক? আপনার ব্যবসা কি মূলত এই প্রাসঙ্গিক মিল এবং প্রাসঙ্গিকতার নির্ভুলতার উপর নির্ভর করে? তাহলে এই প্রকল্পটি আপনাকে কাঁপিয়ে তুলবে!

এখন কল্পনা করুন যদি আমরা জেনারেটিভ মডেলের শক্তি গ্রহণ করতে পারি এবং এমন ইন্টারেক্টিভ এজেন্ট তৈরি করতে পারি যা এই ধরনের প্রেক্ষাপট-সমালোচনামূলক তথ্যের উপর ভিত্তি করে এবং সত্যের উপর ভিত্তি করে স্বায়ত্তশাসিত সিদ্ধান্ত নিতে সক্ষম; আজ আমরা এটিই তৈরি করতে যাচ্ছি। আমরা পেটেন্ট বিশ্লেষণ অ্যাপ্লিকেশনের জন্য AlloyDB-তে উন্নত RAG দ্বারা চালিত এজেন্ট ডেভেলপমেন্ট কিট ব্যবহার করে একটি এন্ড-টু-এন্ড AI এজেন্ট অ্যাপ তৈরি করতে যাচ্ছি।

পেটেন্ট বিশ্লেষণ এজেন্ট ব্যবহারকারীকে তাদের অনুসন্ধানের টেক্সটের প্রাসঙ্গিকভাবে প্রাসঙ্গিক পেটেন্ট খুঁজে পেতে সহায়তা করে এবং জিজ্ঞাসা করলে, একটি নির্বাচিত পেটেন্টের জন্য একটি স্পষ্ট এবং সংক্ষিপ্ত ব্যাখ্যা এবং প্রয়োজনে অতিরিক্ত বিবরণ প্রদান করে। এটি কীভাবে করা হয় তা দেখতে প্রস্তুত? আসুন আরও বিস্তারিত আলোচনা করা যাক!

উদ্দেশ্য

লক্ষ্যটি সহজ। ব্যবহারকারীকে টেক্সট বর্ণনার উপর ভিত্তি করে পেটেন্ট অনুসন্ধান করার অনুমতি দিন এবং তারপর অনুসন্ধান ফলাফল থেকে একটি নির্দিষ্ট পেটেন্টের বিস্তারিত ব্যাখ্যা পেতে পারেন এবং এই সমস্ত কিছু জাভা ADK, AlloyDB, ভেক্টর অনুসন্ধান (উন্নত সূচক সহ), জেমিনি এবং ক্লাউড রানে সার্ভারলেসভাবে স্থাপন করা সম্পূর্ণ অ্যাপ্লিকেশন দিয়ে তৈরি একটি AI এজেন্ট ব্যবহার করে।

তুমি কী তৈরি করবে

এই ল্যাবের অংশ হিসেবে, আপনি:

  1. একটি AlloyDB ইনস্ট্যান্স তৈরি করুন এবং পেটেন্ট পাবলিক ডেটাসেট ডেটা লোড করুন
  2. ScaNN এবং Recall eval বৈশিষ্ট্য ব্যবহার করে AlloyDB-তে উন্নত ভেক্টর অনুসন্ধান বাস্তবায়ন করুন
  3. জাভা ADK ব্যবহার করে একটি এজেন্ট তৈরি করুন
  4. জাভা সার্ভারলেস ক্লাউড ফাংশনে ডাটাবেস সার্ভার-সাইড লজিক বাস্তবায়ন করুন
  5. ক্লাউড রানে এজেন্ট স্থাপন এবং পরীক্ষা করুন

নিম্নলিখিত চিত্রটি তথ্য প্রবাহ এবং বাস্তবায়নের সাথে জড়িত পদক্ষেপগুলি উপস্থাপন করে।

c22563ace65a6930.png সম্পর্কে

High level diagram representing the flow of the Patent Search Agent with AlloyDB & ADK

আবশ্যকতা

2. শুরু করার আগে

একটি প্রকল্প তৈরি করুন

  1. গুগল ক্লাউড কনসোলে , প্রজেক্ট সিলেক্টর পৃষ্ঠায়, একটি গুগল ক্লাউড প্রজেক্ট নির্বাচন করুন বা তৈরি করুন।
  2. আপনার ক্লাউড প্রোজেক্টের জন্য বিলিং সক্ষম আছে কিনা তা নিশ্চিত করুন। কোনও প্রোজেক্টে বিলিং সক্ষম আছে কিনা তা কীভাবে পরীক্ষা করবেন তা শিখুন।
  3. আপনি ক্লাউড শেল ব্যবহার করবেন, যা গুগল ক্লাউডে চলমান একটি কমান্ড-লাইন পরিবেশ। গুগল ক্লাউড কনসোলের শীর্ষে অ্যাক্টিভেট ক্লাউড শেল ক্লিক করুন।

ক্লাউড শেল বোতামের ছবি সক্রিয় করুন

  1. ক্লাউড শেলের সাথে সংযুক্ত হয়ে গেলে, আপনি নিম্নলিখিত কমান্ড ব্যবহার করে পরীক্ষা করতে পারবেন যে আপনি ইতিমধ্যেই প্রমাণীকরণপ্রাপ্ত এবং প্রকল্পটি আপনার প্রকল্প আইডিতে সেট করা আছে কিনা:
gcloud auth list
  1. gcloud কমান্ড আপনার প্রকল্প সম্পর্কে জানে কিনা তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান।
gcloud config list project
  1. যদি আপনার প্রকল্পটি সেট না করা থাকে, তাহলে এটি সেট করতে নিম্নলিখিত কমান্ডটি ব্যবহার করুন:
gcloud config set project <YOUR_PROJECT_ID>
  1. প্রয়োজনীয় 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 কমান্ডের বিকল্প হল প্রতিটি পণ্য অনুসন্ধান করে অথবা এই লিঙ্কটি ব্যবহার করে কনসোলের মাধ্যমে।

gcloud কমান্ড এবং ব্যবহারের জন্য ডকুমেন্টেশন দেখুন।

৩. ডাটাবেস সেটআপ

এই ল্যাবে আমরা পেটেন্ট ডেটার জন্য ডাটাবেস হিসেবে AlloyDB ব্যবহার করব। এটি ডাটাবেস এবং লগের মতো সমস্ত রিসোর্স ধরে রাখার জন্য ক্লাস্টার ব্যবহার করে। প্রতিটি ক্লাস্টারের একটি প্রাথমিক উদাহরণ থাকে যা ডেটাতে একটি অ্যাক্সেস পয়েন্ট প্রদান করে। টেবিলগুলি প্রকৃত ডেটা ধরে রাখবে।

চলুন একটি AlloyDB ক্লাস্টার, ইনস্ট্যান্স এবং টেবিল তৈরি করি যেখানে পেটেন্ট ডেটাসেট লোড করা হবে।

একটি ক্লাস্টার এবং ইনস্ট্যান্স তৈরি করুন

  1. ক্লাউড কনসোলে AlloyDB পৃষ্ঠাটি নেভিগেট করুন। ক্লাউড কনসোলে বেশিরভাগ পৃষ্ঠা খুঁজে পাওয়ার একটি সহজ উপায় হল কনসোলের অনুসন্ধান বার ব্যবহার করে সেগুলি অনুসন্ধান করা।
  2. সেই পৃষ্ঠা থেকে CREATE CLUSTER নির্বাচন করুন:

f76ff480c8c889aa.png সম্পর্কে

  1. আপনি নীচের মত একটি স্ক্রিন দেখতে পাবেন। নিম্নলিখিত মানগুলি দিয়ে একটি ক্লাস্টার এবং ইনস্ট্যান্স তৈরি করুন (রেপো থেকে অ্যাপ্লিকেশন কোড ক্লোন করার ক্ষেত্রে মানগুলি মিলেছে কিনা তা নিশ্চিত করুন):
  • ক্লাস্টার আইডি : " vector-cluster "
  • পাসওয়ার্ড : " alloydb "
  • PostgreSQL 15 / সর্বশেষ প্রস্তাবিত
  • অঞ্চল : " us-central1 "
  • নেটওয়ার্কিং : " default "

538dba58908162fb.png সম্পর্কে

  1. যখন আপনি ডিফল্ট নেটওয়ার্ক নির্বাচন করবেন, তখন আপনি নীচের মতো একটি স্ক্রিন দেখতে পাবেন।

সংযোগ সেট আপ নির্বাচন করুন।
7939bbb6802a91bf.png সম্পর্কে

  1. সেখান থেকে, " Use an automatically allocated IP range " নির্বাচন করুন এবং চালিয়ে যান। তথ্য পর্যালোচনা করার পরে, CREATE CONNECTION নির্বাচন করুন। 768ff5210e79676f.png সম্পর্কে
  2. একবার আপনার নেটওয়ার্ক সেট আপ হয়ে গেলে, আপনি আপনার ক্লাস্টার তৈরি করা চালিয়ে যেতে পারেন। নীচে দেখানো হিসাবে ক্লাস্টার সেট আপ সম্পূর্ণ করতে CREATE CLUSTER এ ক্লিক করুন:

e06623e55195e16e.png

ইনস্ট্যান্স আইডি (যা আপনি ক্লাস্টার / ইনস্ট্যান্স কনফিগারেশনের সময় খুঁজে পেতে পারেন) পরিবর্তন করতে ভুলবেন না

vector-instance । যদি আপনি এটি পরিবর্তন করতে না পারেন, তাহলে আসন্ন সমস্ত রেফারেন্সে আপনার ইনস্ট্যান্স আইডি ব্যবহার করতে ভুলবেন না।

মনে রাখবেন যে ক্লাস্টার তৈরি করতে প্রায় ১০ মিনিট সময় লাগবে। এটি সফল হয়ে গেলে, আপনার তৈরি করা ক্লাস্টারের একটি ওভারভিউ স্ক্রিনে দেখানো হবে।

৪. ডেটা ইনজেশন

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

847e35f1bf8a8bd8.png সম্পর্কে

আপনার ইনস্ট্যান্স তৈরি শেষ না হওয়া পর্যন্ত আপনাকে অপেক্ষা করতে হতে পারে। একবার এটি হয়ে গেলে, ক্লাস্টার তৈরি করার সময় তৈরি করা শংসাপত্রগুলি ব্যবহার করে AlloyDB-তে সাইন ইন করুন। PostgreSQL-এ প্রমাণীকরণের জন্য নিম্নলিখিত ডেটা ব্যবহার করুন:

  • ব্যবহারকারীর নাম: " postgres "
  • ডাটাবেস: " postgres "
  • পাসওয়ার্ড: " alloydb "

AlloyDB স্টুডিওতে সফলভাবে প্রমাণীকরণ করার পরে, SQL কমান্ডগুলি এডিটরে প্রবেশ করানো হবে। আপনি শেষ উইন্ডোর ডানদিকে প্লাস ব্যবহার করে একাধিক এডিটর উইন্ডো যুক্ত করতে পারেন।

91a86d9469d499c4.png সম্পর্কে

আপনি এডিটর উইন্ডোতে 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;

একটি টেবিল তৈরি করুন

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)) ;

abstract_embeddings কলামটি টেক্সটের ভেক্টর মান সংরক্ষণের অনুমতি দেবে।

অনুমতি দিন

"এমবেডিং" ফাংশনে এক্সিকিউট করার জন্য নিচের স্টেটমেন্টটি রান করুন:

GRANT EXECUTE ON FUNCTION embedding TO postgres;

AlloyDB পরিষেবা অ্যাকাউন্টে Vertex AI ব্যবহারকারীর ভূমিকা প্রদান করুন

গুগল ক্লাউড IAM কনসোল থেকে, AlloyDB পরিষেবা অ্যাকাউন্টকে (যা দেখতে এরকম: service-<<PROJECT_NUMBER>>@gcp-sa-alloydb.iam.gserviceaccount.com) "Vertex AI User" ভূমিকায় অ্যাক্সেস দিন। 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 Public Datasets আমাদের ডেটাসেট হিসেবে ব্যবহার করা হবে। আমরা আমাদের কোয়েরি চালানোর জন্য AlloyDB স্টুডিও ব্যবহার করব। এই রেপোতে এই insert scripts sql ফাইলে ডেটা সংগ্রহ করা হয়েছে এবং আমরা পেটেন্ট ডেটা লোড করার জন্য এটি চালাব।

  1. গুগল ক্লাউড কনসোলে, AlloyDB পৃষ্ঠাটি খুলুন।
  2. আপনার নতুন তৈরি ক্লাস্টারটি নির্বাচন করুন এবং ইনস্ট্যান্সে ক্লিক করুন।
  3. AlloyDB নেভিগেশন মেনুতে, AlloyDB Studio এ ক্লিক করুন। আপনার শংসাপত্র দিয়ে সাইন ইন করুন।
  4. ডানদিকের নতুন ট্যাব আইকনে ক্লিক করে একটি নতুন ট্যাব খুলুন।
  5. insert_scripts1.sql , insert_script2.sql , insert_scripts3.sql , insert_scripts4.sql ফাইলগুলি থেকে insert কোয়েরি স্টেটমেন্টগুলি একের পর এক কপি করে রান করুন। এই ব্যবহারের দ্রুত ডেমোর জন্য আপনি 10-50 insert স্টেটমেন্টগুলি কপি করে রান করতে পারেন।

রান করতে, রান এ ক্লিক করুন। আপনার কোয়েরির ফলাফল ফলাফল টেবিলে প্রদর্শিত হবে।

৫. পেটেন্ট ডেটার জন্য এম্বেডিং তৈরি করুন

প্রথমে নিম্নলিখিত নমুনা কোয়েরিটি চালিয়ে এমবেডিং ফাংশনটি পরীক্ষা করা যাক:

SELECT embedding('text-embedding-005', 'AlloyDB is a managed, cloud-hosted SQL database service.');

এটি কোয়েরির নমুনা টেক্সটের জন্য এম্বেডিং ভেক্টরটি ফিরিয়ে দেবে, যা দেখতে ফ্লোটের একটি অ্যারের মতো। দেখতে এরকম:

25a1d7ef0e49e91e.png সম্পর্কে

abstract_embeddings ভেক্টর ফিল্ডটি আপডেট করুন

যদি অ্যাবস্ট্রাক্টের জন্য এম্বেডিং তৈরি করার প্রয়োজন হয়, তাহলে নিচের DML ব্যবহার করে টেবিলের পেটেন্ট অ্যাবস্ট্রাক্টগুলিকে সংশ্লিষ্ট এম্বেডিংগুলির সাথে আপডেট করা উচিত। কিন্তু আমাদের ক্ষেত্রে, ইনসার্ট স্টেটমেন্টে ইতিমধ্যেই প্রতিটি অ্যাবস্ট্রাক্টের জন্য এই এম্বেডিংগুলি রয়েছে তাই আপনাকে এম্বেডিং() পদ্ধতিটি কল করার প্রয়োজন নেই।

UPDATE patents_data set abstract_embeddings = embedding( 'text-embedding-005', abstract);

৬. ভেক্টর অনুসন্ধান করুন

এখন যেহেতু টেবিল, ডেটা, এম্বেডিং সব প্রস্তুত, আসুন ব্যবহারকারী অনুসন্ধান পাঠ্যের জন্য রিয়েল টাইম ভেক্টর অনুসন্ধান করি। আপনি নীচের কোয়েরিটি চালিয়ে এটি পরীক্ষা করতে পারেন:

SELECT id || ' - ' || title as title FROM patents_data ORDER BY abstract_embeddings <=> embedding('text-embedding-005', 'Sentiment Analysis')::vector LIMIT 10;

এই প্রশ্নের মধ্যে,

  1. ব্যবহারকারী যে টেক্সটটি অনুসন্ধান করেছেন তা হল: "অনুভূতি বিশ্লেষণ"।
  2. আমরা text-embedding-005 মডেলটি ব্যবহার করে embedding() পদ্ধতিতে এটিকে embeddings-এ রূপান্তর করছি।
  3. "<=>" COSINE SIMILARITY দূরত্ব পদ্ধতির ব্যবহারকে প্রতিনিধিত্ব করে।
  4. ডাটাবেসে সংরক্ষিত ভেক্টরগুলির সাথে সামঞ্জস্যপূর্ণ করার জন্য আমরা এম্বেডিং পদ্ধতির ফলাফলকে ভেক্টর টাইপে রূপান্তর করছি।
  5. LIMIT 10 ইঙ্গিত করে যে আমরা অনুসন্ধানের টেক্সটের সবচেয়ে কাছের 10টি মিল নির্বাচন করছি।

AlloyDB ভেক্টর সার্চ RAG কে পরবর্তী স্তরে নিয়ে যায়:

এখানে বেশ কিছু জিনিস চালু করা হয়েছে। ডেভেলপার-কেন্দ্রিক দুটি জিনিস হল:

  1. ইনলাইন ফিল্টারিং
  2. প্রত্যাহার মূল্যায়নকারী

ইনলাইন ফিল্টারিং

পূর্বে একজন ডেভেলপার হিসেবে, আপনাকে ভেক্টর সার্চ কোয়েরি করতে হত এবং ফিল্টারিং এবং রিকলের সাথে মোকাবিলা করতে হত। AlloyDB কোয়েরি অপ্টিমাইজার ফিল্টার ব্যবহার করে কীভাবে একটি কোয়েরি কার্যকর করতে হয় তা বেছে নেয়। ইনলাইন ফিল্টারিং হল একটি নতুন কোয়েরি অপ্টিমাইজেশন কৌশল যা AlloyDB কোয়েরি অপ্টিমাইজারকে মেটাডেটা ফিল্টারিং অবস্থা এবং ভেক্টর অনুসন্ধান উভয়ই মূল্যায়ন করতে দেয়, মেটাডেটা কলামে ভেক্টর ইনডেক্স এবং ইনডেক্স উভয়কেই কাজে লাগায়। এর ফলে রিকল পারফরম্যান্স বৃদ্ধি পেয়েছে, যার ফলে ডেভেলপাররা AlloyDB-এর অফারগুলির সুবিধা নিতে সক্ষম হয়েছে।

মাঝারি নির্বাচনীতার ক্ষেত্রে ইনলাইন ফিল্টারিং সবচেয়ে ভালো। AlloyDB ভেক্টর সূচক অনুসন্ধান করার সময়, এটি কেবলমাত্র মেটাডেটা ফিল্টারিং শর্তের সাথে মেলে এমন ভেক্টরগুলির জন্য দূরত্ব গণনা করে (সাধারণত WHERE ধারায় পরিচালিত একটি কোয়েরিতে আপনার কার্যকরী ফিল্টার)। এটি পোস্ট-ফিল্টার বা প্রি-ফিল্টারের সুবিধার পরিপূরক হিসাবে এই কোয়েরিগুলির কর্মক্ষমতা ব্যাপকভাবে উন্নত করে।

  1. 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 হয়।

গুরুত্বপূর্ণ নোট: যদি আপনার সারির সংখ্যা ১০০-এর কম হয়, তাহলে প্রথমেই আপনাকে ScaNN সূচক তৈরি করতে হবে না কারণ এটি কম সারির জন্য প্রযোজ্য হবে না। সেক্ষেত্রে অনুগ্রহ করে নিম্নলিখিত পদক্ষেপগুলি এড়িয়ে যান।

  1. ScaNN ইনডেক্স তৈরি করতে, alloydb_scann এক্সটেনশনটি ইনস্টল করুন।
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
  1. প্রথমে ইনডেক্স ছাড়াই এবং ইনলাইন ফিল্টার সক্রিয় না করে ভেক্টর অনুসন্ধান কোয়েরি চালান:
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;

ফলাফলটি এর অনুরূপ হওয়া উচিত:

6989de0fc3f0f753.png সম্পর্কে

  1. এটিতে Explain Analyze চালান: (কোনও সূচক বা ইনলাইন ফিল্টারিং ছাড়াই)

908dcf87c7f00ed4.png সম্পর্কে

কার্যকর করার সময় ২.৪ মিলিসেকেন্ড

  1. চলুন num_claims ক্ষেত্রে একটি নিয়মিত সূচক তৈরি করি যাতে আমরা এটি দ্বারা ফিল্টার করতে পারি:
CREATE INDEX idx_patents_data_num_claims ON patents_data (num_claims);
  1. আমাদের পেটেন্ট অনুসন্ধান অ্যাপ্লিকেশনের জন্য ScaNN সূচক তৈরি করা যাক। আপনার AlloyDB স্টুডিও থেকে নিম্নলিখিতটি চালান:
CREATE INDEX patent_index ON patents_data 
USING scann (abstract_embeddings cosine)
WITH (num_leaves=32);

গুরুত্বপূর্ণ নোট: (num_leaves=32) আমাদের মোট ১০০০+ সারি বিশিষ্ট ডেটাসেটের জন্য প্রযোজ্য। যদি আপনার সারি সংখ্যা ১০০-এর কম হয়, তাহলে প্রথমেই আপনাকে একটি সূচক তৈরি করতে হবে না কারণ এটি কম সারিগুলির জন্য প্রযোজ্য হবে না।

  1. ScaNN ইনডেক্সে ইনলাইন ফিল্টারিং সক্রিয় করুন:
SET scann.enable_inline_filtering = on
  1. এবার, ফিল্টার এবং ভেক্টর অনুসন্ধান সহ একই কোয়েরিটি রান করা যাক:
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 সক্ষম ভেক্টর অনুসন্ধানের জন্য প্রত্যাহার মূল্যায়ন করি।

প্রত্যাহার মূল্যায়নকারী

Recall in similarity search হল একটি অনুসন্ধান থেকে প্রাপ্ত প্রাসঙ্গিক উদাহরণের শতাংশ, অর্থাৎ প্রকৃত ধনাত্মক সংখ্যা। এটি অনুসন্ধানের মান পরিমাপের জন্য ব্যবহৃত সবচেয়ে সাধারণ মেট্রিক। Recall Loss এর একটি উৎস আনুমানিক nearest neighbor search, বা aNN, এবং k (সঠিক) nearest neighbor search, বা kNN এর মধ্যে পার্থক্য থেকে আসে। AlloyDB এর ScaNN এর মতো ভেক্টর সূচী aNN অ্যালগরিদম বাস্তবায়ন করে, যা আপনাকে প্রত্যাহারে একটি ছোট ট্রেডঅফের বিনিময়ে বৃহৎ ডেটাসেটে ভেক্টর অনুসন্ধানের গতি বাড়াতে দেয়। এখন, AlloyDB আপনাকে পৃথক প্রশ্নের জন্য ডাটাবেসে সরাসরি এই ট্রেডঅফ পরিমাপ করার ক্ষমতা প্রদান করে এবং নিশ্চিত করে যে এটি সময়ের সাথে সাথে স্থিতিশীল। আরও ভালো ফলাফল এবং কর্মক্ষমতা অর্জনের জন্য আপনি এই তথ্যের প্রতিক্রিয়ায় query এবং index প্যারামিটার আপডেট করতে পারেন।

আপনি evaluate_query_recall ফাংশন ব্যবহার করে একটি নির্দিষ্ট কনফিগারেশনের জন্য একটি ভেক্টর ইনডেক্সে একটি ভেক্টর কোয়েরির জন্য রিকোল খুঁজে পেতে পারেন। এই ফাংশনটি আপনাকে আপনার পছন্দসই ভেক্টর কোয়েরি রিকোল ফলাফল অর্জনের জন্য আপনার প্যারামিটারগুলি টিউন করতে দেয়। Recall হল অনুসন্ধানের মানের জন্য ব্যবহৃত মেট্রিক, এবং এটি কোয়েরি ভেক্টরের বস্তুনিষ্ঠভাবে নিকটতম ফলাফলের শতাংশ হিসাবে সংজ্ঞায়িত করা হয়। evaluate_query_recall ফাংশনটি ডিফল্টরূপে চালু থাকে।

গুরুত্বপূর্ণ তথ্য:

যদি আপনি নিম্নলিখিত ধাপগুলিতে HNSW সূচকে অনুমতি অস্বীকার ত্রুটির সম্মুখীন হন, তাহলে আপাতত এই সম্পূর্ণ প্রত্যাহার মূল্যায়ন বিভাগটি এড়িয়ে যান। এটি এই মুহুর্তে অ্যাক্সেস সীমাবদ্ধতার সাথে সম্পর্কিত হতে পারে কারণ এটি এই কোডল্যাবটি নথিভুক্ত করার সময় প্রকাশিত হয়েছে।

  1. ScaNN Index & HNSW সূচীতে Enable Index Scan পতাকা সেট করুন:
SET scann.enable_indexscan = on
SET hnsw.enable_index_scan = on
  1. 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 ফাংশনটি কোয়েরিকে প্যারামিটার হিসেবে গ্রহণ করে এবং এর রিকল ফেরত দেয়। আমি ফাংশন ইনপুট কোয়েরির পারফরম্যান্স পরীক্ষা করার জন্য যে কোয়েরিটি ব্যবহার করেছিলাম সেই একই কোয়েরি ব্যবহার করছি। আমি index পদ্ধতি হিসেবে SCaNN যোগ করেছি। আরও প্যারামিটার বিকল্পের জন্য ডকুমেন্টেশন দেখুন।

আমরা যে ভেক্টর সার্চ কোয়েরিটি ব্যবহার করছি তার প্রত্যাহার:

c98f38fbe6a0b6c5.png সম্পর্কে

আমি দেখতে পাচ্ছি যে RECALL ৭০%। এখন আমি এই তথ্য ব্যবহার করে সূচকের প্যারামিটার, পদ্ধতি এবং কোয়েরি প্যারামিটার পরিবর্তন করতে পারি এবং এই ভেক্টর অনুসন্ধানের জন্য আমার প্রত্যাহার উন্নত করতে পারি!

আমি ফলাফল সেটে সারির সংখ্যা পরিবর্তন করে ৭ করেছি (আগের ১০টি থেকে) এবং আমি RECALL-এ কিছুটা উন্নতি দেখতে পাচ্ছি, অর্থাৎ ৮৬%।

c12f7b92b8481ceb.png সম্পর্কে

এর অর্থ হল, রিয়েল-টাইমে আমি ব্যবহারকারীদের অনুসন্ধানের প্রেক্ষাপট অনুসারে মিলগুলির প্রাসঙ্গিকতা উন্নত করার জন্য আমার ব্যবহারকারীরা কতগুলি মিল দেখতে পান তার সংখ্যা পরিবর্তন করতে পারি।

ঠিক আছে! ডাটাবেস লজিক স্থাপন করে এজেন্টের দিকে এগিয়ে যাওয়ার সময়!!!

৭. সার্ভারলেসভাবে ডাটাবেস লজিক ওয়েবে নিয়ে যান

এই অ্যাপটি ওয়েবে নিয়ে যাওয়ার জন্য প্রস্তুত? নীচের পদক্ষেপগুলি অনুসরণ করুন:

  1. "একটি ফাংশন লিখুন" এ ক্লিক করে একটি নতুন ক্লাউড রান ফাংশন তৈরি করতে গুগল ক্লাউড কনসোলে ক্লাউড রান ফাংশনে যান অথবা https://console.cloud.google.com/run/create?deploymentType=function লিঙ্কটি ব্যবহার করুন।
  2. "একটি ফাংশন তৈরি করতে একটি ইনলাইন সম্পাদক ব্যবহার করুন" বিকল্পটি নির্বাচন করুন এবং কনফিগারেশন শুরু করুন। পরিষেবার নাম " patent-search " প্রদান করুন এবং " us-central1 " হিসাবে অঞ্চল এবং " Java 17" হিসাবে রানটাইম নির্বাচন করুন। প্রমাণীকরণকে " অনুমোদনহীন আহ্বানগুলিকে অনুমতি দিন " এ সেট করুন।
  3. "কন্টেইনার, ভলিউম, নেটওয়ার্কিং, নিরাপত্তা" বিভাগে যান এবং কোনও বিবরণ মিস না করে নীচের পদক্ষেপগুলি অনুসরণ করুন:

নেটওয়ার্কিং ট্যাবে যান:

828cd861864d99ea.png সম্পর্কে

" আউটবাউন্ড ট্র্যাফিকের জন্য একটি VPC-তে সংযোগ করুন " নির্বাচন করুন এবং তারপরে " সার্ভারলেস VPC অ্যাক্সেস সংযোগকারী ব্যবহার করুন " নির্বাচন করুন।

নেটওয়ার্ক ড্রপডাউন, সেটিংসের অধীনে, নেটওয়ার্ক ড্রপডাউনে ক্লিক করুন এবং " নতুন ভিপিসি সংযোগকারী যোগ করুন " বিকল্পটি নির্বাচন করুন (যদি আপনি ইতিমধ্যে ডিফল্টটি কনফিগার না করে থাকেন) এবং পপ-আপ হওয়া ডায়ালগ বক্সে আপনি যে নির্দেশাবলী দেখবেন তা অনুসরণ করুন:

6559ccfd10e597f2.png সম্পর্কে

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

SHOW SCALING SETTINGS প্রসারিত করুন এবং নিশ্চিত করুন যে আপনার কনফিগারেশনটি ঠিক নিম্নলিখিতটিতে সেট করা আছে:

199b0ccd80215004.png সম্পর্কে

CREATE এ ক্লিক করুন এবং এই সংযোগকারীটি এখন বহির্গমন সেটিংসে তালিকাভুক্ত হওয়া উচিত।

নতুন তৈরি সংযোগকারীটি নির্বাচন করুন।

এই VPC সংযোগকারীর মাধ্যমে সমস্ত ট্র্যাফিক রাউটেড করার জন্য বেছে নিন।

NEXT এ ক্লিক করুন এবং তারপর DEPLOY এ ক্লিক করুন।

  1. ডিফল্টরূপে এটি এন্ট্রি পয়েন্টটিকে " gcfv2.HelloHttpFunction " তে সেট করবে। আপনার ক্লাউড রান ফাংশনের HelloHttpFunction.java এবং pom.xml-এ প্লেসহোল্ডার কোডটি যথাক্রমে " PatentSearch.java " এবং " pom.xml " থেকে কোড দিয়ে প্রতিস্থাপন করুন। ক্লাস ফাইলের নাম PatentSearch.java এ পরিবর্তন করুন।
  2. জাভা ফাইলে আপনার মানগুলির সাথে ************* প্লেসহোল্ডার এবং AlloyDB সংযোগ শংসাপত্রগুলি পরিবর্তন করতে ভুলবেন না। AlloyDB শংসাপত্রগুলি হল সেইগুলি যা আমরা এই কোডল্যাবের শুরুতে ব্যবহার করেছিলাম। যদি আপনি বিভিন্ন মান ব্যবহার করে থাকেন, তাহলে দয়া করে জাভা ফাইলে একই মান পরিবর্তন করুন।
  3. স্থাপন করুন ক্লিক করুন।
  4. আপডেটেড ক্লাউড ফাংশনটি স্থাপন করা হয়ে গেলে, আপনি তৈরি হওয়া এন্ডপয়েন্টটি দেখতে পাবেন। এটি অনুলিপি করুন এবং নিম্নলিখিত কমান্ডটি দিয়ে প্রতিস্থাপন করুন:
PROJECT_ID=$(gcloud config get-value project)

curl -X POST <<YOUR_ENDPOINT>> \
  -H 'Content-Type: application/json' \
  -d '{"search":"Sentiment Analysis"}'

ব্যস! AlloyDB ডেটাতে Embeddings মডেল ব্যবহার করে একটি উন্নত Contextual Similarity Vector Search করা খুবই সহজ।

৮. জাভা ADK দিয়ে এজেন্ট তৈরি করা যাক।

প্রথমে, এডিটরে জাভা প্রজেক্ট দিয়ে শুরু করা যাক।

  1. ক্লাউড শেল টার্মিনালে নেভিগেট করুন

https://shell.cloud.google.com/?fromcloudshell=true&show=ide%2Cterminal

  1. অনুরোধ করা হলে অনুমোদন দিন
  2. ক্লাউড শেল কনসোলের উপরের দিক থেকে এডিটর আইকনে ক্লিক করে ক্লাউড শেল এডিটরে টগল করুন।

f913b886324e5196.png সম্পর্কে

  1. ল্যান্ডিং ক্লাউড শেল এডিটর কনসোলে, একটি নতুন ফোল্ডার তৈরি করুন এবং এটির নাম দিন "adk-agents"।

আপনার ক্লাউড শেলের রুট ডিরেক্টরিতে "নতুন ফোল্ডার তৈরি করুন" এ ক্লিক করুন যা নীচে দেখানো হয়েছে:

94c9804697614a94.png সম্পর্কে

এর নাম দিন "adk-agents":

37445dc1fe08f74c.png সম্পর্কে

  1. নিচের কাঠামোর সাথে সংশ্লিষ্ট ফাইলের নাম ব্যবহার করে নিম্নলিখিত ফোল্ডার কাঠামো এবং খালি ফাইলগুলি তৈরি করুন:
adk-agents/
 └—— pom.xml
 └—— src/ 
     └—— main/
         └—— java/
             └—— agents/
                 └—— App.java
  1. একটি পৃথক ট্যাবে গিটহাব রেপো খুলুন এবং App.java এবং pom.xml ফাইলগুলির সোর্স কোডটি কপি করুন।
  2. যদি আপনি উপরের ডান কোণে "নতুন ট্যাবে খুলুন" আইকনটি ব্যবহার করে একটি নতুন ট্যাবে সম্পাদকটি খুলে থাকেন, তাহলে আপনি পৃষ্ঠার নীচে টার্মিনালটি খুলতে পারবেন। আপনি সম্পাদক এবং টার্মিনাল উভয়ই সমান্তরালভাবে খোলা রাখতে পারবেন যাতে আপনি অবাধে কাজ করতে পারেন।
  3. ক্লোন হয়ে গেলে, ক্লাউড শেল এডিটর কনসোলে ফিরে যান।
  4. যেহেতু আমরা ইতিমধ্যেই ক্লাউড রান ফাংশন তৈরি করেছি, তাই আপনাকে রেপো ফোল্ডার থেকে ক্লাউড রান ফাংশন ফাইলগুলি কপি করার দরকার নেই

ADK জাভা SDK দিয়ে শুরু করা

এটা মোটামুটি সহজ। আপনার ক্লোন ধাপে নিম্নলিখিত বিষয়গুলি অন্তর্ভুক্ত রয়েছে তা নিশ্চিত করতে হবে:

  1. নির্ভরতা যোগ করুন:

আপনার pom.xml-এ google-adk এবং google-adk-dev (ওয়েব UI-এর জন্য) আর্টিফ্যাক্টগুলি অন্তর্ভুক্ত করুন। যদি আপনি রেপো থেকে উৎসটি অনুলিপি করে থাকেন, তবে এগুলি ইতিমধ্যেই ফাইলগুলিতে অন্তর্ভুক্ত করা হয়েছে, আপনাকে সেগুলি অন্তর্ভুক্ত করতে হবে না। আপনার ডিপ্লয় করা এন্ডপয়েন্টটি প্রতিফলিত করার জন্য আপনাকে কেবল ক্লাউড রান ফাংশন এন্ডপয়েন্টে একটি পরিবর্তন করতে হবে। এই বিভাগের আসন্ন ধাপগুলিতে এটি কভার করা হয়েছে।

<!-- The ADK core dependency -->
        <dependency>
            <groupId>com.google.adk</groupId>
            <artifactId>google-adk</artifactId>
            <version>0.1.0</version>
        </dependency>
        <!-- The ADK dev web UI to debug your agent -->
        <dependency>
            <groupId>com.google.adk</groupId>
            <artifactId>google-adk-dev</artifactId>
            <version>0.1.0</version>
        </dependency>

অ্যাপ্লিকেশনটি চালানোর জন্য অন্যান্য নির্ভরতা এবং কনফিগারেশনের প্রয়োজন হওয়ায় সোর্স রিপোজিটরি থেকে pom.xml রেফারেন্স করতে ভুলবেন না।

  1. আপনার প্রকল্প কনফিগার করুন:

আপনার pom.xml-এ জাভা ভার্সন (১৭+ প্রস্তাবিত) এবং Maven কম্পাইলার সেটিংস সঠিকভাবে কনফিগার করা আছে কিনা তা নিশ্চিত করুন। আপনি নীচের কাঠামো অনুসরণ করে আপনার প্রকল্পটি কনফিগার করতে পারেন:

adk-agents/
 └—— pom.xml
 └—— src/ 
     └—— main/
         └—— java/
             └—— agents/
                 └—— App.java
  1. এজেন্ট এবং এর সরঞ্জামগুলির সংজ্ঞা (App.java):

এখানেই ADK Java SDK-এর জাদু জ্বলে ওঠে। আমরা আমাদের এজেন্ট, এর ক্ষমতা (নির্দেশনা) এবং এটি ব্যবহার করতে পারে এমন সরঞ্জামগুলি সংজ্ঞায়িত করি।

প্রধান এজেন্ট ক্লাসের কয়েকটি কোড স্নিপেটের একটি সরলীকৃত সংস্করণ এখানে খুঁজুন। সম্পূর্ণ প্রকল্পের জন্য এখানে প্রকল্পের রেপো দেখুন।

// App.java (Simplified Snippets)
package agents;

import com.google.adk.agents.LlmAgent;
import com.google.adk.agents.BaseAgent;
import com.google.adk.agents.InvocationContext;
import com.google.adk.tools.Annotations.Schema;
import com.google.adk.tools.FunctionTool;
// ... other imports

public class App {

    static FunctionTool searchTool = FunctionTool.create(App.class, "getPatents");
    static FunctionTool explainTool = FunctionTool.create(App.class, "explainPatent");

    public static BaseAgent ROOT_AGENT = initAgent();

    public static BaseAgent initAgent() {
        return LlmAgent.builder()
            .name("patent-search-agent")
            .description("Patent Search agent")
            .model("gemini-2.0-flash-001") // Specify your desired Gemini model
            .instruction(
                """
                You are a helpful patent search assistant capable of 2 things:
                // ... complete instructions ...
                """)
            .tools(searchTool, explainTool)
            .outputKey("patents") // Key to store tool output in session state
            .build();
    }

    // --- Tool: Get Patents ---
    public static Map<String, String> getPatents(
        @Schema(name="searchText",description = "The search text for which the user wants to find matching patents")
        String searchText) {
        try {
            String patentsJson = vectorSearch(searchText); // Calls our Cloud Run Function
            return Map.of("status", "success", "report", patentsJson);
        } catch (Exception e) {
            // Log error
            return Map.of("status", "error", "report", "Error fetching patents.");
        }
    }

    // --- Tool: Explain Patent (Leveraging InvocationContext) ---
    public static Map<String, String> explainPatent(
        @Schema(name="patentId",description = "The patent id for which the user wants to get more explanation for, from the database") 
    String patentId, 
    @Schema(name="ctx",description = "The list of patent abstracts from the database from which the user can pick the one to get more explanation for") 
    InvocationContext ctx) { // Note the InvocationContext
        try {
            // Retrieve previous patent search results from session state
            String previousResults = (String) ctx.session().state().get("patents");
            if (previousResults != null && !previousResults.isEmpty()) {
// Logic to find the specific patent abstract from 'previousResults' by 'patentId'
                String[] patentEntries = previousResults.split("\n\n\n\n"); 
                for (String entry : patentEntries) {
                    if (entry.contains(patentId)) { // Simplified check
       // The agent will then use its instructions to summarize this 'report'
                        return Map.of("status", "success", "report", entry);
                    }
                }
            }
            return Map.of("status", "error", "report", "Patent ID not found in previous search.");
        } catch (Exception e) {
            // Log error
            return Map.of("status", "error", "report", "Error explaining patent.");
        }
    }

    public static void main(String[] args) throws Exception {
        InMemoryRunner runner = new InMemoryRunner(ROOT_AGENT);
        // ... (Session creation and main input loop - shown in your source)
    }
}

ADK জাভা কোডের মূল উপাদানগুলি হাইলাইট করা হয়েছে:

  1. LlmAgent.builder(): আপনার এজেন্ট কনফিগার করার জন্য সাবলীল API।
  2. .instruction(...): LLM-এর জন্য মূল প্রম্পট এবং নির্দেশিকা প্রদান করে, যার মধ্যে কোন টুলটি কখন ব্যবহার করতে হবে তাও অন্তর্ভুক্ত।
  3. FunctionTool.create(App.class, "methodName"): এজেন্ট কর্তৃক ব্যবহৃত টুল হিসেবে সহজেই আপনার জাভা পদ্ধতি নিবন্ধন করে। পদ্ধতির নামের স্ট্রিংটি অবশ্যই একটি প্রকৃত পাবলিক স্ট্যাটিক পদ্ধতির সাথে মেলে।
  4. @Schema(description = ...): টুলের প্যারামিটারগুলি টীকা করে, যা LLM-কে বুঝতে সাহায্য করে যে প্রতিটি টুল কী ইনপুট আশা করে। সঠিক টুল নির্বাচন এবং প্যারামিটার পূরণের জন্য এই বর্ণনাটি অত্যন্ত গুরুত্বপূর্ণ।
  5. InvocationContext ctx: স্বয়ংক্রিয়ভাবে টুল পদ্ধতিতে পাস করা হয়, যা সেশন স্টেট (ctx.session().state()), ব্যবহারকারীর তথ্য এবং আরও অনেক কিছুতে অ্যাক্সেস দেয়।
  6. .outputKey("patents"): যখন কোন টুল ডেটা ফেরত দেয়, তখন ADK স্বয়ংক্রিয়ভাবে এই কী-এর অধীনে সেশন অবস্থায় এটি সংরক্ষণ করতে পারে। এইভাবে explainPatent getPatents থেকে ফলাফল অ্যাক্সেস করতে পারে।
  7. VECTOR_SEARCH_ENDPOINT: এটি একটি ভেরিয়েবল যা পেটেন্ট অনুসন্ধান ব্যবহারের ক্ষেত্রে ব্যবহারকারীর জন্য প্রাসঙ্গিক প্রশ্নোত্তরের মূল কার্যকরী যুক্তি ধারণ করে।
  8. এখানে অ্যাকশন আইটেম: পূর্ববর্তী বিভাগ থেকে জাভা ক্লাউড রান ফাংশন ধাপটি বাস্তবায়ন করার পরে আপনাকে একটি আপডেট করা ডিপ্লয় করা এন্ডপয়েন্ট মান সেট করতে হবে।
  9. searchTool : এটি ব্যবহারকারীর অনুসন্ধান পাঠ্যের জন্য পেটেন্ট ডাটাবেস থেকে প্রাসঙ্গিকভাবে প্রাসঙ্গিক পেটেন্ট মিল খুঁজে পেতে ব্যবহারকারীর সাথে জড়িত।
  10. explainTool : এটি ব্যবহারকারীর কাছ থেকে গভীরভাবে অনুসন্ধানের জন্য একটি নির্দিষ্ট পেটেন্টের জন্য অনুরোধ করে। তারপর এটি পেটেন্টের সারাংশ সারসংক্ষেপ করে এবং ব্যবহারকারীর পেটেন্টের বিবরণের উপর ভিত্তি করে আরও প্রশ্নের উত্তর দেওয়ার জন্য প্রস্তুত থাকে।

গুরুত্বপূর্ণ নোট: VECTOR_SEARCH_ENDPOINT ভেরিয়েবলটিকে আপনার ডিপ্লয় করা CRF এন্ডপয়েন্ট দিয়ে প্রতিস্থাপন করতে ভুলবেন না।

স্টেটফুল ইন্টারঅ্যাকশনের জন্য ইনভোকেশন কনটেক্সট ব্যবহার করা

কার্যকর এজেন্ট তৈরির জন্য একটি গুরুত্বপূর্ণ বৈশিষ্ট্য হল কথোপকথনের একাধিক মোড় জুড়ে অবস্থা পরিচালনা করা। ADK-এর InvocationContext এটিকে সহজ করে তোলে।

আমাদের App.java-তে:

  1. যখন initAgent() সংজ্ঞায়িত করা হয়, তখন আমরা .outputKey("patents") ব্যবহার করি। এটি ADK কে বলে যে যখন একটি টুল (যেমন getPatents) তার রিপোর্ট ফিল্ডে ডেটা ফেরত দেয়, তখন সেই ডেটা "patents" কী-এর অধীনে সেশন অবস্থায় সংরক্ষণ করা উচিত।
  2. explainPatent টুল পদ্ধতিতে, আমরা InvocationContext ctx ইনজেক্ট করি:
public static Map<String, String> explainPatent(
    @Schema(description = "...") String patentId, InvocationContext ctx) {
    String previousResults = (String) ctx.session().state().get("patents");
    // ... use previousResults ...
}

এটি explainPatent টুলটিকে getPatents টুল দ্বারা পূর্ববর্তী সময়ে আনা পেটেন্ট তালিকা অ্যাক্সেস করার অনুমতি দেয়, যা কথোপকথনকে স্পষ্ট এবং সুসংগত করে তোলে।

৯. স্থানীয় CLI পরীক্ষা

পরিবেশের ভেরিয়েবল নির্ধারণ করুন

আপনাকে দুটি পরিবেশ ভেরিয়েবল রপ্তানি করতে হবে:

  1. একটি জেমিনি চাবি যা আপনি এআই স্টুডিও থেকে পেতে পারেন:

এটি করার জন্য, https://aistudio.google.com/apikey এ যান এবং আপনার সক্রিয় Google ক্লাউড প্রজেক্টের জন্য API কী পান যেখানে আপনি এই অ্যাপ্লিকেশনটি বাস্তবায়ন করছেন এবং কীটি কোথাও সংরক্ষণ করুন:

ae2db169e6a94e4a.png সম্পর্কে

  1. একবার আপনি কীটি পেয়ে গেলে, ক্লাউড শেল টার্মিনাল খুলুন এবং নিম্নলিখিত কমান্ডটি চালিয়ে আমরা যে নতুন ডিরেক্টরিটি তৈরি করেছি তাতে যান:
cd adk-agents
  1. একটি চলক যা উল্লেখ করবে যে আমরা এবার Vertex AI ব্যবহার করছি না।
export GOOGLE_GENAI_USE_VERTEXAI=FALSE
export GOOGLE_API_KEY=AIzaSyDF...
  1. CLI তে আপনার প্রথম এজেন্ট চালান

এই প্রথম এজেন্টটি চালু করতে, আপনার টার্মিনালে নিম্নলিখিত Maven কমান্ডটি ব্যবহার করুন:

mvn compile exec:java -DmainClass="agents.App"

আপনি আপনার টার্মিনালে এজেন্টের ইন্টারেক্টিভ প্রতিক্রিয়া দেখতে পাবেন।

১০. ক্লাউড রানে মোতায়েন করা

ক্লাউড রানে আপনার ADK জাভা এজেন্ট স্থাপন করা অন্য যেকোনো জাভা অ্যাপ্লিকেশন স্থাপনের অনুরূপ:

  1. ডকারফাইল: আপনার জাভা অ্যাপ্লিকেশন প্যাকেজ করার জন্য একটি ডকারফাইল তৈরি করুন।
  2. বিল্ড এবং পুশ ডকার ইমেজ: গুগল ক্লাউড বিল্ড এবং আর্টিফ্যাক্ট রেজিস্ট্রি ব্যবহার করুন।
  3. আপনি উপরের ধাপটি সম্পাদন করতে পারেন এবং শুধুমাত্র একটি কমান্ডের মাধ্যমে ক্লাউড রানে স্থাপন করতে পারেন:
gcloud run deploy --source . --set-env-vars GOOGLE_API_KEY=<<Your_Gemini_Key>>

একইভাবে, আপনি আপনার জাভা ক্লাউড রান ফাংশন (gcfv2.PatentSearch) স্থাপন করবেন। বিকল্পভাবে, আপনি সরাসরি ক্লাউড রান ফাংশন কনসোল থেকে ডাটাবেস লজিকের জন্য জাভা ক্লাউড রান ফাংশন তৈরি এবং স্থাপন করতে পারেন।

১১. ওয়েব UI দিয়ে পরীক্ষা করা

ADK আপনার এজেন্টের স্থানীয় পরীক্ষা এবং ডিবাগিংয়ের জন্য একটি সহজ ওয়েব UI সহ আসে। যখন আপনি আপনার App.java স্থানীয়ভাবে চালান (যেমন, mvn exec:java -Dexec.mainClass="agents.App" কনফিগার করা থাকলে, অথবা শুধুমাত্র প্রধান পদ্ধতি চালানো হলে), ADK সাধারণত একটি স্থানীয় ওয়েব সার্ভার শুরু করে।

ADK ওয়েব UI আপনাকে এগুলি করতে দেয়:

  1. আপনার এজেন্টকে বার্তা পাঠান।
  2. ইভেন্টগুলি দেখুন (ব্যবহারকারীর বার্তা, টুল কল, টুল প্রতিক্রিয়া, LLM প্রতিক্রিয়া)।
  3. সেশন অবস্থা পরীক্ষা করুন।
  4. লগ এবং ট্রেস দেখুন।

ডেভেলপমেন্টের সময় আপনার এজেন্ট কীভাবে অনুরোধগুলি প্রক্রিয়া করে এবং তার সরঞ্জামগুলি ব্যবহার করে তা বোঝার জন্য এটি অমূল্য। এর অর্থ হল pom.xml-এ আপনার mainClass com.google.adk.web.AdkWebServer- এ সেট করা আছে এবং আপনার এজেন্ট এতে নিবন্ধিত, অথবা আপনি একটি স্থানীয় পরীক্ষা রানার চালাচ্ছেন যা এটি প্রকাশ করে।

কনসোল ইনপুটের জন্য InMemoryRunner এবং Scanner দিয়ে App.java চালানোর সময়, আপনি কোর এজেন্ট লজিক পরীক্ষা করছেন। ওয়েব UI হল আরও ভিজ্যুয়াল ডিবাগিং অভিজ্ঞতার জন্য একটি পৃথক উপাদান, যা প্রায়শই ADK যখন HTTP এর মাধ্যমে আপনার এজেন্টকে পরিষেবা দেয় তখন ব্যবহৃত হয়।

স্প্রিংবুট লোকাল সার্ভার চালু করতে আপনি আপনার রুট ডিরেক্টরি থেকে নিম্নলিখিত Maven কমান্ড ব্যবহার করতে পারেন:

mvn compile exec:java -Dexec.args="--adk.agents.source-dir=src/main/java/ --logging.level.com.google.adk.dev=TRACE --logging.level.com.google.adk.demo.agents=TRACE"

উপরের কমান্ডটি যে URL দিয়ে আউটপুট দেয়, সেখানেই প্রায়শই ইন্টারফেসটি অ্যাক্সেসযোগ্য। যদি এটি Cloud Run deployed হয় , তাহলে আপনি Cloud Run deployed লিঙ্ক থেকে এটি অ্যাক্সেস করতে পারবেন।

আপনি একটি ইন্টারেক্টিভ ইন্টারফেসে ফলাফল দেখতে সক্ষম হবেন।

আমাদের মোতায়েন করা পেটেন্ট এজেন্টের জন্য নীচের ভিডিওটি দেখুন:

AlloyDB ইনলাইন অনুসন্ধান এবং প্রত্যাহার মূল্যায়নের মাধ্যমে একটি মান নিয়ন্ত্রিত পেটেন্ট এজেন্টের ডেমো!

অনুসরণ

১২. পরিষ্কার করা

এই পোস্টে ব্যবহৃত রিসোর্সের জন্য আপনার Google ক্লাউড অ্যাকাউন্টে চার্জ এড়াতে, এই পদক্ষেপগুলি অনুসরণ করুন:

  1. গুগল ক্লাউড কনসোলে, https://console.cloud.google.com/cloud-resource-manager?utm_campaign=CDR_0x1d2a42f5_default_b419133749&utm_medium=external&utm_source=blog এ যান।
  2. https://console.cloud.google.com/cloud-resource-manager?utm_campaign=CDR_0x1d2a42f5_default_b419133749&utm_medium=external&utm_source= ব্লগ পৃষ্ঠা।
  3. প্রকল্পের তালিকায়, আপনি যে প্রকল্পটি মুছতে চান তা নির্বাচন করুন এবং তারপরে মুছুন ক্লিক করুন।
  4. ডায়ালগে, প্রজেক্ট আইডি টাইপ করুন, এবং তারপর প্রজেক্টটি মুছে ফেলতে Shut down এ ক্লিক করুন।

১৩. অভিনন্দন

অভিনন্দন! আপনি ADK, https://cloud.google.com/alloydb/docs?utm_campaign=CDR_0x1d2a42f5_default_b419133749&utm_medium=external&utm_source=blog , Vertex AI, এবং Vector Search এর ক্ষমতা একত্রিত করে জাভাতে আপনার পেটেন্ট বিশ্লেষণ এজেন্ট সফলভাবে তৈরি করেছেন, এছাড়াও আমরা প্রাসঙ্গিক সাদৃশ্য অনুসন্ধানগুলিকে এত রূপান্তরকারী, দক্ষ এবং সত্যিকার অর্থে অর্থ-চালিত করার ক্ষেত্রে একটি বিশাল পদক্ষেপ নিয়েছি।

আজই শুরু করো!

ADK ডকুমেন্টেশন: [অফিসিয়াল ADK জাভা ডক্সের লিঙ্ক]

পেটেন্ট বিশ্লেষণ এজেন্ট সোর্স কোড: [আপনার (এখন সর্বজনীন) গিটহাব রেপোর লিঙ্ক]

জাভা নমুনা এজেন্ট: [adk-samples repo এর লিঙ্ক]

ADK কমিউনিটিতে যোগদান করুন: https://www.reddit.com/r/agentdevelopmentkit/

এজেন্ট তৈরির শুভকামনা!