AI এজেন্ট এবং ফাংশন কলিং: LLM-এর জন্য টুল তৈরি
আপনি একটি AI এজেন্ট তৈরি করছেন যার রিয়েল-টাইম ডেটা আনতে, গণনা করতে বা বাহ্যিক API-এর সাথে ইন্টারঅ্যাক্ট করতে হবে। কিন্তু LLM-এর টেক্সট জেনারেশন এবং প্রকৃত কোড এক্সিকিউশনের মধ্যে ফাঁক কীভাবে পূরণ করবেন? ফাংশন কলিং (যা টুল ব্যবহার নামেও পরিচিত) তার উত্তর। এটি LLM-কে নির্দিষ্ট অ্যাকশনের অনুরোধ করতে দেয় এবং আপনার কোড সেগুলো এক্সিকিউট করে। এই গাইডটি আপনাকে AI এজেন্টের জন্য ফাংশন কলিং ডিজাইন, ইমপ্লিমেন্ট এবং ডিবাগ করার পথ দেখাবে।
ফাংশন কলিং কী?
ফাংশন কলিং হল একটি মেকানিজম যেখানে একটি LLM আপনার সংজ্ঞায়িত একটি ফাংশন কল করার জন্য একটি স্ট্রাকচার্ড অনুরোধ আউটপুট করতে পারে। ফ্রি টেক্সট জেনারেট করার পরিবর্তে, মডেলটি ফাংশনের নাম এবং আর্গুমেন্ট সহ একটি JSON অবজেক্ট রিটার্ন করে। তারপর আপনার অ্যাপ্লিকেশন ফাংশনটি এক্সিকিউট করে এবং ফলাফলটি মডেলে ফিরিয়ে দেয়। এটি এজেন্টদের টেক্সট জেনারেশনের বাইরে কাজ করতে সক্ষম করে, যেমন ডেটাবেস কোয়েরি করা, ইমেইল পাঠানো বা API কল করা।
OpenAI, Anthropic এবং Google-এর মতো প্রধান LLM প্রদানকারীরা ফাংশন কলিং সমর্থন করে। মূল ধারণাটি সামঞ্জস্যপূর্ণ: আপনি উপলব্ধ টুলগুলো বর্ণনা করেন, মডেল সিদ্ধান্ত নেয় কখন সেগুলো ব্যবহার করবে, এবং আপনি এক্সিকিউশন পরিচালনা করেন।
LLM-এর জন্য টুল ডিজাইন করা
নির্ভরযোগ্য এজেন্ট আচরণের জন্য সু-ডিজাইন করা টুল অত্যন্ত গুরুত্বপূর্ণ। এই নীতিগুলো অনুসরণ করুন:
- স্পষ্ট নাম এবং বিবরণ: বর্ণনামূলক ফাংশন নাম এবং বিস্তারিত বিবরণ ব্যবহার করুন। LLM সঠিক টুল বেছে নিতে এগুলোর উপর নির্ভর করে।
- সরল প্যারামিটার: প্যারামিটার ন্যূনতম রাখুন এবং স্ট্যান্ডার্ড টাইপ (string, number, boolean, array, object) ব্যবহার করুন। সম্ভব হলে জটিল নেস্টেড স্ট্রাকচার এড়িয়ে চলুন।
- আইডেম্পোটেন্সি: যেখানে সম্ভব, টুলগুলো আইডেম্পোটেন্ট (পুনরায় চেষ্টা করা নিরাপদ) ডিজাইন করুন যাতে ব্যর্থতাগুলো সুন্দরভাবে সামলানো যায়।
- এরর হ্যান্ডলিং: তথ্যপূর্ণ এরর মেসেজ রিটার্ন করুন যাতে LLM তার পদ্ধতি সামঞ্জস্য করতে পারে।
উদাহরণ: আবহাওয়া টুল
এখানে একটি সাধারণ টুল ডেফিনিশন JSON স্কিমা ফরম্যাটে, যা সাধারণত OpenAI-এর API-এর সাথে ব্যবহৃত হয়:
{
"name": "get_weather",
"description": "Get the current weather for a given city",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "The city name, e.g., San Francisco"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "Temperature unit"
}
},
"required": ["city"]
}
}
ফাংশন কলিং ইমপ্লিমেন্ট করা: ধাপে ধাপে
OpenAI-এর API ব্যবহার করে একটি ন্যূনতম এজেন্ট লুপ তৈরি করি (প্যাটার্নটি অন্যান্য প্রদানকারীর ক্ষেত্রেও প্রযোজ্য)।
১. আপনার টুল ডিফাইন করুন
টুল স্কিমার একটি তালিকা এবং ফাংশন নাম থেকে প্রকৃত Python ফাংশনে একটি ম্যাপিং তৈরি করুন।
import json
import openai
# Tool schemas
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get current weather for a city",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string"},
"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
},
"required": ["city"]
}
}
}
]
# Actual functions
def get_weather(city: str, unit: str = "celsius") -> dict:
# In reality, call a weather API
return {"city": city, "temperature": 22, "unit": unit, "condition": "sunny"}
# Map names to functions
function_map = {
"get_weather": get_weather
}
২. এজেন্ট লুপ তৈরি করুন
এজেন্ট লুপ LLM-এ মেসেজ পাঠায়, টুল কল পরীক্ষা করে, সেগুলো এক্সিকিউট করে এবং মডেল চূড়ান্ত উত্তর রিটার্ন না করা পর্যন্ত পুনরাবৃত্তি করে।
def run_agent(user_message: str):
messages = [{"role": "user", "content": user_message}]
while True:
response = openai.ChatCompletion.create(
model="gpt-4",
messages=messages,
tools=tools,
tool_choice="auto"
)
message = response.choices[0].message
messages.append(message)
# If no tool calls, return the content
if not message.get("tool_calls"):
return message["content"]
# Execute each tool call
for tool_call in message.tool_calls:
function_name = tool_call.function.name
arguments = json.loads(tool_call.function.arguments)
if function_name in function_map:
result = function_map[function_name](**arguments)
else:
result = {"error": f"Unknown function: {function_name}"}
# Append tool result to messages
messages.append({
"role": "tool",
"tool_call_id": tool_call.id,
"content": json.dumps(result)
})
এই লুপ চলতে থাকে যতক্ষণ না LLM টুল কল ছাড়া একটি প্রতিক্রিয়া তৈরি করে, যা নির্দেশ করে যে তার যথেষ্ট তথ্য আছে।
৩. এরর এবং এজ কেস হ্যান্ডেল করুন
বাস্তব-জগতের এজেন্টদের অবশ্যই সামলাতে হবে:
- অবৈধ আর্গুমেন্ট: আর্গুমেন্ট পার্সিং বা ফাংশন কল করার সময় এক্সেপশন ধরুন।
- অজানা টুল: LLM-কে একটি এরর মেসেজ ফেরত দিন যাতে এটি নিজেকে সংশোধন করতে পারে।
- টাইমআউট: বাহ্যিক API কলের জন্য টাইমআউট সেট করুন যাতে হ্যাং না হয়।
- রেট লিমিট: এক্সপোনেনশিয়াল ব্যাকঅফ সহ রিট্রাই ইমপ্লিমেন্ট করুন।
নির্ভরযোগ্য এজেন্টের জন্য সেরা অনুশীলন
- টুল সংখ্যা সীমিত করুন: অনেক বেশি টুল মডেলকে বিভ্রান্ত করে। সম্পর্কিত ফাংশন গ্রুপ করুন বা একটি রাউটার ব্যবহার করুন।
- ইনপুট যাচাই করুন: এক্সিকিউশনের আগে সমস্ত আর্গুমেন্ট স্যানিটাইজ এবং ভ্যালিডেট করুন।
- সবকিছু লগ করুন: ডিবাগিং এবং অডিটিংয়ের জন্য টুল কল এবং ফলাফল লগ করুন।
- বিভিন্ন প্রম্পট দিয়ে পরীক্ষা করুন: নিশ্চিত করুন যে এজেন্ট বিভিন্ন পরিস্থিতিতে সঠিক টুল নির্বাচন করে।
- ফলব্যাক প্রদান করুন: যদি একটি টুল ব্যর্থ হয়, এজেন্টের বিকল্প চেষ্টা করা উচিত বা স্পষ্টীকরণ চাওয়া উচিত।
ফাংশন কলিং সমর্থনের তুলনা
| প্রদানকারী | ফিচারের নাম | ফরম্যাট |
|---|---|---|
| OpenAI | Function Calling | JSON Schema |
| Anthropic | Tool Use | JSON Schema |
| Function Calling | OpenAPI Schema |
উন্নত প্যাটার্ন
আপনার এজেন্ট বড় হওয়ার সাথে সাথে এই প্যাটার্নগুলো বিবেচনা করুন:
- সমান্তরাল টুল কল: কিছু মডেল একসাথে একাধিক টুলের অনুরোধ করতে পারে। গতি বাড়ানোর জন্য সেগুলো একসাথে এক্সিকিউট করুন।
- হিউম্যান-ইন-দ্য-লুপ: সংবেদনশীল অ্যাকশনের জন্য (যেমন, টাকা পাঠানো), এক্সিকিউশনের আগে মানব অনুমোদন প্রয়োজন।
- মেমরি: দীর্ঘ সেশনে প্রসঙ্গ প্রদানের জন্য কথোপকথনের ইতিহাস এবং টুল ফলাফল সংরক্ষণ করুন।
- টুল রাউটিং: মূল LLM কল করার আগে প্রাসঙ্গিক টুল নির্বাচন করতে একটি হালকা ক্লাসিফায়ার ব্যবহার করুন।
ফাংশন কলিং ডিবাগ করা
যখন কিছু ভুল হয়, পরীক্ষা করুন:
- টুল বিবরণ কি স্পষ্ট এবং দ্ব্যর্থহীন?
- প্যারামিটার নাম এবং প্রকার কি সঠিক?
- সঠিক টুল বেছে নেওয়ার জন্য মডেলের যথেষ্ট প্রসঙ্গ আছে কি?
- আপনি কি টুল ফলাফল সঠিকভাবে পরিচালনা করছেন (যেমন, JSON সিরিয়ালাইজেশন)?
সম্পূর্ণ মেসেজ ইতিহাস এবং টুল কল ক্যাপচার করতে লগিং ব্যবহার করুন। প্রায়শই, সমস্যাটি প্রত্যাশিত এবং প্রকৃত আর্গুমেন্টের মধ্যে একটি অমিল।
সাধারণ জিজ্ঞাসা
ফাংশন কলিং এবং টুল ব্যবহারের মধ্যে পার্থক্য কী?
তারা একই ধারণাকে বোঝায়। OpenAI এটিকে "ফাংশন কলিং" বলে, যেখানে Anthropic "টুল ব্যবহার" বলে। উভয়ই LLM-কে বাহ্যিক ফাংশন এক্সিকিউশনের অনুরোধ করতে দেয়।
আমি কি ওপেন-সোর্স মডেলের সাথে ফাংশন কলিং ব্যবহার করতে পারি?
হ্যাঁ, Llama 3.1-এর মতো কিছু ওপেন-সোর্স মডেল ফাংশন কলিং সমর্থন করে এবং LangChain-এর মতো ফ্রেমওয়ার্ক অ্যাবস্ট্রাকশন প্রদান করে। তবে, সমর্থন পরিবর্তিত হয় এবং আপনাকে ফাইন-টিউন করতে বা নির্দিষ্ট প্রম্পট ফরম্যাট ব্যবহার করতে হতে পারে।
আমি কীভাবে LLM-কে বিপজ্জনক ফাংশন কল করা থেকে বিরত রাখব?
কখনও সরাসরি বিপজ্জনক ফাংশন প্রকাশ করবেন না। অ্যালাউলিস্ট ব্যবহার করুন, ইনপুট যাচাই করুন এবং পারমিশন চেক ইমপ্লিমেন্ট করুন। সংবেদনশীল অপারেশনের জন্য, এক্সিকিউশনের আগে মানব নিশ্চিতকরণ প্রয়োজন।
আপনার নিজের AI এজেন্ট তৈরি করতে প্রস্তুত? একটি সাধারণ টুল ডিফাইন করে এবং এজেন্ট লুপ পরীক্ষা করে শুরু করুন। আরও ডেভেলপার টুলের জন্য, টুল কল পেলোড ডিবাগ করতে আমাদের JSON Formatter দেখুন।