ai-agents-for-beginners

Microsoft Foundry Local এবং Qwen ব্যবহার করে লোকাল AI এজেন্ট তৈরি

Local AI এজেন্ট তৈরি

আগের পাঠে এজেন্টগুলো ক্লাউডে স্কেল করা হয়েছিল। এই পাঠে সেগুলোকে একক যন্ত্রে আনা হবে। শেষে আপনার কাছে এমন একটি প্রকৌশল সহকারী থাকবে যা যুক্তি করে, টুলস কল করে, আপনার ফাইল পড়ে এবং ডকুমেন্টেশন অনুসন্ধান করে — একটিও ক্লাউড ইনফারেন্স কল ছাড়াই।

আপনি কেন এটা চান? প্রকৌশল কাজের মধ্যে নিয়মিত তিনটি কারণ আসে:

তবে আপনি একটি frontier cloud মডেলকে tradeoff করছেন একটি Small Language Model (SLM) এর জন্য যা আপনার CPU, GPU, অথবা NPU তে চলে। এই পাঠে এমন এজেন্টগুলি তৈরি করা শিখবেন যা সেই সীমার মধ্যে ভালো পারফর্ম করে, বরং মনে করেন যে সীমাটি নেই।

পরিচিতি

এই পাঠে আপনি শিখবেন:

শেখার লক্ষ্য

এই পাঠ শেষ করার পরে, আপনি পারবেন:

পূর্বপ্রয়োজনীয়তা

এই পাঠটি ধরে নেয় আপনি পূর্ববর্তী পাঠসমূহ সম্পন্ন করেছেন এবং পরিচিত:

এছাড়াও প্রয়োজন:

ছোট ল্যাঙ্গুয়েজ মডেল: লোকাল কাজের জন্য সঠিক টুল

একটি frontier ক্লাউড মডেল এর শত কোটি পরামিতি এবং একটি ডেটা সেন্টার থাকে। একটি SLM এর কয়েকশ কোটি পরামিতি থাকে এবং এটি আপনার ল্যাপটপের RAM-এ ঢোকে। সেই পার্থক্য স্পষ্ট প্রত্যাশা তৈরি করে।

SLM ভালো:

SLM দুর্বল:

তাই স্থানীয় এজেন্টদের জন্য বিজয়ী কৌশল হল: SLM অর্সেস্ট্রেট করবে, আর টুলস ভারী কাজ করবে। মডেলকে আপনার কোডবেস জানা দরকার নেই—তাকে জানতে হবে কখন read_file এবং search_docs কল করতে হয়। এটাই SLM-এর শক্তির সাথে খাপ খায়।

flowchart LR
    U[ডেভেলপার] --> A[স্থানীয় SLM এজেন্ট]
    A -->|কোন টুল ব্যবহার করবে সিদ্ধান্ত নেয়| T1[ফাইল পড়ুন]
    A -->|কোন টুল ব্যবহার করবে সিদ্ধান্ত নেয়| T2[search_docs RAG]
    A -->|কোন টুল ব্যবহার করবে সিদ্ধান্ত নেয়| T3[কোড বিশ্লেষণ করুন]
    T1 --> A
    T2 --> A
    T3 --> A
    A --> R[উত্তর, সম্পূর্ণ ডিভাইসে]

Microsoft Foundry Local

Microsoft Foundry Local একটি হালকা-ওজনের runtime যা সম্পূর্ণরূপে আপনার মেশিনে মডেল ডাউনলোড, ম্যানেজ এবং সার্ভ করে। আমাদের জন্য এর সবচেয়ে গুরুত্বপূর্ণ বৈশিষ্ট্য হল এটি একটি OpenAI-সঙ্গত HTTP endpoint এক্সপোজ করে — অর্থাৎ OpenAI SDK এবং Microsoft Agent Framework এর OpenAI ক্লায়েন্ট শুধু base_url পরিবর্তন করে এটি ব্যবহার করতে পারে। এজেন্ট তৈরির সবকিছু একই রূপে থাকে; শুধু endpoint ক্লাউড থেকে localhost এ চলে আসে।

Foundry Local স্বয়ংক্রিয়ভাবে আপনার হার্ডওয়্যারের জন্য সেরা মডেল বিল্ড বেছে নেয় — CPU বিল্ড, CUDA/GPU বিল্ড, অথবা NPU বিল্ড — যাতে আপনি প্রতি মেশিনে হ্যান্ড-অপটিমাইজ করতে না হয়।

সেটআপ

Foundry Local ইনস্টল করুন (আপনার OS এর জন্য ডকুমেন্টেশন দেখুন), তারপর নিশ্চিত করুন এটি কাজ করছে:

# ইনস্টল করুন (উদাহরণস্বরূপ; আপনার প্ল্যাটফর্মের জন্য ডকুমেন্টেশন অনুসরণ করুন)
winget install Microsoft.FoundryLocal      # উইন্ডোজ
# brew install microsoft/foundrylocal/foundrylocal   # ম্যাকওএস

# একটি Qwen মডেল ডাউনলোড করুন এবং চালান, তারপর লোকাল সার্ভিস শুরু করুন
foundry model run qwen2.5-7b-instruct
foundry service status

সার্ভিস চালু হলে আপনার একটি লোকাল OpenAI-সঙ্গত endpoint থাকে (সাধারণত http://localhost:PORT/v1)। নোটবুকটি স্বয়ংক্রিয়ভাবে foundry-local-sdk ব্যবহার করে endpoint আবিষ্কার করে, তাই আপনাকে পোর্ট হার্ডকোড করতে হবে না।

Qwen Function Calling: কেন গুরুত্বপূর্ণ

একটি এজেন্ট শুধু এজেন্ট যখন সেটি টুলস কল করতে পারে। অনেক SLM চ্যাট করতে পারে, কিন্তু অবিশ্বস্ত, ভুলগঠিত টুল কল তৈরি করে। Qwen মডেলগুলি function calling এর জন্য প্রশিক্ষিত এবং ধারাবাহিকভাবে সঠিক টুল কল গঠন তৈরি করে — যা একটি লোকাল চ্যাট মডেলকে একটি লোকাল এজেন্ট করে তোলে।

ফ্লো হল পরিচিত টুল কলিং লুপ, শুধু যেটা ডিভাইসে চলে:

sequenceDiagram
    participant U as ব্যবহারকারী
    participant A as Qwen এজেন্ট (স্থানীয়)
    participant T as স্থানীয় টুল
    U->>A: "auth.py কি করে?"
    A->>A: সিদ্ধান্ত: read_file কল করুন
    A->>T: read_file("auth.py")
    T-->>A: ফাইলের বিষয়বস্তু
    A->>A: বিষয়বস্তুর উপরে যুক্তি বিশ্লেষণ করুন
    A-->>U: বর্ণনা

লোকাল RAG

ডকুমেন্টেশন অনুসন্ধান হলো সেই জায়গা যেখানে লোকাল এজেন্টরা তাদের মূল্য দেয়। SLM আপনার ফ্রেমওয়ার্কের ডক কি মনে করবে এ আশা করার পরিবর্তে, আপনি সেই ডকগুলো একটি লোকাল ভেক্টর ডাটাবেসে এম্বেড করেন এবং এজেন্ট প্রাসঙ্গিক অংশগুলো প্রয়োজন মতো আনে।

আমরা ব্যবহার করি Chroma, একটি এম্বেডেড ভেক্টর স্টোর যা প্রসেসের মধ্যে চলে, সার্ভার ব্যবস্থাপনা ছাড়া। পুরো পাইপলাইন লোকাল: লোকাল এম্বেডিং মডেল → লোকাল ভেক্টর → লোকাল রিট্রিভাল → লোকাল SLM।

flowchart TB
    D[আপনার ডকস / কোড] --> E[স্থানীয় এমবেডিং মডেল]
    E --> V[(ক্রোমা ভেক্টর ডিবি - ডিস্কে)]
    Q[এজেন্ট প্রশ্ন] --> QE[প্রশ্ন স্থানীয়ভাবে এমবেড করুন]
    QE --> V
    V -->|শীর্ষ-k টুকরো| A[কুইন এজেন্ট]
    A --> Ans[ভিত্তিক উত্তর]

এটি Lesson 5 এর Agentic RAG প্যাটার্নের মতোই — পার্থক্য শুধু যে প্রতিটি উপাদান আপনার মেশিনে চলে।

লোকাল MCP সার্ভার

MCP একটি পরিবহন, ক্লাউড সার্ভিস নয়। MCP সার্ভার একটি লোকাল প্রসেস হিসেবে stdio তে চলতে পারে, স্ট্যান্ডার্ড প্রোটোকলের মাধ্যমে টুলস আপনার এজেন্টের সামনে তুলে ধরে। এতে আপনি MCP সার্ভারের বাড়তে থাকা ইকোসিস্টেম পুনর্ব্যবহার করতে পারেন — ফাইলসিস্টেম অ্যাক্সেস, গিট অপারেশন, ডাটাবেস কোয়েরি — সম্পূর্ণরূপে অফলাইন।

নিরাপত্তার অবস্থা ক্লাউড থেকে ভিন্ন, তবে বিদ্যমান: একটি লোকাল MCP সার্ভার এখনও আপনার ব্যবহারকারীর অনুমতির সাথে চলে, তাই এটি কী কিছু অ্যাক্সেস করে তা সীমাবদ্ধ করুন (একটি প্রকল্প ডিরেক্টরি, পুরো হোম ফোল্ডার নয়) এবং এর আউটপুট যাচাই করে ইনপুট হিসেবে বিবেচনা করুন।

হাইব্রিড ক্লাউড-অ্যান্ড-লোকাল প্যাটার্ন

লোকাল-ফার্স্ট মানে শুধুই লোকাল নয়। পরিণত সিস্টেমগুলো সংবেদনশীলতা ও কঠিনতার ওপর ভিত্তি করে রুট করে:

পরিস্থিতি কোথায় চলে
সংবেদনশীল কোড/ডেটা, অথবা অফলাইন লোকাল SLM
সহজ, সীমানাবদ্ধ কাজ লোকাল SLM (সস্তা, দ্রুত)
কঠিন বহু-হপ যুক্তি অ-সংবেদনশীল ডেটার ওপর ক্লাউড মডেল
সবকিছু, আউটেজের সময় লোকাল SLM (অনুকূল ক্রমহ্রাস)

এটি Lesson 16 থেকে মডেল রাউটিং ধারনার মতো — পার্থক্য শুধু এক “মডেল” এখন আপনার নিজস্ব মেশিন। একটি মজবুত ডিজাইন ক্লাউড না থাকলে লোকালে ফিরে যায়, তাই এজেন্ট প্রত্যক্ষ ব্যর্থতার পরিবর্তে মানগত অবনতিতে পড়ে।

flowchart LR
    Q[অনুরোধ] --> S{সংবেদনশীল বা অফলাইন?}
    S -->|হ্যাঁ| L[স্থানীয় SLM]
    S -->|না| C{গভীর বিশ্লেষণের প্রয়োজন?}
    C -->|না| L
    C -->|হ্যাঁ| Cloud[ক্লাউড মডেল]
    L --> Out[প্রতিক্রিয়া]
    Cloud --> Out

হাতে কলমে ল্যাব: একটি লোকাল ইঞ্জিনিয়ারিং সহকারী

খোলুন code_samples/17-local-agent-foundry-local.ipynb এবং এটি অনুসরণ করুন। আপনি একটি লোকাল ইঞ্জিনিয়ারিং সহকারী তৈরি করবেন যা সম্পূর্ণরূপে আপনার ওয়ার্কস্টেশনে চলে এবং করতে পারে:

  1. টুল কল করা — Foundry Local এর মাধ্যমে Qwen function calling ব্যবহার করে।
  2. লোকাল ফাইল অপারেশন সম্পাদন করা — একটি প্রকল্প ডিরেক্টরিতে ফাইল তালিকাভুক্ত এবং পড়া।
  3. কোড বিশ্লেষণ করা — একটি সোর্স ফাইলে মৌলিক পরিমাপ প্রতিবেদন।
  4. ডকুমেন্টেশন অনুসন্ধান — Chroma সহ ডক ফোল্ডারের ওপর লোকাল RAG।
  5. MCP ব্যবহার করা — একটি লোকাল MCP সার্ভারের সাথে সংযোগ (যদি না থাকে সুকৌশলে বাদ দেওয়া)।

কোনো ক্লাউড ইনফারেন্স ব্যবহার হয় না।

ওয়াকথ্রু

সহকারী Foundry Local এর OpenAI-সঙ্গত endpoint এর মাধ্যমে সংযুক্ত হয়, তাই এজেন্ট কোড ক্লাউড পাঠের মতোই প্রায়ই একরকম দেখায় — শুধু ক্লায়েন্ট বদলায়:

from foundry_local import FoundryLocalManager
from openai import OpenAI

# ফাউন্ড্রি লোকাল মডেল সনাক্ত করে/ডাউনলোড করে এবং আমাদের একটি লোকাল এন্ডপয়েন্ট দেয়।
manager = FoundryLocalManager(\"qwen2.5-7b-instruct\")
client = OpenAI(base_url=manager.endpoint, api_key=manager.api_key)  # api_key একটি স্থানীয় প্লেসহোল্ডার।

টুলগুলি প্রকল্প ডিরেক্টরিতে সীমাবদ্ধ সাধারণ Python ফাংশন:

def read_file(path: str) -> str:
    \"\"\"Read a file, but only inside the sandboxed project directory.\"\"\"
    full = (PROJECT_ROOT / path).resolve()
    if PROJECT_ROOT not in full.parents and full != PROJECT_ROOT:
        return \"Access denied: path is outside the project directory.\"
    return full.read_text(encoding=\"utf-8\")

স্যান্ডবক্স চেক লক্ষ্য করুন—লোকাল হলেও এমন একটি টুল যা এলোমেলো পথ পড়ে সেটা ঝুঁকিপূর্ণ। নোটবুক প্রতিটি টুলকে একটি প্রকল্প রুটে সীমাবদ্ধ রাখে।

জ্ঞান পরীক্ষা

অ্যাসাইনমেন্টে যাওয়ার আগে আপনার বোঝার পরীক্ষা করুন।

1. একটি এজেন্ট লোকাল চালানোর দুইটি নির্দিষ্ট কারণ দিন ক্লাউডের পরিবর্তে।

উত্তর যেকোন দুইটি: **গোপনীয়তা** (কোড এবং ডেটা মেশিন থেকে বের হয় না), **খরচ** (প্রতি টোকেন ইনফারেন্স বিল নেই), এবং **অফলাইন সক্ষমতা** (নেটওয়ার্ক ছাড়া কাজ করে — প্লেনে, নিরাপদ স্থানে, বা আউটেজের সময়)। নিয়ন্ত্রক/কমপ্লায়েন্স বাধ্যবাধকতা ডেটা ডিভাইস থেকে পাঠানো নিষিদ্ধ করে, যা গোপনীয়তার কারণ।

2. লোকাল এজেন্টে SLM এবং এর টুলগুলোর মধ্যে কীভাবে বরাদ্দ রাখা উচিত, এবং কেন?

উত্তর SLM কে **অর্সেস্ট্রেট** করতে দিন (কোন টুল কল হবে এবং কী আর্গুমেন্ট নিয়ে), এবং **টুলস ভারী কাজ করবে** (ফাইল পড়া, ডক আনাসন্ধান, ফলাফল হিসাব করা)। SLM সীমানাবদ্ধ সিদ্ধান্তে শক্তিশালী কিন্তু বিস্তৃত জ্ঞান ও দীর্ঘ যুক্তিতে দুর্বল, তাই টুলসের ওপর নির্ভরতাই তাদের শক্তি।

3. Foundry Local সঙ্গে ক্লাউড এজেন্ট কোড পুনর্ব্যবহার সম্ভব করে কী?

উত্তর Foundry Local একটি **OpenAI-সঙ্গত HTTP endpoint** প্রদান করে। OpenAI SDK এবং Agent Framework-এর OpenAI ক্লায়েন্ট শুধু `base_url` পরিবর্তন (এবং লোকাল প্লেসহোল্ডার API কী ব্যবহার) করে এটিতে কাজ করে। এজেন্ট কোডের বাকি সব একই থাকে।

4. আমরা কেন কোনো SLM নয়, বিশেষ করে Qwen function-calling মডেল ব্যবহার করি?

উত্তর কারণ একটি এজেন্টকে নির্ভরযোগ্য, সঠিক গঠনের **টুল কল** তৈরি করতে হয়। অনেক SLM চ্যাট করতে পারে কিন্তু ভুলগঠিত বা অসঙ্গত টুল-কলের স্ট্রাকচার তৈরি করে। Qwen মডেলগুলি function calling এর জন্য প্রশিক্ষিত এবং ধারাবাহিক টুল কল তৈরি করে, যা একটি লোকাল চ্যাট মডেলকে কাজ করা লোকাল এজেন্টে রূপান্তর করে।

5. লোকাল RAG পাইপলাইনে কোন উপাদানগুলো মেশিনে চলে?

উত্তর সবগুলো: এম্বেডিং মডেল, ভেক্টর ডাটাবেস (Chroma, ডিস্কে), রিট্রিভাল ধাপ, এবং SLM। ডকুমেন্টগুলো লোকালি এম্বেড করা হয়, সংরক্ষণ করা হয়, স্থানীয়ভাবে আনা হয় এবং একটি লোকাল মডেল দিয়ে বিশ্লেষণ করা হয় — কোন অংশই ক্লাউড স্পর্শ করে না।

6. একটি লোকাল MCP সার্ভার আপনার মেশিনে চালানো হচ্ছে। এটি কি স্বয়ংক্রিয়ভাবে নিরাপদ? কোন সাবধানতা নেওয়া উচিত?

উত্তর না। একটি লোকাল MCP সার্ভার আপনার ব্যবহারকারীর অনুমতির সঙ্গে চলে, তাই এটি আপনার মতো যেকোন বস্তুতে পৌঁছাতে পারে। এটি যতটুকু প্রয়োজন সেই অংশে সীমাবদ্ধ করুন (যেমন একটি প্রকল্প ডিরেক্টরি, পুরো হোম ফোল্ডার নয়) এবং এর আউটপুটের ইনপুট হিসেবে যাচাই করুন যেভাবে ব্যবহার করবেন।

7. একটি বোধগম্য হাইব্রিড রাউটিং নিয়ম বর্ণনা করুন যেখানে একটি লোকাল মডেল অন্তর্ভুক্ত।

উত্তর সংবেদনশীল বা অফলাইন অনুরোধ লোকাল SLM-তে পাঠান; সহজ সীমানাবদ্ধ কাজ লোকাল SLM-তে দ্রুত আর সস্তায় পাঠান; কঠিন বহু-হপ যুক্তি অ-সংবেদনশীল ডেটা ক্লাউড মডেলে পাঠান; এবং যদি ক্লাউড পাওয়া না যায় তবে লোকাল SLM-তে ফিরে যান যাতে এজেন্ট অনাকাঙ্ক্ষিতভাবে ব্যর্থ না হয়ে মানসম্পন্ন অবনতিতে পড়ে। এটা Lesson 16-র মডেল রাউটিং, যেখানে স্থানীয় মেশিন এক মডেল।

8. এ পাঠের লোকাল এজেন্ট চালানোর জন্য বাস্তবসম্মত সর্বনিম্ন RAM কত, এবং বেশি RAM কি দেয়?

উত্তর প্রায় **8 GB** হল বাস্তবসম্মত সর্বনিম্ন; 16 GB+ আরামদায়ক। বেশি RAM আপনাকে বড়, অধিক সক্ষম মডেল চালাতে এবং আরও প্রসঙ্গ মনে রাখতে দেয়। GPU বা NPU ইনফারেন্স দ্রুততর করে তবে আবশ্যক নয় — Foundry Local কোনো অ্যাক্সিলারেটর না পেলে CPU বিল্ড বেছে নেয়।

অ্যাসাইনমেন্ট

লোকাল ইঞ্জিনিয়ারিং সহকারীকে লোকাল ডকুমেন্টেশন রিভিউয়ার এ সম্প্রসারিত করুন আপনার পছন্দের একটি ছোট প্রকল্পের জন্য (প্রয়োজনে এই রিপোর কোন লেসন ফোল্ডার ব্যবহার করুন)।

আপনার সাবমিশন হওয়া উচিত:

  1. একটি বাস্তব ডকস/কোড ফোল্ডার Chroma তে ইনডেক্স করা (অন্তত পাঁচটি ফাইল)।
  2. একটি find_todos টুল যোগ করা যা প্রকল্পের TODO/FIXME মন্তব্যগুলি স্ক্যান করে এবং ফাইল ও লাইন নম্বর সহ ফিরে দেয় — read_file এর স্যান্ডবক্স চেক একই থাকবে।

৩. এজেন্টকে তিনটি প্রশ্ন করুন যাতে এটি টুলগুলো একত্রিত করে: একটি খাঁটি RAG প্রশ্ন, একটি যা একটি নির্দিষ্ট ফাইল পড়া দরকার, এবং একটি যা TODO খুঁজে বের করার দরকার। ৪. এটির মাপ নিন: তিনটি প্রতিক্রিয়ার প্রত্যেকটির সময় পরিমাপ করুন এবং একটি মার্কডাউন সেলে নোট করুন। মন্তব্য করুন যে বিলম্ব আপনার পরিকল্পিত ওয়ার্কফ্লোর জন্য গ্রহণযোগ্য কিনা।

তারপরে একটি সংক্ষিপ্ত প্যারাগ্রাফ লিখুন আপনি কী ক্লাউডে স্থানান্তর করবেন এবং কী স্থানীয়ভাবে রাখবেন এই পর্যালোচনাকারীর জন্য, এবং কেন। আপনার মূল্যায়ন হবে স্থানীয় উপাদানগুলি সঠিকভাবে সংযুক্ত হয়েছে কিনা এবং আপনার হাইব্রিড যুক্তি যুক্তিসঙ্গত কিনা — মডেল গুণগত মানের উপর নয়।

সারসংক্ষেপ

এই পাঠে আপনি একটি এজেন্ট তৈরি করেছেন যা সম্পূর্ণরূপে আপনার নিজস্ব মেশিনে চলে:

এটি ডিপ্লয়মেন্ট চক্র সম্পন্ন করে: পাঠ ১৬ এ এজেন্টদের Microsoft Foundry তে স্কেল করা হয়েছে, এবং এই পাঠে একক ওয়ার্কস্টেশনে তাদের স্কেল করা হয়েছে। পরবর্তী পাঠে ডিপ্লয়ড এজেন্টদের সুরক্ষিত রাখা নিয়ে আলোচনা করা হবে।

অতিরিক্ত সংস্থানসমূহ

পূর্ববর্তী পাঠ

Deploying Scalable Agents

পরবর্তী পাঠ

Securing AI Agents


অস্বীকৃতি: এই নথিটি AI অনুবাদ পরিষেবা Co-op Translator ব্যবহার করে অনূদিত হয়েছে। যদিও আমরা শুদ্ধতার জন্য চেষ্টা করি, অনুগ্রহ করে মনে রাখবেন যে স্বয়ংক্রিয় অনুবাদে ত্রুটি বা অসঙ্গতি থাকতে পারে। মূল নথিটি তার স্বভাষায় কর্তৃত্বপূর্ণ উৎস হিসেবে বিবেচিত হওয়া উচিত। গুরুত্বপূর্ণ তথ্যের জন্য পেশাদার মানব অনুবাদ সুপারিশ করা হয়। এই অনুবাদের ব্যবহারে প্রয়োজনীয় ভুল বোঝাবুঝি বা ভুল ব্যাখ্যার জন্য আমরা দায়বদ্ধ নই।