ইদানীং আমি AI Agents নিয়ে বেশ সময় কাটাচ্ছি, বিশেষ করে Go Backend-এ এগুলোকে কীভাবে আসলে কাজের বানানো যায় তা নিয়ে। মডেলের সাথে Chat করা এক জিনিস, কিন্তু তাকে "হাত-পা" দেওয়া অর্থাৎ Tools ব্যবহার করার ক্ষমতা দেওয়া একদম অন্যরকম একটা অভিজ্ঞতা। এর ফলে মডেল নিজেই Real Data Fetch করতে পারে বা নির্দিষ্ট কোনো Action Trigger করতে পারে।
আমি এর জন্য LangChainGo ব্যবহার করছি। Go Ecosystem-এ এই ধরনের কাজের জন্য এটাই এখন পর্যন্ত সেরা Library বলে আমার মনে হয়। পুরো সোর্স কোড GitHub-এ পাবেন।
Workspace Setup
লোকালি রান করার জন্য আমি Ollama ব্যবহার করি। এতে Feedback Loop খুব ফাস্ট থাকে আর Testing করার সময় বাড়তি কোনো খরচও হয় না। আমার অভিজ্ঞতায়, qwen3.5:9b মডেলটি Tool-calling Instruction বেশ ভালো ফলো করে।
mkdir ai-agent && cd ai-agent go mod init ai-agent go get github.com/tmc/langchaingo@latest go get github.com/tmc/langchaingo/llms/ollama # মডেলটি পুল করে নিন ollama pull qwen3.5:9bmkdir ai-agent && cd ai-agent go mod init ai-agent go get github.com/tmc/langchaingo@latest go get github.com/tmc/langchaingo/llms/ollama # মডেলটি পুল করে নিন ollama pull qwen3.5:9b
Agent-কে Tools দেওয়া
LangChainGo-তে Tool মানে হলো সাধারণ কিছু স্ট্রাক্ট যা নির্দিষ্ট কিছু মেথড ইমপ্লিমেন্ট করে। সবচেয়ে গুরুত্বপূর্ণ পার্ট হলো Description। এখানে একদম স্পেসিফিক হতে হবে কারণ LLM এই ডেসক্রিপশন পড়েই ডিসাইড করে সে এই টুলটা কল করবে কি না।
আমি একটা Weather Tool এভাবে ইমপ্লিমেন্ট করেছি:
func (w Weather) Description() string { // JSON ফরম্যাট নিয়ে একদম ক্লিয়ার ইনস্ট্রাকশন দিন return `Get weather. Input: {"city": "Tokyo", "unit": "celsius"}` } func (w Weather) Call(ctx context.Context, input string) (string, error) { var inp WeatherInput if err := json.Unmarshal([]byte(input), &inp); err != nil { // LLM ভুল JSON পাঠালে তাকে কারণটা বলুন যাতে সে ঠিক করতে পারে return "", fmt.Errorf("invalid JSON: use {"city": "NAME", "unit": "celsius"}") } // ... }func (w Weather) Description() string { // JSON ফরম্যাট নিয়ে একদম ক্লিয়ার ইনস্ট্রাকশন দিন return `Get weather. Input: {"city": "Tokyo", "unit": "celsius"}` } func (w Weather) Call(ctx context.Context, input string) (string, error) { var inp WeatherInput if err := json.Unmarshal([]byte(input), &inp); err != nil { // LLM ভুল JSON পাঠালে তাকে কারণটা বলুন যাতে সে ঠিক করতে পারে return "", fmt.Errorf("invalid JSON: use {"city": "NAME", "unit": "celsius"}") } // ... }
Think-Act-Observe Loop
Agent-এর মূল লজিক থাকে Agent আর Executor-এ। Agent Prompt Engineering সামলায়, আর Executor পুরো লুপটা ম্যানেজ করে। লোকাল মডেল ব্যবহার করার সময় আমি দেখেছি System Prompt যদি খুব কড়া না হয়, তবে মডেল আউটপুট ফরম্যাট নিয়ে উল্টাপাল্টা শুরু করে, যা Parser-কে ব্রেক করে দেয়।
// (Code remains same as original)// (Code remains same as original)
Debugging এবং তিক্ত অভিজ্ঞতা
AI Agents নিয়ে কাজ করতে গিয়ে আমার সবচেয়ে বড় বিরক্তির জায়গা হলো যখন Agent একই লুপে আটকে যায়। বারবার একই ভুল Tool Call করা বা ভুল Input দেওয়াটা বেশ কমন। callbacks.LogHandler{} ব্যবহার করে আপনি Terminal-এ দেখতে পাবেন আপনার Agent আসলে কী ভাবছে।
যদি Agent বারবার ভুল করে, তবে বুঝতে হবে আপনার Tool-এর Description যথেষ্ট পরিষ্কার নয়। শুধু "Error" রিটার্ন না করে LLM বুঝতে পারে এমন Feedback দিলে সে পরের Attempt-এ সেটা ঠিক করে নেওয়ার চেষ্টা করে। তবে মাঝেমধ্যে মডেল এমন সব আজব Tool Call করার চেষ্টা করে যার কোনো অস্তিত্বই নেই, যা সামলানো বেশ চ্যালেঞ্জিং।
AI Agents নিয়ে কাজ করার সময় ধৈর্য রাখা খুব জরুরি। সবকিছু ঠিকঠাক Setup করার পরও মাঝেমধ্যে মডেল অপ্রত্যাশিত আচরণ করতে পারে, যা আসলে এই Technology-র একটা সীমাবদ্ধতা।
Go Language এবং LangChainGo ব্যবহার করে কীভাবে দক্ষ AI Agents তৈরি করবেন, Tool Integration এবং Debugging-এর বাস্তব অভিজ্ঞতা ও কোডসহ বিস্তারিত জানুন!