১. ভূমিকা
এই কোডল্যাবটি আপনাকে দেখাবে কিভাবে আপনার Agentic অ্যাপ্লিকেশনে RAG সক্রিয় করতে Gemini File Search ব্যবহার করতে হয়। আপনি চাংকিং, এমবেডিং বা ভেক্টর ডেটাবেসের খুঁটিনাটি বিষয় নিয়ে চিন্তা না করেই আপনার ডকুমেন্টগুলো ইনজেস্ট ও ইনডেক্স করতে Gemini File Search ব্যবহার করবেন।
আপনি যা শিখবেন
- RAG-এর মূল বিষয়গুলো এবং কেন আমাদের এটি প্রয়োজন।
- জেমিনি ফাইল সার্চ কী এবং এর সুবিধাগুলো।
- কীভাবে একটি ফাইল সার্চ স্টোর তৈরি করবেন।
- ফাইল সার্চ স্টোরে কীভাবে আপনার নিজস্ব ফাইলগুলো আপলোড করবেন।
- RAG-এর জন্য জেমিনি ফাইল সার্চ টুল কীভাবে ব্যবহার করবেন
- গুগল এজেন্ট ডেভেলপমেন্ট কিট (ADK) ব্যবহারের সুবিধাসমূহ।
- ADK ব্যবহার করে নির্মিত একটি এজেন্টিক সলিউশনে জেমিনি ফাইল সার্চ টুল কীভাবে ব্যবহার করবেন।
- গুগল সার্চের মতো গুগলের নিজস্ব টুলগুলোর পাশাপাশি জেমিনি ফাইল সার্চ টুল কীভাবে ব্যবহার করবেন।
আপনি যা করবেন
- একটি গুগল ক্লাউড প্রজেক্ট তৈরি করুন এবং আপনার ডেভেলপমেন্ট এনভায়রনমেন্ট সেট আপ করুন।
- Google Gen AI SDK (কিন্তু ADK ছাড়া) ব্যবহার করে একটি সহজ Gemini-ভিত্তিক এজেন্ট তৈরি করুন, যেটি Google সার্চ ব্যবহার করতে পারবে, কিন্তু RAG সক্ষমতা থাকবে না।
- বিশেষভাবে তৈরি তথ্যের ক্ষেত্রে নির্ভুল ও উচ্চমানের তথ্য প্রদানে এর অক্ষমতা প্রদর্শন করুন।
- একটি জেমিনি ফাইল সার্চ স্টোর তৈরি ও পরিচালনার জন্য একটি জুপিটার নোটবুক তৈরি করুন (যা আপনি স্থানীয়ভাবে বা, ধরা যাক, গুগল কোলাবে চালাতে পারবেন)।
- ফাইল সার্চ স্টোরে নিজস্ব কন্টেন্ট আপলোড করতে নোটবুকটি ব্যবহার করুন।
- এমন একটি এজেন্ট তৈরি করুন যাতে ফাইল সার্চ স্টোর সংযুক্ত আছে, এবং প্রমাণ করুন যে এটি আরও ভালো প্রতিক্রিয়া দিতে সক্ষম।
- আমাদের প্রাথমিক 'বেসিক' এজেন্টকে গুগল সার্চ টুলসহ একটি ADK এজেন্টে রূপান্তর করুন।
- ADK ওয়েব UI ব্যবহার করে এজেন্টটি পরীক্ষা করুন।
- এজেন্ট-অ্যাজ-এ-টুল প্যাটার্ন ব্যবহার করে ADK এজেন্টের মধ্যে ফাইল সার্চ স্টোরকে অন্তর্ভুক্ত করুন, যাতে আমরা গুগল সার্চ টুলের পাশাপাশি ফাইল সার্চ টুলটিও ব্যবহার করতে পারি।
২. র্যাগ কী এবং কেন আমাদের এটি প্রয়োজন
সুতরাং... পুনরুদ্ধার বর্ধিত প্রজন্ম ।
আপনি যেহেতু এখানে আছেন, সম্ভবত আপনি জানেন এটি কী, তবুও নিশ্চিত হওয়ার জন্য চলুন আরেকবার সংক্ষেপে দেখে নেওয়া যাক। এলএলএম-রা (মিথুন রাশির মতো) অত্যন্ত মেধাবী, কিন্তু তারা কয়েকটি সমস্যায় ভোগেন:
- সেগুলো সবসময় সেকেলে হয় : তারা শুধু প্রশিক্ষণের সময় যা শিখেছে, তাই জানে।
- তারা সবকিছু জানে না : হ্যাঁ, মডেলগুলো বিশাল, কিন্তু তারা সর্বজ্ঞ নয়।
- তারা আপনার গোপনীয় তথ্য জানে না : তাদের ব্যাপক জ্ঞান আছে, কিন্তু তারা আপনার অভ্যন্তরীণ নথি, আপনার ব্লগ বা আপনার জিরা টিকিটগুলো পড়েনি।
তাই যখন আপনি কোনো মডেলকে এমন কিছু জিজ্ঞাসা করেন যার উত্তর সে জানে না, তখন আপনি সাধারণত একটি ভুল বা এমনকি মনগড়া উত্তর পাবেন। প্রায়শই, মডেলটি এই ভুল উত্তরটি বেশ আত্মবিশ্বাসের সাথেই বলে দেয়। একেই আমরা হ্যালুসিনেশন বলে থাকি।
একটি সমাধান হলো আমাদের গোপনীয় তথ্য সরাসরি কথোপকথনের প্রসঙ্গে যুক্ত করে দেওয়া । অল্প পরিমাণ তথ্যের জন্য এটি ঠিক আছে, কিন্তু যখন তথ্যের পরিমাণ অনেক বেশি হয়, তখন এটি দ্রুত সমস্যা তৈরি করে। বিশেষত, এর ফলে নিম্নলিখিত সমস্যাগুলো দেখা দেয়:
- লেটেন্সি : মডেল থেকে ক্রমশ ধীরতর প্রতিক্রিয়া।
- সিগন্যাল রট , যা "মাঝপথে হারিয়ে যাওয়া" নামেও পরিচিত: এমন একটি অবস্থা যেখানে মডেলটি অপ্রয়োজনীয় ডেটা থেকে প্রাসঙ্গিক ডেটা আলাদা করতে আর সক্ষম হয় না। মডেলটি ডেটার প্রেক্ষাপটের বেশিরভাগ অংশই উপেক্ষা করে।
- খরচ : কারণ টোকেন কিনতে টাকা লাগে।
- প্রসঙ্গ উইন্ডো নিঃশেষিত : এই পর্যায়ে, জেমিনি আপনার অনুরোধগুলোর ওপর কোনো ব্যবস্থা নেবে না।
এই পরিস্থিতি প্রতিকারের একটি অনেক বেশি কার্যকর উপায় হলো RAG ব্যবহার করা। এটি মূলত আপনার ডেটা উৎসগুলো থেকে (সিমান্টিক ম্যাচিং ব্যবহার করে) প্রাসঙ্গিক তথ্য খুঁজে বের করা এবং সেই ডেটার প্রাসঙ্গিক অংশগুলোকে আপনার প্রশ্নের পাশাপাশি মডেলে সরবরাহ করার একটি প্রক্রিয়া। এটি মডেলটিকে আপনার বাস্তবতার সাথে সংযুক্ত করে ।
এটি বাহ্যিক ডেটা ইম্পোর্ট করে, ডেটাগুলোকে খণ্ডে খণ্ডে বিভক্ত করে, সেগুলোকে ভেক্টর এমবেডিং-এ রূপান্তর করে এবং তারপর সেই এমবেডিংগুলোকে একটি উপযুক্ত ভেক্টর ডেটাবেসে সংরক্ষণ ও সূচীবদ্ধ করার মাধ্যমে কাজ করে।

সুতরাং, RAG বাস্তবায়ন করতে গেলে আমাদের সাধারণত নিম্নলিখিত বিষয়গুলো নিয়ে ভাবতে হয়:
- একটি ভেক্টর ডেটাবেস তৈরি করা (Pinecone, Weaviate, pgvector সহ Postgres...)।
- আপনার ডকুমেন্টগুলোকে (যেমন পিডিএফ, মার্কডাউন, ইত্যাদি) ভাগ করার জন্য একটি চাংকিং স্ক্রিপ্ট লেখা।
- একটি এমবেডিং মডেল ব্যবহার করে ওই চাঙ্কগুলোর জন্য এমবেডিং (ভেক্টর) তৈরি করা হচ্ছে।
- ভেক্টর ডেটাবেসে ভেক্টরগুলো সংরক্ষণ করা হচ্ছে।
কিন্তু বন্ধুরা বন্ধুদেরকে কোনো কিছু অতিরিক্ত জটিল করতে দেয় না। যদি আমি আপনাকে বলি যে এর চেয়েও সহজ একটি উপায় আছে?
৩. পূর্বশর্তসমূহ
একটি গুগল ক্লাউড প্রজেক্ট তৈরি করুন
You need a Google Cloud Project to run this codelab. You can use a project you already have, or create a new one .
আপনার প্রোজেক্টে বিলিং চালু আছে কিনা তা নিশ্চিত করুন। আপনার প্রোজেক্টের বিলিং স্ট্যাটাস কীভাবে চেক করবেন তা জানতে এই গাইডটি দেখুন।
মনে রাখবেন, এই কোডল্যাবটি সম্পূর্ণ করতে আপনার কোনো খরচ হবে না। বড়জোর কয়েক পয়সা লাগতে পারে।
তুমি তোমার প্রজেক্টটা তৈরি করে ফেলো। আমি অপেক্ষা করব।
ডেমো রিপো ক্লোন করুন
আমি এই কোডল্যাবের জন্য নির্দেশনামূলক কন্টেন্টসহ একটি রিপো তৈরি করেছি। আপনার এটি লাগবে!
আপনার টার্মিনাল থেকে, অথবা গুগল ক্লাউড শেল এডিটর-এর সাথে সমন্বিত টার্মিনাল থেকে নিম্নলিখিত কমান্ডগুলো চালান। ক্লাউড শেল এবং এর এডিটর খুবই সুবিধাজনক, কারণ আপনার প্রয়োজনীয় সমস্ত কমান্ড আগে থেকেই ইনস্টল করা থাকে এবং সবকিছু কোনো রকম ঝামেলা ছাড়াই চলে।
git clone https://github.com/derailed-dash/gemini-file-search-demo cd gemini-file-search-demo
এই ট্রি-টি রিপো-র গুরুত্বপূর্ণ ফোল্ডার এবং ফাইলগুলো দেখায়:
gemini-file-search-demo/ ├── app/ │ ├── basic_agent_adk/ # Agent with Google Search, using ADK framework │ │ └── agent.py │ ├── rag_agent_adk/ # Agent with Google Search and File Search, using ADK framework │ │ ├── agent.py │ │ └── tools_custom.py │ ├── sdk_agent.py # Agent using GenAI SDK (no ADK) with Google Search tool │ └── sdk_rag_agent.py # Agent using GenAI SDK (no ADK) with Gemini File Search tool ├── data/ │ └── story.md # Sample story with "bespoke content" to use with Gemini File Search Store ├── notebooks/ │ └── file_search_store.ipynb # Jupyter notebook for creating and managing Gemini File Search Store │ ├── .env.template # Template for environment variables - make a copy as .env ├── Makefile # Makefile for `make` commands ├── pyproject.toml # Project configuration and dependencies └── README.md # This file
এই ফোল্ডারটি ক্লাউড শেল এডিটর বা আপনার পছন্দের এডিটরে খুলুন। (আপনি কি এখনও অ্যান্টিগ্র্যাভিটি ব্যবহার করেছেন? যদি না করে থাকেন, তবে এখনই এটি ব্যবহার করে দেখার ভালো সময়।)
উল্লেখ্য যে, রিপোজিটরিতে data/story.md ফাইলে "দ্য ওয়ার্মহোল ইনকারশন" নামে একটি নমুনা গল্প রয়েছে। আমি এটি জেমিনির সাথে যৌথভাবে লিখেছি! গল্পটি কমান্ডার ডাজবো এবং তার বুদ্ধিমান স্টারশিপের স্কোয়াড্রনকে নিয়ে। (আমি এলিট ডেঞ্জারাস গেমটি থেকে কিছুটা অনুপ্রেরণা নিয়েছি।) এই গল্পটি আমাদের 'বিশেষ জ্ঞানভান্ডার' হিসেবে কাজ করে, যেখানে এমন সব নির্দিষ্ট তথ্য রয়েছে যা জেমিনি জানে না এবং গুগল সার্চ করেও খুঁজে বের করতে পারে না।
আপনার উন্নয়ন পরিবেশ সেটআপ করুন
সুবিধার জন্য, আপনার প্রয়োজনীয় অনেক কমান্ড চালানো সহজ করতে আমি একটি Makefile দিয়েছি। নির্দিষ্ট কমান্ড মনে রাখার পরিবর্তে, আপনি শুধু make <target> -এর মতো কিছু চালাতে পারেন। তবে, make শুধুমাত্র `Linux` / `MacOS` / `WSL` পরিবেশে উপলব্ধ। আপনি যদি `Windows` (WSL ছাড়া) ব্যবহার করেন, তাহলে আপনাকে make target`-এ থাকা সম্পূর্ণ কমান্ডগুলো চালাতে হবে।
# Install dependencies with make make install # If you don't have make... uv sync --extra jupyter
ক্লাউড শেল এডিটরে make install চালালে এটি দেখতে এইরকম লাগে:

একটি জেমিনি এপিআই কী তৈরি করুন
জেমিনি ডেভেলপার এপিআই (যা জেমিনি ফাইল সার্চ টুল ব্যবহার করার জন্য আমাদের প্রয়োজন) ব্যবহার করতে আপনার একটি জেমিনি এপিআই কী লাগবে। এপিআই কী পাওয়ার সবচেয়ে সহজ উপায় হলো গুগল এআই স্টুডিও ব্যবহার করা, যা আপনার গুগল ক্লাউড প্রোজেক্টের জন্য এপিআই কী সংগ্রহ করার একটি সুবিধাজনক ইন্টারফেস প্রদান করে। নির্দিষ্ট ধাপগুলোর জন্য এই নির্দেশিকাটি দেখুন।
আপনার API কী তৈরি হয়ে গেলে, সেটির একটি কপি করে নিরাপদে রাখুন।
এখন আপনাকে এই এপিআই কী-টি একটি এনভায়রনমেন্ট ভেরিয়েবল হিসেবে সেট করতে হবে। আমরা একটি .env ফাইল ব্যবহার করে এটি করতে পারি। অন্তর্ভুক্ত .env.example ফাইলটি কপি করে .env নামে একটি নতুন ফাইল তৈরি করুন। ফাইলটি দেখতে এইরকম হবে:
export GEMINI_API_KEY="your-api-key" export MODEL="gemini-2.5-flash" export STORE_NAME="demo-file-store"
এবার your-api-key জায়গায় আপনার আসল API কী বসান। এখন এটি দেখতে অনেকটা এইরকম হবে:

এখন এনভায়রনমেন্ট ভেরিয়েবলগুলো লোড হয়েছে কিনা তা নিশ্চিত করুন। এটি করার জন্য আপনাকে নিম্নলিখিত কমান্ডটি চালাতে হবে:
source .env
৪. মৌলিক এজেন্ট
প্রথমে, চলুন একটি ভিত্তি স্থাপন করা যাক। আমরা একটি সাধারণ এজেন্ট চালানোর জন্য মূল google-genai SDK ব্যবহার করব।
কোডটি
app/sdk_agent.py ফাইলটি দেখুন। এটি একটি সংক্ষিপ্ত বাস্তবায়ন যা:
- একটি
genai.Clientইনস্ট্যানশিয়েট করে। -
google_searchটুলটি সক্রিয় করে। - ব্যাস, এটুকুই। কোনো ছেঁড়া কাপড় নেই।
কোডটি ভালোভাবে দেখুন এবং এটি কী কাজ করে তা বুঝতে পেরেছেন কিনা তা নিশ্চিত করুন।
এটা চালানো
# With make make sdk-agent # Without make uv run python app/sdk_agent.py
চলুন একে একটি সাধারণ প্রশ্ন করা যাক:
> What is the stock price of Google?
গুগল সার্চ ব্যবহার করে বর্তমান মূল্য খুঁজে বের করার জন্য এটির সঠিক উত্তর দেওয়া উচিত:

এখন, এমন একটি প্রশ্ন করা যাক যার উত্তর এটি জানে না। এর জন্য এজেন্টকে আমাদের গল্পটি পড়তে হবে।
> Who pilots the 'Too Many Pies' ship?
এটা ব্যর্থ হওয়া উচিত বা এমনকি বিভ্রম সৃষ্টি করা উচিত। দেখা যাক:

এবং প্রত্যাশিতভাবেই, মডেলটি প্রশ্নটির উত্তর দিতে ব্যর্থ হয়। আমরা কী নিয়ে কথা বলছি, সে সম্পর্কে এর কোনো ধারণাই নেই!
এখন এজেন্ট থেকে বের হতে quit টাইপ করুন।
৫. জেমিনি ফাইল সার্চ: ব্যাখ্যা

জেমিনি ফাইল সার্চ মূলত দুটি জিনিসের সমন্বয়:
- একটি সম্পূর্ণ পরিচালিত RAG সিস্টেম : আপনি একগুচ্ছ ফাইল সরবরাহ করেন, এবং জেমিনি ফাইল সার্চ আপনার জন্য ফাইলগুলোর খণ্ডীকরণ, এমবেডিং, সংরক্ষণ এবং ভেক্টর ইন্ডেক্সিংয়ের কাজ করে দেয়।
- এজেন্টিক অর্থে একটি 'টুল' : যেখানে আপনি আপনার এজেন্ট সংজ্ঞায় জেমিনি ফাইল সার্চ টুলকে একটি টুল হিসেবে সহজেই যোগ করতে পারেন এবং টুলটিকে একটি ফাইল সার্চ স্টোরের দিকে নির্দেশ করতে পারেন।
তবে সবচেয়ে গুরুত্বপূর্ণ বিষয় হলো: এটি জেমিনি এপিআই-এর মধ্যেই তৈরি করা আছে । এর মানে হলো, এটি ব্যবহার করার জন্য আপনাকে কোনো অতিরিক্ত এপিআই চালু করতে বা আলাদা কোনো প্রোডাক্ট ডেপ্লয় করতে হবে না। তাই এটি সত্যিই ব্যবহারের জন্য প্রস্তুত ।
জেমিনি ফাইল অনুসন্ধানের বৈশিষ্ট্য
এখানে কিছু বৈশিষ্ট্য দেওয়া হলো:
- চাংকিং, এমবেডিং, স্টোরিং এবং ইনডেক্সিং-এর খুঁটিনাটি বিষয়গুলো আপনার, অর্থাৎ ডেভেলপারের কাছ থেকে গোপন রাখা হয়। এর মানে হলো, এমবেডিং মডেল (যা হলো জেমিনি এমবেডিংস) বা ফলাফলস্বরূপ ভেক্টরগুলো কোথায় সংরক্ষিত হয়, সে সম্পর্কে আপনার জানার (বা মাথা ঘামানোর) কোনো প্রয়োজন নেই। আপনাকে ভেক্টর ডেটাবেস সংক্রান্ত কোনো সিদ্ধান্ত নিতে হবে না।
- এটি কোনো অতিরিক্ত কনফিগারেশন ছাড়াই বিপুল সংখ্যক ডকুমেন্ট টাইপ সাপোর্ট করে। এর মধ্যে রয়েছে, তবে এগুলোর মধ্যেই সীমাবদ্ধ নয়: PDF, DOCX, Excel, SQL, JSON, Jupyter নোটবুক, HTML, Markdown, CSV, এবং এমনকি zip ফাইলও। আপনি সম্পূর্ণ তালিকাটি এখানে দেখতে পারেন। সুতরাং, উদাহরণস্বরূপ, আপনি যদি টেক্সট, ছবি এবং টেবিল সম্বলিত PDF ফাইল দিয়ে আপনার এজেন্টকে প্রস্তুত করতে চান, তবে এই PDF ফাইলগুলোর কোনো প্রি-প্রসেসিং করার প্রয়োজন নেই। শুধু সরাসরি PDF ফাইলগুলো আপলোড করুন, এবং বাকিটা Gemini-এর উপর ছেড়ে দিন।
- আমরা যেকোনো আপলোড করা ফাইলে নিজস্ব মেটাডেটা যোগ করতে পারি। পরবর্তীতে, রান টাইমে টুলটি কোন ফাইলগুলো ব্যবহার করবে তা ফিল্টার করার জন্য এটি খুবই কার্যকর হতে পারে।
ডেটা কোথায় থাকে?
আপনি কিছু ফাইল আপলোড করেন। জেমিনি ফাইল সার্চ টুল সেই ফাইলগুলো নিয়ে, সেগুলোর চাঙ্ক ও এমবেডিং তৈরি করে, এবং সেগুলোকে... কোথাও রেখে দিয়েছে। কিন্তু কোথায়?
উত্তরটি হলো: একটি ফাইল সার্চ স্টোর । এটি আপনার এমবেডিংগুলোর জন্য একটি সম্পূর্ণ পরিচালিত কন্টেইনার। এর নেপথ্যে কীভাবে কাজ হয়, তা আপনার জানার (বা তা নিয়ে মাথা ঘামানোর) প্রয়োজন নেই। আপনাকে শুধু (প্রোগ্রাম্যাটিকভাবে) একটি তৈরি করতে হবে এবং তারপর এতে আপনার ফাইলগুলো আপলোড করতে হবে।
এটা সস্তা!
আপনার এমবেডিং সংরক্ষণ এবং অনুসন্ধান করা বিনামূল্যে । তাই আপনি যতদিন খুশি এমবেডিং সংরক্ষণ করতে পারেন, এবং সেই সংরক্ষণের জন্য আপনাকে কোনো অর্থ প্রদান করতে হবে না!
প্রকৃতপক্ষে, আপনাকে শুধুমাত্র আপলোড/ইনডেক্সিংয়ের সময় এমবেডিং তৈরির জন্যই অর্থ প্রদান করতে হয়। এই প্রতিবেদন লেখার সময় , এর জন্য প্রতি ১০ লক্ষ টোকেনের খরচ ছিল ০.১৫ ডলার। এটা বেশ সস্তা।
৬. আমরা কীভাবে জেমিনি ফাইল সার্চ ব্যবহার করি?
দুটি পর্যায় রয়েছে:
- এমবেডিংগুলো তৈরি করে একটি ফাইল সার্চ স্টোরে সংরক্ষণ করুন।
- আপনার এজেন্টের মাধ্যমে ফাইল সার্চ স্টোরে অনুসন্ধান করুন।
প্রথম পর্যায় - জেমিনি ফাইল সার্চ স্টোর তৈরি ও পরিচালনার জন্য জুপিটার নোটবুক
এই পর্যায়টি আপনি প্রথমে করবেন এবং তারপর যখনই স্টোরটি আপডেট করতে চাইবেন। উদাহরণস্বরূপ, যখন নতুন ডকুমেন্ট যোগ করার থাকে, বা যখন মূল ডকুমেন্টগুলো পরিবর্তিত হয়।
এই পর্যায়টি আপনার ডেপ্লয় করা এজেন্টিক অ্যাপ্লিকেশনের মধ্যে অন্তর্ভুক্ত করার কোনো প্রয়োজন নেই। অবশ্যই, আপনি চাইলে তা করতে পারেন। উদাহরণস্বরূপ, যদি আপনি আপনার এজেন্টিক অ্যাপ্লিকেশনের অ্যাডমিন ব্যবহারকারীদের জন্য কোনো ধরনের UI তৈরি করতে চান। কিন্তু প্রায়শই এমন কিছু কোড থাকাই যথেষ্ট, যা আপনি প্রয়োজন অনুযায়ী চালাতে পারেন। আর এই কোড প্রয়োজন অনুযায়ী চালানোর একটি দারুণ উপায় কী? একটি জুপিটার নোটবুক!
নোটবুক
আপনার এডিটরে notebooks/file_search_store.ipynb ফাইলটি খুলুন। যদি আপনাকে কোনো Jupyter VS Code এক্সটেনশন ইনস্টল করতে বলা হয়, তবে তা করে নিন।
যদি আমরা এটি ক্লাউড শেল এডিটর-এ খুলি, তাহলে এটি দেখতে এইরকম হয়:

চলুন, এটি সেল বাই সেল চালানো যাক। প্রয়োজনীয় ইম্পোর্টগুলো সহ Setup সেলটি এক্সিকিউট করে শুরু করুন। আপনি যদি আগে কোনো নোটবুক না চালিয়ে থাকেন, তাহলে আপনাকে প্রয়োজনীয় এক্সটেনশনগুলো ইনস্টল করতে বলা হবে। এগিয়ে যান এবং তা করে নিন। এরপর আপনাকে একটি কার্নেল বেছে নিতে বলা হবে। " Python environments... " নির্বাচন করুন এবং তারপর সেই লোকাল .venv নির্বাচন করুন যা আমরা আগে make install চালানোর সময় ইনস্টল করেছিলাম:

তারপর:
- এনভায়রনমেন্ট ভেরিয়েবলগুলো অন্তর্ভুক্ত করতে " Local Only " সেলটি চালান।
- Gemini Gen AI ক্লায়েন্ট শুরু করতে "ক্লায়েন্ট ইনিশিয়ালাইজেশন" সেলটি চালান।
- নাম দ্বারা জেমিনি ফাইল সার্চ স্টোর পুনরুদ্ধার করতে হেল্পার ফাংশন সহ 'Retrieve the Store' সেলটি চালান।
এখন আমরা স্টোরটি তৈরি করার জন্য প্রস্তুত।
- স্টোরটি তৈরি করতে "Create the Store (One Time)" সেলটি রান করুন। আমাদের এটি শুধুমাত্র একবারই করতে হবে। কোডটি সফলভাবে রান হলে, আপনি
"Created store: fileSearchStores/<someid>"লেখা একটি মেসেজ দেখতে পাবেন। - এর মধ্যে কী আছে তা দেখতে " View the Store" সেলটি চালান। এই পর্যায়ে, আপনি দেখতে পাবেন যে এতে ০টি ডকুমেন্ট রয়েছে।
চমৎকার! আমাদের একটি জেমিনি ফাইল সার্চ স্টোর এখন প্রস্তুত।
ডেটা আপলোড করা হচ্ছে
আমরা data/story.md স্টোরে আপলোড করতে চাই। নিম্নলিখিত পদক্ষেপগুলো অনুসরণ করুন:
- যে সেলটি আপলোড পাথ নির্ধারণ করে, সেটি চালান। এটি আমাদের
data/ফোল্ডারকে নির্দেশ করে। - পরবর্তী সেলটি চালান, যা স্টোরে ফাইল আপলোড করার জন্য ইউটিলিটি ফাংশন তৈরি করে। লক্ষ্য করুন যে, এই সেলের কোডটিও প্রতিটি আপলোড করা ফাইল থেকে মেটাডেটা বের করার জন্য জেমিনি (Gemini) ব্যবহার করে। আমরা এই বের করা মানগুলো নিয়ে স্টোরে কাস্টম মেটাডেটা হিসেবে সংরক্ষণ করি। (এটি করা আপনার জন্য বাধ্যতামূলক নয়, তবে এটি একটি দরকারি কাজ।)
- ফাইলটি আপলোড করার জন্য সেলটি চালান। মনে রাখবেন, যদি আমরা আগে একই নামের কোনো ফাইল আপলোড করে থাকি, তাহলে নোটবুকটি নতুনটি আপলোড করার আগে বিদ্যমান সংস্করণটি মুছে ফেলবে। ফাইলটি আপলোড হয়ে গেছে এমন একটি বার্তা আপনি দেখতে পাবেন।

পর্যায় ২ - আমাদের এজেন্টে জেমিনি ফাইল সার্চ RAG বাস্তবায়ন করা
আমরা একটি জেমিনি ফাইল সার্চ স্টোর তৈরি করেছি এবং এতে আমাদের স্টোরিটি আপলোড করেছি। এখন আমাদের এজেন্টে ফাইল সার্চ স্টোরটি ব্যবহার করার সময় এসেছে। চলুন একটি নতুন এজেন্ট তৈরি করি যা গুগল সার্চের পরিবর্তে ফাইল সার্চ স্টোর ব্যবহার করে। app/sdk_rag_agent.py ফাইলটি দেখুন।
প্রথম যে বিষয়টি উল্লেখ্য তা হলো, আমরা স্টোরের নাম পাস করে আমাদের স্টোরটি পুনরুদ্ধার করার জন্য একটি ফাংশন তৈরি করেছি:
def get_store(client: genai.Client, store_name: str) -> types.FileSearchStore | None:
"""Retrieve a store by display name"""
try:
for a_store in client.file_search_stores.list():
if a_store.display_name == store_name:
return a_store
except Exception as e:
logger.error(f"Error listing stores: {e}")
return None
একবার আমাদের স্টোর তৈরি হয়ে গেলে, এটিকে আমাদের এজেন্টের সাথে একটি টুল হিসেবে সংযুক্ত করার মতোই ব্যবহার করা সহজ, ঠিক এইভাবে:
file_search_tool = types.Tool(file_search=types.FileSearch(file_search_store_names=[store.name]))
RAG এজেন্ট চালানো
আমরা এটা এভাবে চালু করি:
make sdk-rag-agent # Or, without make: uv run python app/sdk_rag_agent.py
চলুন সেই প্রশ্নটি করা যাক যার উত্তর আগের এজেন্ট দিতে পারেনি:
> Who pilots the 'Too Many Pies' ship?
আর তার প্রতিক্রিয়া?

সফল! প্রতিক্রিয়া থেকে আমরা দেখতে পাচ্ছি যে:
- প্রশ্নটির উত্তর দিতে আমাদের ফাইল স্টোরটি ব্যবহার করা হয়েছিল।
- ৫টি প্রাসঙ্গিক খণ্ডাংশ পাওয়া গেছে।
- উত্তরটা একদম সঠিক!
এজেন্টটি বন্ধ করতে quit টাইপ করুন।
৭. আমাদের এজেন্টদের ADK ব্যবহারে রূপান্তর করা
গুগল এজেন্ট ডেভেলপমেন্ট কিট (ADK) হলো ডেভেলপারদের জন্য এজেন্ট এবং এজেন্টিক সিস্টেম তৈরির একটি ওপেন সোর্স মডিউলার ফ্রেমওয়ার্ক ও এসডিকে। এটি আমাদের সহজে মাল্টি-এজেন্ট সিস্টেম তৈরি এবং অর্কেস্ট্রেট করতে সাহায্য করে। জেমিনি এবং গুগল ইকোসিস্টেমের জন্য অপ্টিমাইজ করা হলেও, ADK মডেল-অ্যাগনস্টিক, ডেপ্লয়মেন্ট-অ্যাগনস্টিক এবং অন্যান্য ফ্রেমওয়ার্কের সাথে সামঞ্জস্যপূর্ণ করে তৈরি করা হয়েছে। আপনি যদি এখনও ADK ব্যবহার না করে থাকেন, তবে আরও জানতে ADK ডক্স- এ যান।
গুগল সার্চ সহ বেসিক ADK এজেন্ট
app/basic_agent_adk/agent.py ফাইলটি দেখুন। এই নমুনা কোডে আপনি দেখতে পাবেন যে আমরা আসলে দুটি এজেন্ট তৈরি করেছি:
- একটি
root_agentযা ব্যবহারকারীর সাথে মিথস্ক্রিয়া পরিচালনা করে, এবং যেখানে আমরা প্রধান সিস্টেম নির্দেশনা প্রদান করেছি। - একটি পৃথক
SearchAgentযা টুল হিসেবেgoogle.adk.tools.google_searchব্যবহার করে।
root_agent আসলে SearchAgent একটি টুল হিসেবে ব্যবহার করে, যা এই লাইনটি ব্যবহার করে প্রয়োগ করা হয়েছে:
tools=[AgentTool(agent=search_agent)],
রুট এজেন্টের সিস্টেম প্রম্পটটি দেখতে এইরকম:
You are a helpful AI assistant designed to provide accurate and useful information.
If you don't know the answer, use the SearchAgent to perform a Google search.
Do not attempt to search more than ONCE.
If the search yields no relevant results or returns unrelated content, you MUST immediately respond with: "I could not find any information about that."
Do NOT retry the search with different terms. Do NOT ask for clarification. FAIL FAST.
এজেন্টের সাথে চেষ্টা করা
ডেভেলপারদের তাদের ADK এজেন্ট পরীক্ষা করার জন্য ADK বেশ কিছু রেডিমেড ইন্টারফেস প্রদান করে। এই ইন্টারফেসগুলোর মধ্যে একটি হলো ওয়েব ইউআই (Web UI)। এর মাধ্যমে আমরা কোনো ইউজার ইন্টারফেস কোড না লিখেই ব্রাউজারে আমাদের এজেন্টগুলো পরীক্ষা করতে পারি!
আমরা নিম্নলিখিত কমান্ডটি চালিয়ে এই ইন্টারফেসটি চালু করতে পারি:
make adk-playground # Or, without make: uv run adk web app --port 8501 --reload_agents
লক্ষ্য করুন যে, এই কমান্ডটি adk web টুলকে app ফোল্ডারে নির্দেশ করে, যেখানে এটি স্বয়ংক্রিয়ভাবে root_agent ইমপ্লিমেন্ট করা যেকোনো ADK এজেন্ট খুঁজে বের করবে। তাহলে চলুন, এটি পরীক্ষা করে দেখা যাক:

কয়েক সেকেন্ড পরেই অ্যাপ্লিকেশনটি প্রস্তুত হয়ে যাবে। আপনি যদি কোডটি স্থানীয়ভাবে চালান, তবে আপনার ব্রাউজারে http://127.0.0.1:8501 এ যান। আর যদি ক্লাউড শেল এডিটর-এ চালান, তাহলে ' ওয়েব প্রিভিউ' -তে ক্লিক করুন এবং পোর্টটি পরিবর্তন করে ৮৫০১ করে দিন।

যখন UI প্রদর্শিত হবে, ড্রপডাউন থেকে basic_agent_adk নির্বাচন করুন, এবং তারপরে আমরা এটিকে প্রশ্ন জিজ্ঞাসা করতে পারি:

এখন পর্যন্ত সব ঠিক আছে! ওয়েব UI এমনকি আপনাকে দেখিয়ে দেয় কখন রুট এজেন্ট SearchAgent দায়িত্ব অর্পণ করছে। এটি একটি অত্যন্ত দরকারি বৈশিষ্ট্য।
এবার আমরা একে সেই প্রশ্নটি করি যার জন্য আমাদের গল্প সম্পর্কে জ্ঞান থাকা প্রয়োজন:

আপনি নিজেই চেষ্টা করে দেখুন। দেখবেন, নির্দেশনা অনুযায়ী এটি দ্রুত ব্যর্থ হয়।
ADK এজেন্টের মধ্যে ফাইল সার্চ স্টোর অন্তর্ভুক্ত করুন
এখন আমরা সবকিছু একত্রিত করব। আমরা এমন একটি ADK এজেন্ট চালাব যা ফাইল সার্চ স্টোর এবং গুগল সার্চ উভয়ই ব্যবহার করতে সক্ষম। app/rag_agent_adk/agent.py ফাইলের কোডটি দেখুন।
কোডটি আগের উদাহরণের মতোই, তবে কয়েকটি গুরুত্বপূর্ণ পার্থক্য রয়েছে:
- আমাদের একটি রুট এজেন্ট আছে যা দুটি বিশেষজ্ঞ এজেন্টকে সমন্বয় করে:
- RagAgent : বিশেষায়িত জ্ঞানের বিশেষজ্ঞ - আমাদের জেমিনি ফাইল সার্চ স্টোর ব্যবহার করে
- সার্চএজেন্ট : সাধারণ জ্ঞানের বিশেষজ্ঞ - গুগল সার্চ ব্যবহার করে
- যেহেতু ADK-তে এখনও
FileSearchজন্য কোনো বিল্ট-ইন র্যাপার নেই, তাই আমরা FileSearch টুলটিকে র্যাপ করার জন্যFileSearchToolএকটি কাস্টম র্যাপার ক্লাস ব্যবহার করি, যা লো-লেভেল মডেল রিকোয়েস্টেfile_search_store_namesকনফিগারেশনটি ইনজেক্ট করে। এটিapp/rag_agent_adk/tools_custom.pyআলাদা স্ক্রিপ্টে ইমপ্লিমেন্ট করা হয়েছে।
এছাড়াও, একটি বিষয় খেয়াল রাখতে হবে। এই লেখাটি লেখার সময়, আপনি একই এজেন্টের কাছে একই অনুরোধে নেটিভ GoogleSearch টুল এবং FileSearch টুল একসাথে ব্যবহার করতে পারবেন না। যদি চেষ্টা করেন, তাহলে এই ধরনের একটি এরর পাবেন:
ত্রুটি - একটি ত্রুটি ঘটেছে: 400 অবৈধ আর্গুমেন্ট। {'error': {'code': 400, 'message': 'সার্চ টুল এবং ফাইল সার্চ টুল একসাথে সমর্থিত নয়', 'status': 'অবৈধ আর্গুমেন্ট'}}
ত্রুটি: 400 অবৈধ আর্গুমেন্ট। {'error': {'code': 400, 'message': 'সার্চ টুল এবং ফাইল সার্চ টুল একসাথে সমর্থিত নয়', 'status': 'অবৈধ আর্গুমেন্ট'}}
এর সমাধান হলো দুটি স্পেশালিস্ট এজেন্টকে আলাদা সাব-এজেন্ট হিসেবে ইমপ্লিমেন্ট করা, এবং Agent-as-a-Tool প্যাটার্ন ব্যবহার করে সেগুলোকে রুট এজেন্টের কাছে পাঠানো। এবং সবচেয়ে গুরুত্বপূর্ণ বিষয় হলো, রুট এজেন্টের সিস্টেম ইনস্ট্রাকশনে প্রথমে RagAgent ব্যবহার করার জন্য খুব স্পষ্ট নির্দেশনা দেওয়া আছে:
আপনি একজন সহায়ক এআই সহকারী, যাকে সঠিক ও দরকারি তথ্য প্রদানের জন্য তৈরি করা হয়েছে।
আপনার দুজন বিশেষজ্ঞ এজেন্টের সাথে যোগাযোগের সুযোগ রয়েছে:
- RagAgent: অভ্যন্তরীণ জ্ঞানভান্ডার থেকে বিশেষায়িত তথ্যের জন্য।
- সার্চএজেন্ট: গুগল সার্চ থেকে সাধারণ তথ্য পাওয়ার জন্য।
সর্বদা প্রথমে RagAgent দিয়ে চেষ্টা করুন। যদি এতে কোনো কার্যকর উত্তর না পাওয়া যায়, তাহলে SearchAgent দিয়ে চেষ্টা করুন।
চূড়ান্ত পরীক্ষা
আগের মতোই ADK ওয়েব UI চালান:
make adk-playground # Or, without make: uv run adk web app --port 8501 --reload_agents
এবার, UI-তে rag_agent_adk নির্বাচন করুন। চলুন দেখি এটি কীভাবে কাজ করে: 
আমরা দেখতে পাচ্ছি যে এটি প্রশ্নের উপর ভিত্তি করে উপযুক্ত উপ-প্রতিনিধি নির্বাচন করে।
৮. উপসংহার
এই কোডল্যাবটি সম্পন্ন করার জন্য অভিনন্দন!
আপনি একটি সাধারণ স্ক্রিপ্ট থেকে একটি মাল্টি-এজেন্ট RAG-সক্ষম সিস্টেমে রূপান্তরিত হয়েছেন; তাও আবার এক লাইন এমবেডিং কোড ছাড়াই এবং কোনো ভেক্টর ডেটাবেস প্রয়োগ না করেই!
আমরা শিখেছি:
- জেমিনি ফাইল সার্চ একটি পরিচালিত RAG সমাধান যা সময় এবং মানসিক শান্তি বাঁচায়।
- ADK আমাদের জটিল মাল্টি-এজেন্ট অ্যাপের জন্য প্রয়োজনীয় কাঠামো প্রদান করে এবং ওয়েব UI-এর মতো ইন্টারফেসের মাধ্যমে ডেভেলপারদের সুবিধা দেয়।
- ‘এজেন্ট-অ্যাজ-এ-টুল’ প্যাটার্নটি টুলের সামঞ্জস্যজনিত সমস্যার সমাধান করে।
আশা করি এই ল্যাবটি আপনার উপকারে এসেছে। আবার দেখা হবে!