অধিকাংশ মানুষই একটি LLM-কে প্রম্পট করতে পারে। কিন্তু প্রকৃত ট্রাফিক সামলাতে পারে এমন একটি প্রোডাক্টের মধ্যে এটিকে বিল্ড করা সম্পূর্ণ ভিন্ন একটি বিষয়। আপনি যদি চ্যাট উইন্ডোতে টাইপ করা থেকে বেরিয়ে প্রোডাকশন-গ্রে AI শিপ করতে চান, তবে আপনাকে বুঝতে হবে যে এই স্ট্যাকটি আসলে কীভাবে কাজ করে। এটি কোনো জাদু নয়। এটি বিচ্ছিন্ন ইঞ্জিনিয়ারিং সমস্যার একটি পাইপলাইন, এবং প্রতিটি স্তরের নিজস্ব ব্যর্থতার ধরন (failure modes) রয়েছে।

একটি আধুনিক AI সিস্টেম কীভাবে কাজ করে, আপনি একটি শব্দ টাইপ করার মুহূর্ত থেকে শুরু করে একটি এজেন্ট একটি কাজ সম্পন্ন করা পর্যন্ত, আমি সেটি আপনাকে বুঝিয়ে বলছি।

ভিত্তি: মডেলগুলো কীভাবে চিন্তা করে

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

আপনার প্রম্পট থেকে মডেলের রেসপন্স পর্যন্ত যাত্রাটি দেখতে অনেকটা এরকম:

Tokenization হলো প্রথম ধাপ। একটি নিউরাল নেটওয়ার্কের কাছে কাঁচা টেক্সট বা Raw text অর্থহীন, তাই মডেল আপনার শব্দগুলোকে ছোট ছোট টুকরোয় ভাগ করে এবং প্রতিটি টুকরোকে একটি সংখ্যার সাথে ম্যাপ করে। "tokenization" শব্দটি তিনটি আলাদা টোকেনে বিভক্ত হতে পারে। ভোকাবুলারির ওপর ভিত্তি করে "New York" ফ্রেজটি একটি বা দুটি টোকেন হতে পারে। এই সংখ্যাগুলো এলোমেলো নয়; এগুলো একটি নির্দিষ্ট ডিকশনারি থেকে আসে যা মডেলটি ট্রেনিংয়ের সময় শিখেছে।

শব্দগুলো সংখ্যা হয়ে গেলে সেগুলোর অর্থ প্রয়োজন। Embeddings সেই সংখ্যাগুলোকে ভেক্টরে রূপান্তরিত করে—যা ফ্লোটিং-পয়েন্ট ভ্যালুর একটি দীর্ঘ তালিকা এবং যা গাণিতিক স্পেসে সদৃশ ধারণাগুলোকে কাছাকাছি রাখে। "King" এবং "Queen" একে অপরের কাছাকাছি থাকে। "Paris" এবং "Berlin" একটি ক্লাস্টারে থাকে, কিন্তু "Python" বা "JavaScript"-এর থেকে আলাদা এলাকায়।

কিন্তু শুধু ভেক্টর দিয়ে ক্রম বা অর্ডার বোঝা যায় না। Positional encoding মডেলকে বলে দেয় যে বাক্যের কোথায় কোন টোকেনটি বসেছে। এটি ছাড়া, "The dog bit the man" এবং "The man bit the dog" দেখতে একই রকম মনে হতো।

এরপর আসে attention mechanism। এখানেই মডেল ইনপুটের সমস্ত টোকেনের দিকে নজর দেয় এবং সিদ্ধান্ত নেয় যে পরবর্তী টোকেনটি প্রেডিক্ট করার জন্য কোনগুলো গুরুত্বপূর্ণ। আপনি যখন জিজ্ঞাসা করেন, "কোম্পানিটি কবে প্রতিষ্ঠিত হয়েছিল এবং এখন কে এটি পরিচালনা করছে?", তখন মডেলের জন্য "founded"-কে একটি তারিখের সাথে এবং "leads"-কে একজন CEO-র নামের সাথে লিঙ্ক করা প্রয়োজন। Attention সেই সংযোগগুলো তৈরি করে।

এই অপারেশনগুলো অনেকগুলো layers-এ স্তরে স্তরে সাজানো থাকে—প্রায়শই ডজন ডজন লেয়ার থাকে—যেখানে প্রাথমিক লেয়ারগুলো সিনট্যাক্স হ্যান্ডেল করে এবং পরবর্তী লেয়ারগুলো বিমূর্ত যুক্তি (abstract reasoning) তৈরি করে। মাঝখানের কোথাও, feed-forward networks তথ্যগত সম্পর্কগুলো জমা রাখে। এখানেই মডেল এই জ্ঞানটি রাখে যে প্যারিস ফ্রান্সের রাজধানী, অথবা একটি নির্দিষ্ট API একটি JSON পেলোড আশা করে। এটি ঠিক কোনো ডেটাবেস নয়, বরং ওয়েটসের (weights) একটি সংকুচিত জাল যা প্যাটার্নগুলোকে সক্রিয় করে।

সবশেষে, decoding অভ্যন্তরীণ ভেক্টর রিপ্রেজেন্টেশনগুলোকে পুনরায় মানুষের পাঠযোগ্য টোকেনে রূপান্তরিত করে। মডেলটি "জানে" না যে এটি ইংরেজি লিখছে; এটি কেবল হাজার হাজার সম্ভাব্য পরবর্তী টোকেনের মধ্যে র‍্যাঙ্কিং করে এবং বারবার সবচেয়ে সম্ভাব্য টোকেনটি বেছে নেয়, যতক্ষণ না এটি একটি স্টপ কন্ডিশনে পৌঁছায়।

RAG লেয়ার: মডেলকে স্মৃতি প্রদান করা

একটি বেস মডেল সময়ের সাথে স্থির হয়ে যায়। এর ওয়েটগুলো একটি নির্দিষ্ট সময় পর্যন্ত ইন্টারনেটের তথ্য ধারণ করে এবং আপনি যদি সেগুলো ইনপুট না দেন, তবে এটি আপনার ব্যক্তিগত ডকুমেন্ট অ্যাক্সেস করতে পারে না। এটি বেশিরভাগ ব্যবসায়িক কাজের জন্য একে অকেজো করে তোলে। Retrieval-Augmented Generation, বা RAG, মডেলটিকে একটি এক্সটারনাল লাইব্রেরি প্রদান করে যা উত্তর দেওয়ার আগে সে এটি ব্যবহার করতে পারে, ফলে এই সমস্যাটি সমাধান হয়।

ধারণাগতভাবে এটি সহজ কিন্তু বাস্তবে বেশ জটিল। প্রথমে, আপনি আপনার ডকুমেন্টগুলো নেন এবং chunking প্রয়োগ করেন। আপনি একটি ১০০ পৃষ্ঠার PDF সরাসরি প্রম্পট উইন্ডোতে ঢেলে দেন না। আপনি এটিকে অনুচ্ছেদ, বিভাগ বা অর্থপূর্ণ ব্লকে এমনভাবে ভাগ করেন যা মডেলের কনটেক্সট লিমিটের মধ্যে থাকে এবং একই সাথে এর অর্থ বজায় থাকে।

প্রতিটি চাঙ্ক (chunk) একটি embedding model-এর মধ্য দিয়ে যায় এবং একটি ভেক্টরে পরিণত হয়, ঠিক যেমন LLM-এর ভেতরের টোকেনগুলো হয়। এই ভেক্টরগুলো একটি vector database-এ থাকে—যা সঠিক অনুসন্ধানের (exact lookup) পরিবর্তে সিমিলারিটি সার্চের (similarity search) জন্য ডিজাইন করা একটি বিশেষ স্টোর। যখন একজন ব্যবহারকারী প্রশ্ন করেন, আপনি তাদের কুয়েরিটি এমবেড করেন এবং ডেটাবেসকে জিজ্ঞাসা করেন: "অর্থের দিক থেকে এই ভেক্টরের সবচেয়ে কাছাকাছি কোন চাঙ্কগুলো আছে?"

শুধুমাত্র র (raw) ভেক্টর সার্চ অনেক সময় সঠিক মিল খুঁজে পায় না। একটি ভালো প্রোডাকশন সিস্টেম hybrid search ব্যবহার করে, যা কিওয়ার্ড ম্যাচিংয়ের সাথে সিম্যান্টিক সিমিলারিটিকে যুক্ত করে। যদি কেউ "SLA-99 compliance" সম্পর্কে জানতে চায়, তবে আপনি এমন একটি ডকুমেন্ট চান যাতে হুবহু সেই স্ট্রিংটি আছে, শুধু এমন কিছু নয় যা দেখতে বা শুনতে অনেকটা একই রকম।

রিট্রিভালের পর, re-ranking নয়েজ বা অপ্রাসঙ্গিক তথ্য ফিল্টার করে। প্রাথমিক সার্চ হয়তো বিশটি চাঙ্ক রিটার্ন করতে পারে, কিন্তু মাত্র উপরের তিনটি বা চারটি আসলে সাহায্য করে। একটি র-র্যাঙ্কার (re-ranker) প্রাসঙ্গিকতা স্কোর করে এবং LLM-এ কিছু পাঠানোর আগেই বাকিগুলো বাদ দিয়ে দেয়, যা টোকেন সাশ্রয় করে এবং হ্যালুসিনেশন (hallucinations) কমায়।

এজেন্ট লেয়ার: পদক্ষেপ নেওয়া

RAG একটি মডেলকে পড়তে সাহায্য করে। Agents একে কাজ করতে সাহায্য করে।

একটি agent মূলত একটি লুপের মধ্যে থাকা একটি LLM। এটি পর্যবেক্ষণ করে, যুক্তি প্রদান করে, কাজ করে এবং তারপর আবার পর্যবেক্ষণ করে। আপনি যদি একটি agent-কে একটি ফ্লাইট বুক করতে বলেন, তবে এটি কেবল বুকিং কীভাবে কাজ করে তা বর্ণনা করে না। এটি কাজটিকে বিভিন্ন ধাপে ভাগ করে, সঠিক ফাংশনগুলো কল করে, রেসপন্সগুলো পড়ে এবং সমন্বয় করে।

লুপটি দেখতে এরকম। Observe: agent বর্তমান অবস্থা পর্যবেক্ষণ করে—আপনার অনুরোধ, পূর্ববর্তী tool call-এর ফলাফল, যেকোনো ত্রুটি। Reason: LLM পরবর্তী পদক্ষেপ কী হবে তা সিদ্ধান্ত নেয়, যা প্রায়শই একটি সুসংগঠিত পরিকল্পনা তৈরি করে বা পূর্বনির্ধারিত বিকল্প থেকে নির্বাচন করার মাধ্যমে হয়। Act: এটি একটি tool কল করে।

Tools হলো সেই মাধ্যম যার মাধ্যমে agents বাস্তব জগতের সাথে যোগাযোগ করে। এগুলো JSON schemas দিয়ে সংজ্ঞায়িত করা হয় যা মডেলকে বলে দেয় একটি API-এর ঠিক কী কী parameters প্রয়োজন। LLM এলোমেলোভাবে HTTP request পাঠায় না। এটি একটি schema পূরণ করে। "Call the weather API with city: London and units: metric." যদি tool একটি তাপমাত্রা প্রদান করে, তবে agent সেটি...