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

আর তাই, RAG বাস্তবায়নের জন্য, আমাদের সাধারণত নিম্নলিখিত বিষয়গুলি নিয়ে চিন্তা করতে হয়:
- একটি ভেক্টর ডাটাবেস স্পিনিং আপ করা (পিনেকোন, ওয়েভিয়েট, পিজিভেক্টর সহ পোস্টগ্রেস...)।
- আপনার ডকুমেন্টগুলিকে টুকরো টুকরো করার জন্য একটি চাঙ্কিং স্ক্রিপ্ট লেখা (যেমন PDF, মার্কডাউন, যাই হোক না কেন)।
- একটি এম্বেডিং মডেল ব্যবহার করে, ঐ অংশগুলির জন্য এম্বেডিং (ভেক্টর) তৈরি করা হচ্ছে।
- ভেক্টর ডাটাবেসে ভেক্টর সংরক্ষণ করা।
কিন্তু বন্ধুরা বন্ধুদেরকে জিনিসপত্র অতিরিক্ত বাড়াতে দেয় না। যদি আমি তোমাকে বলি এর চেয়ে সহজ উপায় আছে?
৩. পূর্বশর্ত
একটি গুগল ক্লাউড প্রজেক্ট তৈরি করুন
এই কোডল্যাবটি চালানোর জন্য আপনার একটি Google ক্লাউড প্রজেক্টের প্রয়োজন। আপনি ইতিমধ্যেই থাকা একটি প্রজেক্ট ব্যবহার করতে পারেন, অথবা একটি নতুন তৈরি করতে পারেন ।
আপনার প্রকল্পে বিলিং সক্ষম আছে কিনা তা নিশ্চিত করুন। আপনার প্রকল্পের বিলিং স্থিতি কীভাবে পরীক্ষা করবেন তা জানতে এই নির্দেশিকাটি দেখুন।
মনে রাখবেন যে এই কোডল্যাবটি সম্পূর্ণ করতে আপনার কোনও খরচ হবে বলে আশা করা হচ্ছে না। সর্বাধিক, কয়েক পয়সা।
তুমি যাও, তোমার প্রজেক্ট রেডি করো। আমি অপেক্ষা করবো।
ডেমো রেপো ক্লোন করুন
আমি এই কোডল্যাবের জন্য নির্দেশিত কন্টেন্ট সহ একটি রেপো তৈরি করেছি। আপনার এটির প্রয়োজন হবে!
আপনার টার্মিনাল থেকে অথবা Google Cloud Shell Editor- এ ইন্টিগ্রেটেড টার্মিনাল থেকে নিম্নলিখিত কমান্ডগুলি চালান। Cloud Shell এবং এর এডিটর খুবই সুবিধাজনক, কারণ আপনার প্রয়োজনীয় সমস্ত কমান্ড আগে থেকে ইনস্টল করা থাকে এবং সবকিছু "আউট-অফ-দ্য-বক্স" চলে।
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 টার্গেটগুলিতে থাকা সম্পূর্ণ কমান্ডগুলি চালাতে হবে।
# Install dependencies with make make install # If you don't have make... uv sync --extra jupyter
ক্লাউড শেল এডিটরে make install চালালে এটি দেখতে এরকম দেখাবে:

একটি জেমিনি এপিআই কী তৈরি করুন
জেমিনি ডেভেলপার এপিআই (যা আমাদের জেমিনি ফাইল সার্চ টুল ব্যবহার করার জন্য প্রয়োজন) ব্যবহার করতে, আপনার একটি জেমিনি এপিআই কী প্রয়োজন। এপিআই কী পাওয়ার সবচেয়ে সহজ উপায় হল গুগল এআই স্টুডিও ব্যবহার করা, যা আপনার গুগল ক্লাউড প্রকল্প(গুলি) এর জন্য এপিআই কীগুলি পেতে একটি সুবিধাজনক ইন্টারফেস প্রদান করে। নির্দিষ্ট পদক্ষেপগুলির জন্য এই নির্দেশিকাটি দেখুন।
আপনার API কী তৈরি হয়ে গেলে, এটি কপি করুন এবং নিরাপদে রাখুন।
এখন আপনাকে এই 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
৪. মৌলিক এজেন্ট
প্রথমে, একটি বেসলাইন স্থাপন করা যাক। আমরা একটি সাধারণ এজেন্ট চালানোর জন্য raw google-genai SDK ব্যবহার করব।
কোডটি
app/sdk_agent.py দেখুন। এটি একটি ন্যূনতম বাস্তবায়ন যা:
- একটি
genai.Clientইনস্ট্যান্টিয়েট করে। -
google_searchটুল সক্রিয় করে। - এই তো। RAG নেই।
কোডটি একবার দেখুন এবং নিশ্চিত করুন যে আপনি এটি কী করে তা বুঝতে পেরেছেন।
এটি চালানো
# 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 আগে চালানোর সময় ইনস্টল করেছি:

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

দ্বিতীয় ধাপ - আমাদের এজেন্টে জেমিনি ফাইল অনুসন্ধান 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]))
আরএজি এজেন্ট পরিচালনা
আমরা এটি এভাবে চালু করি:
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) হল একটি ওপেন সোর্স মডুলার ফ্রেমওয়ার্ক এবং SDK যা ডেভেলপারদের এজেন্ট এবং এজেন্টিক সিস্টেম তৈরি করার জন্য ব্যবহার করা যেতে পারে। এটি আমাদের সহজেই মাল্টি-এজেন্ট সিস্টেম তৈরি এবং পরিচালনা করতে সাহায্য করে। জেমিনি এবং গুগল ইকোসিস্টেমের জন্য অপ্টিমাইজ করা হলেও, 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 এজেন্ট পরীক্ষা করার সুযোগ করে দেওয়ার জন্য বেশ কিছু অত্যাধুনিক ইন্টারফেস প্রদান করে। এই ইন্টারফেসের মধ্যে একটি হল ওয়েব 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 এ নির্দেশ করুন। যদি আপনি ক্লাউড শেল এডিটরে চালান, তাহলে " ওয়েব প্রিভিউ " এ ক্লিক করুন এবং পোর্টটি 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তে প্রয়োগ করা হয়েছে।
এছাড়াও, একটি "gotcha" আছে যা সম্পর্কে সতর্ক থাকতে হবে। লেখার সময়, আপনি একই এজেন্টের কাছে একই অনুরোধে নেটিভ GoogleSearch টুল এবং FileSearch টুল ব্যবহার করতে পারবেন না। যদি আপনি চেষ্টা করেন, তাহলে আপনি এইরকম একটি ত্রুটি পাবেন:
ত্রুটি - একটি ত্রুটি ঘটেছে: 400 INVALID_ARGUMENT। {'ত্রুটি': {'কোড': 400, 'message': 'একটি সরঞ্জাম হিসাবে অনুসন্ধান এবং ফাইল অনুসন্ধান সরঞ্জাম একসাথে সমর্থিত নয়', 'স্থিতি': 'INVALID_ARGUMENT'}}
ত্রুটি: ৪০০ INVALID_ARGUMENT। {'ত্রুটি': {'কোড': ৪০০, 'বার্তা': 'একটি সরঞ্জাম হিসাবে অনুসন্ধান এবং ফাইল অনুসন্ধান সরঞ্জাম একসাথে সমর্থিত নয়', 'স্থিতি': 'INVALID_ARGUMENT'}}
সমাধান হল দুটি বিশেষজ্ঞ এজেন্টকে পৃথক সাবএজেন্ট হিসেবে বাস্তবায়ন করা এবং 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 এর মতো ইন্টারফেসের মাধ্যমে ডেভেলপারদের সুবিধা প্রদান করে।
- "এজেন্ট-অ্যাজ-এ-টুল" প্যাটার্নটি টুলের সামঞ্জস্যের সমস্যাগুলি সমাধান করে।
আশা করি এই ল্যাবটি আপনার কাজে লেগেছে। পরের বার দেখা হবে!