একটা এজেন্ট কখন Autonomous হয় — Autonomy-র লেভেল বোঝা, Level 0 থেকে Full Autonomous পর্যন্ত

একটা এজেন্ট কখন Autonomous হয় — Autonomy-র লেভেল বোঝা, Level 0 থেকে Full Autonomous পর্যন্ত

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

একটা এজেন্ট কখন Autonomous হয় — Autonomy-র লেভেল বোঝা, Level 0 থেকে Full Autonomous পর্যন্ত
একটা এজেন্ট কখন Autonomous হয় — Autonomy-র লেভেল বোঝা, Level 0 থেকে Full Autonomous পর্যন্ত

MCP নিয়ে আগের পোস্টে দেখেছিলাম, প্রজেক্টের বাইরের tool-এর সাথে এজেন্ট কীভাবে জোড়া লাগে। tool জুড়ে যাওয়ার পর সামনে আসে অন্য একটা প্রশ্ন: কাজের কতটা এজেন্ট নিজে করে ফেলবে, আর কোথায় আপনার কাছে ফিরবে?

এই সিরিজের খরচ-হিসাবের এজেন্টটায় আরেকটা tool জুড়ুন, delete_expense। ইউজার লিখল, “পুরোনো এন্ট্রিগুলো পরিষ্কার করে দাও।” মডেল এটাকে অনুমতি ধরে নিয়ে tool ডাকা শুরু করল। কিছু বিগড়ায়নি। মেসেজটা ওই ব্যাখ্যার জায়গা দিয়েছে, tool-টা কাজটা করতে দিয়েছে। যেটা ছিল না, সেটা হলো কখন tool-টা চলতে পারবে তার নিয়ম।

এজেন্ট কতটা স্বাধীন হওয়া উচিত?

Autonomy মানে মানুষ অনুমোদন দেওয়ার, দেখার বা থামানোর আগে এজেন্ট নিজে কতটা করতে পারে। এটা মডেলের স্বভাব না, আপনার কোড যে নিয়ম জোর করে মানায় সেটা। শুরুতে শুধু পড়ার tool দিন, লেখার আগে মানুষের অনুমোদন চান, আর এজেন্টকে চলতে দেখে একটা একটা করে tool ছেড়ে দিন।

খরচের তালিকার কয়েকটা সারি একটা মোছার নিশ্চিতকরণ কার্ডের আড়ালে আটকে আছে, পাশে অপেক্ষারত জ্বলজ্বলে এজেন্ট কোর
খরচের তালিকার কয়েকটা সারি একটা মোছার নিশ্চিতকরণ কার্ডের আড়ালে আটকে আছে, পাশে অপেক্ষারত জ্বলজ্বলে এজেন্ট কোর

Level 0 থেকে Level 4

এই level-গুলোর কোনো সরকারি মান নেই। এটা আমার নিজের ব্যবহার করা স্কেল, আর প্রতিটা ধাপে একটা করে সিদ্ধান্ত মানুষের হাত থেকে এজেন্টের হাতে যায়।

  • Level 0, কোনো tool নেই। মডেল শুধু লেখে, কাজ সব মানুষের। এটা সাধারণ চ্যাটবট, আলাদা কোড লাগে না, শুধু tools অ্যারে পাঠাবেন না।
  • Level 1, শুধু পড়ার tool। এজেন্ট অর্ডারের অবস্থা বা মোট খরচের মতো জিনিস খুঁজে দেখতে পারে, কিছু বদলাতে পারে না। সবচেয়ে খারাপ ফল একটা ভুল উত্তর।
  • Level 2, অনুমোদন নিয়ে লেখা। এজেন্ট প্রতিটা বদলের প্রস্তাব দেয়, মানুষ হ্যাঁ বা না বলে।
  • Level 3, সীমার ভেতরে স্বাধীনতা। সাধারণ লেখার কাজ নিজে নিজে চলে, আপনার বেঁধে দেওয়া সীমার ভেতরে: step-এর সীমা, প্রতিটা কাজের লগ। ফেরানো যায় না এমন কাজে এখনও জিজ্ঞেস করে।
  • Level 4, পুরো স্বাধীনতা। সবকিছু মানুষ ছাড়াই চলে। খুব কম কাজে এটা মানায়, আর যেগুলোতে মানায় সেখানে prompt-এর চেয়ে অনেক বেশি monitoring লাগে।

Level কোনো পুরো এজেন্টের গায়ে লেগে থাকে না। একই এজেন্টে পড়ার কাজ Level 4-এ আর মোছার কাজ Level 2-এ চলতে পারে। তাই ভাগ করতে হবে এজেন্টকে না, tool-কে।

ভুলের খরচ দিয়ে tool ভাগ করুন

বেশিরভাগ এজেন্টে তিনটা শ্রেণিতেই কুলিয়ে যায়। read tool কিছু বদলায় না। write tool এমন কিছু বদলায় যা ফেরানো যায়। irreversible tool এমন কিছু করে যা ফেরানো যায় না: ডেটা মোছা, বার্তা পাঠানো, টাকা সরানো। শ্রেণি ঠিক হয় ভুল call-এর খরচ দেখে, tool-এর নাম দেখে না। update_record নামটা নিরীহ শোনায়, যতক্ষণ না সে একমাত্র কপিটা ওভাররাইট করে।

তারপর সিদ্ধান্তটা দুটো জিনিসের একটা ফাংশন: tool-এর শ্রেণি আর বর্তমান level।

📊 Architecture DiagramArchitecture Flow
Interactive diagram rendering...
flowchart TD
    A[মডেল একটা tool চায়] --> B{Tool-এর ঝুঁকির শ্রেণি}
    B -->|read| C[চালাও]
    B -->|write| D{Autonomy level}
    B -->|irreversible| E{Autonomy level}
    D -->|১| F[প্রত্যাখ্যান]
    D -->|২| G[মানুষকে জিজ্ঞেস]
    D -->|৩ বা ৪| C
    E -->|১| F
    E -->|২ বা ৩| G
    E -->|৪| C
    G -->|অনুমোদিত| C
    G -->|বাতিল| I[মডেলকে error ফলাফল পাঠাও]
    F --> I
    C --> H[মডেলকে ফলাফল পাঠাও]
System architecture specification and node flow: flowchart TD A[মডেল একটা tool চায়] --> B{Tool-এর ঝুঁকির শ্রেণি} B -->|read| C[চালাও] B -->|write| D{Autonomy level} B -->|irreversible| E{Autonomy level} D -->|১| F[প্রত্যাখ্যান] D -->|২| G[মানুষকে জিজ্ঞেস] D -->|৩ বা ৪| C E -->|১| F E -->|২ বা ৩| G E -->|৪| C G -->|অনুমোদিত| C G -->|বাতিল| I[মডেলকে error ফলাফল পাঠাও] F --> I C --> H[মডেলকে ফলাফল পাঠাও]

Flow-এর সারসংক্ষেপ: প্রতিটা tool-অনুরোধ যাচাই হয় tool-এর ঝুঁকির শ্রেণি আর বর্তমান level দিয়ে। পড়ার কাজ সবসময় চলে। লেখার কাজ level অনুযায়ী চলে বা অনুমোদনের অপেক্ষা করে, আর ফেরানো যায় না এমন কাজ Level 4 না আসা পর্যন্ত মানুষের অপেক্ষা করে। প্রত্যাখ্যান বা বাতিল error ফলাফল হয়ে মডেলের কাছে ফেরে, যাতে সে ঠিকঠাক সাড়া দিতে পারে।

ম্যাগনিফায়ার, পেনসিল আর ট্র্যাশ-বিনের তিনটা কাচের tool কার্ড, যথাক্রমে খোলা লেন, আধখোলা গেট আর হাতের তালু আকৃতির অনুমোদন সুইচসহ বন্ধ গেটে যাচ্ছে
ম্যাগনিফায়ার, পেনসিল আর ট্র্যাশ-বিনের তিনটা কাচের tool কার্ড, যথাক্রমে খোলা লেন, আধখোলা গেট আর হাতের তালু আকৃতির অনুমোদন সুইচসহ বন্ধ গেটে যাচ্ছে

নিয়মটা কোডে

npm install @anthropic-ai/sdk দিয়ে SDK নিন, ANTHROPIC_API_KEY সেট করুন, ফাইলটা agent/autonomy.ts নামে সেভ করে AUTONOMY=2 npx tsx agent/autonomy.ts চালান। মানটা 1, 3 বা 4 করে একই মেসেজ পাঠিয়ে তুলনা করুন। এখানে Node-এর বিল্ট-ইন readline/promises ব্যবহার হয়েছে, তাই Node-এর মোটামুটি নতুন একটা সংস্করণ লাগবে।

ts
// agent/autonomy.ts
import Anthropic from '@anthropic-ai/sdk';
import { createInterface } from 'node:readline/promises';

const client = new Anthropic();
const rl = createInterface({ input: process.stdin, output: process.stdout });

type Risk = 'read' | 'write' | 'irreversible';
type Decision = 'allow' | 'ask' | 'deny';

const LEVEL = Number(process.env.AUTONOMY ?? 2);

const expenses = [{ id: 1, item: 'tea', amount: 40 }];
let nextId = 2;

const risks: Record<string, Risk> = {
  get_total: 'read',
  add_expense: 'write',
  delete_expense: 'irreversible',
};

function decide(level: number, risk: Risk): Decision {
  if (risk === 'read') return 'allow';
  if (level <= 1) return 'deny';
  if (level >= 4) return 'allow';
  if (risk === 'write' && level === 3) return 'allow';
  return 'ask';
}

const tools: Anthropic.Tool[] = [
  {
    name: 'get_total',
    description: 'Return the exact sum of every expense recorded so far. Use this whenever the user asks for a total.',
    input_schema: { type: 'object', properties: {} },
  },
  {
    name: 'add_expense',
    description: 'Record one expense. Use it whenever the user says they spent money.',
    input_schema: {
      type: 'object',
      properties: { item: { type: 'string' }, amount: { type: 'number' } },
      required: ['item', 'amount'],
    },
  },
  {
    name: 'delete_expense',
    description: 'Permanently delete one expense by its id. Use it only when the user names the expense to remove.',
    input_schema: {
      type: 'object',
      properties: { id: { type: 'number' } },
      required: ['id'],
    },
  },
];

function execute(name: string, input: Record<string, unknown>): unknown {
  if (name === 'get_total') return { total: expenses.reduce((sum, e) => sum + e.amount, 0) };
  if (name === 'add_expense') {
    const expense = { id: nextId++, item: String(input.item), amount: Number(input.amount) };
    expenses.push(expense);
    return expense;
  }
  if (name === 'delete_expense') {
    const index = expenses.findIndex((e) => e.id === Number(input.id));
    if (index === -1) return { error: 'no such expense' };
    expenses.splice(index, 1);
    return { ok: true };
  }
  return { error: 'unknown tool' };
}

async function approve(name: string, input: Record<string, unknown>): Promise<boolean> {
  const answer = await rl.question(`Allow ${name} ${JSON.stringify(input)}? (y/n) `);
  return answer.trim().toLowerCase() === 'y';
}

async function guarded(name: string, input: Record<string, unknown>): Promise<unknown> {
  const decision = decide(LEVEL, risks[name] ?? 'irreversible');
  console.log(`[${decision}] ${name}`);
  if (decision === 'deny') return { error: 'not permitted at this autonomy level' };
  if (decision === 'ask' && !(await approve(name, input))) return { error: 'the user declined this action' };
  return execute(name, input);
}

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

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

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

    if (response.stop_reason !== 'tool_use') {
      return response.content.flatMap((b) => (b.type === 'text' ? [b.text] : [])).join('');
    }

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

  return 'Stopped: step limit reached';
}

runAgent('Add 300 for groceries, then delete expense 1.')
  .then(console.log)
  .finally(() => rl.close());

decide-ই পুরো নিয়ম। risks-এ নেই এমন tool-এর শ্রেণি আপনা থেকেই irreversible, ফলে যেটা শ্রেণিতে ফেলতে ভুলে গেছেন সেটা সবচেয়ে কড়া নিয়মে পড়ে। প্রত্যাখ্যান বা বাতিল ফিরে যায় exception হিসেবে না, error ফলাফল হিসেবে, tool-calling পোস্টের একই নিয়মে, যাতে মডেল ইউজারকে বলতে পারে কী ঘটেছে। guarded প্রতিটা সিদ্ধান্তের জন্য এক লাইন ছাপে, আর audit trail হিসেবে এটাই সবচেয়ে ছোট কাজের জিনিস। নমুনা মেসেজে Level 2-এ দুইবার প্রশ্ন আসার কথা, প্রতিটা লেখার জন্য একবার। Level 3-এ add নিজে চলবে, শুধু delete-এর আগে প্রশ্ন আসবে।

নিজের সিরিজের কোড আবার পড়তে গিয়ে যা চোখে পড়ল

এই পোস্টের পরিকল্পনা করতে গিয়ে prompt নিয়ে পোস্টের system prompt টেমপ্লেটটা আবার খুললাম। ওর Boundaries অংশে একটা লাইন আছে: “Never delete or change a past expense unless the user explicitly asks to।” অথচ ওই পোস্টের এজেন্টের tool তিনটা: add_expense, get_total, save_note। delete tool-ই নেই। মানে লাইনটা এমন একটা কাজ ঠেকাচ্ছে যা এজেন্ট করতেই পারে না। ভবিষ্যতে কখনো delete tool যোগ হলে, মডেল আর আপনার ডেটার মাঝে ওই একটা বাক্যই দাঁড়িয়ে থাকত।

চারটা অংশ নিয়ে পোস্টের tracker উল্টো দিক থেকে একই ফাঁক দেখায়। add_expense আর save_note কোনো অনুমোদন ছাড়াই লেখে, একমাত্র সীমা ছয় ধাপের step cap। এটা ছিল একটা Level 3 সিদ্ধান্ত, যেটাকে আমি কখনো নাম দিইনি। মেমোরির অ্যারে আর একটা notes ফাইলের জন্য এটা চলে। ধ্বংসাত্মক কোনো tool তালিকায় ঢুকলেই আর চলে না। এজন্যই এখানকার গেট বসেছে কোডে, execute-এর পাশে, আর prompt-এর লাইনটা থাকে দ্বিতীয় স্তর হিসেবে।

Autonomy নিয়ে সাধারণ ভুল

  • নিয়মটা শুধু prompt-এ রাখা। একটা বাক্য ভুল বোঝা যায়। যে ফাংশন হ্যাঁ ছাড়া delete-এ পৌঁছায়ই না, তাকে যুক্তি দিয়ে এড়ানো যায় না।
  • নাম দেখে শ্রেণি ঠিক করা। ভুল call-এ কী খরচ হবে জিজ্ঞেস করুন, তারপর শ্রেণি বাছুন।
  • শ্রেণি না দেওয়া tool-এর জন্য কোনো ডিফল্ট না রাখা। risks[name] ?? 'irreversible'-এর মতো করে কড়া দিকেই ব্যর্থ হোন।
  • পুরো এজেন্টের level একসাথে বাড়ানো। একবারে একটা tool তুলুন। add_expense ঠিকঠাক চলছে মানে delete_expense ঢিলে করা যায়, তা না।
  • অনুমোদন parallel-এ চালানো। পড়ার call একসাথে চলতে পারে। মানুষের উত্তরের অপেক্ষা করে এমন কিছু একটা একটা করে চালান, loop-এ সাধারণ for সেজন্যই।
  • বাতিলকে crash ধরা। tool result হিসেবে ফেরত দিন, মডেল বিকল্প প্রস্তাব দেবে।

এরপর

Level বলে দেয় একটা এজেন্টের কতটা তদারকি লাগে। tool, memory, prompt আর autonomy পর্যন্ত যা শেখা হলো তা জোড়া দিয়ে প্রথম হাতে-কলমে প্রজেক্ট বানানোর পালা, আর সেটা ঠিকভাবে পরিকল্পনা করার মতো বিষয়।

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

বেশি স্বাধীন এজেন্ট কি সবসময় ভালো এজেন্ট?

না। Autonomy মানুষের পর্যালোচনা সরিয়ে দেয়, আর পর্যালোচনার দাম সবচেয়ে বেশি তখন, যখন কাজটা দামি বা ফেরানো কঠিন। সবচেয়ে নিচের যে level-এ এজেন্ট তবুও কাজের থাকে, সেটাই লক্ষ্য, আর সেটা ঠিক করুন এজেন্ট ধরে না, tool ধরে।

নতুন এজেন্ট বানানো শুরু করব কোথা থেকে?

Level 1 থেকে, শুধু পড়ার tool দিয়ে। তারপর Level 2-এ গিয়ে প্রতিটা লেখা নিজে হাতে অনুমোদন করুন, আর একটা tool-কে অনুমোদন ছাড়া চালাতে দিন তখনই, যখন নানা ধরনের আসল অনুরোধে তাকে ঠিকঠাক চলতে দেখেছেন।

মডেল কি নিজের autonomy level নিজে ঠিক করতে পারে?

পারা উচিত না। তদারকির বিষয় যে মডেল নিজেই, তাই নিয়মটা থাকতে হবে আপনার কোডে, যেখানে মডেল সেটা বদলাতে বা যুক্তি দিয়ে এড়াতে পারে না। prompt-এর একটা লাইন দ্বিতীয় স্তর হিসেবে কাজের, প্রথম স্তর না।

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

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

আমি স্টার্টআপ ও আধুনিক ব্যবসার জন্য স্কেলেবল ফুল-স্ট্যাক ওয়েব অ্যাপ্লিকেশন (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.