সিম্বাল ট্রানজিট: LangChain4J এবং MCP টুলবক্স জাভা SDK ব্যবহার করে একটি মাল্টি এজেন্ট সিস্টেম

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

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

এই ল্যাবে, আমরা নিম্নলিখিত উপাদানগুলো ব্যবহার করে সিম্বাল ট্রানজিট এজেন্ট তৈরি করব:

  • LangChain4j: এআই অর্কেস্ট্রেশনের জন্য সর্বশ্রেষ্ঠ জাভা ফ্রেমওয়ার্ক।
  • AlloyDB: একটি উচ্চ কর্মক্ষমতা সম্পন্ন, PostgreSQL-এর সাথে সামঞ্জস্যপূর্ণ ডাটাবেস।
  • এমসিপি টুলবক্স জাভা এসডিকে: জাভা এজেন্টদের বাহ্যিক টুল এবং ডেটা উৎসের সাথে সংযুক্ত করার একটি প্রমিত পদ্ধতি।

আপনি যা তৈরি করবেন

e68388d533c9997e.png

সিম্বাল বাস এজেন্ট, একটি জাভা স্প্রিং বুট অ্যাপ্লিকেশন যা নিম্নলিখিত উপাদানগুলো নিয়ে গঠিত:

  1. এজেন্টদের সাথে টুল অর্কেস্ট্রেশনের জন্য AlloyDB ডাটাবেস এবং MCP টুলবক্স জাভা SDK।
  2. টুলবক্স ডেপ্লয়মেন্ট এবং অ্যাপ্লিকেশন (এজেন্ট ডেপ্লয়মেন্ট)-এর জন্য ক্লাউড রান।
  3. জাভা ১৭ সহ একটি স্প্রিং বুট অ্যাপ্লিকেশনে এজেন্ট এবং এলএলএম ফ্রেমওয়ার্কের জন্য ল্যাংচেইন৪জে (LangChain4J) লাইব্রেরি।

আপনি যা শিখবেন

  • MCP টুলবক্স ফর ডেটাবেসেস জাভা SDK ব্যবহার করে অর্কেস্ট্রেটেড বিশেষায়িত এজেন্ট এবং সাব-এজেন্ট তৈরি করতে কীভাবে LangChain4J ব্যবহার করবেন
  • ডেটা ও এআই-এর জন্য কীভাবে AlloyDB সেট আপ এবং ব্যবহার করবেন।
  • MCP টুলবক্স ব্যবহার করে কীভাবে এজেন্টদের AlloyDB ডেটা টুলের সাথে সংযুক্ত করবেন।
  • ক্লাউড রান ব্যবহার করে কীভাবে সলিউশনটি ডেপ্লয় করবেন অথবা লোকালি চালাবেন।

স্থাপত্য

  1. AlloyDB for PostgreSQL: এটি একটি উচ্চ-ক্ষমতাসম্পন্ন অপারেশনাল ডেটাবেস হিসেবে কাজ করে, যেখানে আমাদের রুট, পলিসি এবং বুকিংয়ের রেকর্ড সংরক্ষিত থাকে। এটি ভেক্টর সার্চ এবং ডেটা পুনরুদ্ধারের কাজটি পরিচালনা করে।
  2. MCP টুলবক্স ফর ডেটাবেসেস জাভা SDK: এটি 'অর্কেস্ট্রেশন মায়েস্ট্রো' হিসেবে কাজ করে, AlloyDB ডেটাকে এক্সিকিউটেবল টুল হিসেবে প্রকাশ করে যা এজেন্টরা কল করতে পারে।

এমসিপি টুলবক্স জাভা এসডিকে এন্টারপ্রাইজ-গ্রেড অ্যাপ্লিকেশনগুলির জন্য আপনার ডাটাবেস টুলগুলির সাথে এজেন্টদের অনায়াসে সমন্বয় করা সম্ভব করে তোলে।

  1. LangChain4J: একটি ওপেন-সোর্স জাভা লাইব্রেরি যা জাভা অ্যাপ্লিকেশনগুলিতে লার্জ ল্যাঙ্গুয়েজ মডেল (LLM) একীভূতকরণকে সহজ করে। এটি চ্যাটবট, এজেন্ট এবং রিট্রিভাল-অগমেন্টেড জেনারেশন (RAG) সিস্টেম সহ কৃত্রিম বুদ্ধিমত্তা-চালিত অ্যাপ্লিকেশন তৈরির জন্য টুলস এবং অ্যাবস্ট্রাকশন প্রদান করে।
  2. ক্লাউড রান: একটি সম্পূর্ণ পরিচালিত সার্ভারলেস প্ল্যাটফর্ম যা আপনাকে যেকোনো ভাষা, যেকোনো লাইব্রেরি, যেকোনো বাইনারি ব্যবহার করে অনায়াসে এবং দ্রুত অ্যাপ বা ওয়েবসাইট তৈরি ও ডেপ্লয় করতে দেয়। আপনি আপনার পছন্দের ভাষা, ফ্রেমওয়ার্ক এবং লাইব্রেরি ব্যবহার করে কোড লিখতে পারেন, সেটিকে একটি কন্টেইনার হিসেবে প্যাকেজ করতে পারেন, "gcloud run deploy" কমান্ডটি চালাতে পারেন, এবং আপনার অ্যাপটি লাইভ হয়ে যাবে—প্রোডাকশনে চলার জন্য প্রয়োজনীয় সবকিছু সহ। কন্টেইনার তৈরি করা সম্পূর্ণ ঐচ্ছিক। আপনি যদি Go, Node.js, Python, Java, .NET Core, বা Ruby ব্যবহার করেন, তাহলে আপনি সোর্স-ভিত্তিক ডেপ্লয়মেন্ট বিকল্পটি ব্যবহার করতে পারেন, যা আপনার ব্যবহৃত ভাষার সেরা অনুশীলনগুলো অনুসরণ করে আপনার জন্য কন্টেইনারটি তৈরি করে দেবে।

প্রয়োজনীয়তা

  • একটি ব্রাউজার, যেমন ক্রোম বা ফায়ারফক্স
  • বিলিং সক্ষম একটি গুগল ক্লাউড প্রজেক্ট।
  • SQL এবং Java সম্পর্কে প্রাথমিক ধারণা।

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

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

  1. গুগল ক্লাউড কনসোলের প্রজেক্ট সিলেক্টর পেজে, একটি গুগল ক্লাউড প্রজেক্ট নির্বাচন করুন বা তৈরি করুন।
  2. আপনার ক্লাউড প্রোজেক্টের জন্য বিলিং চালু আছে কিনা তা নিশ্চিত করুন। কোনো প্রোজেক্টে বিলিং চালু আছে কিনা তা কীভাবে পরীক্ষা করবেন, তা জেনে নিন
  3. আপনি ক্লাউড শেল ব্যবহার করবেন, যা গুগল ক্লাউডে চালিত একটি কমান্ড-লাইন পরিবেশ। গুগল ক্লাউড কনসোলের শীর্ষে থাকা ‘Activate Cloud Shell’-এ ক্লিক করুন।

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

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

বিকল্পভাবে আপনি এর জন্য gcloud কমান্ড ব্যবহার করতে পারেন। gcloud কমান্ড এবং এর ব্যবহার সম্পর্কে জানতে ডকুমেন্টেশন দেখুন।

অপ্রত্যাশিত সমস্যা ও সমাধান

"ঘোস্ট প্রজেক্ট" সিন্ড্রোম

আপনি gcloud config set project চালিয়েছেন, কিন্তু কনসোল UI-তে আপনি আসলে একটি ভিন্ন প্রজেক্ট দেখছেন। উপরের বাম দিকের ড্রপডাউনে প্রজেক্ট আইডিটি যাচাই করুন!

বিলিং ব্যারিকেড

আপনি প্রজেক্টটি চালু করেছেন, কিন্তু বিলিং অ্যাকাউন্টটি দিতে ভুলে গেছেন। AlloyDB একটি উচ্চ-ক্ষমতাসম্পন্ন ইঞ্জিন; এর 'গ্যাস ট্যাঙ্ক' (বিলিং) খালি থাকলে এটি চালু হবে না।

এপিআই প্রচার বিলম্ব

আপনি "এপিআই সক্ষম করুন" এ ক্লিক করেছেন, কিন্তু কমান্ড লাইনে এখনও Service Not Enabled দেখাচ্ছে। ৬০ সেকেন্ড অপেক্ষা করুন। ক্লাউডের তার নিউরনগুলোকে সজাগ হতে কিছুটা সময় লাগে।

কোটা কোয়াগস

আপনি যদি একটি একেবারে নতুন ট্রায়াল অ্যাকাউন্ট ব্যবহার করেন, তাহলে AlloyDB ইনস্ট্যান্সের জন্য আপনার আঞ্চলিক কোটা শেষ হয়ে যেতে পারে। যদি us-central1 কাজ না করে, তাহলে us-east1 চেষ্টা করুন।

"লুকানো" পরিষেবা এজেন্ট

কখনও কখনও AlloyDB সার্ভিস এজেন্টকে স্বয়ংক্রিয়ভাবে aiplatform.user রোলটি দেওয়া হয় না । যদি আপনার SQL কোয়েরিগুলো পরে Gemini-র সাথে যোগাযোগ করতে না পারে, তবে সাধারণত এটিই এর কারণ হয়ে থাকে।

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

আমাদের অ্যাপ্লিকেশনের কেন্দ্রবিন্দুতে রয়েছে AlloyDB for PostgreSQL । আমরা এর শক্তিশালী ভেক্টর সক্ষমতা এবং সমন্বিত কলামার ইঞ্জিনকে কাজে লাগিয়ে ৫০,০০০-এরও বেশি SCM রেকর্ডের জন্য এমবেডিং তৈরি করেছি। এটি প্রায় রিয়েল-টাইম ভেক্টর বিশ্লেষণ সক্ষম করে, যার ফলে আমাদের এজেন্টরা মিলিসেকেন্ডের মধ্যে বিশাল ডেটাসেট জুড়ে ইনভেন্টরির অসঙ্গতি বা লজিস্টিকস ঝুঁকি শনাক্ত করতে পারে।

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

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

  1. নিচের বোতামটিতে ক্লিক করুন অথবা লিঙ্কটি কপি করে আপনার ব্রাউজারে পেস্ট করুন, যেখানে গুগল ক্লাউড কনসোল ব্যবহারকারী লগ ইন করা আছেন।

বিকল্পভাবে , আপনি আপনার প্রজেক্ট থেকে ক্লাউড শেল টার্মিনালে যেতে পারেন, যেখানে আপনি বিলিং অ্যাকাউন্টটি রিডিম করেছেন, এবং নিচের কমান্ডগুলো ব্যবহার করে গিটহাব রিপোটি ক্লোন করে প্রজেক্টটিতে নেভিগেট করতে পারেন:

git clone https://github.com/AbiramiSukumaran/easy-alloydb-setup

cd easy-alloydb-setup
  1. এই ধাপটি সম্পন্ন হলে রিপোটি আপনার লোকাল ক্লাউড শেল এডিটরে ক্লোন করা হবে এবং আপনি প্রজেক্ট ফোল্ডার থেকে নিচের কমান্ডটি চালাতে পারবেন (আপনাকে অবশ্যই প্রজেক্ট ডিরেক্টরিতে থাকতে হবে):
sh run.sh
  1. এখন UI ব্যবহার করুন (টার্মিনালে থাকা লিঙ্কে ক্লিক করে অথবা টার্মিনালে থাকা 'preview on web' লিঙ্কে ক্লিক করে)।
  2. শুরু করার জন্য আপনার প্রজেক্ট আইডি, ক্লাস্টার এবং ইনস্ট্যান্সের নামগুলোর বিবরণ লিখুন।
  3. লগগুলো স্ক্রল হতে হতে আপনি এক কাপ কফি নিয়ে আসুন এবং পর্দার আড়ালে এটি কীভাবে কাজ করছে তা এখানে পড়ে নিন।

অপ্রত্যাশিত সমস্যা ও সমাধান

"ধৈর্য" সমস্যা

ডাটাবেস ক্লাস্টার একটি ভারী অবকাঠামো। যদি আপনি পৃষ্ঠাটি রিফ্রেশ করেন বা ক্লাউড শেল সেশনটি "আটকে গেছে" ভেবে বন্ধ করে দেন, তাহলে এর ফলে একটি "ঘোস্ট" ইনস্ট্যান্স তৈরি হতে পারে যা আংশিকভাবে প্রোভিশন করা এবং ম্যানুয়াল হস্তক্ষেপ ছাড়া মুছে ফেলা অসম্ভব।

অঞ্চলের অমিল

আপনি যদি us-central1 এ আপনার API-গুলো সক্রিয় করে asia-south1 এ ক্লাস্টারটি প্রোভিশন করার চেষ্টা করেন, তাহলে আপনি কোটা সংক্রান্ত সমস্যা বা সার্ভিস অ্যাকাউন্টের অনুমতি পেতে বিলম্বের সম্মুখীন হতে পারেন। পুরো ল্যাবের জন্য একটি অঞ্চলেই সীমাবদ্ধ থাকুন!

জম্বি ক্লাস্টার

যদি আপনি আগে কোনো ক্লাস্টারের জন্য একই নাম ব্যবহার করে থাকেন এবং সেটি মুছে না ফেলেন, তাহলে স্ক্রিপ্টটি বলতে পারে যে ক্লাস্টারের নামটি ইতিমধ্যেই বিদ্যমান। একটি প্রোজেক্টের মধ্যে ক্লাস্টারের নাম অবশ্যই অনন্য হতে হবে।

ক্লাউড শেল টাইমআউট

আপনার কফি বিরতি যদি ৩০ মিনিটের হয়, তাহলে ক্লাউড শেল স্লিপ মোডে চলে যেতে পারে এবং sh run.sh প্রসেসটির সংযোগ বিচ্ছিন্ন করে দিতে পারে। ট্যাবটি সক্রিয় রাখুন!

৪. স্কিমা প্রোভিশনিং

আপনার AlloyDB ক্লাস্টার এবং ইনস্ট্যান্স চালু হয়ে গেলে, AI এক্সটেনশনগুলি সক্রিয় করতে এবং স্কিমাটি প্রোভিশন করতে AlloyDB Studio SQL এডিটরে যান।

1e3ac974b18a8113.png

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

  • ব্যবহারকারীর নাম : " postgres "
  • ডাটাবেস : " postgres "
  • পাসওয়ার্ড : " alloydb " (অথবা তৈরির সময় আপনি যা সেট করেছিলেন)

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

28cb9a8b6aa0789f.png

আপনি এডিটর উইন্ডোতে AlloyDB-এর জন্য কমান্ড লিখবেন এবং প্রয়োজন অনুযায়ী Run, Format ও Clear অপশনগুলো ব্যবহার করবেন।

এক্সটেনশনগুলি সক্ষম করুন

এই অ্যাপটি তৈরি করার জন্য, আমরা pgvector এবং google_ml_integration এক্সটেনশনগুলো ব্যবহার করব। pgvector এক্সটেনশনটি আপনাকে ভেক্টর এমবেডিং সংরক্ষণ এবং অনুসন্ধান করার সুযোগ দেয়। google_ml_integration এক্সটেনশনটি এমন সব ফাংশন সরবরাহ করে যা ব্যবহার করে আপনি Vertex AI প্রেডিকশন এন্ডপয়েন্টগুলো অ্যাক্সেস করে SQL-এ প্রেডিকশন পেতে পারেন। নিম্নলিখিত DDL-গুলো রান করে এই এক্সটেনশনগুলো সক্রিয় করুন :

CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector;

অনুমতি প্রদান করুন

'embedding' ফাংশনটিতে execute অনুমোদন দিতে নিচের স্টেটমেন্টটি চালান:

GRANT EXECUTE ON FUNCTION embedding TO postgres;

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

Google Cloud 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"

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

আপনি AlloyDB Studio-তে নিচের DDL স্টেটমেন্টটি ব্যবহার করে একটি টেবিল তৈরি করতে পারেন:

DROP TABLE IF EXISTS transit_policies;
DROP TABLE IF EXISTS bus_schedules;
DROP TABLE IF EXISTS bookings;

-- Table 1: Transit Policies (Unstructured Data for RAG)
CREATE TABLE transit_policies (
    policy_id SERIAL PRIMARY KEY,
    category VARCHAR(50),
    policy_text TEXT,
    policy_embedding vector(768) 
);

-- Table 2: Intercity Bus Schedules (Structured Data)
CREATE TABLE bus_schedules (
    trip_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    origin_city VARCHAR(100),
    destination_city VARCHAR(100),
    departure_time TIMESTAMP,
    arrival_time TIMESTAMP,
    available_seats INT DEFAULT 50,
    ticket_price DECIMAL(6,2)
);

-- Table 3: Booking Ledger (Transactional Action Data)
CREATE TABLE bookings (
    booking_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    trip_id UUID REFERENCES bus_schedules(trip_id),
    passenger_id VARCHAR(100),
    status VARCHAR(20) DEFAULT 'CONFIRMED',
    booking_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

policy_embedding কলামটি কিছু টেক্সট ফিল্ডের ভেক্টর মান সংরক্ষণের সুযোগ দেবে।

ডেটা ইনজেশন

সংশ্লিষ্ট টেবিলগুলিতে একসাথে অনেক রেকর্ড যোগ করতে নিচের SQL স্টেটমেন্টগুলো চালান:

  1. AlloyDB-তে নেটিভভাবে আনস্ট্রাকচার্ড পলিসি সন্নিবেশ করুন এবং রিয়েল এমবেডিং তৈরি করুন।
-- 1. Insert Unstructured Policies and GENERATE REAL EMBEDDINGS natively in AlloyDB

INSERT INTO transit_policies (category, policy_text, policy_embedding) 
VALUES 
('Pets', 'Service animals are always welcome. Small pets (under 25 lbs) are allowed in secure carriers for a $25 fee. Large dogs are not permitted on standard coaches.', embedding('text-embedding-005', 'Service animals are always welcome. Small pets (under 25 lbs) are allowed in secure carriers for a $25 fee. Large dogs are not permitted on standard coaches.')),
('Luggage', 'Each passenger is allowed one carry-on (up to 15 lbs) and two stowed bags (up to 50 lbs each) free of charge. Additional bags cost $15 each.', embedding('text-embedding-005', 'Each passenger is allowed one carry-on (up to 15 lbs) and two stowed bags (up to 50 lbs each) free of charge. Additional bags cost $15 each.')),
('Refunds', 'Tickets are fully refundable up to 24 hours before departure. Within 24 hours, tickets can be exchanged for travel credit only.', embedding('text-embedding-005', 'Tickets are fully refundable up to 24 hours before departure. Within 24 hours, tickets can be exchanged for travel credit only.'));
  1. generate_series ব্যবহার করে ৭ দিনের জন্য ২০০টিরও বেশি বাস্তবসম্মত সময়সূচী তৈরি করুন।
-- 2. Generate 200+ Realistic Schedules for the Next 7 Days using generate_series

INSERT INTO bus_schedules (origin_city, destination_city, departure_time, arrival_time, ticket_price, available_seats)
SELECT 
    origin,
    destination,
    -- Generate departures every 4 hours starting from tomorrow
    (CURRENT_DATE + 1) + (interval '4 hours' * seq) AS dep_time,
    (CURRENT_DATE + 1) + (interval '4 hours' * seq) + interval '4.5 hours' AS arr_time,
    ROUND((RANDOM() * 30 + 25)::numeric, 2) AS price, -- Random price between $25 and $55
    FLOOR(RANDOM() * 50 + 1) AS seats -- Random seats between 1 and 50
FROM 
    (VALUES 
        ('New York', 'Boston'), ('Boston', 'New York'),
        ('Philadelphia', 'Washington DC'), ('Washington DC', 'Philadelphia'),
        ('Seattle', 'Portland'), ('Portland', 'Seattle')
    ) AS routes(origin, destination)
CROSS JOIN generate_series(1, 40) AS seq; -- 6 routes * 40 time slots = 240 distinct trips ingested!

এমবেডিং তৈরি করুন

" embedding('text-embedding-005', '<<policytext>>') " ফাংশনটি ব্যবহার করে transit_policies টেবিলে ডেটা ইনসার্ট করার স্টেটমেন্টে এমবেডিং স্বয়ংক্রিয়ভাবে অন্তর্ভুক্ত হয়ে যায়।

অপ্রত্যাশিত সমস্যা ও সমাধান

"পাসওয়ার্ড অ্যামনেসিয়া" লুপ

আপনি যদি "ওয়ান ক্লিক" সেটআপ ব্যবহার করে থাকেন এবং আপনার পাসওয়ার্ড মনে না থাকে, তাহলে কনসোলের ইনস্ট্যান্স বেসিক ইনফরমেশন পেজে গিয়ে postgres পাসওয়ার্ড রিসেট করার জন্য "এডিট"-এ ক্লিক করুন।

"এক্সটেনশন খুঁজে পাওয়া যায়নি" ত্রুটি

যদি CREATE EXTENSION ব্যর্থ হয়, তবে এর কারণ হলো ইনস্ট্যান্সটি প্রায়শই প্রাথমিক প্রোভিশনিং-এর পর থেকে "Maintenance" বা "Updating" অবস্থায় থাকে। ইনস্ট্যান্স তৈরির ধাপটি সম্পূর্ণ হয়েছে কিনা তা পরীক্ষা করুন এবং প্রয়োজনে কয়েক সেকেন্ড অপেক্ষা করুন।

আইএএম প্রচার সমস্যা

আপনি gcloud IAM কমান্ডটি চালিয়েছেন, কিন্তু পারমিশন ত্রুটির কারণে SQL CALL এখনও ব্যর্থ হচ্ছে। Google ব্যাকবোনের মাধ্যমে IAM পরিবর্তনগুলি কার্যকর হতে কিছুটা সময় লাগতে পারে । একটু অপেক্ষা করুন।*** গুরুতর:

  1. কখনও কখনও এমন হতে পারে যে আপনার AlloyDB সার্ভিস অ্যাকাউন্টটি, পারমিশন ধাপে আমরা যে ফরম্যাটটি ব্যবহার করেছি তার থেকে ভিন্ন দেখাচ্ছে। তাই AlloyDB সার্ভিস অ্যাকাউন্টটিতে Vertex AI ইউজার রোল আছে কিনা, সে বিষয়ে ১০০% নিশ্চিত হতে হলে : Google Cloud Console-এর AlloyDB ক্লাস্টার পেজে যান। আপনার ক্লাস্টারটিতে ক্লিক করুন এবং Overview ট্যাবে, Service Account লেবেলযুক্ত ফিল্ডটি খুঁজুন।
    মানটি কপি করুন এবং তারপর IAM-এ গিয়ে Vertex AI User Role-টি যোগ করুন।
  2. এছাড়াও, যদি আপনি "শুরু করার আগে" বিভাগের "এপিআই সক্ষম করুন" ধাপটি এড়িয়ে যান, তাহলে AlloyDB থেকে এমবেডিং অ্যাক্সেস করতে গিয়ে সমস্যার সম্মুখীন হবেন।

ভেক্টর মাত্রার অমিল

transit_policies টেবিলের policy_embedding কলামটি VECTOR(768) এ সেট করা আছে। আপনি যদি পরে একটি ভিন্ন মডেল (যেমন একটি 1536-ডাইমেনশনাল মডেল) ব্যবহার করার চেষ্টা করেন, তাহলে আপনার ইনসার্টগুলো জটিল হয়ে যাবে। text-embedding-005 ব্যবহার করুন।

প্রজেক্ট আইডি টাইপো

create_model কলে, আপনি যদি বন্ধনী « » বাদ দেন অথবা আপনার প্রজেক্ট আইডি ভুল টাইপ করেন, তাহলে মডেল রেজিস্ট্রেশনটি সফল দেখালেও প্রথম প্রকৃত কোয়েরির সময় ব্যর্থ হবে। আপনার স্ট্রিংটি পুনরায় ভালোভাবে যাচাই করুন!

৫. টুলস ও টুলবক্স সেটআপ

MCP টুলবক্স ফর ডেটাবেস হলো ডেটাবেসের জন্য একটি ওপেন সোর্স MCP সার্ভার। এটি কানেকশন পুলিং, অথেন্টিকেশন এবং আরও অনেক জটিল বিষয় সামলানোর মাধ্যমে আপনাকে আরও সহজে, দ্রুত এবং নিরাপদে টুল তৈরি করতে সক্ষম করে। টুলবক্স আপনাকে এমন জেন এআই (Gen AI) টুল তৈরি করতে সাহায্য করে, যা আপনার এজেন্টদেরকে আপনার ডেটাবেসের ডেটা অ্যাক্সেস করতে দেয়।

আমরা ডেটাবেসের জন্য মডেল কনটেক্সট প্রোটোকল (MCP) টুলবক্সকে 'পরিচালক' হিসেবে ব্যবহার করি। এটি আমাদের এজেন্ট এবং AlloyDB-এর মধ্যে একটি প্রমিত মিডলওয়্যার হিসেবে কাজ করে। একটি tools.yaml কনফিগারেশন সংজ্ঞায়িত করার মাধ্যমে, টুলবক্সটি স্বয়ংক্রিয়ভাবে জটিল ডেটাবেস অপারেশনগুলোকে পরিষ্কার, কার্যকর টুল হিসেবে প্রকাশ করে; যেমন find-bus-schedules and routes বা query-schedules for specific routes এবং book-ticket মতো স্বায়ত্তশাসিত কাজগুলো সম্পাদন করা। এর ফলে এজেন্ট লজিকের মধ্যে ম্যানুয়াল কানেকশন পুলিং বা বয়লারপ্লেট SQL-এর প্রয়োজনীয়তা দূর হয়।

টুলবক্স সার্ভার ইনস্টল করা হচ্ছে

আপনার ক্লাউড শেল টার্মিনাল থেকে, আপনার নতুন টুলস yaml ফাইল এবং টুলবক্স বাইনারি সংরক্ষণের জন্য একটি ফোল্ডার তৈরি করুন:

mkdir cymbal-bus-toolbox

cd cymbal-bus-toolbox

সেই নতুন ফোল্ডারটির ভেতর থেকে, নিম্নলিখিত কমান্ডগুলো চালান:

# see releases page for other versions
export VERSION=0.27.0
curl -L -o toolbox https://storage.googleapis.com/mcp-toolbox-for-databases/v$VERSION/linux/amd64/toolbox
chmod +x toolbox

এরপর ক্লাউড শেল এডিটর-এ প্রবেশ করে এই রিপো ফাইলের বিষয়বস্তুগুলো কপি করে সেই নতুন ফোল্ডারের ভিতরে tools.yaml ফাইলটি তৈরি করুন।

... (Refer to entire file in the repo)

tools:

   find-bus-schedules:
    kind: postgres-sql
    source: alloydb
    description: Find all available bus schedules.
    statement: |
      SELECT CAST(trip_id AS TEXT) trip_id, departure_time, arrival_time, ticket_price, available_seats , origin_city, destination_city 
      FROM bus_schedules;

   query-schedules:
    kind: postgres-sql
    source: alloydb
    description: Find available bus schedules between an origin and destination city.
    parameters:
      - name: origin
        type: string
        description: The departure city name.
      - name: destination
        type: string
        description: The arrival city name.
    statement: |
      SELECT CAST(trip_id AS TEXT) trip_id, departure_time, arrival_time, ticket_price, available_seats 
      FROM bus_schedules 
      WHERE lower(origin_city) = lower($1) 
        AND lower(destination_city) = lower($2) 
        AND available_seats > 0 
      ORDER BY departure_time ASC 
      LIMIT 5;

   book-ticket:
    kind: postgres-sql
    source: alloydb
    description: Books a ticket for a specific trip, decrementing available seats and generating a confirmed booking record.
    parameters:
      - name: trip_id
        type: string
        description: The UUID of the trip schedule to book.
      - name: passenger_name
        type: string
        description: Name or ID of the passenger (Bound securely via backend or AuthToken).
        authServices:
          - name: google_auth
            field: sub
    statement: |
      WITH updated_schedule AS (
          UPDATE bus_schedules 
          SET available_seats = available_seats - 1 
          WHERE trip_id = CAST($1 AS UUID) AND available_seats > 0
          RETURNING trip_id
      )
      INSERT INTO bookings (trip_id, passenger_id)
      SELECT trip_id, $2 
      FROM updated_schedule
      RETURNING CAST(booking_id as TEXT) as booking_id, trip_id, passenger_id, status, booking_time;

   search-policies:
    kind: postgres-sql
    source: alloydb
    description: Semantic search for transit policies regarding luggage, pets, refunds, and general rules.
    parameters:
      - name: search_query
        type: string
        description: The user's question about transit policies to be embedded and searched.
    statement: |
      SELECT category, policy_text 
      FROM transit_policies 
      ORDER BY policy_embedding <=> CAST(embedding('text-embedding-005', $1) AS vector(768))
      LIMIT 2;

দ্রষ্টব্য:

  1. tools.yaml সেটআপ করার সময়, alloydb সোর্স কনফিগারেশনে ipType: "private" অন্তর্ভুক্ত করতে ভুলবেন না।
  2. এছাড়াও authServices কনফিগারেশনের জন্য clientId প্যারামিটারে MCP টুলবক্স সার্ভিস URL অন্তর্ভুক্ত করতে মনে রাখবেন। আপনি হয়তো শুধুমাত্র প্রাথমিক ডেপ্লয়মেন্টের পরেই লিঙ্কটি পেতে পারেন - তাই, অথেনটিকেটেড টুলস ব্যবহারের ক্ষেত্রটি কাজ করছে কিনা তা নিশ্চিত করতে আপনাকে ডেপ্লয়মেন্ট ধাপগুলো দুইবার চালাতে হবে।
  3. আপনার AlloyDB কানেকশনটি প্রাইভেট করা থাকলে, টুলবক্সটি স্থানীয়ভাবে পরীক্ষা করার জন্য নিচের অপশনগুলো কাজ করবে না। স্থানীয়ভাবে পরীক্ষা করার জন্য আপনাকে কানেকশনটি পাবলিক করতে হবে অথবা কানেকশনের জন্য একটি প্রক্সি ব্যবহার করতে হবে। কিন্তু এ নিয়ে চিন্তার কোনো কারণ নেই । আমাদের ক্ষেত্রে, আমরা এটি সরাসরি ক্লাউড রান-এ ডেপ্লয় করে তারপর পরীক্ষা করব।

স্থানীয় সার্ভারে tools.yaml ফাইলটি পরীক্ষা করতে:

./toolbox --tools-file "tools.yaml"

বিকল্পভাবে আপনি UI-তে এটি পরীক্ষা করতে পারেন:

./toolbox --ui

চলুন, নিচের পদ্ধতি অনুসরণ করে ক্লাউড রান-এ এটি ডেপ্লয় করে ফেলি।

ক্লাউড রান ডিপ্লয়মেন্ট

  1. PROJECT_ID এনভায়রনমেন্ট ভেরিয়েবল সেট করুন:
export PROJECT_ID="my-project-id"
  1. gcloud CLI চালু করুন:
gcloud init
gcloud config set project $PROJECT_ID
  1. আপনার নিম্নলিখিত API গুলি সক্রিয় থাকতে হবে:
gcloud services enable run.googleapis.com \
                       cloudbuild.googleapis.com \
                       artifactregistry.googleapis.com \
                       iam.googleapis.com \
                       secretmanager.googleapis.com
  1. আপনার যদি আগে থেকে একটি ব্যাকএন্ড সার্ভিস অ্যাকাউন্ট না থাকে, তাহলে একটি তৈরি করুন:
gcloud iam service-accounts create toolbox-identity
  1. সিক্রেট ম্যানেজার ব্যবহারের অনুমতি দিন:
gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member serviceAccount:toolbox-identity@$PROJECT_ID.iam.gserviceaccount.com \
    --role roles/secretmanager.secretAccessor
  1. সার্ভিস অ্যাকাউন্টকে আমাদের AlloyDB সোর্সের জন্য নির্দিষ্ট অতিরিক্ত অনুমতিগুলো (roles/alloydb.client এবং roles/serviceusage.serviceUsageConsumer) প্রদান করুন।
gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member serviceAccount:toolbox-identity@$PROJECT_ID.iam.gserviceaccount.com \
    --role roles/alloydb.client


gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member serviceAccount:toolbox-identity@$PROJECT_ID.iam.gserviceaccount.com \
    --role roles/serviceusage.serviceUsageConsumer
  1. tools.yaml ফাইলটিকে সিক্রেট হিসেবে আপলোড করুন:
gcloud secrets create tools-cymbal-transit --data-file=tools.yaml
  1. আপনার যদি আগে থেকেই একটি সিক্রেট থাকে এবং আপনি সেটির ভার্সন আপডেট করতে চান, তাহলে নিম্নলিখিতটি সম্পাদন করুন:
gcloud secrets versions add tools-cymbal-transit --data-file=tools.yaml
  1. ক্লাউড রানের জন্য আপনি যে কন্টেইনার ইমেজটি ব্যবহার করতে চান, সেটির জন্য একটি এনভায়রনমেন্ট ভেরিয়েবল সেট করুন:
export IMAGE=us-central1-docker.pkg.dev/database-toolbox/toolbox/toolbox:latest
  1. নিম্নলিখিত কমান্ড ব্যবহার করে টুলবক্সকে ক্লাউড রানে স্থাপন করুন:

আপনার AlloyDB ইনস্ট্যান্সে যদি পাবলিক অ্যাক্সেস চালু করা থাকে, তাহলে Cloud Run-এ ডেপ্লয়মেন্টের জন্য নিচের কমান্ডটি অনুসরণ করুন:

gcloud run deploy toolbox-cymbal-transit \
    --image $IMAGE \
    --service-account toolbox-identity \
    --region us-central1 \
    --set-secrets "/app/tools.yaml=tools-cymbal-transit:latest" \
    --args="--tools-file=/app/tools.yaml","--address=0.0.0.0","--port=8080" \
    --allow-unauthenticated

আপনি যদি VPC নেটওয়ার্ক ব্যবহার করেন, তাহলে নিচের কমান্ডটি ব্যবহার করুন:

gcloud run deploy toolbox-cymbal-transit \
    --image $IMAGE \
    --service-account toolbox-identity \
    --region us-central1 \
    --set-secrets "/app/tools.yaml=tools-cymbal-transit:latest" \
    --args="--tools-file=/app/tools.yaml","--address=0.0.0.0","--port=8080" \
    --network <<YOUR_NETWORK_NAME>> \
    --subnet <<YOUR_SUBNET_NAME>> \
    --allow-unauthenticated

দ্রষ্টব্য: একবার ডেপ্লয় করা হয়ে গেলে ক্লাউড রান সার্ভিস লিস্টে যান এবং নিশ্চিত করুন যে সেই সার্ভিসের সিকিউরিটি ট্যাবে "Allow public access" অপশনটি সিলেক্ট করা আছে।

৬. এজেন্ট অ্যাপ্লিকেশন সেটআপ

এই রিপোটি আপনার প্রজেক্টে ক্লোন করুন এবং চলুন বিষয়টি ধাপে ধাপে দেখি।

গিটহাব রিপো

এটি ক্লোন করতে, আপনার ক্লাউড শেল টার্মিনাল থেকে (রুট ডিরেক্টরিতে অথবা যেখান থেকে আপনি এই প্রজেক্টটি তৈরি করতে চান), নিম্নলিখিত কমান্ডটি চালান:

git clone https://github.com/googleapis/mcp-toolbox-sdk-java

উপরের এই কমান্ডটি আসলে পুরো mcp-toolbox-sdk-java-টি ক্লোন করে। আমাদের শুধু এর থেকে স্যাম্পল প্রজেক্টটি দরকার। তাই রিপোটির ভেতরে প্রজেক্টটির রুট ডিরেক্টরিতে যান:

cd mcp-toolbox-sdk-java/demo-applications/cymbal-transit
  1. এতে প্রজেক্টটি তৈরি হয়ে যাবে এবং আপনি ক্লাউড শেল এডিটর-এ তা যাচাই করতে পারবেন।

a494664032904c77.png

  1. CymbalTransitController.java ফাইলটি খুলুন এবং এনভায়রনমেন্ট ভেরিয়েবল সেট করুন:
  2. জিসিপি_প্রজেক্ট_আইডি
  3. জিসিপি_অঞ্চল
  4. মিথুন_মডেলের_নাম
  5. MCP_TOOLBOX_URL

বিকল্পভাবে (শুধুমাত্র উন্নয়নের উদ্দেশ্যে) আপনি সংশ্লিষ্ট ফলব্যাক ভ্যালু প্লেসহোল্ডারগুলোও প্রতিস্থাপন করতে পারেন।

৭. কোড ওয়াকথ্রু

CymbalTransitController আমাদের Cloud Run সার্ভিসের প্রবেশদ্বার হিসেবে কাজ করে। এটি কথোপকথনের প্রবাহ পরিচালনা করে এবং এজেন্ট যাতে ব্যবহারকারীর বর্তমান অনুরোধে প্রবেশাধিকার পায়, তা নিশ্চিত করে।

বাস্তবায়নটি একটি স্তরযুক্ত স্থাপত্য অনুসরণ করে যা এআই অর্কেস্ট্রেশন, টুল ব্রিজিং এবং নিম্ন-স্তরের এমসিপি যোগাযোগকে পৃথক করে।

১. এআই এজেন্ট কনফিগারেশন ( AgentConfiguration )

এই ক্লাসটি AI কম্পোনেন্টগুলো বুটস্ট্র্যাপ করার জন্য Spring-এর @Configuration ব্যবহার করে। এটি VertexAiGeminiChatModel- কে ইনিশিয়ালাইজ করে এবং এটিকে আমাদের Agent ইন্টারফেসের সাথে বাইন্ড করে।

@Bean
ChatLanguageModel geminiChatModel() {
    return VertexAiGeminiChatModel.builder()
        .project(projectId)
        .location(region)
        .modelName(modelName)
        .build();
}

@Bean
TransitAgent transitAgent(ChatLanguageModel chatLanguageModel, TransitAgentTools tools) {
    return AiServices.builder(TransitAgent.class)
        .chatLanguageModel(chatLanguageModel)
        .chatMemoryProvider(memoryId -> MessageWindowChatMemory.withMaxMessages(20))
        .tools(tools) 
        .build();
}

গুরুত্ব: AiServices ইন্টারফেসটিকে LLM-এর সাথে সংযুক্ত করে। MessageWindowChatMemory নিশ্চিত করে যে এজেন্ট একটি একক সেশনের মধ্যে ২০টি পর্যন্ত বার্তার জন্য ব্যবহারকারীর পছন্দসমূহ (যেমন পূর্বে উল্লিখিত পোষা প্রাণী বহনকারী) মনে রাখে।

২. এআই এজেন্ট ইন্টারফেস ( TransitAgent )

@SystemMessage অ্যানোটেশনটি "পার্সোনা" এবং অপারেশনাল সীমাবদ্ধতা, বিশেষত একটি রাউটিং স্ট্র্যাটেজি , সংজ্ঞায়িত করে।

@SystemMessage({
    "You are the Cymbal Transit Concierge.",
    "CRITICAL INSTRUCTION: On your very first interaction, you MUST use the 'findAllSchedules' tool to fetch and memorize the broad bus routes.",
    "ONLY if the user asks a specifically narrowed-down question... should you route to the specific tools like 'querySchedules', 'bookTicket', 'searchPolicies'.",
    "Don't show any asterisks while listing results. Keep it formatted and numbered or bulleted."
})
String chat(@MemoryId String sessionId, @UserMessage String userMessage);

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

৩. টুলবক্স ব্রিজ ( TransitAgentTools )

এই পরিষেবাটি এজেন্টের 'হাত' হিসেবে কাজ করে, যা LangChain4j টুল কলগুলোকে এক্সিকিউশন লজিকে রূপান্তরিত করে।

@Tool("Fetches the initial, broad dataset of all available bus schedules and routes.")
public String findAllSchedules() {
    return mcpService.findAllSchedules().join();
}


@Tool("Book a ticket for a passenger using a specific trip ID.")
public String bookTicket(String tripId, String passengerName) {
    return mcpService.bookTicket(tripId, passengerName).join();
}

সিঙ্ক্রোনাস এক্সিকিউশন: যদিও MCP কলগুলো অ্যাসিঙ্ক্রোনাস ( CompletableFuture রিটার্ন করে), LLM-এর তার "চিন্তা" প্রক্রিয়া চালিয়ে যাওয়ার জন্য একটি ফলাফলের প্রয়োজন হয়। এজেন্টের কাছে সিঙ্ক্রোনাস ফলাফল ফেরত দেওয়ার জন্য আমরা .join() ব্যবহার করি।

৪. এমসিপি টুলবক্স সার্ভিস ( McpToolboxService )

এটি হলো যোগাযোগ স্তর, যা AlloyDB ব্যাকএন্ডের সাথে যোগাযোগের জন্য MCP টুলবক্স জাভা SDK ব্যবহার করে।

// Identity Management: Fetching OIDC ID Token for Auth
GoogleCredentials credentials = GoogleCredentials.getApplicationDefault();
this.idToken = ((IdTokenProvider) credentials)
    .idTokenWithAudience(targetUrl, Collections.emptyList())
    .getTokenValue();

// Dynamic Invocation: Executing a tool by name
public CompletableFuture<String> findAllSchedules() {
    return mcpClient.invokeTool("find-bus-schedules", Collections.emptyMap()).thenApply(result -> {
        return result.content().stream()
            .map(content -> content.text())
            .collect(Collectors.joining(", ", "[", "]"));
    });
}

গুরুত্ব: McpToolboxClient JSON-RPC যোগাযোগের মূল কাজগুলো সামলায়। বিশেষ করে bookTicket মেথডটি ডায়নামিকভাবে জটিল প্যারামিটার বাইন্ড করার ক্ষেত্রে SDK-টির সক্ষমতা প্রদর্শন করে।

৫. REST কন্ট্রোলার ( TransitAgentController )

চূড়ান্ত ফলাফলটি আমূল সরলীকৃত হয়, কারণ LangChain4j এর স্টেট এবং লজিক পরিচালনা করে।

@PostMapping("/chat")
public ResponseEntity<String> handleUserChat(@RequestBody String userMessage, HttpSession session) {
    String sessionId = session.getId();
    String agentResponse = transitAgent.chat(sessionId, userMessage);
    return ResponseEntity.ok(agentResponse);
}

গুরুত্ব: HttpSession ID-কে @MemoryId সাথে ম্যাপ করার মাধ্যমে আমরা নিশ্চিত করি যে বিভিন্ন ব্যবহারকারীর ভ্রমণ পরিকল্পনা যেন গুলিয়ে না যায়, এবং একই সাথে কন্ট্রোলার কোডও পরিচ্ছন্ন ও পাঠযোগ্য থাকে।

৮. এমসিপি টুলবক্স: তাৎপর্য এবং জাভা এসডিকে

এমসিপি কী?

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

ডেটাবেসের জন্য এমসিপি টুলবক্স

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

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

জাভা এসডিকে কেন?

এমসিপি টুলবক্স জাভা এসডিকে জাভা ডেভেলপারদের নিম্নলিখিত কাজগুলো করতে দেয়:

  1. টুল ব্যবহার: একটি MCP সার্ভারের (যেমন AlloyDB-এর জন্য MCP টুলবক্স) সাথে সংযোগ করুন এবং স্বয়ংক্রিয়ভাবে এর সক্ষমতাগুলোকে LangChain4j-এর বোধগম্য জাভা মেথডে রূপান্তর করুন।
  2. টাইপ সেফটি: টুল প্যারামিটারের জন্য জাভার স্ট্রং টাইপিং ব্যবহার করুন, যা টুল কলে রানটাইম "হ্যালুসিনেশন" ত্রুটি হ্রাস করে।
  3. এন্টারপ্রাইজ প্রস্তুতি: Spring Boot, Quarkus, Micronaut ইত্যাদির সাথে সহজে ইন্টিগ্রেট করা যায়।
  4. অনায়াসে সংযোগ স্থাপন করুন: গতানুগতিক JSON-RPC কোড লেখা পরিহার করুন।
  5. প্রমাণীকরণের মানসম্মতকরণ: গুগল ক্লাউড OIDC টোকেনের জন্য নেটিভ সাপোর্ট টুলের নিরাপদ নির্বাহ নিশ্চিত করে।

এবং আরও অনেক কিছু

নির্ভরতা: pom.xml কনফিগারেশন

সর্বশেষ MCP টুলবক্স জাভা SDK অন্তর্ভুক্ত করতে আপনার Maven প্রজেক্টে নিম্নলিখিত ডিপেন্ডেন্সিটি যোগ করুন:

   <dependency>
        <groupId>com.google.cloud.mcp</groupId>
        <artifactId>mcp-toolbox-sdk-java</artifactId>
        <version>0.2.0</version>
    </dependency>

LangChain4j আর্টিফ্যাক্টটি অন্তর্ভুক্ত করতে আপনার Maven প্রজেক্টে নিম্নলিখিত ডিপেন্ডেন্সিটি যোগ করুন:

     <!-- LangChain4j Core & Gemini -->
    <dependency>
        <groupId>dev.langchain4j</groupId>
        <artifactId>langchain4j</artifactId>
        <version>0.35.0</version>
    </dependency>

এই তো!!! আমরা সফলভাবে প্রজেক্টটি ক্লোন করেছি এবং এজেন্ট, এমসিপি টুলবক্স জাভা এসডিকে ও কনটেক্সট-এর বিস্তারিত বিষয়গুলো আলোচনা করেছি।

৯. স্থানীয়ভাবে দৌড়ানো

আপনার মেশিনে এজেন্টটি পরীক্ষা করার জন্য, আপনাকে এটিকে আপনার ডেপ্লয় করা এমসিপি টুলবক্স সার্ভারের সাথে সংযুক্ত করতে হবে।

  1. পরিবেশ ভেরিয়েবল সেট করুন:
export GCP_PROJECT_ID="<<YOUR_PROJECT_ID>>"
export GCP_REGION="us-central1"
export GEMINI_MODEL_NAME="gemini-2.5-flash"
export MCP_TOOLBOX_URL="<<YOUR_TOOLBOX_ENDPOINT_URL>>/mcp"
  1. Maven দিয়ে চালান:
mvn compile

mvn spring-boot:run

এটি আপনার এজেন্টকে স্থানীয়ভাবে চালু করবে এবং আপনি এটি পরীক্ষা করতে পারবেন।

১০. চলুন এটি ক্লাউড রানে ডেপ্লয় করি।

প্রজেক্টটি যেখানে ক্লোন করা হয়েছে, সেখানকার ক্লাউড শেল টার্মিনাল থেকে নিম্নলিখিত কমান্ডটি চালিয়ে ক্লাউড রান-এ এটি ডিপ্লয় করুন এবং নিশ্চিত করুন যে আপনি প্রজেক্টটির রুট ফোল্ডারের ভিতরে আছেন

আপনি যদি আমাদের বর্তমান প্রজেক্টের রুট ফোল্ডারে না থাকেন, তাহলে আপনার ক্লাউড শেল টার্মিনালে এটি চালান:

cd cymbal-transit

আপনি যদি ইতিমধ্যেই cymbal-transit রুটে থাকেন, তাহলে Cloud Run-এ সরাসরি অ্যাপটি ডেপ্লয় করতে নিচের কমান্ডটি চালান:

gcloud run deploy cymbal-transit --source . --set-env-vars GCP_PROJECT_ID=<<YOUR_PROJECT_ID>>,GCP_REGION=us-central1,GEMINI_MODEL_NAME=gemini-2.5-flash,MCP_TOOLBOX_URL=<<YOUR_MCP_TOOLBOX_URL>> --allow-unauthenticated

<<YOUR_PROJECT>> and <<YOUR_MCP_TOOLBOX_URL>> প্লেসহোল্ডারগুলির মান প্রতিস্থাপন করুন।

কমান্ডটি শেষ হলে এটি একটি সার্ভিস ইউআরএল (Service URL) দেবে। সেটি কপি করুন।

ক্লাউড রান সার্ভিস অ্যাকাউন্টকে AlloyDB ক্লায়েন্ট রোলটি প্রদান করুন। এর ফলে আপনার সার্ভারলেস অ্যাপ্লিকেশনটি নিরাপদে ডাটাবেসে টানেল করতে পারবে।

আপনার ক্লাউড শেল টার্মিনালে এটি চালান:

# 1. Get your Project ID and Project Number
PROJECT_ID=$(gcloud config get-value project)
PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")

# 2. Grant the AlloyDB Client role
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
--role="roles/alloydb.client"

দ্রষ্টব্য: একবার ডেপ্লয় করা হয়ে গেলে ক্লাউড রান সার্ভিস লিস্টে যান এবং নিশ্চিত করুন যে সেই সার্ভিসের সিকিউরিটি ট্যাবে "Allow public access" অপশনটি সিলেক্ট করা আছে।

এখন সার্ভিস ইউআরএলটি (আগে কপি করা ক্লাউড রান এন্ডপয়েন্ট) ব্যবহার করে অ্যাপটি পরীক্ষা করুন।

দ্রষ্টব্য: যদি আপনি কোনো পরিষেবা সংক্রান্ত সমস্যার সম্মুখীন হন এবং কারণ হিসেবে মেমরির কথা উল্লেখ থাকে, তবে তা পরীক্ষা করার জন্য বরাদ্দকৃত মেমরির সীমা ১ GiB পর্যন্ত বাড়িয়ে দেখতে পারেন।

১১. ডেমো

এজেন্টকে জিজ্ঞাসা করুন: "আমাকে আগামীকাল সকালে নিউ ইয়র্ক থেকে বস্টন যেতে হবে। আমি কি আমার গোল্ডেন রিট্রিভারটিকে সাথে আনতে পারি?" লক্ষ্য করুন এজেন্ট কীভাবে:

  1. বড় কুকুরের জন্য নীতিমালা অনুসন্ধান করে।
  2. নির্দিষ্ট সময়সূচী খুঁজে বের করে।
  3. ট্রিপ আইডি সহ দ্রুততম ট্রিপটির সারসংক্ষেপ দেয়।
  4. আপনি সেই অ্যাকশন রিকোয়েস্টটি ফলো-আপ করলে একটি টিকিটও বুক করা হয়।

aa0408a81074d0fc.png

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

এই ল্যাবটি সম্পন্ন হয়ে গেলে, alloyDB ক্লাস্টার এবং ইনস্ট্যান্সটি ডিলিট করতে ভুলবেন না।

এটি ক্লাস্টারটিকে তার ইনস্ট্যান্স(গুলি) সহ পরিষ্কার করে দেবে।

১৩. অভিনন্দন

আপনি সফলভাবে একটি অত্যাধুনিক জাভা-ভিত্তিক ট্রানজিট এজেন্ট তৈরি করেছেন। অর্কেস্ট্রেশনের জন্য LangChain4j এবং ডেটা কানেক্টিভিটির জন্য MCP টুলবক্স জাভা SDK ব্যবহার করে, আপনি এমন একটি সিস্টেম তৈরি করেছেন যা বিভিন্ন এজেন্ট, টুল এবং ডেটা সোর্সের মধ্যে সমন্বয় সাধন করতে পারে। আপনি যদি একাধিক ডেটাবেস, এমনকি বিভিন্ন প্ল্যাটফর্মের মধ্যে MCP টুলবক্স ফর ডেটাবেস ব্যবহার করে আপনার এজেন্টিক অ্যাপ্লিকেশনগুলোর অর্কেস্ট্রেশন শুরু করতে চান, তাহলে আজই জাভা SDK ব্যবহার শুরু করুন! এখানে লঞ্চ ঘোষণার ব্লগটি রয়েছে, যেখানে লাইব্রেরিটি সম্পর্কে আরও বিস্তারিত তথ্য দেওয়া আছে । আপনি যদি এই ধরনের আরও অ্যাপ্লিকেশন হাতে-কলমে, বিনামূল্যে, নিজের গতিতে এবং প্রশিক্ষকের নির্দেশনায় তৈরি করতে চান, তাহলে https://codevipassana.dev -এ কোড বিপাসনা-র জন্য সাইন আপ করুন!!!