টিউটোরিয়াল ২.৪: টুল এবং এজেন্ট
ভূমিকা
গল্প: কল্পনা করুন, আপনি একটি নতুন শহরে গেছেন এবং একটি রেস্টুরেন্টে যেতে চান। আপনি একজন লোকাল গাইডকে (এজেন্ট) জিজ্ঞেস করেন। গাইড প্রথমে গুগল ম্যাপ (একটি টুল) ব্যবহার করে রেস্টুরেন্ট খুঁজে বের করে, তারপর ওয়েদার অ্যাপ (আরেকটি টুল) চেক করে দেখে বাইরে বৃষ্টি হচ্ছে কিনা, এবং শেষে উবার অ্যাপ (আরেকটি টুল) ব্যবহার করে আপনার জন্য একটি রাইড বুক করে।
LangChain-এ, এজেন্ট এবং টুল ঠিক এভাবেই কাজ করে। এজেন্ট হল একটি LLM-ভিত্তিক সিস্টেম যা বিভিন্ন টুল ব্যবহার করে কমপ্লেক্স টাস্ক সম্পাদন করতে পারে।
টুল কনসেপ্ট এবং ইন্টিগ্রেশন
টুল কি?
টুল হল এমন ফাংশন যা LLM-কে বাহ্যিক সিস্টেম বা ডাটা সোর্সের সাথে ইন্টারাক্ট করতে সাহায্য করে। এগুলি LLM-এর ক্ষমতা বাড়ায়, কারণ LLM নিজে থেকে:
- রিয়েল-টাইম ডাটা অ্যাক্সেস করতে পারে না (যেমন আজকের আবহাওয়া)
- কমপ্লেক্স ক্যালকুলেশন করতে পারে না (যেমন বড় সংখ্যার গুণ)
- ইন্টারনেট সার্চ করতে পারে না
- ডাটাবেস কোয়েরি করতে পারে না
- API কল করতে পারে না
টুল ইন্টিগ্রেশন
LangChain-এ, টুল ইন্টিগ্রেট করার জন্য Tool ক্লাস ব্যবহার করা হয়। একটি টুল তৈরি করতে, আপনাকে নিম্নলিখিত জিনিসগুলি প্রদান করতে হবে:
- নাম: টুলের একটি ইউনিক নাম
- ডেসক্রিপশন: টুল কি করে তার বর্ণনা
- ফাংশন: টুল কল করলে যে ফাংশন এক্সিকিউট হবে
বেসিক টুল ইমপ্লিমেন্টেশন
from langchain.tools import BaseTool
from typing import Optional, Type
class SimpleTool(BaseTool):
name = "simple_tool"
description = "একটি সিম্পল টুল যা ইনপুট টেক্সটকে আপারকেস করে।"
def _run(self, query: str) -> str:
"""টুল রান করে"""
return query.upper()
async def _arun(self, query: str) -> str:
"""টুল অ্যাসিঙ্ক্রোনাসলি রান করে"""
return query.upper()
বিল্ট-ইন টুল
LangChain বিভিন্ন বিল্ট-ইন টুল প্রদান করে যা আপনি সহজেই ব্যবহার করতে পারেন।
1. সার্চ টুল
from langchain.tools import Tool
from langchain.utilities import GoogleSearchAPIWrapper
# গুগল সার্চ API সেটআপ করুন
search = GoogleSearchAPIWrapper()
# সার্চ টুল তৈরি করুন
search_tool = Tool(
name="Google Search",
description="ইন্টারনেটে সার্চ করার জন্য উপযোগী। কারেন্ট ইভেন্ট, ফ্যাক্ট চেক, বা অনলাইন তথ্য খোঁজার জন্য ব্যবহার করুন।",
func=search.run
)
2. ক্যালকুলেটর টুল
from langchain.tools import Tool
from langchain.utilities import PythonREPL
# পাইথন REPL সেটআপ করুন
python_repl = PythonREPL()
# ক্যালকুলেটর টুল তৈরি করুন
calculator_tool = Tool(
name="Calculator",
description="ম্যাথমেটিক্যাল ক্যালকুলেশন করার জন্য উপযোগী। ইনপুট হিসেবে পাইথন এক্সপ্রেশন নিবে।",
func=python_repl.run
)
3. ওয়েদার টুল
from langchain.tools import Tool
import requests
def get_weather(location: str) -> str:
"""নির্দিষ্ট লোকেশনের আবহাওয়া পান"""
# এখানে আসল API কল থাকবে
# এটি একটি ডেমো উদাহরণ
return f"{location} এর আবহাওয়া: 28°C, আংশিক মেঘলা"
# ওয়েদার টুল তৈরি করুন
weather_tool = Tool(
name="Weather",
description="কোন লোকেশনের বর্তমান আবহাওয়া জানতে ব্যবহার করুন। ইনপুট হিসেবে শহর বা এলাকার নাম নিবে।",
func=get_weather
)
4. ডাটাবেস টুল
from langchain.tools import Tool
from langchain.utilities import SQLDatabase
from langchain.chains import SQLDatabaseChain
from langchain_openai import OpenAI
# ডাটাবেস কানেকশন সেটআপ করুন
db = SQLDatabase.from_uri("sqlite:///chinook.db")
# LLM সেটআপ করুন
llm = OpenAI(temperature=0)
# SQL চেইন তৈরি করুন
db_chain = SQLDatabaseChain.from_llm(llm, db, verbose=True)
# ডাটাবেস টুল তৈরি করুন
database_tool = Tool(
name="Database",
description="SQL ডাটাবেস কোয়েরি করার জন্য উপযোগী। ইনপুট হিসেবে ন্যাচারাল ল্যাঙ্গুয়েজ কোয়েরি নিবে।",
func=db_chain.run
)
5. ডকুমেন্ট লোডার টুল
from langchain.tools import Tool
from langchain.document_loaders import WebBaseLoader
def load_document(url: str) -> str:
"""URL থেকে ডকুমেন্ট লোড করে"""
loader = WebBaseLoader(url)
docs = loader.load()
return docs[0].page_content
# ডকুমেন্ট লোডার টুল তৈরি করুন
document_tool = Tool(
name="DocumentLoader",
description="ওয়েবসাইট থেকে টেক্সট কনটেন্ট লোড করার জন্য উপযোগী। ইনপুট হিসেবে URL নিবে।",
func=load_document
)
কাস্টম টুল তৈরি করা
আপনি নিজের প্রয়োজন অনুযায়ী কাস্টম টুল তৈরি করতে পারেন। এখানে কয়েকটি উদাহরণ দেওয়া হল:
1. নিউজ টুল
from langchain.tools import BaseTool
import requests
from typing import Optional, Type
class NewsTool(BaseTool):
name = "news_tool"
description = "সাম্প্রতিক নিউজ পেতে ব্যবহার করুন। ইনপুট হিসেবে টপিক নিবে।"
def _run(self, query: str) -> str:
"""টপিক অনুযায়ী নিউজ খোঁজে"""
# এখানে আসল নিউজ API কল থাকবে
# এটি একটি ডেমো উদাহরণ
return f"{query} সম্পর্কিত সাম্প্রতিক নিউজ:\n1. {query} সম্পর্কে নতুন গবেষণা প্রকাশিত\n2. {query} নিয়ে আন্তর্জাতিক সম্মেলন আয়োজিত"
async def _arun(self, query: str) -> str:
"""অ্যাসিঙ্ক্রোনাস ভার্সন"""
return self._run(query)
2. ইমেজ জেনারেটর টুল
from langchain.tools import BaseTool
import requests
from typing import Optional, Type
class ImageGeneratorTool(BaseTool):
name = "image_generator"
description = "টেক্সট প্রম্পট থেকে ইমেজ জেনারেট করতে ব্যবহার করুন। ইনপুট হিসেবে ইমেজের বর্ণনা নিবে।"
def _run(self, prompt: str) -> str:
"""ইমেজ জেনারেট করে"""
# এখানে আসল ইমেজ জেনারেশন API কল থাকবে (যেমন DALL-E, Stable Diffusion)
# এটি একটি ডেমো উদাহরণ
return f"'{prompt}' বর্ণনা অনুযায়ী ইমেজ জেনারেট করা হয়েছে। ইমেজ URL: https://example.com/generated-image.jpg"
async def _arun(self, prompt: str) -> str:
"""অ্যাসিঙ্ক্রোনাস ভার্সন"""
return self._run(prompt)
3. ফাইল অপারেশন টুল
from langchain.tools import BaseTool
import os
import json
from typing import Optional, Type
class FileOperationTool(BaseTool):
name = "file_operation"
description = "ফাইল পড়া, লেখা, এবং আপডেট করতে ব্যবহার করুন। ইনপুট হিসেবে JSON ফরম্যাটে অপারেশন এবং ফাইল পাথ নিবে।"
def _run(self, query: str) -> str:
"""ফাইল অপারেশন পারফর্ম করে"""
try:
# JSON ইনপুট পার্স করুন
data = json.loads(query)
operation = data.get("operation")
file_path = data.get("file_path")
if not operation or not file_path:
return "অপারেশন এবং ফাইল পাথ উভয়ই প্রয়োজন।"
# অপারেশন পারফর্ম করুন
if operation == "read":
if os.path.exists(file_path):
with open(file_path, 'r', encoding='utf-8') as file:
content = file.read()
return f"ফাইল কনটেন্ট:\n{content}"
else:
return f"ফাইল পাওয়া যায়নি: {file_path}"
elif operation == "write":
content = data.get("content", "")
with open(file_path, 'w', encoding='utf-8') as file:
file.write(content)
return f"ফাইল সফলভাবে লেখা হয়েছে: {file_path}"
elif operation == "append":
content = data.get("content", "")
with open(file_path, 'a', encoding='utf-8') as file:
file.write(content)
return f"ফাইলে সফলভাবে কনটেন্ট যোগ করা হয়েছে: {file_path}"
else:
return f"অজানা অপারেশন: {operation}"
except json.JSONDecodeError:
return "ইনপুট বৈধ JSON ফরম্যাটে নেই।"
except Exception as e:
return f"এরর: {str(e)}"
async def _arun(self, query: str) -> str:
"""অ্যাসিঙ্ক্রোনাস ভার্সন"""
return self._run(query)
4. API কল টুল
from langchain.tools import BaseTool
import requests
import json
from typing import Optional, Type
class APICallTool(BaseTool):
name = "api_call"
description = "এক্সটার্নাল API কল করতে ব্যবহার করুন। ইনপুট হিসেবে JSON ফরম্যাটে API এন্ডপয়েন্ট, মেথড, এবং পেলোড নিবে।"
def _run(self, query: str) -> str:
"""API কল পারফর্ম করে"""
try:
# JSON ইনপুট পার্স করুন
data = json.loads(query)
endpoint = data.get("endpoint")
method = data.get("method", "GET").upper()
headers = data.get("headers", {})
payload = data.get("payload", {})
if not endpoint:
return "API এন্ডপয়েন্ট প্রয়োজন।"
# API কল পারফর্ম করুন
if method == "GET":
response = requests.get(endpoint, headers=headers, params=payload)
elif method == "POST":
response = requests.post(endpoint, headers=headers, json=payload)
elif method == "PUT":
response = requests.put(endpoint, headers=headers, json=payload)
elif method == "DELETE":
response = requests.delete(endpoint, headers=headers, json=payload)
else:
return f"অসমর্থিত HTTP মেথড: {method}"
# রেসপন্স প্রসেস করুন
if response.status_code >= 200 and response.status_code < 300:
try:
return json.dumps(response.json(), indent=2, ensure_ascii=False)
except:
return response.text
else:
return f"API কল ব্যর্থ হয়েছে। স্ট্যাটাস কোড: {response.status_code}, রেসপন্স: {response.text}"
except json.JSONDecodeError:
return "ইনপুট বৈধ JSON ফরম্যাটে নেই।"
except Exception as e:
return f"এরর: {str(e)}"
async def _arun(self, query: str) -> str:
"""অ্যাসিঙ্ক্রোনাস ভার্সন"""
return self._run(query)
এজেন্ট কি এবং কিভাবে কাজ করে
গল্প: এজেন্টকে একজন স্মার্ট অ্যাসিস্ট্যান্ট হিসেবে কল্পনা করুন যার কাছে বিভিন্ন টুল আছে। যখন আপনি তাকে একটি টাস্ক দেন, সে প্রথমে চিন্তা করে কোন টুল ব্যবহার করবে, তারপর সেই টুল ব্যবহার করে, রেজাল্ট দেখে, এবং প্রয়োজনে আরও টুল ব্যবহার করে যতক্ষণ না টাস্ক সম্পন্ন হয়।
এজেন্ট কি?
এজেন্ট হল একটি LLM-ভিত্তিক সিস্টেম যা:
- ইউজারের প্রম্পট বোঝে
- সিদ্ধান্ত নেয় কোন টুল ব্যবহার করবে
- টুল ব্যবহার করে এবং আউটপুট পায়
- আউটপুট বিশ্লেষণ করে এবং পরবর্তী পদক্ষেপ নির্ধারণ করে
- প্রয়োজনে আরও টুল ব্যবহার করে
- সম্পূর্ণ উত্তর তৈরি করে
এজেন্ট কিভাবে কাজ করে
এজেন্ট কাজ করে এই ধাপগুলি অনুসরণ করে:
- ইনপুট প্রসেসিং: ইউজারের প্রম্পট গ্রহণ করে এবং বোঝে।
- প্ল্যানিং: কোন টুল ব্যবহার করবে তা সিদ্ধান্ত নেয়।
- টুল এক্সিকিউশন: নির্বাচিত টুল কল করে এবং আউটপুট পায়।
- অবজারভেশন: টুলের আউটপুট বিশ্লেষণ করে।
- রিজনিং: পরবর্তী পদক্ষেপ নির্ধারণ করে (আরও টুল ব্যবহার করবে নাকি ফাইনাল উত্তর দেবে)।
- রেসপন্স জেনারেশন: সম্পূর্ণ উত্তর তৈরি করে।
এজেন্ট টাইপ
LangChain বিভিন্ন ধরনের এজেন্ট সাপোর্ট করে:
- ReAct এজেন্ট: Reasoning and Acting এর সংক্ষিপ্ত রূপ, যা রিজনিং এবং অ্যাকশন স্টেপ অল্টারনেট করে।
- OpenAI ফাংশন কলিং এজেন্ট: OpenAI-এর ফাংশন কলিং ফিচার ব্যবহার করে টুল কল করে।
- Zero-shot ReAct এজেন্ট: কোন ট্রেনিং ছাড়াই ReAct প্যাটার্ন ব্যবহার করে।
- Structured Tool Chat এজেন্ট: স্ট্রাকচার্ড টুল ইনপুট/আউটপুট ফরম্যাট ব্যবহার করে।
- Plan and Execute এজেন্ট: প্রথমে একটি প্ল্যান তৈরি করে, তারপর সেটি এক্সিকিউট করে।
ReAct এজেন্ট
ReAct (Reasoning and Acting) এজেন্ট হল এমন এজেন্ট যা রিজনিং এবং অ্যাকশন স্টেপ অল্টারনেট করে। এটি LLM-কে “চিন্তা করতে” এবং “অ্যাকশন নিতে” উৎসাহিত করে।
ReAct এজেন্ট কিভাবে কাজ করে
- থট (Thought): এজেন্ট প্রথমে চিন্তা করে কি করতে হবে।
- অ্যাকশন (Action): তারপর একটি টুল সিলেক্ট করে এবং ইনপুট দেয়।
- অবজারভেশন (Observation): টুলের আউটপুট দেখে।
- থট (Thought): আবার চিন্তা করে পরবর্তী পদক্ষেপ কি হবে।
- অ্যাকশন/আন্সার (Action/Answer): আরেকটি টুল ব্যবহার করে বা ফাইনাল উত্তর দেয়।
ReAct এজেন্ট ইমপ্লিমেন্টেশন
from langchain.agents import initialize_agent, Tool
from langchain.agents import AgentType
from langchain_openai import OpenAI
from langchain.utilities import GoogleSearchAPIWrapper, WikipediaAPIWrapper
import os
# API কি সেট করুন
os.environ["OPENAI_API_KEY"] = "your-openai-api-key"
os.environ["GOOGLE_API_KEY"] = "your-google-api-key"
os.environ["GOOGLE_CSE_ID"] = "your-google-cse-id"
# LLM সেটআপ করুন
llm = OpenAI(temperature=0)
# টুল সেটআপ করুন
search = GoogleSearchAPIWrapper()
wikipedia = WikipediaAPIWrapper()
tools = [
Tool(
name="Google Search",
func=search.run,
description="ইন্টারনেটে সার্চ করার জন্য উপযোগী। কারেন্ট ইভেন্ট, ফ্যাক্ট চেক, বা অনলাইন তথ্য খোঁজার জন্য ব্যবহার করুন।"
),
Tool(
name="Wikipedia",
func=wikipedia.run,
description="উইকিপিডিয়া থেকে তথ্য খোঁজার জন্য উপযোগী। ব্যক্তি, স্থান, ইভেন্ট, বা কনসেপ্ট সম্পর্কে জানতে ব্যবহার করুন।"
)
]
# ReAct এজেন্ট তৈরি করুন
react_agent = initialize_agent(
tools,
llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
# এজেন্ট রান করুন
react_agent.run("বাংলাদেশের প্রধানমন্ত্রী কে এবং তিনি কত সাল থেকে প্রধানমন্ত্রী?")
ReAct এজেন্ট আউটপুট উদাহরণ
> Entering new AgentExecutor chain...
আমি বাংলাদেশের বর্তমান প্রধানমন্ত্রী এবং তাঁর কার্যকাল সম্পর্কে জানতে চাই। এর জন্য আমি Google Search ব্যবহার করব।
Action: Google Search
Action Input: "বাংলাদেশের বর্তমান প্রধানমন্ত্রী কে এবং কত সাল থেকে"
Observation: বাংলাদেশের বর্তমান প্রধানমন্ত্রী শেখ হাসিনা। তিনি ১৯৯৬-২০০১, এবং ২০০৯ সাল থেকে ২০২৪ সালের জানুয়ারি পর্যন্ত বাংলাদেশের প্রধানমন্ত্রী ছিলেন।
আমি এখন আরও বিস্তারিত তথ্য জানতে উইকিপিডিয়া ব্যবহার করব।
Action: Wikipedia
Action Input: "শেখ হাসিনা বাংলাদেশের প্রধানমন্ত্রী"
Observation: শেখ হাসিনা ওয়াজেদ (জন্ম ২৮ সেপ্টেম্বর ১৯৪৭) একজন বাংলাদেশী রাজনীতিবিদ যিনি ১৯৯৬-২০০১ সাল পর্যন্ত এবং ২০০৯ থেকে ২০২৪ সালের জানুয়ারি পর্যন্ত বাংলাদেশের প্রধানমন্ত্রী ছিলেন। তিনি বাংলাদেশের জাতীয় সংসদে বিরোধী দলীয় নেতা হিসেবেও দায়িত্ব পালন করেছেন ১৯৮৬-১৯৮৭, ১৯৯১-১৯৯৫, এবং ২০০১-২০০৬ সাল পর্যন্ত। তিনি বাংলাদেশ আওয়ামী লীগের সভাপতি এবং বাংলাদেশের জাতির পিতা শেখ মুজিবুর রহমানের কন্যা।
আমি এখন প্রাপ্ত তথ্য থেকে উত্তর তৈরি করব।
বাংলাদেশের প্রধানমন্ত্রী ছিলেন শেখ হাসিনা ওয়াজেদ। তিনি দুটি সময়কালে প্রধানমন্ত্রী হিসেবে দায়িত্ব পালন করেছেন: প্রথমবার ১৯৯৬ থেকে ২০০১ সাল পর্যন্ত এবং দ্বিতীয়বার ২০০৯ সাল থেকে ২০২৪ সালের জানুয়ারি পর্যন্ত। তিনি বাংলাদেশ আওয়ামী লীগের স্ভাপতি এবং বাংলাদেশের জাতির পিতা শেখ মুজিবুর রহমানের কন্যা।
> Finished chain.
OpenAI ফাংশন কলিং
OpenAI ফাংশন কলিং এজেন্ট OpenAI-এর ফাংশন কলিং ফিচার ব্যবহার করে টুল কল করে। এটি টুল সিলেকশন এবং ইনপুট ফরম্যাটিং-এ বেশি স্ট্রাকচার্ড এবং নির্ভুল।
OpenAI ফাংশন কলিং এজেন্ট কিভাবে কাজ করে
- LLM-কে টুলগুলি ফাংশন হিসেবে ডিফাইন করে দেওয়া হয়।
- LLM সিদ্ধান্ত নেয় কোন ফাংশন কল করবে এবং কি প্যারামিটার দিয়ে।
- এজেন্ট সেই ফাংশন কল করে এবং রেজাল্ট LLM-কে ফিড করে।
- LLM রেজাল্ট প্রসেস করে এবং পরবর্তী ফাংশন কল বা ফাইনাল উত্তর দেয়।
OpenAI ফাংশন কলিং এজেন্ট ইমপ্লিমেন্টেশন
from langchain.agents import initialize_agent, Tool
from langchain.agents import AgentType
from langchain_openai import ChatOpenAI
from langchain.utilities import GoogleSearchAPIWrapper, WikipediaAPIWrapper
import os
# API কি সেট করুন
os.environ["OPENAI_API_KEY"] = "your-openai-api-key"
os.environ["GOOGLE_API_KEY"] = "your-google-api-key"
os.environ["GOOGLE_CSE_ID"] = "your-google-cse-id"
# LLM সেটআপ করুন (OpenAI ফাংশন কলিং এর জন্য ChatOpenAI ব্যবহার করতে হবে)
llm = ChatOpenAI(temperature=0, model="gpt-4-0613")
# টুল সেটআপ করুন
search = GoogleSearchAPIWrapper()
wikipedia = WikipediaAPIWrapper()
def get_weather(location: str) -> str:
"""নির্দিষ্ট লোকেশনের আবহাওয়া পান"""
# এখানে আসল API কল থাকবে
# এটি একটি ডেমো উদাহরণ
return f"{location} এর আবহাওয়া: 28°C, আংশিক মেঘলা"
tools = [
Tool(
name="Google Search",
func=search.run,
description="ইন্টারনেটে সার্চ করার জন্য উপযোগী। কারেন্ট ইভেন্ট, ফ্যাক্ট চেক, বা অনলাইন তথ্য খোঁজার জন্য ব্যবহার করুন।"
),
Tool(
name="Wikipedia",
func=wikipedia.run,
description="উইকিপিডিয়া থেকে তথ্য খোঁজার জন্য উপযোগী। ব্যক্তি, স্থান, ইভেন্ট, বা কনসেপ্ট সম্পর্কে জানতে ব্যবহার করুন।"
),
Tool(
name="Weather",
func=get_weather,
description="কোন লোকেশনের বর্তমান আবহাওয়া জানতে ব্যবহার করুন। ইনপুট হিসেবে শহর বা এলাকার নাম নিবে।"
)
]
# OpenAI ফাংশন কলিং এজেন্ট তৈরি করুন
function_agent = initialize_agent(
tools,
llm,
agent=AgentType.OPENAI_FUNCTIONS,
verbose=True
)
# এজেন্ট রান করুন
function_agent.run("ঢাকার আবহাওয়া কেমন এবং সেখানে কি দর্শনীয় স্থান আছে?")
OpenAI ফাংশন কলিং এজেন্ট আউটপুট উদাহরণ
> Entering new AgentExecutor chain...
আমি প্রথমে ঢাকার আবহাওয়া সম্পর্কে জানতে Weather টুল ব্যবহার করব।
Action: Weather
Action Input: ঢাকা
Observation: ঢাকা এর আবহাওয়া: 28°C, আংশিক মেঘলা
এখন আমি ঢাকার দর্শনীয় স্থান সম্পর্কে জানতে Wikipedia টুল ব্যবহার করব।
Action: Wikipedia
Action Input: ঢাকার দর্শনীয় স্থান
Observation: ঢাকা বাংলাদেশের রাজধানী এবং সবচেয়ে বড় শহর। এখানে অনেক ঐতিহাসিক এবং দর্শনীয় স্থান রয়েছে:
1. আহসান মঞ্জিল: ঢাকার পুরাতন শহরে অবস্থিত একটি ঐতিহাসিক প্রাসাদ, যা ১৯ শতকে নির্মিত হয়েছিল।
2. লালবাগ কেল্লা: ১৭ শতকে মোগল আমলে নির্মিত একটি অসম্পূর্ণ কেল্লা।
3. ঢাকেশ্বরী মন্দির: হিন্দু ধর্মের একটি প্রাচীন মন্দির।
4. জাতীয় সংসদ ভবন: বিশ্ববিখ্যাত স্থপতি লুই কান দ্বারা ডিজাইন করা একটি আধুনিক স্থাপত্য।
5. জাতীয় স্মৃতিসৌধ: বাংলাদেশের স্বাধীনতা যুদ্ধের স্মরণে নির্মিত।
6. জাতীয় জাদুঘর: বাংলাদেশের ইতিহাস, সংস্কৃতি এবং প্রত্নতত্ত্ব সম্পর্কিত সংগ্রহশালা।
7. স্টার মসজিদ: তারকা আকৃতির টাইলস দিয়ে সাজানো একটি ঐতিহাসিক মসজিদ।
8. ঢাকা বিশ্ববিদ্যালয়: বাংলাদেশের প্রথম বিশ্ববিদ্যালয়, যা ১৯২১ সালে প্রতিষ্ঠিত হয়েছিল।
9. হাতিরঝিল: শহরের মধ্যে একটি আধুনিক বিনোদন কেন্দ্র।
10. বাংলাদেশ জাতীয় চিড়িয়াখানা: মিরপুরে অবস্থিত।
এই তথ্য থেকে আমি এখন একটি সম্পূর্ণ উত্তর তৈরি করব।
ঢাকার আবহাওয়া বর্তমানে 28°C এবং আংশিক মেঘলা রয়েছে।
ঢাকায় অনেক দর্শনীয় স্থান রয়েছে, যেগুলি আপনি ভ্রমণ করতে পারেন:
1. আহসান মঞ্জিল - ঢাকার পুরাতন শহরে অবস্থিত একটি ঐতিহাসিক প্রাসাদ (১৯ শতক)
2. লালবাগ কেল্লা - মোগল আমলে নির্মিত একটি অসম্পূর্ণ কেল্লা (১৭ শতক)
3. জাতীয় সংসদ ভবন - বিখ্যাত স্থপতি লুই কান দ্বারা ডিজাইন করা আধুনিক স্থাপত্য
4. জাতীয় স্মৃতিসৌধ - স্বাধীনতা যুদ্ধের স্মরণে নির্মিত
5. জাতীয় জাদুঘর - বাংলাদেশের ইতিহাস ও সংস্কৃতির সংগ্রহশালা
6. স্টার মসজিদ - তারকা আকৃতির টাইলস দিয়ে সাজানো ঐতিহাসিক মসজিদ
7. ঢাকা বিশ্ববিদ্যালয় - ১৯২১ সালে প্রতিষ্ঠিত বাংলাদেশের প্রথম বিশ্ববিদ্যালয়
8. হাতিরঝিল - শহরের মধ্যে একটি আধুনিক বিনোদন কেন্দ্র
9. বাংলাদেশ জাতীয় চিড়িয়াখানা - মিরপুরে অবস্থিত
10. ঢাকেশ্বরী মন্দির - একটি প্রাচীন হিন্দু মন্দির
> Finished chain.
এজেন্ট এক্সিকিউটর এবং কন্ট্রোল
এজেন্ট এক্সিকিউটর হল এমন কম্পোনেন্ট যা এজেন্টের এক্সিকিউশন প্রসেস কন্ট্রোল করে। এটি এজেন্টের অ্যাকশন, টুল কল, এবং আউটপুট ম্যানেজ করে।
এজেন্ট এক্সিকিউটর কনফিগারেশন
from langchain.agents import AgentExecutor, initialize_agent, Tool
from langchain.agents import AgentType
from langchain_openai import OpenAI
from langchain.memory import ConversationBufferMemory
import os
# API কি সেট করুন
os.environ["OPENAI_API_KEY"] = "your-openai-api-key"
# LLM সেটআপ করুন
llm = OpenAI(temperature=0)
# টুল সেটআপ করুন
def calculator(expression: str) -> str:
"""ম্যাথমেটিক্যাল এক্সপ্রেশন ক্যালকুলেট করে"""
try:
return str(eval(expression))
except Exception as e:
return f"এরর: {str(e)}"
tools = [
Tool(
name="Calculator",
func=calculator,
description="ম্যাথমেটিক্যাল ক্যালকুলেশন করার জন্য উপযোগী। ইনপুট হিসেবে ম্যাথমেটিক্যাল এক্সপ্রেশন নিবে।"
)
]
# মেমোরি সেটআপ করুন
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
# এজেন্ট তৈরি করুন
agent = initialize_agent(
tools,
llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
memory=memory,
verbose=True
)
# এজেন্ট এক্সিকিউটর কনফিগার করুন
agent_executor = AgentExecutor.from_agent_and_tools(
agent=agent,
tools=tools,
memory=memory,
verbose=True,
max_iterations=5, # সর্বোচ্চ ইটারেশন সংখ্যা
early_stopping_method="generate", # আর্লি স্টপিং মেথড
handle_parsing_errors=True # পার্সিং এরর হ্যান্ডেল করবে
)
# এজেন্ট এক্সিকিউটর রান করুন
agent_executor.run("১০০ এবং ২০০ এর যোগফল কত?")
এজেন্ট এক্সিকিউটর কন্ট্রোল প্যারামিটার
এজেন্ট এক্সিকিউটর বিভিন্ন প্যারামিটার দিয়ে কন্ট্রোল করা যায়:
- max_iterations: সর্বোচ্চ ইটারেশন সংখ্যা (ডিফল্ট: 15)
- max_execution_time: সর্বোচ্চ এক্সিকিউশন টাইম (সেকেন্ডে)
- early_stopping_method: আর্লি স্টপিং মেথড (“force” বা “generate”)
- handle_parsing_errors: পার্সিং এরর হ্যান্ডেল করবে কিনা
- return_intermediate_steps: ইন্টারমিডিয়েট স্টেপ রিটার্ন করবে কিনা
এজেন্ট আউটপুট হ্যান্ডলিং
# এজেন্ট রান করুন এবং ইন্টারমিডিয়েট স্টেপ পান
result = agent_executor.run(
"১০০ এবং ২০০ এর যোগফল কত?",
return_intermediate_steps=True
)
# রেজাল্ট প্রসেস করুন
final_answer = result["output"]
intermediate_steps = result["intermediate_steps"]
print(f"ফাইনাল আন্সার: {final_answer}")
print("\nইন্টারমিডিয়েট স্টেপস:")
for step in intermediate_steps:
print(f"অ্যাকশন: {step[0].tool}")
print(f"অ্যাকশন ইনপুট: {step[0].tool_input}")
print(f"অবজারভেশন: {step[1]}")
print("---")
এজেন্ট ট্র্যাকিং এবং লগিং
from langchain.callbacks import StdOutCallbackHandler
from langchain.callbacks.tracers import LangChainTracer
from langchain.callbacks.tracers import ConsoleCallbackHandler
# কলব্যাক হ্যান্ডলার সেটআপ করুন
handler = StdOutCallbackHandler()
tracer = LangChainTracer()
console_handler = ConsoleCallbackHandler()
# এজেন্ট এক্সিকিউটর কনফিগার করুন
agent_executor = AgentExecutor.from_agent_and_tools(
agent=agent,
tools=tools,
memory=memory,
verbose=True,
callbacks=[handler, tracer, console_handler] # কলব্যাক হ্যান্ডলার যোগ করুন
)
# এজেন্ট এক্সিকিউটর রান করুন
agent_executor.run("১০০ এবং ২০০ এর যোগফল কত?")
প্র্যাকটিক্যাল এক্সাম্পল: মাল্টি-টুল রিসার্চ এজেন্ট
এখানে একটি প্র্যাকটিক্যাল এক্সাম্পল দেওয়া হল যা একটি রিসার্চ এজেন্ট তৈরি করে যা বিভিন্ন টুল ব্যবহার করে:
from langchain.agents import initialize_agent, Tool
from langchain.agents import AgentType
from langchain_openai import ChatOpenAI
from langchain.utilities import GoogleSearchAPIWrapper, WikipediaAPIWrapper
from langchain.tools import BaseTool
from langchain.memory import ConversationBufferMemory
import requests
import json
import os
from typing import Optional, Type
# API কি সেট করুন
os.environ["OPENAI_API_KEY"] = "your-openai-api-key"
os.environ["GOOGLE_API_KEY"] = "your-google-api-key"
os.environ["GOOGLE_CSE_ID"] = "your-google-cse-id"
# LLM সেটআপ করুন
llm = ChatOpenAI(temperature=0, model="gpt-4-0613")
# টুল সেটআপ করুন
search = GoogleSearchAPIWrapper()
wikipedia = WikipediaAPIWrapper()
# কাস্টম টুল তৈরি করুন
class NewsTool(BaseTool):
name = "news_tool"
description = "সাম্প্রতিক নিউজ পেতে ব্যবহার করুন। ইনপুট হিসেবে টপিক নিবে।"
def _run(self, query: str) -> str:
"""টপিক অনুযায়ী নিউজ খোঁজে"""
# এখানে আসল নিউজ API কল থাকবে
# এটি একটি ডেমো উদাহরণ
return f"{query} সম্পর্কিত সাম্প্রতিক নিউজ:\n1. {query} সম্পর্কে নতুন গবেষণা প্রকাশিত\n2. {query} নিয়ে আন্তর্জাতিক সম্মেলন আয়োজিত"
async def _arun(self, query: str) -> str:
"""অ্যাসিঙ্ক্রোনাস ভার্সন"""
return self._run(query)
class WeatherTool(BaseTool):
name = "weather_tool"
description = "কোন লোকেশনের বর্তমান আবহাওয়া জানতে ব্যবহার করুন। ইনপুট হিসেবে শহর বা এলাকার নাম নিবে।"
def _run(self, location: str) -> str:
"""লোকেশন অনুযায়ী আবহাওয়া দেয়"""
# এখানে আসল ওয়েদার API কল থাকবে
# এটি একটি ডেমো উদাহরণ
return f"{location} এর আবহাওয়া: 28°C, আংশিক মেঘলা"
async def _arun(self, location: str) -> str:
"""অ্যাসিঙ্ক্রোনাস ভার্সন"""
return self._run(location)
def calculator(expression: str) -> str:
"""ম্যাথমেটিক্যাল এক্সপ্রেশন ক্যালকুলেট করে"""
try:
return str(eval(expression))
except Exception as e:
return f"এরর: {str(e)}"
# সব টুল একত্রিত করুন
tools = [
Tool(
name="Google Search",
func=search.run,
description="ইন্টারনেটে সার্চ করার জন্য উপযোগী। কারেন্ট ইভেন্ট, ফ্যাক্ট চেক, বা অনলাইন তথ্য খোঁজার জন্য ব্যবহার করুন।"
),
Tool(
name="Wikipedia",
func=wikipedia.run,
description="উইকিপিডিয়া থেকে তথ্য খোঁজার জন্য উপযোগী। ব্যক্তি, স্থান, ইভেন্ট, বা কনসেপ্ট সম্পর্কে জানতে ব্যবহার করুন।"
),
NewsTool(),
WeatherTool(),
Tool(
name="Calculator",
func=calculator,
description="ম্যাথমেটিক্যাল ক্যালকুলেশন করার জন্য উপযোগী। ইনপুট হিসেবে ম্যাথমেটিক্যাল এক্সপ্রেশন নিবে।"
)
]
# মেমোরি সেটআপ করুন
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
# এজেন্ট তৈরি করুন
research_agent = initialize_agent(
tools,
llm,
agent=AgentType.OPENAI_FUNCTIONS,
memory=memory,
verbose=True
)
# এজেন্ট রান করুন
research_agent.run("আমি একটি রিসার্চ করছি জলবায়ু পরিবর্তন নিয়ে। এ সম্পর্কে সাম্প্রতিক তথ্য, নিউজ, এবং বাংলাদেশে এর প্রভাব সম্পর্কে জানতে চাই। এছাড়া ঢাকার বর্তমান আবহাওয়া কেমন?")
উপসংহার
এই টিউটোরিয়ালে আমরা LangChain-এ টুল এবং এজেন্ট সম্পর্কে বিস্তারিত জেনেছি। আমরা দেখেছি কিভাবে:
- টুল ডিফাইন এবং ব্যবহার করতে হয়
- বিল্ট-ইন টুল ব্যবহার করতে হয়
- কাস্টম টুল তৈরি করতে হয়
- এজেন্ট কি এবং কিভাবে কাজ করে
- ReAct এজেন্ট ইমপ্লিমেন্ট করতে হয়
- OpenAI ফাংশন কলিং ব্যবহার করতে হয়
- এজেন্ট এক্সিকিউটর কনফিগার এবং কন্ট্রোল করতে হয়
টুল এবং এজেন্ট LLM-ভিত্তিক অ্যাপ্লিকেশনের ক্ষমতা বাড়াতে অত্যন্ত গুরুত্বপূর্ণ। এগুলি LLM-কে বাহ্যিক সিস্টেম এবং ডাটা সোর্সের সাথে ইন্টারাক্ট করতে সাহায্য করে, যা LLM-কে আরও কার্যকর এবং ইউজফুল করে তোলে।
আপনি এই কনসেপ্টগুলি ব্যবহার করে বিভিন্ন ধরনের অ্যাপ্লিকেশন তৈরি করতে পারেন, যেমন:
- ভার্চুয়াল অ্যাসিস্ট্যান্ট
- রিসার্চ এজেন্ট
- কাস্টমার সাপোর্ট বট
- ডাটা অ্যানালিসিস টুল
- কনটেন্ট জেনারেশন সিস্টেম
পরবর্তী টিউটোরিয়ালে আমরা আরও অ্যাডভান্সড টপিক এক্সপ্লোর করব!