এআই এজেন্ট বানাতে কোন কোন ভাষা, লাইব্রেরি ও টুলস আসলে দরকার হয়

এআই এজেন্ট বানাতে কোন কোন ভাষা, লাইব্রেরি ও টুলস আসলে দরকার হয়

Z
জাহিদ হাসান তন্ময়
২ অক্টোবর, ২০২৬
10 মিনিটের পড়া
🇬🇧 Read in English
|
0 views
অডিও ওভারভিউ ও পডকাস্ট
~১ মিনিট কুইক ওভারভিউ
0%

এআই এজেন্ট বানাতে কোন কোন ভাষা, লাইব্রেরি ও টুলস আসলে দরকার হয়
এআই এজেন্ট বানাতে কোন কোন ভাষা, লাইব্রেরি ও টুলস আসলে দরকার হয়

Python-নির্ভর কোনো ফোরামে গিয়ে জিজ্ঞেস করুন এআই এজেন্ট বানাতে কোন ভাষা শেখা উচিত — উত্তর আসবে Python, কোনো দ্বিধা ছাড়াই। একই প্রশ্ন করুন যেখানে JavaScript ডেভেলপাররা আড্ডা দেন, সমান জোরে উত্তর আসবে TypeScript। দুই পক্ষেরই দেখানোর মতো আসল প্রজেক্ট আছে, আর দুই পক্ষই একভাবে ঠিক — যা আসল উত্তরটাকে পক্ষ নেওয়ার চেয়ে বেশি কাজের করে তোলে।

এজেন্ট বানাতে আলাদা কোনো “এআই ভাষা” লাগে না। Python আর TypeScript দুটোই ভালোভাবে কাজ করে, আর সঠিক পছন্দটা সাধারণত নির্ভর করে এজেন্টটা কোথায় চলবে আর তার চারপাশে কী আছে তার ওপর, কোনটা “এআই-এর জন্য ভালো” তার ওপর না। ভাষার বাইরে যা আসলে গুরুত্বপূর্ণ তা হলো মডেলের সাথে কথা বলার একটা SDK, দরকার হলে retrieval-এর জন্য জ্ঞান জমানো আর খোঁজার একটা জায়গা, আর production-এ এজেন্টের tool-গুলো কী করছে তা দেখার একটা উপায়। LangChain বা LlamaIndex-এর মতো framework এসবের ওপর একটা ঐচ্ছিক কাঠামো মাত্র, বাধ্যতামূলক কিছু না।

ভাষার প্রশ্ন: Python নাকি TypeScript

একটা এজেন্ট loop — মেসেজ পড়া, মডেলকে জিজ্ঞেস করা, tool চালানো, ফলাফল ফেরত পাঠানো — এটা সাধারণ অ্যাপ্লিকেশন কোড। এর জন্য কোনো training loop লাগে না, GPU ছোঁয়া লাগে না, Python-এ এমন কিছু নেই যা TypeScript-এ নেই বা উল্টোটা। সিদ্ধান্তটা আসলে ভাষা নিজে নয়, তার চারপাশের প্রসঙ্গ ঠিক করে দেয়।

অনেকটা রান্নাঘর বেছে নেওয়ার মতো। আপনার হাতে দুটো রান্নাঘরই থাকতে পারে, দুটোতেই একই রান্না রান্না করা যায় — আসল প্রশ্নটা হলো কোন রান্নাঘরে আপনার বাকি বাসনকোসন, মসলা আর হাত-পরিচিত জিনিসগুলো আগে থেকেই সাজানো আছে। এজেন্ট বানানোর সময়ও তাই: ভাষাটা রান্নার স্বাদ বদলায় না, শুধু বাকি প্রজেক্টের সাথে কতটা মসৃণভাবে বসে সেটা ঠিক করে।

আপনার এজেন্টের চারপাশে যদি ডেটা-ঘন কিছু চলে — embedding হাতে প্রসেস করা, dataset বানানো, notebook-এ কাজ করা, বা এমন কোনো লাইব্রেরির সাথে কাজ যা শুধু Python-এর ecosystem-এই আছে — তাহলে Python-ই স্বাভাবিক পছন্দ। নতুন কোনো model feature এলে তার উদাহরণও সাধারণত প্রথমে Python-এই আসে।

আপনার এজেন্টকে যদি এমন কিছুর ভেতরে থাকতে হয় যা আপনি ইতিমধ্যেই Node-এ বানাচ্ছেন — একটা Next.js API route, একটা Discord bot, browser extension, বা শুরু থেকে শেষ পর্যন্ত TypeScript-এ লেখা একটা backend — তাহলে TypeScript-ই বাস্তবসম্মত পছন্দ। আগে থেকে থাকা একটা Node অ্যাপে এজেন্ট যোগ করতে গিয়ে দুটো আলাদা runtime জোড়া লাগানো শুধু বাড়তি ঝামেলা, কোনো আসল লাভ নেই তাতে।

Go আর Rust-ও মাঝেমধ্যে দেখা যায়, মূলত এজেন্ট loop-এর জন্য না, তার চারপাশের অংশের জন্য — অনেক বেশি throughput দরকার এমন একটা orchestration service, বা প্রতি মিলিসেকেন্ড গুরুত্বপূর্ণ এমন একটা tool executor। কোনোটাই এই কাজের জন্য কারো প্রথম পছন্দ না।

দুটো ভিন্ন রঙের আলোর রেখা একটা উজ্জ্বল বিন্দুতে মিশে একটাই রেখা হয়ে যাচ্ছে
দুটো ভিন্ন রঙের আলোর রেখা একটা উজ্জ্বল বিন্দুতে মিশে একটাই রেখা হয়ে যাচ্ছে

একমাত্র বাধ্যতামূলক জিনিস: SDK

প্রতিটা এজেন্টের একটামাত্র বাধ্যতামূলক tool লাগে: এমন একটা SDK যা মডেলকে ডাকতে পারে আর structured tool-call request ফেরত দিতে পারে। Anthropic দুই ecosystem-এর জন্যই official client দেয় — TypeScript-এর জন্য @anthropic-ai/sdk, Python-এর জন্য anthropic — আর এই সিরিজের প্রতিটা উদাহরণেই এতদিন TypeScript-টা ব্যবহার করেছি। বাকি তালিকার কোনো কিছুই বাধ্যতামূলক না। একটা কাজ করা এজেন্ট মানে একটা ভাষা, এই একটা লাইব্রেরি, আর নিজের লেখা loop।

Orchestration Framework: কাজের, তবে প্রথম দিনেই না

LangChain, LlamaIndex, CrewAI, Vercel AI SDK — এগুলো আছে যাতে প্রতিটা প্রজেক্টে একই loop, memory handling আর retry logic নতুন করে লিখতে না হয়, আর একসাথে অনেকগুলো এজেন্ট বানানো টিমের জন্য এগুলো সত্যিই কাজে লাগে। তবে দাম হলো, আপনার আর আসলে কী ঘটছে তার মাঝে একটা abstraction layer বসে যায়।

এই সিরিজের প্রতিটা পোস্টে যেভাবে করা হয়েছে, সেভাবে আগে নিজে raw loop বানালে, পরে যখন কোনো framework ব্যবহার করবেন তখন ঠিক বুঝতে পারবেন সে আপনার জন্য কী করছে আর কী লুকিয়ে রাখছে। তার আগেই কোনো framework নিলে সাধারণত এজেন্টের সমস্যা না, framework-এর আচরণ ডিবাগ করতে হয়।

বাকি টুলবক্স

📊 Architecture DiagramArchitecture Flow
Interactive diagram rendering...
flowchart TD
    L[একটা ভাষা বেছে নিন: Python বা TypeScript] --> S[সেই ভাষার official SDK যোগ করুন]
    S --> O[ইচ্ছেমতো তার ওপরে একটা orchestration framework]
    S --> V[জ্ঞান জমানো ও খোঁজার একটা জায়গা]
    S --> G[প্রতিটা tool call-এর জন্য logging]
    O --> D[একটা server বা script হিসেবে deploy]
    V --> D
    G --> D
System architecture specification and node flow: flowchart TD L[একটা ভাষা বেছে নিন: Python বা TypeScript] --> S[সেই ভাষার official SDK যোগ করুন] S --> O[ইচ্ছেমতো তার ওপরে একটা orchestration framework] S --> V[জ্ঞান জমানো ও খোঁজার একটা জায়গা] S --> G[প্রতিটা tool call-এর জন্য logging] O --> D[একটা server বা script হিসেবে deploy] V --> D G --> D

Flow-এর সারসংক্ষেপ: সবকিছুর শুরু একটা ভাষা আর তার official SDK দিয়ে। তার ওপরে orchestration framework ঐচ্ছিক, আর জ্ঞান জমানোর জায়গা এবং প্রতিটা call-এর logging পাশাপাশি বসে, শেষে তিনটাকেই চালানোর একটা জায়গা লাগে।

বাস্তব একটা সেটআপে আরও কয়েকটা সহায়ক অংশ থাকে:

  • জ্ঞান জমানোর জায়গা, retrieval দরকার হলে — শেখার জন্য একটা array আর similarity function দিয়ে শুরু করা যায়, production-এর জন্য একটা ঠিকঠাক vector database পর্যন্ত, RAG নিয়ে আগের পোস্টে যা দেখানো হয়েছে।
  • Secret ব্যবস্থাপনা — API key থাকে environment variable-এ বা আপনার host-এর secret manager-এ, কখনো repository-তে commit করা যায় না।
  • আসল API call খরচ না করে টেস্ট করার একটা উপায় — এই সিরিজের প্রতিটা কোড উদাহরণ এতদিন যাচাই করা হয়েছে আসল client-এর জায়গায় একটা ছোট্ট scripted fake বসিয়ে, যা নির্দিষ্ট response ফেরত দেয় — প্রতিবার নেটওয়ার্ক না ছুঁয়ে এজেন্টের logic unit test করার ঠিক এই পদ্ধতিটাই।
  • Logging — প্রতিটা ধাপে কোন tool চলেছে, কী argument দিয়ে, আর কী ফেরত এসেছে তার রেকর্ড। এটা না থাকলে, production-এ ভুল উত্তর এলে সেটা lookup না হয়ে আন্দাজ হয়ে দাঁড়ায়।
  • Deploy করার একটা জায়গা — request-এর মাঝে state ধরে রাখতে হলে একটা লম্বা সময় চলতে থাকা server, আর প্রতিটা call স্বাধীন আর ছোট হলে একটা serverless function।

দুই ভাষা, একই Loop

Python আর TypeScript তুলনা করার সবচেয়ে পরিষ্কার উপায় হলো ঠিক একই ছোট্ট এজেন্ট দুটোতেই লিখে পাশাপাশি রাখা। দুটোই চালাতে শুধু ANTHROPIC_API_KEY সেট থাকলেই হবে।

TypeScript — npm install @anthropic-ai/sdk দিয়ে ইনস্টল করুন, agent/minimal-agent.ts নামে সেভ করুন, npx tsx agent/minimal-agent.ts দিয়ে চালান:

ts
// agent/minimal-agent.ts
import Anthropic from '@anthropic-ai/sdk';

const client = new Anthropic();

const times: Record<string, string> = { Dhaka: '11:45 PM', London: '6:45 PM' };

const tools: Anthropic.Tool[] = [
  {
    name: 'get_time_in_city',
    description: 'Get the current local time in a named city.',
    input_schema: {
      type: 'object',
      properties: { city: { type: 'string' } },
      required: ['city'],
    },
  },
];

function execute(name: string, input: { city: string }): unknown {
  if (name === 'get_time_in_city') return { time: times[input.city] ?? 'unknown city' };
  return { error: 'unknown tool' };
}

async function runAgent(question: string): Promise<string> {
  const messages: Anthropic.MessageParam[] = [{ role: 'user', content: question }];

  for (let step = 0; step < 4; step++) {
    const response = await client.messages.create({
      model: 'claude-sonnet-5',
      max_tokens: 300,
      tools,
      messages,
    });

    messages.push({ role: 'assistant', content: response.content });

    if (response.stop_reason !== 'tool_use') {
      const block = response.content.find((b): b is Anthropic.TextBlock => b.type === 'text');
      return block?.text ?? '';
    }

    const results: Anthropic.ToolResultBlockParam[] = [];
    for (const block of response.content) {
      if (block.type === 'tool_use') {
        results.push({
          type: 'tool_result',
          tool_use_id: block.id,
          content: JSON.stringify(execute(block.name, block.input as { city: string })),
        });
      }
    }
    messages.push({ role: 'user', content: results });
  }

  return 'Stopped: step limit reached';
}

runAgent('What time is it in Dhaka?').then(console.log);

Python — pip install anthropic দিয়ে ইনস্টল করুন, agent/minimal_agent.py নামে সেভ করুন, python agent/minimal_agent.py দিয়ে চালান:

py
# agent/minimal_agent.py
from anthropic import Anthropic

client = Anthropic()

times = {"Dhaka": "11:45 PM", "London": "6:45 PM"}

tools = [
    {
        "name": "get_time_in_city",
        "description": "Get the current local time in a named city.",
        "input_schema": {
            "type": "object",
            "properties": {"city": {"type": "string"}},
            "required": ["city"],
        },
    }
]


def execute(name, tool_input):
    if name == "get_time_in_city":
        return {"time": times.get(tool_input["city"], "unknown city")}
    return {"error": "unknown tool"}


def run_agent(question):
    messages = [{"role": "user", "content": question}]

    for _ in range(4):
        response = client.messages.create(
            model="claude-sonnet-5",
            max_tokens=300,
            tools=tools,
            messages=messages,
        )

        messages.append({"role": "assistant", "content": response.content})

        if response.stop_reason != "tool_use":
            for block in response.content:
                if block.type == "text":
                    return block.text
            return ""

        results = []
        for block in response.content:
            if block.type == "tool_use":
                results.append({
                    "type": "tool_result",
                    "tool_use_id": block.id,
                    "content": str(execute(block.name, block.input)),
                })
        messages.append({"role": "user", "content": results})

    return "Stopped: step limit reached"


print(run_agent("What time is it in Dhaka?"))

লাইনে লাইনে মিলিয়ে দেখলে দুটোই একই চারটা কাজ করে: একটা tool ঠিক করা, সেটা স্থানীয়ভাবে চালানো, মডেল আর কোনো tool না চাওয়া পর্যন্ত loop চালানো, আর লেখা উত্তর ফেরত দেওয়া। দুটোর মাঝে এজেন্টের আচরণে কোনো তফাত নেই।

একটা জ্বলজ্বলে কাচের কোরের চারপাশে তিনটা ছোট ঐচ্ছিক টুল মডিউল দূরত্ব রেখে ঘুরছে
একটা জ্বলজ্বলে কাচের কোরের চারপাশে তিনটা ছোট ঐচ্ছিক টুল মডিউল দূরত্ব রেখে ঘুরছে

আসল তফাতটা ঠিক কোথায়

এই পোস্টের জন্য একই loop TypeScript থেকে Python-এ নিয়ে যাওয়ার সময় যে তফাতটা চোখে পড়ল, সেটা syntax না — সেটা হলো কোনো block-এর ঠিক type এখনো জানা নেই এমন অবস্থা দুটো ভাষা কীভাবে সামলায়। TypeScript সংস্করণে response.content.find((b): b is Anthropic.TextBlock => b.type === 'text') একটা type predicate: এই লাইন পার হলেই compiler জেনে যায় block-এর একটা .text property আছে, আর কোড চালানোর আগেই autocomplete কাজ করে। Python সংস্করণে block.text-ও একইভাবে কাজ করে, কিন্তু আগে থেকে কেউ সেটা যাচাই করে না — কোনো tool-use block-এর ওপর .text ডাকলে সেটা শুধু চালিয়েই ধরা পড়ত, একটা AttributeError দিয়ে। কোনোটাই ভুল না। TypeScript এই ধরনের ভুল কোড চালানোর আগেই ধরে ফেলে; Python ধরে ঠিক যে মুহূর্তে সেটা ঘটে।

Tool বাছাইয়ে সাধারণ ভুল

  • “এআই-এর জন্য কোনটা সেরা” দেখে ভাষা বেছে নেওয়া, এজেন্ট কোথায় চলবে তা না দেখে। এজেন্ট loop এতে কিছু যায়-আসে না। আপনার deployment আর আগে থেকে থাকা codebase-এর যায়-আসে।
  • একবারও raw loop নিজে না বানিয়ে সরাসরি framework নেওয়া। এতে বোঝার সুযোগটাই হারিয়ে যায়, framework আসলে কী করছে আর কী লুকিয়ে রাখছে।
  • Production-এ কিছু ভাঙার আগ পর্যন্ত logging বাদ দেওয়া। তখন কী ঘটেছিল সেটা লগ থেকে পড়ার বদলে স্মৃতি থেকে জোড়া লাগাতে হয়।
  • Vector database-কে প্রথম দিনের infrastructure ধরে নেওয়া। retrieval আসলে পরিকল্পনার অংশ না হওয়া পর্যন্ত বেশিরভাগ এজেন্টের এটা লাগেই না — একটা array ততক্ষণ ঠিকই চলে, যতক্ষণ না চলে না।

এরপর

ভাষা আর SDK এজেন্টকে স্থানীয়ভাবে চালিয়ে দেয়। একবারে একটা tool call-এ react করার বদলে একটা বহু-ধাপের পরিকল্পনা ভরসাযোগ্যভাবে অনুসরণ করানো — এটা নিয়ে আলাদা একটা পোস্ট লেখার মতো যথেষ্ট আছে।

প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী (FAQ)

আমি যে ভাষা আগে থেকেই জানি, সেটাই কি বেছে নেব?

প্রায় সব ক্ষেত্রেই, হ্যাঁ। এজেন্ট loop সাধারণ অ্যাপ্লিকেশন কোড, machine learning কোড না, তাই আপনার আগে থেকে জানা ভাষাই সাধারণত সঠিক শুরু। শুধু নির্দিষ্ট কোনো কারণ থাকলে বদলান — যেমন আগে থেকে থাকা একটা Python data pipeline, বা এজেন্টকে একটা Node web app-এর ভেতরেই থাকতে হবে এমন কোনো শর্ত।

শুরু করতে কি LangChain বা এরকম কোনো framework লাগবে?

না, আর প্রায়ই একটু অপেক্ষা করাই ভালো। এই সিরিজের প্রতিটা উদাহরণের মতো আগে official SDK দিয়ে raw loop বানান, যাতে কোনো framework যোগ করার আগেই ঠিক বুঝে নিতে পারেন সে আপনার জন্য কী করত।

এআই এজেন্টের জন্য Python কি সত্যিই TypeScript-এর চেয়ে ভালো?

এজেন্ট loop-এর জন্য না — পাশাপাশি রাখা উদাহরণ যেমন দেখাল, দুটো প্রায় সমান। ডেটা-সংক্রান্ত tooling গুরুত্বপূর্ণ হলে Python এগিয়ে থাকে: embedding-এর অঙ্ক, dataset, notebook। এজেন্টকে সরাসরি একটা web app বা আগে থেকে থাকা Node service-এর ভেতরে থাকতে হলে TypeScript এগিয়ে থাকে।

🟢 ফ্রিল্যান্স ও কনট্রাক্ট প্রজেক্টের জন্য উন্মুক্ত

কাস্টম ওয়েব অ্যাপ বা এআই অটোমেশন বানাতে চান?

আমি স্টার্টআপ ও আধুনিক ব্যবসার জন্য স্কেলেবল ফুল-স্ট্যাক ওয়েব অ্যাপ্লিকেশন (Next.js, React, Node, PostgreSQL) এবং ইন্টেলিজেন্ট এআই এজেন্ট সলিউশন তৈরি করি। আপনার প্রজেক্টের আইডিয়া নিয়ে কথা বলা যাক!

ফুল-স্ট্যাক এমভিপি (MVP) ডেভেলপমেন্ট
অটোনোমাস এআই এজেন্ট ও এলএলএম ইন্টিগ্রেশন
পারফেক্ট এসইও ও সর্বোচ্চ পারফরম্যান্স
ক্লিন কোড ও মডার্ন আর্কিটেকচার

আর্টিকেলটি কি আপনার ভালো লেগেছে?

তন্ময়ের কাজকে সাপোর্ট করতে তালি (Clap) দিয়ে উৎসাহিত করুন!

0 views
Z

জাহিদ হাসান তন্ময়

সফটওয়্যার ডেভেলপার

MERN ফুল-স্ট্যাক ডেভেলপার এবং AI এজেন্ট ডেভেলপার, ঢাকা, বাংলাদেশ। ওয়েব ডেভেলপমেন্ট, রিঅ্যাক্ট, লারাভেল এবং আমার লার্নিং জার্নি নিয়ে লিখছি।

Related Articles

Stay Updated

Subscribe to get insights on full-stack architecture, AI agent engineering, and web development.