পাঠ ২৭ · ৫৭-এর মধ্যে · মডিউল ৭
Home / AI Courses / AI Ethics / LLM রিক্যাপ

LLM কীভাবে কাজ করে — একটি এথিক্স-ফোকাসড রিক্যাপ

How LLMs work — an ethics-focused recap
৯ মিনিট পড়া মধ্যম · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • next-token prediction ধারণাটি — একটি মডেল কীভাবে "পরবর্তী শব্দ" অনুমান করতে শেখে
  • প্রি-ট্রেনিং → ফাইন-টিউনিং → RLHF — এই পাইপলাইনের বড় ছবিটি (গভীর টেকনিক্যাল ডিটেইলের জন্য machine-learning/deep-learning কোর্স দেখুন)
  • কেন এই প্রকৃতিই M7-এর বাকি পাঠগুলোর (RLHF, হ্যালুসিনেশন, প্রম্পট ইনজেকশন) নৈতিক ঝুঁকিগুলোর মূল কারণ
  • একটি সত্যিকারের, চলমান bigram-ফ্রিকোয়েন্সি ডেমো

১ · Next-token prediction — মূল ধারণা

একটি LLM-এর মূল কাজ আশ্চর্যজনকভাবে সহজভাবে বর্ণনা করা যায়: এখন পর্যন্ত যা লেখা হয়েছে, তার ভিত্তিতে পরবর্তী টোকেন (শব্দ/সাব-ওয়ার্ড) কী হবে তার একটি প্রোবাবিলিটি ডিস্ট্রিবিউশন অনুমান করা। ফরমালি:

$$P(w_t \mid w_1, w_2, \dots, w_{t-1})$$

অর্থাৎ, আগের সব শব্দ $w_1$ থেকে $w_{t-1}$ দেখে মডেল পরবর্তী শব্দ $w_t$ কী হওয়ার সম্ভাবনা বেশি তা হিসাব করে। ট্রেনিং-এর সময় মডেলের প্যারামিটার এমনভাবে অ্যাডজাস্ট করা হয় যাতে বাস্তব কর্পাসে যে শব্দটি সত্যিই পরে এসেছিল, তার প্রোবাবিলিটি বাড়ে। এই প্রক্রিয়াটি সম্পূর্ণ self-supervised — কোনো মানুষকে প্রতিটি বাক্যের জন্য "সঠিক উত্তর" লেবেল করতে হয় না, কারণ কর্পাসের পরবর্তী শব্দটিই নিজে থেকে লেবেল। এই প্রক্রিয়ার নিউরাল-নেটওয়ার্ক আর্কিটেকচার (transformer) ও ট্রেনিং মেকানিক্সের সম্পূর্ণ গভীর ব্যাখ্যা Deep Learning ও Machine Learning কোর্সে আছে — এখানে আমরা শুধু ততটুকু কভার করছি যতটা এই মডিউলের নৈতিক প্রশ্নগুলো বুঝতে দরকার।

২ · প্রি-ট্রেনিং থেকে ডিপ্লয়মেন্ট পর্যন্ত

একটি আধুনিক চ্যাট-স্টাইল LLM সাধারণত কয়েকটি ধাপ পার হয়ে আসে:

বিশাল টেক্সট কর্পাস (ইন্টারনেট, বই, কোড ইত্যাদি) প্রি-ট্রেনিং next-token prediction ফাইন-টিউনিং instruction-following শেখানো RLHF (L28-এ পূর্ণ বিস্তারিত) ❗ এই পুরো পাইপলাইনে কোনো আলাদা ground-truth fact-checking ধাপ নেই — L29-এ বিস্তারিত
প্রতিটি ধাপ মডেলের আচরণ পরিমার্জিত করে, কিন্তু কোনো ধাপই মডেলের ভেতরে একটি "সত্যতা যাচাইকারী" যোগ করে না — পুরো পাইপলাইনটাই প্যাটার্ন-ভিত্তিক।

সংক্ষেপে — প্রি-ট্রেনিং-এ মডেল বিশাল, বৈচিত্র্যময় (এবং প্রায়ই ফিল্টার-না-করা) টেক্সট থেকে ভাষার প্যাটার্ন শেখে। ফাইন-টিউনিং-এ মডেলকে একটি ছোট, কিউরেটেড ডেটাসেট (উদাহরণ প্রম্পট-রেসপন্স জোড়া) দিয়ে "প্রশ্নের উত্তর দেওয়ার মতো" ফরম্যাটে আচরণ করতে শেখানো হয়। RLHF (Reinforcement Learning from Human Feedback) ধাপে মানুষের ফিডব্যাক থেকে একটি "reward model" ট্রেইন করে মডেলের আচরণ আরও পরিমার্জিত করা হয় — এই ধাপটির নিজস্ব গুরুত্বপূর্ণ নৈতিক জটিলতা আছে, যা পরবর্তী পাঠ (L28)-এ একটি সত্যিকারের সিমুলেশন দিয়ে দেখানো হবে।

৩ · কেন এটি এথিক্যালি গুরুত্বপূর্ণ

জ্ঞান = ডেটা-নির্ভর
মডেল যা "জানে" তা আসলে ট্রেনিং কর্পাসে কতবার, কোন প্যাটার্নে কোন তথ্য দেখা গেছে তার প্রতিফলন — কোনো স্বাধীন যাচাই-করা "জ্ঞানভাণ্ডার" নয়।
বায়াসও একই পথে আসে
ট্রেনিং ডেটায় থাকা সামাজিক/ঐতিহাসিক বায়াস মডেল ঠিক একইভাবে "শেখে" যেভাবে সে সঠিক তথ্য শেখে — কোনো বিশেষ ফিল্টার নিজে থেকে বায়াস আলাদা করে না।
কোনো built-in fact-checker নেই
মডেল আউটপুট জেনারেট করার সময় কোনো external ground-truth ডেটাবেসের সাথে মিলিয়ে দেখে না — এটি শুধু পরবর্তী টোকেনের সম্ভাবনা হিসাব করে (L29-এ বিস্তারিত)।
Deep Learning / Machine Learning কোর্সের সাথে সম্পর্ক

Transformer আর্কিটেকচার, অ্যাটেনশন মেকানিজম, এবং গ্র্যাডিয়েন্ট-ডিসেন্ট ভিত্তিক ট্রেনিং-এর সম্পূর্ণ টেকনিক্যাল গভীরতার জন্য Deep Learning ও Machine Learning কোর্স দেখুন — এই পাঠের লক্ষ্য শুধু এতটুকু বোঝানো যা এই মডিউলের নৈতিক আলোচনাগুলো (RLHF, হ্যালুসিনেশন, প্রম্পট ইনজেকশন) স্বাধীনভাবে বোঝার জন্য যথেষ্ট।

৪ · একটি সত্যিকারের ডেমো — ফ্রিকোয়েন্সি বনাম সত্য

নিচের কোডে একটি অত্যন্ত সরল "next-word predictor" তৈরি করা হয়েছে — এটি কোনো বাস্তব LLM নয়, বরং একটি ছোট কর্পাসে bigram (word-pair) ফ্রিকোয়েন্সি গণনা করে সবচেয়ে বেশিবার দেখা যাওয়া continuation বেছে নেয়। লক্ষ্য করুন — কর্পাসে ইচ্ছাকৃতভাবে একটি ভুল তথ্য ("বাংলাদেশের মুদ্রার নাম রুপি") সঠিক তথ্যের ("...টাকা") চেয়ে বেশিবার রাখা হয়েছে।

Python
from collections import defaultdict, Counter

corpus = [
    "ঢাকা বাংলাদেশের রাজধানী",
    "ঢাকা বাংলাদেশের রাজধানী",
    "বাংলাদেশের মুদ্রার নাম টাকা",       # সঠিক তথ্য -- ১ বার
    "বাংলাদেশের মুদ্রার নাম রুপি",       # ভুল তথ্য -- ৩ বার (নয়েজি স্ক্র্যাপড ডেটা সিমুলেট করা)
    "বাংলাদেশের মুদ্রার নাম রুপি",
    "বাংলাদেশের মুদ্রার নাম রুপি",
    "পদ্মা সেতু একটি বাস্তব অবকাঠামো প্রকল্প",
]

# word-level bigram counts: prev_word -> Counter(next_word)
bigram_counts = defaultdict(Counter)
for line in corpus:
    words = line.split()
    for w1, w2 in zip(words, words[1:]):
        bigram_counts[w1][w2] += 1

def predict_next(word):
    if word not in bigram_counts or not bigram_counts[word]:
        return None
    # "মডেল" সবচেয়ে বেশি frequency-র continuation বেছে নেয় -- কোনো সত্যতা-যাচাই নেই
    return bigram_counts[word].most_common(1)[0][0]

def generate(start_words, steps=1):
    words = start_words.split()
    for _ in range(steps):
        nxt = predict_next(words[-1])
        if nxt is None:
            break
        words.append(nxt)
    return " ".join(words)

print("প্রম্পট: 'বাংলাদেশের মুদ্রার নাম'")
print("মডেলের আউটপুট:", generate("বাংলাদেশের মুদ্রার নাম", steps=1))
print()
print("কর্পাসে 'নাম'-এর পরে কোন শব্দ কতবার এসেছে:", dict(bigram_counts["নাম"]))

    
মডেল predict_next()-এ কোথাও "টাকা সঠিক, রুপি ভুল" এই ধরনের কোনো তথ্য নেই — এটি শুধু গণনা করে কোন continuation কর্পাসে বেশিবার এসেছে, এবং "রুপি" জিতে যায় কারণ এটি ৩ বার এসেছে (সঠিক তথ্য "টাকা" মাত্র ১ বার)। বাস্তব LLM অনেক বড়, অনেক জটিল প্রসেসে চলে — কিন্তু মূল নীতিটি একই থেকে যায়: ট্রেনিং ডেটায় একটি প্যাটার্ন যত বেশি দৃঢ়ভাবে প্রতিষ্ঠিত (frequent/consistent), মডেল তত বেশি আত্মবিশ্বাসের সাথে সেটি পুনরুৎপাদন করবে — সেটি সত্য হোক বা না হোক। L29-এ আমরা এই একই সমস্যাটিকে "হ্যালুসিনেশন" নামে আরও ফরমালি, একটি সোর্স-ডকুমেন্ট-ভিত্তিক ফেইথফুলনেস-চেকার দিয়ে পরীক্ষা করব।
মূল কথা · Key takeaway

একটি LLM-কে "জানে" বলাটা কিছুটা misleading — এটি বরং প্রশিক্ষণ ডেটার পরিসংখ্যানগত কাঠামো অনুসারে সবচেয়ে সম্ভাব্য পরবর্তী টোকেন অনুমান করে। এই একই প্রক্রিয়া মডেলকে দরকারী ও ভাষাগতভাবে সাবলীল করে তোলে, আবার এই একই প্রক্রিয়াই মডেলকে ট্রেনিং ডেটার বায়াস, ভুল তথ্য, এবং কনফিডেন্টলি-ভুল আউটপুটের (হ্যালুসিনেশন) ঝুঁকিতে ফেলে। এই মডিউলের বাকি পাঠগুলো (RLHF, হ্যালুসিনেশন, প্রম্পট ইনজেকশন, কপিরাইট) সবই এই একই মূল সত্য থেকে শুরু হয়।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ একজন বলছেন, "LLM তো ইন্টারনেটের প্রায় সব লেখা থেকে শিখেছে, তাই ও যা বলে সেটা সাধারণত সত্য হওয়া উচিত।" উপরের ডেমোর আলোকে এই যুক্তির সমস্যা কোথায়?

সমস্যা হলো মডেল "সত্য" বনাম "মিথ্যা" যাচাই করে না — সে শুধু কোন প্যাটার্নটি ট্রেনিং ডেটায় বেশি দৃঢ়ভাবে প্রতিষ্ঠিত (frequent/consistent) তা বেছে নেয়। উপরের ডেমোতে ভুল তথ্য ("রুপি") সঠিক তথ্যের ("টাকা") চেয়ে বেশিবার কর্পাসে থাকায় মডেল ভুল উত্তর দিয়েছে — বিশাল স্কেলেও একই যান্ত্রিকতা কাজ করে, শুধু আরও জটিল আকারে।

প্র ০২ প্রি-ট্রেনিং কর্পাসে যদি কোনো ভুল ধারণা বহুবার পুনরাবৃত্তি হয়ে থাকে, ফাইন-টিউনিং বা RLHF কি সেটা পুরোপুরি "ঠিক" করে দিতে পারে?

ফাইন-টিউনিং ও RLHF মডেলের আচরণ/স্টাইল উল্লেখযোগ্যভাবে shape করতে পারে (L28-এ বিস্তারিত), কিন্তু এই ধাপগুলো প্রতিটি সম্ভাব্য তথ্যকে আলাদাভাবে ground truth-এর সাথে মিলিয়ে "যাচাই" করে না — এগুলোও নিজেরাই তুলনামূলক ছোট ডেটাসেট/ফিডব্যাক থেকে প্যাটার্ন শেখে। তাই প্রি-ট্রেনিং-এ গভীরভাবে প্রতিষ্ঠিত একটি ভুল ধারণা RLHF-এর পরও থেকে যেতে পারে — এই কারণেই হ্যালুসিনেশন (L29) একটি চলমান, কাঠামোগত ঝুঁকি, নিছক একটি "বাগ" নয় যা এক ধাপে সারিয়ে ফেলা যায়।

প্র ০৩ উপরের কোডে bigram_counts["নাম"]-এ যদি "টাকা" ৪ বার এবং "রুপি" ৩ বার থাকতো, predict_next("নাম") কী রিটার্ন করত এবং কেন?

"টাকা" রিটার্ন করত, কারণ most_common(1) সবসময় সর্বোচ্চ কাউন্টের এন্ট্রি বেছে নেয় — এখানে ৪ > ৩। এটাই দেখায় আউটপুট সম্পূর্ণভাবে কর্পাসের ফ্রিকোয়েন্সি দ্বারা নির্ধারিত হয়, কোনো অন্তর্নিহিত "সত্যতা" যাচাই দ্বারা নয় — শুধু কাউন্ট বদলালেই আউটপুট বদলে যায়।

অনুশীলন

  1. চিন্তা করুন: corpus-এ "ঢাকা বাংলাদেশের রাজধানী" লাইনটি আরও ২ বার যোগ করলে bigram_counts["ঢাকা"]-তে কী পরিবর্তন হবে বলে আপনার ধারণা?

    বর্তমানে bigram_counts["ঢাকা"] হলো Counter({"বাংলাদেশের": 2}) (কারণ লাইনটি ইতিমধ্যে ২ বার আছে)। আরও ২ বার যোগ করলে এটি Counter({"বাংলাদেশের": 4}) হবে — যেহেতু এখানে সবসময় একই একক continuation ("বাংলাদেশের") ছিল, প্রেডিকশনের ফলাফল একই থাকবে, শুধু কাউন্ট বাড়বে।

  2. পরীক্ষা করুন: কোডে "নাম" শব্দের পরে "টাকা" (সঠিক তথ্য) আরও ৪ বার যোগ করুন যাতে এটি "রুপি"-র চেয়ে বেশি frequent হয়, তারপর Run চেপে predict_next("নাম")-এর ফলাফল যাচাই করুন।

    এখন bigram_counts["নাম"] হবে প্রায় Counter({"টাকা": 5, "রুপি": 3}) — এবং predict_next("নাম") এখন "টাকা" রিটার্ন করবে। এটি দেখায় সমস্যাটি ঠিক করার একটি (আংশিক) উপায় হলো ট্রেনিং ডেটায় সঠিক তথ্যের প্রতিনিধিত্ব বাড়ানো — কিন্তু বাস্তব-বিশ্বে বিলিয়ন শব্দের কর্পাসে এভাবে "manually" প্রতিটি ভুল ধারণা সংশোধন করা অসম্ভব, যা এই ঝুঁকিকে কাঠামোগত করে তোলে।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

  • কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ নৈতিক ফ্রেমওয়ার্ক, বায়াস-ফেয়ারনেস, প্রাইভেসি, ট্রান্সপারেন্সি, AI অ্যালাইনমেন্ট, জেনারেটিভ AI/LLM এথিক্স, সামাজিক প্রভাব, গভর্নেন্স ও রেগুলেশন, সেক্টর-স্পেসিফিক এথিক্স ও এক্সিস্টেনশিয়াল রিস্ক বিতর্ক।
  • Machine Learning কোর্স ফাউন্ডেশন ট্রেনিং, অপ্টিমাইজেশন, ও মডেল ইভালুয়েশনের টেকনিক্যাল ভিত্তি — এই পাঠের প্রি-ট্রেনিং/ফাইন-টিউনিং ধারণার গভীর ব্যাখ্যা।
  • Deep Learning কোর্স ফাউন্ডেশন Transformer আর্কিটেকচার ও অ্যাটেনশন মেকানিজমের সম্পূর্ণ টেকনিক্যাল বিস্তারিত।
আগের পাঠ
কারিজিবিলিটি ও অফ-সুইচ প্রবলেম