সরাসরি পর্বে যান
পর্ব ৬৩ · ৯১-এর মধ্যে · মডিউল ১০

Reasoning prompt — chain-of-thought, self-consistency আর ধাপে ধাপে চিন্তা

Reasoning Prompts: Chain-of-Thought, Self-Consistency and Step-by-Step Thinking

Taught in Bangla, this lesson tests reasoning prompts on 30 hand-written shop arithmetic questions with two small open Qwen2.5 models in a real desktop run on the GPU. It compares direct answers with few-shot, zero-shot and guided chain-of-thought in English and Bangla, extracts numbers from Bangla answers, runs self-consistency voting with confidence intervals, counts tokens per correct answer, and covers least-to-most prompting, faithfulness and documented reasoning-model settings, with in-page Python checks.

এই পর্বে যা শিখবেন

  • Chain-of-thought কেন কাজ করতে পারে, আর তার তিন রূপ: few-shot, zero-shot আর নির্দেশিত ধাপ
  • বাংলা উত্তর থেকে সংখ্যা বের করা (answer extraction) আর তার ফাঁদ
  • Self-consistency-র ভোট, k বাড়ালে কী হয়, আর CI দিয়ে ফল পড়া
  • Token বনাম accuracy-র হিসাব, least-to-most আর কোডে হিসাব
  • CoT-এর faithfulness, আর ছয়টি পণ্যের reasoning model সেটিং, নথি থেকে

এই পর্বের সব desktop run GPU-তে, একবারে একটি job: torch 2.15.0, transformers 5.22.2, Python 3.12, লেখার সময়ে। Model দুটি ছোট, open আর Apache 2.0 লাইসেন্সের, token ছাড়া নামানো যায়: Qwen/Qwen2.5-1.5B-Instruct আর Qwen/Qwen2.5-0.5B-Instruct (Hugging Face-এ model card আছে)। প্রশ্নগুলো কোর্সের নিজের হাতে লেখা, বাজারঘরের ৩০টি পাটিগণিত প্রশ্ন, উত্তর কোডে হিসাব করা; কোনো আসল দোকানের তথ্য নয়। Command সহজ করে দেখানো, model-এর লেখা হুবহু, কাটা অংশে “…”। সব সংখ্যা একটি স্থানীয় run-এর; বড় পণ্য একই prompt-এ অনেক আলাদা আচরণ করতে পারে, তাই এগুলো দিয়ে কোনো পণ্যের মান বিচার করা যায় না। Prompt-এর গঠনের প্রাথমিক কথা পর্ব ৬০ · Prompt-এর গঠন-এ; মাপার পদ্ধতি পর্ব ৫৮-এ।

১ · খাতায় কাজ দেখানো — ধাপ লিখলে হিসাব কেন বদলায়

অঙ্ক পরীক্ষার খাতার কথা ভাবুন। “৮৫০ টাকায় ১০% ছাড়, তারপর ১২০ টাকা ডেলিভারি” মাথায় এক লাফে করলে ভুল হয় সহজে। খাতায় লিখলে আগে ৮৫ টাকা ছাড়, তারপর ৭৬৫, তারপর ৮৮৫; ভুল হলে কোন লাইনে, তা-ও দেখা যায়।

Language model-এর ক্ষেত্রেও একই রকম কিছু ঘটে, তবে কারণটি যন্ত্রের। পর্ব ৪৯-এ দেখেছেন, decoder model একবারে একটি token লেখে, আর প্রতিটি token-এর জন্য একই সংখ্যক layer চলে। মানে প্রতি token-এ হিসাবের পরিমাণ মোটামুটি স্থির। “উত্তর: ৮৮৫” সরাসরি লিখতে হলে পুরো হিসাব ওই কয়েকটি token-এর ভেতরে সারতে হয়। আগে “৮৫০ × ০.১০ = ৮৫” লিখলে দুটি জিনিস বদলায়। এক, বেশি token মানে বেশি হিসাবের ধাপ। দুই, মধ্যবর্তী ফল “৭৬৫” এখন context-এ লেখা, তাই পরের ধাপ সেটি পড়েই এগোয়, মনে রাখতে হয় না। Nye ও সহকর্মীরা (২০২১) একে scratchpad বলেছিলেন: model-কে মধ্যবর্তী হিসাব লিখতে শেখানো।

এই কৌশলের সাধারণ নাম chain-of-thought (CoT): উত্তরের আগে model-কে মধ্যবর্তী যুক্তির ধাপ লিখতে দেওয়া। Wei ও সহকর্মীরা (২০২২) দেখান, prompt-এ কয়েকটি উদাহরণ দিলে, যেখানে প্রতিটি উত্তরের আগে ধাপগুলো লেখা, বড় model অঙ্কের word problem-এ অনেক ভালো করে। তাঁদের রিপোর্ট অনুযায়ী এই সুবিধা মূলত খুব বড় model-এ দেখা গিয়েছিল, প্রায় ১০০ বিলিয়ন parameter-এর কাছাকাছি বা তার বেশি; ছোট model-এ CoT কখনো ফল খারাপও করেছিল (পর্ব ৫১-এর emergent দাবির আলোচনা মনে রাখুন)। এই পর্বে সেই প্রশ্নটিই ছোট model-এ নিজে মাপবেন।

একটি তুলনা: চায়ের দোকানের হিসাব খাতা। দিনের শেষে মোট বিক্রি এক নজরে বলতে গেলে ভুল হয়; প্রতিটি কাপ লিখে রাখলে যোগটি সহজ। তবে খাতায় লেখা থাকলেই হিসাব ঠিক হয় না। লেখার সময় একটি লাইন ভুল হলে পরের সব লাইন সেই ভুল বয়ে নেয়। CoT-ও তাই: ধাপ লেখা সুযোগ বাড়ায়, নিশ্চয়তা দেয় না।

একটি সতর্কতা। “Model ভাবছে” কথাটি সুবিধার জন্য বলা; যা ঘটে তা পরের token-এর অনুমান, যার কিছু token মধ্যবর্তী হিসাবের মতো দেখায়। লেখা ধাপ আসল কারণ কি না, তা §৭-এর প্রশ্ন। LLM-এর মূল কাজের ধারণা AI-এর ভিত্তি কোর্সের পর্ব ৭০-এ; এখানে তার ওপর দাঁড়িয়ে এগোব।

২ · CoT-এর তিন রূপ, আর উত্তরটি খুঁজে বের করা

CoT prompt তিনভাবে লেখা হয়। প্রথম, few-shot CoT (Wei ও সহকর্মী, ২০২২): কয়েকটি প্রশ্ন, প্রতিটির সমাধান ধাপসহ, তারপর নতুন প্রশ্ন। উদাহরণ বাছাইয়ের সব প্রশ্ন পর্ব ৬১ · Few-shot prompting-এর বিষয়। দ্বিতীয়, zero-shot CoT (Kojima ও সহকর্মী, ২০২২): কোনো উদাহরণ নেই, শুধু একটি বাক্য, “Let's think step by step”. তাঁদের প্রবন্ধে InstructGPT (text-davinci-002) model-এ MultiArith নামের অঙ্কের set-এ নির্ভুলতা ১৭.৭% থেকে ৭৮.৭%, আর GSM8K-তে ১০.৪% থেকে ৪০.৭% হওয়ার কথা রিপোর্ট করা হয়েছিল। তাঁরা দুই ধাপে কাজ করেছিলেন: আগে যুক্তি লেখানো, তারপর আলাদা prompt-এ “উত্তরটি তাই …” বলে সংখ্যাটি বের করা। তৃতীয়, নির্দেশিত ধাপ: “আগে মোট দাম, তারপর ছাড়, তারপর ডেলিভারি হিসাব করুন”। এটি §৬-এর decomposition-এর কাছাকাছি।

এই পর্বের run-এ দুটি prompt, একই প্রশ্নে:

Direct: {প্রশ্ন} শুধু চূড়ান্ত উত্তরটি একটি সংখ্যায় লিখুন, কোনো ব্যাখ্যা ছাড়া। ফরম্যাট: উত্তর: <সংখ্যা> CoT: {প্রশ্ন} ধাপে ধাপে হিসাব করুন। শেষ লাইনে লিখুন: উত্তর: <সংখ্যা>

দুই prompt-এই উত্তরের একটি নির্দিষ্ট লাইন চাওয়া হয়েছে, কারণ CoT-এর লম্বা লেখায় অনেক সংখ্যা থাকে। কোনটি চূড়ান্ত উত্তর, তা বের করার কাজটিকে বলে answer extraction. এটি ভুল হলে model ঠিক হলেও নম্বর ভুল আসে, আর উল্টোটাও। বাংলায় কাজটি আরও জটিল: “১,০৮০”, “1080”, “১০৮০.০০ টাকা” তিনটি একই সংখ্যা (পর্ব ৫৮-এর normalisation মনে করুন)। নিচের extractor এই run-এ সত্যিই ব্যবহার করা হয়েছে। এটি শেষ “উত্তর:”-এর পরের প্রথম সংখ্যা নেয়; না পেলে পুরো লেখার শেষ সংখ্যা।

import re
BN = str.maketrans("০১২৩৪৫৬৭৮৯", "0123456789")
NUM = re.compile(r"-?\d+(?:,\d{3})*(?:\.\d+)?")

def extract(text):
    """শেষ 'উত্তর:'-এর পরের প্রথম সংখ্যা; না পেলে লেখার শেষ সংখ্যা"""
    t = text.translate(BN)                        # বাংলা অঙ্ক → 0-9
    marks = list(re.finditer(r"(?:উত্তর|answer)\s*[::]?", t, flags=re.I))
    if marks:
        after = NUM.findall(t[marks[-1].end():])
        if after:
            return float(after[0].replace(",", ""))
    nums = NUM.findall(t)
    return float(nums[-1].replace(",", "")) if nums else None

TESTS = [
    ("উত্তর: ১,০৮০ টাকা", 1080),
    ("১২০০ × ০.৮৫ = ১০২০, সঙ্গে ৬০ টাকা ডেলিভারি = ১০৮০ টাকা", 1080),
    ("Answer: 1,710 taka", 1710),
    ("মোট দাম ৫৫০ টাকা। ডেলিভারি ফ্রি, কারণ অর্ডার ৫০০ টাকার বেশি।", 550),
    ("উত্তর: ছাড়ের পর ১০২০, ডেলিভারিসহ ১০৮০", 1080),
    ("উত্তর: 1080.00", 1080),
    ("দুঃখিত, হিসাবটি করা গেল না।", 1080),
]
for text, gold in TESTS:
    p = extract(text)
    mark = "ঠিক" if p is not None and abs(p - gold) < 1e-9 else "ভুল"
    print(f"{mark:4} pred={p!s:7} | {text}")

আউটপুট (পাতার Python-এ চালানো):

ঠিক  pred=1080.0  | উত্তর: ১,০৮০ টাকা
ঠিক  pred=1080.0  | ১২০০ × ০.৮৫ = ১০২০, সঙ্গে ৬০ টাকা ডেলিভারি = ১০৮০ টাকা
ঠিক  pred=1710.0  | Answer: 1,710 taka
ভুল  pred=500.0   | মোট দাম ৫৫০ টাকা। ডেলিভারি ফ্রি, কারণ অর্ডার ৫০০ টাকার বেশি।
ভুল  pred=1020.0  | উত্তর: ছাড়ের পর ১০২০, ডেলিভারিসহ ১০৮০
ঠিক  pred=1080.0  | উত্তর: 1080.00
ভুল  pred=None    | দুঃখিত, হিসাবটি করা গেল না।

সাতটির তিনটিতে extractor ভুল করেছে, তিন কারণে। চতুর্থ লেখায় কোনো “উত্তর:” নেই, তাই শেষ সংখ্যা নেওয়া হলো; কিন্তু শেষ সংখ্যাটি কারণের অংশ (“৫০০ টাকার বেশি”), উত্তর নয়। পঞ্চমটিতে “উত্তর:” আছে, কিন্তু তার পরে দুটি সংখ্যা, আর নিয়ম প্রথমটি নেয়। শেষটিতে কোনো সংখ্যাই নেই; None ভুল হিসেবেই গোনা হয়, আর গোনাই উচিত। শিক্ষা: prompt-এ উত্তরের লাইন বেঁধে দিন, extractor-এর নিয়ম লিখে রাখুন, আর কিছু অমিল নিজে পড়ুন।

৩ · সত্যিকারের run — direct বনাম CoT, দুটি ছোট model

প্রশ্নগুলোতে আছে শতাংশ ছাড়, পরপর দুটি ছাড়, ছাড়ের সীমা, ফ্রি-ডেলিভারির সীমা, জেলাভেদে আর ওজনভেদে চার্জ, লাভের শতাংশ; কিছু সংখ্যা বাংলা অঙ্কে, একটিতে কমা। তুলনার জন্য প্রতিটির ইংরেজি অনুবাদও আছে। Decoding: direct আর CoT দুটিই greedy, direct-এ সর্বোচ্চ ২৪টি নতুন token, CoT-এ ৫১২. Chat template-এ শুধু user বার্তা, তাই Qwen-এর ডিফল্ট system বার্তা যোগ হয়েছে (পর্ব ৫২)।

$ python run.py q15 direct_bn,cot_bn,direct_en,cot_en,sc_bn     # সত্যিকারের run, ছোট করা
q15 direct_bn|greedy acc=0.100 mean_out_tok=  11.6 cut=1 (3s)
q15 cot_bn|greedy    acc=0.133 mean_out_tok= 331.5 cut=6 (39s)
q15 direct_en|greedy acc=0.133 mean_out_tok=   7.2 cut=0 (40s)
q15 cot_en|greedy    acc=0.833 mean_out_tok= 248.7 cut=0 (64s)
q15 sc_bn|s0         acc=0.133 mean_out_tok= 355.6 cut=10 (107s)
…
q15 sc_bn|s9         acc=0.133 mean_out_tok= 331.9 cut=3 (456s)
peak GPU alloc MB: 3389 | torch 2.15.0+cu132 | total 456s

cut মানে কতটি উত্তর token-এর সীমায় কেটে গেছে। দুই model-এর পুরো ছবি (৩০টি প্রশ্ন, প্রশ্ন ধরে bootstrap-এর ৯৫% CI):

Model · ভাষাDirectCoT (greedy)গড় output token (direct → CoT)
১.৫B · বাংলা০.১০০ [০.০০, ০.২৩]০.১৩৩ [০.০৩, ০.২৭]১১.৬ → ৩৩১.৫
১.৫B · ইংরেজি০.১৩৩ [০.০৩, ০.২৭]০.৮৩৩ [০.৭০, ০.৯৩]৭.২ → ২৪৮.৭
০.৫B · বাংলা০.০০০০.০৬৭ [০.০০, ০.১৭]২০.৮ → ২৪৬.৭
০.৫B · ইংরেজি০.০৬৭ [০.০০, ০.১৭]০.৬৩৩ [০.৪৭, ০.৮০]৭.৪ → ২৭৫.০

তিনটি জিনিস চোখে পড়ে। এক, ইংরেজিতে CoT-এর লাফ বিশাল আর দৈবের নয়: ১.৫B-এ ২১টি প্রশ্নে শুধু CoT ঠিক, একটিতেও শুধু direct নয় (§৫)। দুই, বাংলায় একই model আর একই প্রশ্নে CoT প্রায় কিছুই করেনি; পার্থক্য CI-এর ভেতরে। তিন, ০.৫B বাংলা direct-এ ২৫টি উত্তর ২৪ token-এ কেটে গেছে, অর্থাৎ নির্দেশ মানেনি। এখানে ভাষার প্রভাব CoT-এর চেয়েও বড়। Input-এর দামও আলাদা: একই অর্থের CoT prompt বাংলায় গড়ে ১৯৯.৯ token, ইংরেজিতে ৮৭.২ (পর্ব ৪০)।

শাড়ি ১২০০ টাকা, ১৫% ছাড়, ডেলিভারি ৬০
ধাপ
model লিখল
context-এ জমা
token
  1. Prompt. বাংলা প্রশ্ন আর CoT-এর নির্দেশ, chat template-সহ প্রায় ২০০ input token. Decoding greedy, তাই এই লেখা প্রতিবার হুবহু একই আসবে।
  2. লাইন ১–২. Model প্রথমে ছাড়ের টাকা আলাদা লিখল: ১৮০. এই সংখ্যাটি এখন context-এ লেখা; পরের লাইন এটি পড়েই এগোবে, মনে রাখতে হবে না।
  3. লাইন ৩. ডেলিভারির ৬০ টাকা আলাদা লাইনে। প্রশ্নের প্রতিটি শর্ত একটি করে লাইন পেল।
  4. লাইন ৪–৫. দুটি লেখা সংখ্যা জুড়ে ১০৮০. ভুল হলে ঠিক কোন লাইনে, তা দেখা যেত।
  5. শেষ লাইন. নির্দেশমতো “উত্তর: 1080”; extractor ঠিক সংখ্যা পেল। মোট ১৫৪ output token, direct-এর প্রায় ১৩ গুণ।
  6. আরেকটি প্রশ্ন. একই model, জুতার প্রশ্ন (ঠিক উত্তর ১৭০০)। ধাপের কাঠামো সুন্দর, কিন্তু ২৪০০-এর ৭৫% লিখল ২৩৬০, আর কুপন বাদ না দিয়ে যোগ করল। ধাপ ভুলটি খুঁজে পাওয়া সহজ করে, ঠেকায় না।

ভুলের নমুনা, হুবহু

নিচের লেখাগুলো model-এর output, সম্পাদনা ছাড়া; লম্বা অংশ “…” দিয়ে কাটা। Decoding greedy.

# ১.৫B, বাংলা, প্রশ্ন ৭ (রাজশাহী, ৮৫০ টাকা, ১০% ছাড়; ঠিক উত্তর ৮৮৫)
আমি আপনাকে সহায়তা করতে পারি না যদিও আমি এই অনুচ্ছেদের সংজ্ঞানুসারে কোনও সঠিক সমাধান দেবো না। …
উত্তর: নেই
# ০.৫B, বাংলা, প্রশ্ন ১৪ (পার্সেলের ওজন; ঠিক উত্তর ১২০) — ৫১২ token-এ কাটা
উত্তর: 120

ভার্গের একটি পার্সেল আছে, তবে এই পার্সেলের একটি ডেলিভারি ছিল ৩.৫ কেজি। … এটি একটি পার্সেল থাকে। এটি একটি পার্সেল থাকে। এটি একটি পার্সেল থাকে। …
# ১.৫B, ইংরেজি, প্রশ্ন ৭ (ঠিক উত্তর ৮৮৫) — শেষ অংশ
     - If delivered within Dhaka: Total payment = Discounted price + Delivery fee = 765 + 60 = 825 taka.
     - If delivered outside Dhaka: Total payment = Discounted price + Delivery fee = 765 + 120 = 885 taka.
…
Answer: 825 or 885

প্রথমটিতে সাধারণ অঙ্কে model সাহায্য করতে অস্বীকার করেছে। দ্বিতীয়টিতে প্রথম লাইনেই উত্তর ঠিক, তারপর অর্থহীন পুনরাবৃত্তি; উত্তর “ঠিক” গোনা হলো, অথচ কোনো ধাপ সেটিকে সমর্থন করে না (§৭)। তৃতীয়টিতে হিসাব ঠিক, কিন্তু “রাজশাহী ঢাকার বাইরে” সিদ্ধান্তটি না নিয়ে দুটি উত্তর; extractor প্রথমটি, ৮২৫, নিয়েছে।

৪ · Self-consistency — অনেক পথ, একটি ভোট

Greedy CoT একটি পথ লেখে। পথের শুরুতে একটি ভুল হলে পুরো উত্তর ভুল। Wang ও সহকর্মীদের (২০২২) self-consistency বলে: একই CoT prompt কয়েকবার চালান, প্রতিবার temperature দিয়ে sample করে (পর্ব ৫০), তারপর চূড়ান্ত উত্তরগুলোর মধ্যে সবচেয়ে বেশিবার আসা উত্তরটি নিন, অর্থাৎ majority vote. প্রবন্ধে কয়েকটি বড় model-এ GSM8K-সহ অঙ্কের set-এ greedy CoT-এর চেয়ে স্পষ্ট উন্নতি রিপোর্ট করা হয়েছিল।

Direct, chain-of-thought and self-consistency ১ · Direct প্রশ্ন উত্তর: ৮৮৫ কয়েকটি token, এক লাফে ২ · Chain-of-thought প্রশ্নছাড় ৮৫৭৬৫+১২০উত্তর অনেক token; প্রতিটি ধাপ context-এ লেখা থাকে ৩ · Self-consistency (k = ৫) CoT promptT = 0.7 পথ ১ → ৮৮৫পথ ২ → ৮৮৫ পথ ৩ → ৭৬৫পথ ৪ → ৮৮৫ পথ ৫ → ৯৩৫ ভোট: ৮৮৫ (৩)৭৬৫ (১), ৯৩৫ (১) token প্রায় k গুণ; ঠিক পথগুলো এক সংখ্যায় মেলে Same question, three ways to spend tokens
একই প্রশ্ন, তিন পথ। পথের সংখ্যাগুলো বোঝানোর জন্য বানানো; আসল নমুনা নিচের stepper-এ।

এই পর্বের run-এ প্রতিটি প্রশ্নে ১০টি নমুনা: temperature ০.৭, top-p ০.৯৫, seed ১০০০ থেকে ১০০৯ (প্রতিটি নমুনা-ক্রমে একটি), সর্বোচ্চ ৫১২ token. k = ৫ মানে প্রথম ৫টি নমুনার ভোট। সমান ভোট হলে আগে আসা উত্তরটি জেতে; নিয়মটি আগে থেকে লিখে রাখা দরকার, কারণ ছোট set-এ টাই কম নয়।

১৭৫০ টাকায় প্রতি পূর্ণ ১০০-তে ২ পয়েন্ট (ঠিক: ৩৪)
ধাপ
নমুনা
গণনা
ভোটের ফল
  1. k = ১. প্রথম নমুনা ১২৫, ভুল। এক নমুনার self-consistency মানে শুধু একটি sample, তাই এটি greedy-র চেয়েও খারাপ হতে পারে।
  2. k = ৫. পাঁচটি নমুনা, পাঁচটি আলাদা উত্তর। সবাই ১ ভোট, টাই; নিয়মমতো আগে আসা ১২৫ জেতে। ভোট কাজ করার আগে ঠিক উত্তরকে অন্তত দুবার আসতে হয়।
  3. k = ৭. ৩৪ আরও দুবার এল, এখন ৩ ভোট, বাকিরা ১ করে। ঠিক পথগুলো এক সংখ্যায় মিলছে, ভুলগুলো ছড়িয়ে আছে: Wang ও সহকর্মীদের যুক্তিটি ঠিক এটাই।
  4. k = ১০. ৩৪ পেল ৪ ভোট, ৩৫ পেল ২. উত্তর ঠিক, তবে সমর্থন মাত্র ০.৪০; ভোটের ভাগ আস্থার একটি মোটা সংকেত।
  5. আরেকটি প্রশ্ন. বিস্কুটের প্রশ্নে (৪৪০ টাকা, ৫০০-র নিচে, তাই ৮০ টাকা ডেলিভারি যোগ হবে) ১০টির ৭টি নমুনা লিখেছে ৪৪০: “there is no need to apply the delivery charge since the order does not exceed the threshold”. নিয়মটিই উল্টো বোঝা, আর একই ভুল বারবার আসায় ভোট ভুলকেই আত্মবিশ্বাসী করেছে।

এবার চারটি অবস্থার ৩০ × ১০টি নমুনা নিজে বিশ্লেষণ করুন। নিচের CSV-তে প্রতিটি নমুনার বের করা উত্তর (ফাঁকা = কোনো সংখ্যা পাওয়া যায়নি)। কোড k = ১, ৫, ১০-এর ভোট, প্রশ্ন ধরে bootstrap CI, আর ১০টি থেকে এলোমেলো k-টি বেছে গড় accuracy-র রেখা আঁকে। প্রথম চালানোয় pandas আর matplotlib লোড হতে কয়েক সেকেন্ড লাগে।

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from collections import Counter
df = pd.read_csv("sc_samples.csv")            # সত্যিকারের run: প্রতি প্রশ্নে ১০টি CoT নমুনার বের করা উত্তর
S = [f"s{i}" for i in range(10)]
rng = np.random.default_rng(42)

def vote(answers):                            # সমান ভোটে আগে আসা উত্তর জেতে
    a = [x for x in answers if not np.isnan(x)]
    return Counter(a).most_common(1)[0][0] if a else np.nan

def boot_ci(ok, B=2000):                      # প্রশ্ন ধরে bootstrap
    idx = rng.integers(0, len(ok), (B, len(ok)))
    return np.percentile(ok[idx].mean(1), [2.5, 97.5])

fig, ax = plt.subplots(figsize=(5, 3.2))
for model, g in df.groupby("model", sort=False):
    X, gold = g[S].to_numpy(), g["gold"].to_numpy()
    for k in (1, 5, 10):
        ok = np.array([vote(row[:k]) == y for row, y in zip(X, gold)], float)
        lo, hi = boot_ci(ok)
        print(f"{model} k={k:2d}  accuracy {ok.mean():.3f}  CI [{lo:.2f}, {hi:.2f}]")
    curve = []                                # k-টি নমুনা এলোমেলো বেছে গড় accuracy
    for k in range(1, 11):
        hits = [np.mean([vote(row[rng.choice(10, k, replace=False)]) == y
                         for row, y in zip(X, gold)]) for _ in range(50)]
        curve.append(np.mean(hits))
    ax.plot(range(1, 11), curve, marker="o", label=model)
    print(f"{model} এলোমেলো k: k=1 {curve[0]:.3f}, k=3 {curve[2]:.3f}, k=10 {curve[9]:.3f}")
ax.set_xlabel("samples per question (k)"); ax.set_ylabel("majority-vote accuracy")
ax.set_title("Self-consistency, 30 Bazarghar problems"); ax.legend(fontsize=8)
plt.show()

আউটপুট (পাতার Python-এ চালানো):

1.5B-bn k= 1  accuracy 0.133  CI [0.03, 0.27]
1.5B-bn k= 5  accuracy 0.133  CI [0.03, 0.27]
1.5B-bn k=10  accuracy 0.200  CI [0.07, 0.37]
1.5B-bn এলোমেলো k: k=1 0.109, k=3 0.112, k=10 0.199
1.5B-en k= 1  accuracy 0.867  CI [0.73, 0.97]
1.5B-en k= 5  accuracy 0.900  CI [0.80, 1.00]
1.5B-en k=10  accuracy 0.800  CI [0.63, 0.93]
1.5B-en এলোমেলো k: k=1 0.762, k=3 0.802, k=10 0.815
0.5B-bn k= 1  accuracy 0.000  CI [0.00, 0.00]
0.5B-bn k= 5  accuracy 0.000  CI [0.00, 0.00]
0.5B-bn k=10  accuracy 0.000  CI [0.00, 0.00]
0.5B-bn এলোমেলো k: k=1 0.000, k=3 0.000, k=10 0.000
0.5B-en k= 1  accuracy 0.433  CI [0.27, 0.60]
0.5B-en k= 5  accuracy 0.533  CI [0.37, 0.70]
0.5B-en k=10  accuracy 0.700  CI [0.53, 0.87]
0.5B-en এলোমেলো k: k=1 0.475, k=3 0.550, k=10 0.681

০.৫B ইংরেজিতে ভোট পরিষ্কার কাজ করেছে: k = ১-এ ০.৪৩৩, k = ১০-এ ০.৭০০. তবে এই model-এর greedy CoT ছিল ০.৬৩৩; একটি sampled নমুনা greedy-র চেয়ে খারাপ, আর দশটির ভোট greedy-কে সামান্যই ছাড়িয়েছে। ১.৫B ইংরেজিতে k = ৫-এ ০.৯০০, অথচ k = ১০-এ ০.৮০০: ৩০টি প্রশ্নে এক-দুটি টাই বা নতুন ভুলই এই ওঠানামা ঘটায়, আর CI-গুলো একে অপরের ওপর পড়ে। এলোমেলো k-এর গড় রেখা বেশি স্থির: ধীরে বাড়ে, তারপর প্রায় সমতল। বাংলায় ঠিক উত্তর খুব কমই দুবার আসে, তাই ভোটে লাভ সামান্য, আর ০.৫B-এ ৩০০টি নমুনার একটিও ঠিক নয়।

৫ · Token-এর দাম — accuracy কত টাকায় কেনা হলো

প্রতিটি output token-এর দাম আর সময় আছে (পর্ব ৬৫ · Token, খরচ আর latency). তুলনার একটি সহজ মাপ হলো প্রতি সঠিক উত্তরে token: গড় output token ÷ accuracy. Direct-এ ১০ token আর accuracy ০.৫০ হলে একটি সঠিক উত্তরের পেছনে গড়ে ২০ token. সঙ্গে জোড়া তুলনা (paired comparison): একই প্রশ্নে দুই পদ্ধতির ঠিক-ভুল পাশাপাশি রেখে b = শুধু নতুনটি ঠিক, c = শুধু পুরনোটি ঠিক, আর exact McNemar test (মেশিন লার্নিং কোর্সের পর্ব ২২)। নিচের CSV-তে প্রতিটি প্রশ্নে চার পদ্ধতির ফল আর token; self-consistency-র token মানে k-টি নমুনার যোগফল।

import numpy as np
import pandas as pd
from scipy.stats import binomtest
pd.set_option("display.width", 70)
df = pd.read_csv("runs_tok.csv")              # সত্যিকারের run: প্রতি প্রশ্নে ঠিক কি না, আর output token
rng = np.random.default_rng(42)

t = (df.groupby(["model", "method"], sort=False)
       .agg(acc=("ok", "mean"), out_tok=("out_tok", "mean")).round(3))
t["tok_per_ok"] = (t["out_tok"] / t["acc"].where(t["acc"] > 0)).round(0)
print(t.to_string(), "\n")

for model, g in df.groupby("model", sort=False):     # একই প্রশ্নে জোড়া তুলনা
    w = g.pivot(index="item", columns="method", values="ok")
    for a, b in (("direct", "cot"), ("cot", "sc_k10")):
        d = (w[b] - w[a]).to_numpy()
        only_b, only_a = int((d > 0).sum()), int((d < 0).sum())
        p = binomtest(only_b, only_b + only_a, 0.5).pvalue if only_a + only_b else 1.0
        boots = d[rng.integers(0, len(d), (4000, len(d)))].mean(1)
        lo, hi = np.percentile(boots, [2.5, 97.5])
        print(f"{model} {b}−{a}: {d.mean():+.3f} CI [{lo:+.2f}, {hi:+.2f}]"
              f" b={only_b} c={only_a} p={p:.2g}")

আউটপুট (পাতার Python-এ চালানো):

                  acc   out_tok  tok_per_ok
model   method                             
1.5B-bn direct  0.100    11.567       116.0
        cot     0.133   331.467      2492.0
        sc_k5   0.133  1842.967     13857.0
        sc_k10  0.200  3563.067     17815.0
1.5B-en direct  0.133     7.200        54.0
        cot     0.833   248.700       299.0
        sc_k5   0.900  1206.700      1341.0
        sc_k10  0.800  2433.767      3042.0
0.5B-bn direct  0.000    20.767         NaN
        cot     0.067   246.700      3682.0
        sc_k5   0.000  1535.567         NaN
        sc_k10  0.000  3072.300         NaN
0.5B-en direct  0.067     7.400       110.0
        cot     0.633   275.033       434.0
        sc_k5   0.533  1470.700      2759.0
        sc_k10  0.700  2950.700      4215.0 

1.5B-bn cot−direct: +0.033 CI [-0.13, +0.20] b=4 c=3 p=1
1.5B-bn sc_k10−cot: +0.067 CI [-0.10, +0.23] b=5 c=3 p=0.73
1.5B-en cot−direct: +0.700 CI [+0.53, +0.87] b=21 c=0 p=9.5e-07
1.5B-en sc_k10−cot: -0.033 CI [-0.17, +0.07] b=1 c=2 p=1
0.5B-bn cot−direct: +0.067 CI [+0.00, +0.17] b=2 c=0 p=0.5
0.5B-bn sc_k10−cot: -0.067 CI [-0.17, +0.00] b=0 c=2 p=0.5
0.5B-en cot−direct: +0.567 CI [+0.40, +0.73] b=17 c=0 p=1.5e-05
0.5B-en sc_k10−cot: +0.067 CI [-0.10, +0.23] b=4 c=2 p=0.69

১.৫B ইংরেজিতে CoT প্রতি সঠিক উত্তরে ৫৪ থেকে ২৯৯ token-এ গেছে, প্রায় সাড়ে পাঁচ গুণ, আর বিনিময়ে accuracy ০.১৩৩ থেকে ০.৮৩৩; জোড়া পার্থক্য +০.৭০০, CI [+০.৫৩, +০.৮৭], b = ২১, c = ০. এই দাম দেওয়ার মতো। একই model-এ k = ১০ নিলে token প্রায় দশগুণ (৩০৪২), অথচ CoT-এর চেয়ে −০.০৩৩, CI শূন্যকে ঘিরে: দাম আছে, লাভ নেই। বাংলায় ১.৫B-এর CoT প্রতি সঠিক উত্তরে ২৪৯২ token নিয়েছে, direct-এর প্রায় ২১ গুণ, আর পার্থক্য +০.০৩৩, p = ১. সেখানে CoT-এর দাম দিয়ে কিছু কেনা হয়নি। NaN মানে একটিও সঠিক উত্তর নেই, তাই ভাগ করা যায় না।

খরচের অঙ্কটি সাধারণ সূত্রে লেখা যায়। প্রতিটি প্রশ্নে input token I, output token O, আর প্রতি দশ লাখ token-এ দাম যথাক্রমে Q আর P টাকা হলে n প্রশ্নের খরচ

খরচ = n × (I × Q + k × O × P) ÷ ১০৬

যেখানে k = ১ সাধারণ CoT-এ, আর self-consistency-তে নমুনার সংখ্যা (প্রতিটি নমুনা আলাদা request হলে input-ও k বার গোনা হয়)। দাম বদলায়, তাই এখানে সংখ্যা নেই; নিজের দাম বসান (অনুশীলন ১)।

৬ · Least-to-most — বড় প্রশ্ন ছোট প্রশ্নে ভাঙা

CoT model-কে ধাপ লিখতে বলে, কিন্তু কোন ধাপ, কোন ক্রমে, তা model-এর ওপর ছেড়ে দেয়। Least-to-most prompting (Zhou ও সহকর্মী, ২০২২) কাজটি দুই ভাগে করে। প্রথম ভাগে model বা মানুষ প্রশ্নটিকে ছোট উপ-প্রশ্নে ভাঙে, সহজ থেকে কঠিন ক্রমে। দ্বিতীয় ভাগে উপ-প্রশ্নগুলো একে একে সমাধান হয়, আর প্রতিটির উত্তর পরের উপ-প্রশ্নের prompt-এ যোগ হয়। প্রবন্ধে দেখানো হয়েছিল, উদাহরণের চেয়ে কঠিন প্রশ্নে, যেমন SCAN নামের নির্দেশ-অনুবাদের task-এ, এটি সাধারণ CoT-এর চেয়ে ভালোভাবে সাধারণীকরণ করে; বড় model-এ, তাঁদের পরীক্ষায়।

বাজারঘরের একটি কঠিন অর্ডারে চারটি নিয়ম একসঙ্গে: ৩টিতে ছাড়, ছাড়ের সীমা, ফ্রি-ডেলিভারির সীমা আর ঢাকার বাইরের চার্জ। §৩-এ দেখেছেন, ছোট model এমন প্রশ্নে নিয়ম বাদ দেয় বা উল্টো খাটায়। নিচের কোড কোনো model ছাড়াই, সাধারণ Python-এ, দেখায় একটি model-এর কোন ধাপগুলো কোন ক্রমে মানা উচিত। প্রতিটি ফাংশন একটি উপ-প্রশ্ন।

# প্রশ্ন: ৩টি মধুর বয়াম, প্রতিটি ৬০০ টাকা; ৩টি কিনলে মোট দামে ১৫% ছাড়, তবে ছাড় সর্বোচ্চ ২৫০ টাকা।
# ১৭০০ টাকার কম অর্ডারে ডেলিভারি ৮০ টাকা, নইলে ফ্রি। ঢাকার বাইরে হলে আরও ৪০ টাকা। গ্রাহক খুলনায়।
order = {"qty": 3, "unit": 600, "pct": 15, "cap": 250, "free_from": 1700,
         "fee": 80, "outside_extra": 40, "outside_dhaka": True}

def subtotal(o):          return o["qty"] * o["unit"]
def discount(o, sub):     return min(sub * o["pct"] / 100, o["cap"]) if o["qty"] >= 3 else 0
def delivery(o, after):   return (0 if after >= o["free_from"] else o["fee"]) + (o["outside_extra"] if o["outside_dhaka"] else 0)

steps = []                                     # least-to-most: ছোট প্রশ্ন আগে, তার উত্তর পরের প্রশ্নে
sub = subtotal(order);              steps.append(("ছাড়ের আগে মোট দাম কত?", sub))
d = discount(order, sub);           steps.append(("ছাড় কত (সীমা মেনে)?", d))
after = sub - d;                    steps.append(("ছাড়ের পর দাম কত?", after))
fee = delivery(order, after);       steps.append(("ডেলিভারি কত (ফ্রি-সীমা ছাড়ের পরের দামে)?", fee))
total = after + fee;                steps.append(("গ্রাহক মোট কত দেবেন?", total))
for i, (q, a) in enumerate(steps, 1):
    print(f"ধাপ {i}: {q:42} → {a:g}")

# একটি সাধারণ ভুল: ফ্রি-সীমা ছাড়ের আগের দামে দেখা
wrong = after + delivery(order, sub)
print(f"\nভুল ক্রমে (ফ্রি-সীমা ছাড়ের আগের দামে): {wrong:g}  বনাম ঠিক: {total:g}")

আউটপুট (পাতার Python-এ চালানো):

ধাপ 1: ছাড়ের আগে মোট দাম কত?                     → 1800
ধাপ 2: ছাড় কত (সীমা মেনে)?                       → 250
ধাপ 3: ছাড়ের পর দাম কত?                          → 1550
ধাপ 4: ডেলিভারি কত (ফ্রি-সীমা ছাড়ের পরের দামে)?  → 120
ধাপ 5: গ্রাহক মোট কত দেবেন?                       → 1670

ভুল ক্রমে (ফ্রি-সীমা ছাড়ের আগের দামে): 1590  বনাম ঠিক: 1670

পাঁচটি উপ-প্রশ্ন, প্রতিটির উত্তর পরেরটির ইনপুট। ধাপ ২-এ ১৫% মানে ২৭০ টাকা, কিন্তু সীমা ২৫০, তাই ২৫০. ধাপ ৪ সবচেয়ে সূক্ষ্ম: ফ্রি-ডেলিভারির সীমা ছাড়ের পরের দামে দেখতে হয়। ১৫৫০ টাকা ১৭০০-র কম, তাই ৮০ টাকা, আর খুলনা বলে আরও ৪০. শেষ লাইনে দেখুন, ক্রম ভুল হলে উত্তর ১৫৯০ আসে, ৮০ টাকা কম। নিয়মের ক্রম বাজারঘরের নীতির প্রশ্ন; prompt-এ না লিখলে model আন্দাজ করবে।

শিক্ষা: যে হিসাবের নিয়ম আপনি জানেন, তা model-কে আন্দাজ করতে দেবেন না। এক পথ, prompt-এ উপ-প্রশ্নগুলো ক্রমসহ লিখে দেওয়া। আরও নিরাপদ পথ, model দিয়ে শুধু অর্ডারের সংখ্যাগুলো বের করা (পর্ব ৬২ · Structured output-এর JSON), আর হিসাবটি উপরের মতো কোডে করা। Gao ও সহকর্মীদের PAL (২০২২) আর Chen ও সহকর্মীদের Program of Thoughts (২০২২) এই ভাবনারই প্রবন্ধ: model যুক্তি লেখে কোড হিসেবে, আর Python interpreter হিসাবটি করে।

৭ · লেখা যুক্তি কি আসল কারণ? — faithfulness-এর প্রশ্ন

CoT দেখতে ব্যাখ্যার মতো, কিন্তু একে “model কেন এই উত্তর দিল”-র প্রমাণ ধরা যায় না। Turpin ও সহকর্মীরা (২০২৩) few-shot উদাহরণে একটি লুকানো ঝোঁক ঢুকিয়েছিলেন, যেমন সব উদাহরণের সঠিক উত্তর বিকল্প “(A)”-তে রাখা। তাঁদের রিপোর্ট অনুযায়ী model-গুলো প্রায়ই তখন “(A)”-র দিকে ঝুঁকেছে, আর তার পক্ষে বিশ্বাসযোগ্য CoT লিখেছে, কিন্তু ব্যাখ্যায় ঝোঁকটির কথা উল্লেখ করেনি। BIG-Bench Hard-এর ১৩টি task-এ নির্ভুলতা সর্বোচ্চ প্রায় ৩৬% পর্যন্ত কমেছিল বলে তাঁরা লেখেন। অর্থাৎ লেখা যুক্তি আর উত্তরের আসল কারণ আলাদা হতে পারে। একে বলে CoT-এর faithfulness-এর সমস্যা।

Lanham ও সহকর্মীরা (২০২৩) উল্টো দিক থেকে মেপেছিলেন: CoT মাঝপথে কেটে দিলে বা ভেতরে ভুল ঢুকিয়ে দিলে উত্তর কতটা বদলায়। উত্তর না বদলালে বোঝা যায়, লেখা ধাপের ওপর উত্তর তেমন নির্ভর করছিল না। তাঁদের রিপোর্টে task ভেদে নির্ভরতা অনেক আলাদা ছিল। §৩-এর ০.৫B উত্তরটিও মনে করুন: শেষ সংখ্যা ঠিক, অথচ কোনো ধাপ তাকে সমর্থন করে না।

বাজারঘরে এর মানে: ফেরতের দাবি মঞ্জুর হবে কি না, এমন সিদ্ধান্তে model-এর লেখা “কারণ” গ্রাহককে দেখানো বা নিরীক্ষার নথি হিসেবে রাখা বিপজ্জনক। লেখা কারণটি সুন্দর হতে পারে, অথচ আসল কারণ অন্য। সিদ্ধান্তের নিয়ম কোডে বা লিখিত নীতিতে রাখুন, model-এর লেখাকে প্রমাণ নয়, একটি খসড়া ধরুন।

৮ · Reasoning model আর “thinking” সেটিং — ছয়টি পণ্যের নথি

২০২৪ সাল থেকে reasoning model এসেছে: training-এর সময়েই, মূলত reinforcement learning দিয়ে, উত্তরের আগে লম্বা মধ্যবর্তী লেখা তৈরি করতে শেখানো model; DeepSeek-R1-এর প্রবন্ধ (২০২৫) এর একটি খোলা বিবরণ দেয়। CoT তখন prompt-এর কৌশল নয়, একটি সেটিং। “Thinking” নথির ভাষা; আসলে এটি উত্তরের আগে বাড়তি token.

মূল ধারণা সবার এক। এক, একটি সেটিং দিয়ে বাড়তি লেখার মাত্রা ঠিক হয় (effort বা level বা budget). দুই, সেই লেখার পুরোটা আপনি সাধারণত দেখেন না; কেউ সারাংশ দেয়, কেউ সংকেতায়িত (encrypted) রূপ, কেউ পুরো লেখা। তিন, না দেখলেও সেই token-এর দাম দিতে হয়, আর সেগুলো output-এর সীমার ভেতরে গোনা হয়। নিচের সারণির সব তথ্য প্রতিটি প্রতিষ্ঠানের নিজের developer নথি থেকে, লেখার সময়ে (নভেম্বর ২০২৬) পড়া; নথি প্রায়ই বদলায়, তাই পরিবর্তন হতে পারে। Model ভেদে নিয়ম আলাদা, তাই নিজের model-এর পাতা দেখে নিন। এটি মান তুলনা নয়।

পণ্য (প্রতিষ্ঠান)সেটিং (নথির নাম)কী দেখা যায়কী লুকানোToken-এর হিসাব
ChatGPT / GPT (OpenAI)reasoning.effort (Responses API), reasoning_effort (Chat Completions); মান model ভেদে none থেকে maxচাইলে সারাংশ: reasoning.summaryআসল reasoning token: “not visible via the API”Output token হিসেবে বিল; output_tokens_details.reasoning_tokens; max_output_tokens-এর ভেতরে
Gemini (Google)thinking_level (model ভেদে minimal থেকে high); thinking_summariesশুধু সারাংশ, তাও খালি থাকতে পারেআসল চিন্তা; প্রতিটি ধাপে সংকেতায়িত signatureদাম = output + thinking token; usage.total_thought_tokens; max_output_tokens-এর ভেতরে
Claude (Anthropic)thinking: {type: "adaptive"} আর effort; পুরনো budget_tokens নতুন model-এ বাতিলdisplay: "summarized" দিলে সারাংশ; নতুন model-এ ডিফল্ট "omitted"কাঁচা chain of thought কোনো সেটিংয়েই ফেরত আসে নাপুরো thinking token output হিসেবে বিল, সারাংশের token নয়; output_tokens_details.thinking_tokens; max_tokens-এর ভেতরে
Grok (xAI)reasoning_effort: low, medium, high (ডিফল্ট), কিছু model-এ xhigh; তালিকাভুক্ত model-এ বন্ধ করা যায় নাকিছু model-এ সারাংশReasoning সংকেতায়িত; include: ["reasoning.encrypted_content"] দিলে ফেরত আসেUsage-এ reasoning_tokens; মোট ব্যবহারের অংশ হিসেবে বিল
DeepSeekthinking: {type: "enabled"/"disabled"}, reasoning_effort; ডিফল্টে চালুপুরো লেখা আলাদা reasoning_content ঘরেনথিতে পাইনিবিলের নিয়ম পড়া নথিতে পাইনি; thinking-এ temperature কাজ করে না
Kimi (Moonshot AI)Model ভেদে: thinking.type চালু/বন্ধ, বা reasoning_effort (low, high, max)পুরো লেখা reasoning_content ঘরেনথিতে পাইনিreasoning_content আর content মিলে max_tokens-এর ভেতরে; token ব্যবহারে গোনা হয়

তিনটি ব্যবহারিক কথা। প্রথম, খরচ লুকানো থাকতে পারে; Anthropic-এর নথি সরাসরি লেখে, বিলের output token দেখা token-এর সঙ্গে মিলবে না। তাই খরচ মাপুন usage-এর ঘর থেকে, লেখা গুনে নয় (পর্ব ৬৫ · Token, খরচ আর latency). দ্বিতীয়, সীমা ছোট দিলে উত্তরই হারাতে পারে। OpenAI-এর নথি সতর্ক করে, max_output_tokens ফুরিয়ে গেলে উত্তর “incomplete” হয়, দেখা যায় এমন লেখা না-ও থাকতে পারে। তৃতীয়, বহু ধাপের কথোপকথনে কিছু API চায় আগের reasoning অংশ হুবহু ফেরত পাঠাতে (Gemini-র signature, DeepSeek আর Kimi-তে tool ব্যবহারের সময় reasoning_content).

আর prompt? OpenAI-এর reasoning best practices নথি (লেখার সময়ে) সরাসরি বলে “Avoid chain-of-thought prompts”: এই model-গুলো নিজেই ভেতরে ধাপ লেখে, তাই “ধাপে ধাপে ভাবুন” বলা দরকার নেই, কখনো ক্ষতিও করতে পারে। একই নথি পরিষ্কার লক্ষ্য, শর্ত আর output-এর ফরম্যাট দিতে বলে। অর্থাৎ এই পর্বের CoT prompt সবচেয়ে কাজের সাধারণ instruct model-এ, বিশেষ করে নিজের চালানো ছোট open model-এ; reasoning model-এ কাজ সরে যায় effort সেটিং আর ভালো মূল্যায়নের দিকে।

নমুনা request (OpenAI Responses API-র নথির ধাঁচে; key নেই বলে চালানো হয়নি, কোনো উত্তরও দেখানো হচ্ছে না):

{
  "model": "<আপনার reasoning model>",
  "reasoning": { "effort": "low", "summary": "auto" },
  "max_output_tokens": 2000,
  "input": "৩টি মধুর বয়াম ... মোট কত? শেষ লাইনে: উত্তর: <সংখ্যা>"
}

উত্তরের usage-এ output_tokens-এর পাশে reasoning_tokens দেখে বুঝবেন, বিলের কতটা ভেতরের লেখা।

৯ · কখন CoT, কখন নয় — একটি সিদ্ধান্তের তালিকা

প্রবন্ধ, নথি আর এই run মিলিয়ে শুরুর অনুমান; প্রতিটি নিজের eval set-এ মেপে নিন (পর্ব ৬৬ · Prompt পরীক্ষা)।

অবস্থাশুরুর পছন্দকারণ
এক ধাপের প্রশ্ন, তথ্য খোঁজা, শ্রেণিবিভাগDirectSprague ও সহকর্মীদের (২০২৪) পর্যালোচনায় এমন কাজে CoT-এর লাভ সামান্য; token বাঁচে
বহু ধাপের হিসাব, নিয়মের ক্রম জরুরিCoT, বা আরও ভালো: সংখ্যা বের করে হিসাব কোডেমধ্যবর্তী ফল লেখা থাকে; কোডে হিসাব নির্ভুল আর যাচাইযোগ্য
উত্তর একটি সংখ্যা বা লেবেল, ভুলের দাম বেশি, সময় আছেSelf-consistency, ছোট k (৩–৫) দিয়ে শুরুভোট গোনা যায়; ভোটের ভাগ একটি আস্থার সংকেত
খোলা লেখা (চিঠি, সারাংশ)CoT সাধারণত দরকার নেইভোট গোনা যায় না; লম্বা লেখা পাঠকের কাজে লাগে না
Reasoning model ব্যবহার করছেনCoT prompt নয়; effort সেটিং, স্পষ্ট লক্ষ্য আর ফরম্যাটOpenAI-এর নথি এমন model-এ CoT prompt এড়াতে বলে; লুকানো token-ও বিল হয়
Latency-র সীমা কঠিন (চ্যাটের প্রথম উত্তর)Direct, বা ছোট effortপ্রতিটি বাড়তি token অপেক্ষা বাড়ায় (পর্ব ৬৫)
এই পর্বের run থেকে, ৩০টি প্রশ্ন
ধাপ
যা মাপা হলো
খরচ
রায়
  1. সহজ প্রশ্ন. এক লাইনের গুণে ১.৫B বাংলায় direct ঠিক উত্তর দিয়েছে ১১ token-এ। CoT চাইতেই ৩৫৬ token লিখে ভুল ১০০-তে পৌঁছেছে। এক ধাপের কাজে CoT শুধু ভুলের বাড়তি সুযোগ।
  2. ইংরেজি, ১.৫B. ২১টি প্রশ্নে শুধু CoT ঠিক, একটিতেও শুধু direct নয়। প্রতি সঠিক উত্তরে token সাড়ে পাঁচ গুণ, তবু লাভটি বড় আর জোড়া CI শূন্য থেকে দূরে। এখানে CoT রাখুন।
  3. বাংলা, ১.৫B. একই model, একই প্রশ্ন: ৪টিতে শুধু CoT ঠিক, ৩টিতে শুধু direct. পার্থক্য দৈবের সঙ্গে মেলে, আর প্রতি সঠিক উত্তরে token ২১ গুণ। এখানে CoT-এর দাম দিয়ে কিছু কেনা হচ্ছে না।
  4. ভোট যোগ করব? ১.৫B ইংরেজিতে দশটি নমুনার ভোট greedy CoT-এর চেয়ে সামান্য খারাপ; ০.৫B-এ সামান্য ভালো, কিন্তু p ≈ ০.৬৯. দশগুণ token-এর বদলে প্রমাণিত লাভ নেই, অন্তত ৩০টি প্রশ্নে।
  5. সিদ্ধান্ত লেখা. এই set আর এই model-এর জন্য নিয়ম: ইংরেজিতে greedy CoT; বাংলায় model দিয়ে সংখ্যা বের করে হিসাব কোডে (§৬)। Model, prompt বা ভাষা বদলালে একই পরীক্ষা আবার চালাতে হবে।

আরও গভীরে: CoT-এর তাত্ত্বিক দিক নিয়ে Feng ও সহকর্মীদের “Towards Revealing the Mystery behind Chain of Thought” (২০২৩) আর Merrill ও Sabharwal-এর কাজ যুক্তি দেয়, মধ্যবর্তী token লেখার সুযোগ একটি নির্দিষ্ট গভীরতার transformer-কে আরও জটিল ধরনের হিসাব প্রকাশের ক্ষমতা দেয়। Self-consistency-র পরের ধাপ হিসেবে verifier বা process reward model প্রস্তাব করা হয়েছে, যেখানে আলাদা একটি model প্রতিটি পথ বা প্রতিটি ধাপকে নম্বর দেয় (Cobbe ও সহকর্মী, ২০২১; Lightman ও সহকর্মীদের “Let's Verify Step by Step”, ২০২৩)। Tree of Thoughts (Yao ও সহকর্মী, ২০২৩) পথগুলো গাছের মতো খোঁজে; খরচ আরও বেশি।

পরীক্ষা ও ইন্টারভিউতে: CoT আর self-consistency-র পার্থক্য? CoT একটি পথ লেখে; self-consistency temperature দিয়ে অনেক পথ নিয়ে চূড়ান্ত উত্তরে ভোট নেয়। Self-consistency-তে greedy চলবে? না, সব নমুনা একই হবে। CoT-এর খরচ কীভাবে তুলনা করবেন? গড় output token আর প্রতি সঠিক উত্তরে token (গড় token ÷ accuracy). Zero-shot CoT কী? উদাহরণ ছাড়া “Let's think step by step” (Kojima ও সহকর্মী, ২০২২)। CoT কি model-এর আসল যুক্তি দেখায়? নিশ্চিত নয়; Turpin ও সহকর্মীরা (২০২৩) অবিশ্বস্ত ব্যাখ্যা দেখিয়েছেন।

১০ · AI-এর যুগে — reasoning prompt নিয়ে AI সহকারীর সঙ্গে কাজ

CoT আর self-consistency-র কোড AI assistant দ্রুত লিখে দেয়, কিন্তু ভুলগুলো ক্র্যাশ করে না, নম্বর শুধু একটু বদলায়।

AI প্রায়ই যা করেকেন ভুলকীভাবে ধরবেন
Self-consistency-র কোডে greedy decodingপ্রতিবার একই পথ; ১০টি “নমুনা” আসলে একটিনমুনাগুলোর লেখা আলাদা কি না দেখা; do_sample=True আর temperature লেখা
পুরনো library-র argument, যেমন বাদ পড়া generate-এর বিকল্পনীরবে উপেক্ষা হতে পারে, বা errorনিজের version-এর নথি; একটি প্রশ্নে চালিয়ে দেখা
“শেষ সংখ্যা”-কে উত্তর ধরা, বাংলা অঙ্ক বাদকারণের সংখ্যা উত্তর হয়ে যায়; “১,০৮০” পড়া যায় নাউত্তরের লাইন বেঁধে দেওয়া; extractor-এর test
একটি run, CI ছাড়া, “CoT ১০% ভালো”৩০টি প্রশ্নে অনিশ্চয়তা ±১৫ শতাংশ-বিন্দুর মতোজোড়া তুলনা, bootstrap CI, কয়েকটি seed
Token-এর খরচ বাদ দিয়ে শুধু accuracyk = ১০ মানে প্রায় ১০ গুণ output tokenপ্রতিটি পদ্ধতির পাশে গড় token আর প্রতি সঠিক উত্তরে token
CoT-কে model-এর আসল যুক্তি বলে ব্যাখ্যাFaithfulness নিশ্চিত নয় (Turpin, ২০২৩)সিদ্ধান্তের নিয়ম কোডে; লেখাকে প্রমাণ না ধরা
প্রবন্ধের নম্বর বা পণ্যের সেটিং স্মৃতি থেকেবানানো বা পুরনো তথ্যমূল প্রবন্ধ আর তারিখসহ official নথি নিজে খোলা

কোড চাওয়ার সময় যাচাইয়ের অংশও চেয়ে নিন। গ্রাহকের আসল অর্ডার, ফোন নম্বর বা কোনো API key কোনো hosted assistant-এর prompt-এ দেবেন না।

আমি Hugging Face transformers-এ (version লিখে দিচ্ছি) একটি ছোট open instruct model দিয়ে বাংলা পাটিগণিত প্রশ্নে direct, CoT আর self-consistency তুলনা করব। ১. Direct আর CoT-এর দুটি prompt দাও; দুটিতেই শেষ লাইনে “উত্তর: <সংখ্যা>” চাইবে। ২. বাংলা অঙ্ক, কমা আর “টাকা” সামলায় এমন answer extractor দাও, সঙ্গে পাঁচটি ছোট test. ৩. Self-consistency-র জন্য sampling-এর কোড দাও (temperature, top_p, seed লিখে), k = ১, ৫, ১০-এ সংখ্যাগরিষ্ঠ ভোট। ৪. প্রতিটি accuracy-র পাশে bootstrap CI, জোড়া তুলনা, গড় output token আর প্রতি সঠিক উত্তরে token দাও। ৫. কোনো প্রবন্ধের নম্বর বা পণ্যের API-র নিয়ম নিশ্চিত না হলে বলো; কিছু বানাবে না। Model “ভাবে” বা “বোঝে” এমন দাবি করবে না।

AI-এর দেওয়া reasoning-কোড আর দাবির চেকলিস্ট

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

প্রতিটি প্রশ্ন নিয়ে নিজে কিছুক্ষণ ভাবুন, তারপর “→ উত্তর” চাপুন।

প্র ০১“ধাপে ধাপে লিখলে model ভালো হিসাব করে” — যন্ত্রের দিক থেকে এর ব্যাখ্যা কী, আর কোন দাবিটি বাড়াবাড়ি?

যন্ত্রের দিক থেকে দুটি সহজ কারণ আছে। প্রথম, হিসাবের পরিমাণ। Decoder model প্রতিটি token-এর জন্য একই সংখ্যক layer চালায়। সরাসরি “উত্তর: ৮৮৫” লিখতে হলে কয়েকটি token-এর মধ্যেই পুরো হিসাব সারতে হয়। ধাপ লিখলে token বাড়ে, তাই মোট হিসাবও বাড়ে। দ্বিতীয়, স্মৃতি। মধ্যবর্তী ফল “৭৬৫” একবার লেখা হলে সেটি context-এ থাকে; পরের token attention দিয়ে সেটি সরাসরি পড়তে পারে। Nye ও সহকর্মীরা (২০২১) scratchpad নিয়ে কাজে দেখিয়েছিলেন, মধ্যবর্তী হিসাব লিখতে শেখানো model বহু অঙ্কের যোগ বা ছোট প্রোগ্রামের ফল বের করার মতো কাজে ভালো করে। পরে কিছু তাত্ত্বিক কাজ যুক্তি দিয়েছে, মধ্যবর্তী token লেখার সুযোগ থাকলে একটি নির্দিষ্ট গভীরতার transformer আরও জটিল ধরনের হিসাব প্রকাশ করতে পারে; এসব ফল নির্দিষ্ট অনুমানের ওপর দাঁড়ানো।

বাড়াবাড়ি দাবি দুটি। এক, “CoT model-কে ভাবতে শেখায়”। CoT model-এর weight বদলায় না; এটি শুধু কোন token-এর ধারা লেখা হবে, তা বদলায়। দুই, “CoT সব model-এ সব কাজে সাহায্য করে”। Wei ও সহকর্মীরা (২০২২) নিজেরাই রিপোর্ট করেছিলেন, সুবিধা প্রধানত বড় model-এ দেখা গেছে, ছোটতে কখনো ক্ষতি। Sprague ও সহকর্মীদের ২০২৪ সালের বড় পর্যালোচনা “To CoT or not to CoT?” যুক্তি দেয়, সুবিধা মূলত অঙ্ক আর প্রতীকী যুক্তির কাজে কেন্দ্রীভূত, অন্য অনেক কাজে সামান্য। এই পর্বের ছোট run-ও একই কথা বলে: ফল model, ভাষা আর প্রশ্ন ভেদে বদলায়, আর প্রশ্ন কম হলে পার্থক্য শব্দের নিচে চাপা পড়ে।

মূল উপলব্ধি: CoT বাড়তি হিসাবের ধাপ আর লেখা স্মৃতি দেয়; সেটি কাজে লাগবে কি না, তা model আর task-এর ওপর নির্ভর করে, আর মেপে দেখতে হয়।

প্র ০২Self-consistency কেন কাজ করে, আর কোন অবস্থায় ভোট নেওয়া অর্থহীন বা ক্ষতিকর?

Wang ও সহকর্মীদের (২০২২) যুক্তিটি সুন্দর। একটি কঠিন অঙ্কের ঠিক উত্তরে পৌঁছানোর অনেক পথ আছে, কিন্তু সব ঠিক পথ একই সংখ্যায় শেষ হয়। ভুল পথগুলো সাধারণত ভিন্ন ভিন্ন ভুল সংখ্যায় শেষ হয়। তাই অনেক নমুনা নিলে ঠিক উত্তরটি একসঙ্গে জমে, আর ভুলগুলো ছড়িয়ে পড়ে। একটি সরল গাণিতিক ছবি: প্রতিটি নমুনা স্বাধীনভাবে p সম্ভাবনায় ঠিক, আর ভুলগুলো সবাই আলাদা হলে, p বেশ ছোট হলেও সংখ্যাগরিষ্ঠ উত্তর প্রায়ই ঠিক হয়। ক্রিকেটে তৃতীয় আম্পায়ার একাধিক ক্যামেরা দেখেন, কারণ একটি ক্যামেরার ভুল কোণ অন্যগুলো ধরে ফেলে।

এই ছবির দুটি অনুমানই বাস্তবে ভাঙতে পারে। প্রথম, নমুনাগুলো স্বাধীন নয়। একই model, একই prompt-এর নমুনা একই ভুল ধারণা বয়ে নেয়। যদি model নিয়মটিই ভুল বোঝে, যেমন ফ্রি-ডেলিভারির সীমা ছাড়ের আগের দামে দেখে, তবে বেশিরভাগ নমুনা একই ভুল সংখ্যায় পৌঁছাবে, আর ভোট সেই ভুলকে আরও আত্মবিশ্বাসী করবে। দ্বিতীয়, ভুলগুলো ছড়ানো না-ও হতে পারে। হ্যাঁ/না প্রশ্নে মাত্র দুটি উত্তর; প্রতিটি নমুনার p ০.৫-এর নিচে হলে ভোট ফল খারাপ করে। অনুশীলনের ৪ নম্বরে এর হিসাব আছে।

আরেকটি সীমা হলো উত্তরের ধরন। ভোট নিতে হলে উত্তর তুলনা করা যায় এমন হতে হয়: একটি সংখ্যা, একটি লেবেল। খোলা লেখা, যেমন গ্রাহককে চিঠি, সরাসরি গোনা যায় না; সেখানে Chen ও সহকর্মীদের “Universal Self-Consistency” (২০২৩) ধরনের পদ্ধতি একটি LLM দিয়েই সবচেয়ে সামঞ্জস্যপূর্ণ উত্তর বাছাইয়ের প্রস্তাব দেয়, যার নিজের পক্ষপাত আছে (পর্ব ৫৮-এর বিচারক-সমস্যা)। আর খরচ: k = ১০ মানে প্রায় দশগুণ output token, দশগুণ সময়।

মূল উপলব্ধি: ভোট কাজ করে যখন ঠিক পথগুলো এক জায়গায় মেলে আর ভুলগুলো ছড়ায়; একই ভুল বারবার এলে ভোট সেটিকেই জয়ী করে।

প্র ০৩CoT-এর লেখা যুক্তি যদি আসল কারণ না-ও হয়, তবু কি এটি মূল্যবান? নিরীক্ষা আর নিরাপত্তার কাজে এর অবস্থান কী?

Faithfulness-এর প্রশ্নটি দুই দিক থেকে দেখা দরকার। খারাপ খবর আগে। Turpin ও সহকর্মীরা (২০২৩) দেখান, few-shot উদাহরণে লুকানো ঝোঁক বা prompt-এ “আমার মনে হয় উত্তর এটি” ধরনের ইঙ্গিত দিলে model-এর উত্তর সেই দিকে সরে, অথচ CoT-এ সেই ইঙ্গিতের কথা থাকে না, বরং অন্য বিশ্বাসযোগ্য যুক্তি থাকে। সামাজিক পক্ষপাতের পরীক্ষাতেও তাঁরা একই ধরন রিপোর্ট করেন। Lanham ও সহকর্মীরা (২০২৩) CoT কেটে বা বদলে দেখেছিলেন উত্তর কতটা নির্ভর করে; কিছু task-এ উত্তর প্রায় বদলায়নি, অর্থাৎ লেখাটি অনেকাংশে সাজসজ্জা। তাঁদের একটি পর্যবেক্ষণ ছিল, বড় model-এ কিছু task-এ নির্ভরতা কম দেখা গেছে।

ভালো খবরও আছে। লেখা ধাপ মানুষের পক্ষে পরীক্ষা করা সহজ করে: ধাপে একটি স্পষ্ট গাণিতিক ভুল থাকলে উত্তর সন্দেহ করার কারণ পাওয়া যায়। কিছু গবেষক reasoning model-এর লেখা পর্যবেক্ষণ করে অনাকাঙ্ক্ষিত আচরণ ধরার প্রস্তাব দিয়েছেন, যাকে CoT monitoring বলা হয়; তাঁরা নিজেরাই সতর্ক করেন, model-কে সেই লেখার ওপর চাপ দিয়ে train করলে লেখা আর আচরণের সম্পর্ক দুর্বল হতে পারে। এটি এখনো সক্রিয় গবেষণার বিষয়।

বাস্তব কাজে নিয়ম তিনটি। এক, সিদ্ধান্তের নিয়ম (ফেরত মঞ্জুর, দাম, ছাড়) কোডে বা লিখিত নীতিতে রাখুন। দুই, CoT-কে একটি খসড়া হিসাব ধরুন, যার প্রতিটি সংখ্যা কোড দিয়ে আবার যাচাই করা যায়। তিন, গ্রাহককে model-এর লেখা যুক্তি “কারণ” হিসেবে দেখাবেন না; পণ্যের নথিও (§৮) কাঁচা লেখা প্রায়ই লুকিয়ে রাখে। পুরো LLM নিরাপত্তার আলোচনা পর্ব ৭৩-এ।

মূল উপলব্ধি: CoT একটি পরীক্ষাযোগ্য খসড়া, model-এর মনের ছবি নয়; সিদ্ধান্তের প্রমাণ হিসেবে একে ব্যবহার করবেন না।

প্র ০৪Reasoning model আসার পর কি “ধাপে ধাপে ভাবুন” লেখা পুরনো হয়ে গেছে?

আংশিক হ্যাঁ। ২০২৪ সালে OpenAI o1 ধরনের model প্রকাশ করে, যাকে উত্তরের আগে লম্বা ভেতরের লেখা তৈরি করতে শেখানো হয়েছে বলে প্রতিষ্ঠানটি জানায়। ২০২৫ সালে DeepSeek-R1-এর প্রবন্ধ খোলাখুলি বর্ণনা দেয়, কীভাবে reinforcement learning দিয়ে, যেখানে পুরস্কার মূলত চূড়ান্ত উত্তর ঠিক কি না তার ওপর, model-কে লম্বা যুক্তির লেখা তৈরিতে উৎসাহ দেওয়া যায়; তারা ছোট open model-এ সেই আচরণ distill-ও করে (পর্ব ৫৯)। এখন অনেক পণ্যে এটি একটি সেটিং (§৮)। OpenAI-এর নথি এমন model-এ CoT prompt এড়াতে বলে, কারণ model নিজেই ভেতরে ধাপ লেখে।

তবে পুরোপুরি নয়, তিন কারণে। প্রথম, অনেক কাজ এখনো সাধারণ instruct model-এ চলে: খরচ কম, latency কম, আর নিজের সার্ভারে চালানো ছোট open model প্রায়ই এমনই। সেখানে CoT prompt, উত্তরের লাইনের ফরম্যাট আর self-consistency সরাসরি কাজে লাগে। দ্বিতীয়, reasoning model-এও prompt-এর কাজ ফুরায়নি; নথিগুলো স্পষ্ট লক্ষ্য, শর্ত আর output ফরম্যাট দিতে বলে। কোন ধাপ মানতে হবে তা যদি ব্যবসার নিয়ম হয়, যেমন ফ্রি-ডেলিভারির সীমা ছাড়ের পরের দামে, সেটি লিখে দিতেই হবে। তৃতীয়, খরচ। ভেতরের লেখা লুকানো থাকলেও বিল হয়। সহজ প্রশ্নে বেশি effort দেওয়া টাকার অপচয়; কিছু নথি এ কারণেই effort কমানোর বা adaptive সেটিংয়ের কথা বলে।

আরেকটি সূক্ষ্ম বিষয়: reasoning model-এর ভেতরের লেখা সাধারণত দেখা যায় না, তাই ভুল ধাপ খুঁজে পাওয়া কঠিন। নিজের চালানো open model-এ পুরো লেখা দেখা যায়, যা শেখার জন্য আর ভুল বিশ্লেষণের জন্য সুবিধা।

মূল উপলব্ধি: Reasoning model-এ CoT prompt-এর জায়গা নিয়েছে effort সেটিং; সাধারণ আর ছোট model-এ CoT এখনো একটি মাপার মতো হাতিয়ার, আর দুই ক্ষেত্রেই স্পষ্ট নিয়ম ও মূল্যায়ন জরুরি।

প্র ০৫বাংলায় reasoning prompt-এর আলাদা চ্যালেঞ্জ কী? ইংরেজিতে অনুবাদ করে হিসাব করানো কি ভালো পথ?

এই পর্বের run-এ বাংলার সমস্যাটি স্পষ্ট দেখা গেছে। একই ৩০টি প্রশ্ন, একই model, শুধু ভাষা বদল: Qwen2.5-1.5B ইংরেজিতে CoT দিয়ে ০.৮৩৩, বাংলায় ০.১৩৩. ০.৫B-এ ইংরেজিতে ০.৬৩৩, বাংলায় ০.০৬৭. বাংলা উত্তরে দেখা গেছে অর্থহীন পুনরাবৃত্তি, অঙ্কে সাহায্য করতে অস্বীকার, আর ঠিক কাঠামোর ভেতরে ভুল গুণ; পর্ব ৫৮-এও এমন ফারাক দেখা গিয়েছিল। এটি দুটি ছোট model-এর একটি স্থানীয় মাপ; বড় model বা অন্য পরিবারে ফারাক অনেক কম হতে পারে, আর সেটি নিজের set-এ মেপেই জানা যায়।

দ্বিতীয় চ্যালেঞ্জ খরচ। একই অর্থের CoT prompt বাংলায় গড়ে প্রায় ২০০ input token, ইংরেজিতে প্রায় ৮৭, কারণ tokenizer বাংলা লেখাকে বেশি টুকরোয় ভাঙে (পর্ব ৪০)। বাংলা CoT-এর output-ও লম্বা: ১.৫B-এ গড়ে ৩৩১ token, ইংরেজিতে ২৪৯. তৃতীয় চ্যালেঞ্জ উত্তর বের করা: বাংলা অঙ্ক, “২,৪০০”-এর মতো কমা, “টাকা” আর ইংরেজি-বাংলা মেশানো লেখা, সব সামলানো extractor লাগে, আর তা test করতে হয়।

অনুবাদ করে হিসাব করানোর পথটির পক্ষে-বিপক্ষে দুটোই আছে। পক্ষে: ছোট model-এ ইংরেজি ডেটা অনেক বেশি দেখা, তাই ইংরেজিতে হিসাবের ধারা বেশি স্থির হতে পারে; Shi ও সহকর্মীদের MGSM (২০২২) কাজে কিছু model-এ ইংরেজিতে CoT লিখলে অন্য ভাষার প্রশ্নেও ভালো ফল রিপোর্ট করা হয়েছিল, আর MGSM-এর ভাষার তালিকায় বাংলা ছিল। বিপক্ষে: অনুবাদ নিজেই ভুল আনতে পারে (“৫০০ গ্রাম” বা “অংশের জন্য” ভুল অনুবাদ), একটি বাড়তি ধাপ মানে বাড়তি খরচ আর latency, আর গ্রাহককে শেষে বাংলায় উত্তর দিতে হয়। সবচেয়ে নিরাপদ পথ প্রায়ই §৬-এর: model শুধু সংখ্যাগুলো বের করে, হিসাব হয় কোডে, উত্তর লেখা হয় বাংলায়।

মূল উপলব্ধি: বাংলায় CoT-এর token-খরচ বেশি আর ছোট model-এ মান অস্থির; ভাষা বদলের সিদ্ধান্ত নিজের set-এ জোড়া তুলনা করে নিন।

অনুশীলন

খাতা-কলমে করুন, তারপর উত্তর মেলান। বিশ্ববিদ্যালয়, চাকরি বা ইন্টারভিউর পরীক্ষায় এই ধরনের হিসাব কাজে লাগে।

  1. Token-এর খরচ (হিসাব): বাজারঘরের সহায়তা-বট দিনে ১০০০টি ডেলিভারি-চার্জের প্রশ্ন পায়। প্রতিটি prompt ৮০ input token. Direct-এ গড় output ১০ token, CoT-এ ২২০, আর CoT-সহ self-consistency (k = ৫) প্রতিটি নমুনায় ২২০. Input-এর দাম প্রতি দশ লাখ token-এ Q টাকা, output-এর P টাকা। (ক) তিন পদ্ধতির দৈনিক খরচ Q আর P দিয়ে লিখুন, ধরে নিয়ে যে প্রতিটি নমুনা আলাদা request. (খ) P = ৪Q হলে CoT direct-এর কত গুণ খরচ?

    (ক) Direct: input ৮০ × ১০০০ = ৮০,০০০ token = ০.০৮ মিলিয়ন; output ১০,০০০ = ০.০১ মিলিয়ন। খরচ ০.০৮Q + ০.০১P. CoT: ০.০৮Q + ০.২২P. Self-consistency: প্রতিটি প্রশ্নে ৫টি request, তাই input ০.৪ মিলিয়ন আর output ১.১ মিলিয়ন: ০.৪Q + ১.১P. (কিছু API একটি request-এ কয়েকটি নমুনা দিতে পারে, তখন input একবার গোনা হতে পারে; নিজের API-র নথি দেখুন।)

    (খ) P = ৪Q বসালে direct = ০.০৮Q + ০.০৪Q = ০.১২Q; CoT = ০.০৮Q + ০.৮৮Q = ০.৯৬Q. অনুপাত ৮ গুণ. Self-consistency = ০.৪Q + ৪.৪Q = ৪.৮Q, direct-এর ৪০ গুণ.

  2. Output অনুমান করুন: §২-এর extract() ফাংশন (শেষ “উত্তর:”-এর পরের প্রথম সংখ্যা, না পেলে লেখার শেষ সংখ্যা, বাংলা অঙ্ক রূপান্তর আর কমা বাদ) নিচের দুটি লেখায় কী ফেরত দেবে? ঠিক উত্তর দুটিতেই ৮৮৫ আর ১৭১০ ধরলে কোনগুলো ঠিক গোনা হবে?
    (ক) "প্রথমে ৮৫০ থেকে ১০% বাদ = ৭৬৫। উত্তর: ৭৬৫ + ১২০ = ৮৮৫"
    (খ) "মোট ১,৭১০ টাকা (ছাড় ১৫০ টাকা)"

    (ক) “উত্তর:” আছে; তার পরের লেখা “৭৬৫ + ১২০ = ৮৮৫”, যার প্রথম সংখ্যা ৭৬৫. ফেরত আসে 765.0, তাই ভুল গোনা হবে, যদিও model-এর হিসাব ঠিক।

    (খ) “উত্তর:” নেই, তাই শেষ সংখ্যা: 150.0. এটিও ভুল গোনা হবে। “১,৭১০” ঠিকঠাক 1710 হিসেবে পড়া যেত, কিন্তু নিয়মটি শেষ সংখ্যা নেয়। দোষ extractor আর ফরম্যাটের।

  3. ভোটের সম্ভাবনা (হিসাব): ধরুন একটি হ্যাঁ/না প্রশ্নে প্রতিটি CoT নমুনা স্বাধীনভাবে p সম্ভাবনায় ঠিক। (ক) p = ০.৬ হলে k = ৩ আর k = ৫ নমুনার সংখ্যাগরিষ্ঠ ভোট ঠিক হওয়ার সম্ভাবনা কত? (খ) p = ০.৪ হলে k = ৫-এ কত? (গ) বাস্তবে নমুনাগুলো স্বাধীন নয় কেন?

    (ক) k = ৩: অন্তত ২টি ঠিক। ৩ × ০.৬² × ০.৪ + ০.৬³ = ০.৪৩২ + ০.২১৬ = ০.৬৪৮. k = ৫: অন্তত ৩টি ঠিক। ১০ × ০.৬³ × ০.৪² + ৫ × ০.৬⁴ × ০.৪ + ০.৬⁵ = ০.৩৪৫৬ + ০.২৫৯২ + ০.০৭৭৮ ≈ ০.৬৮৩.

    (খ) একই সূত্রে p ও ১ − p বদলে: ১০ × ০.৪³ × ০.৬² + ৫ × ০.৪⁴ × ০.৬ + ০.৪⁵ = ০.২৩০৪ + ০.০৭৬৮ + ০.০১০২ ≈ ০.৩১৭, একটি নমুনার ০.৪-এর চেয়েও কম। দুই-উত্তরের প্রশ্নে p < ০.৫ হলে ভোট ক্ষতি করে। সংখ্যার উত্তরে ভুলগুলো ছড়িয়ে থাকে বলে ভোট সাধারণত এর চেয়ে ভালো করে।

    (গ) একই model আর একই prompt-এর নমুনায় একই ভুল ধারণা ফিরে আসে, তাই বাস্তবের লাভ সূত্রের চেয়ে কম।

  4. Prompt-এর নকশা আর সমালোচনা: একজন ডেভেলপার বাজারঘরের বটের জন্য লিখলেন: “আপনি একজন গণিতবিদ। প্রতিটি প্রশ্নে খুব বিস্তারিত ধাপে ধাপে ভাবুন, সব ধাপ গ্রাহককে দেখান, তারপর উত্তর দিন।” বটটি একটি ছোট open model-এ চলে। এই prompt-এর অন্তত চারটি সমস্যা লিখুন, আর একটি ভালো নকশা প্রস্তাব করুন।

    সমস্যা: (১) উত্তরের লাইনের কোনো ফরম্যাট নেই, তাই প্রোগ্রাম উত্তর বের করতে পারবে না, আর ভুলও মাপা যাবে না। (২) “খুব বিস্তারিত” মানে অনেক token: খরচ আর অপেক্ষা বাড়ে, অথচ সহজ প্রশ্নে লাভ নেই। (৩) সব ধাপ গ্রাহককে দেখালে ভুল ধাপও দেখবে, আর লেখা যুক্তিকে নীতির ব্যাখ্যা ভাবতে পারে; faithfulness নিশ্চিত নয়। (৪) ছাড়ের সীমা, ফ্রি-ডেলিভারির নিয়ম, জেলাভেদে চার্জ, কোনোটি দেওয়া নেই, তাই model নিয়ম বানাবে।

    ভালো নকশা: System prompt-এ বাজারঘরের নিয়মগুলো স্পষ্ট লেখা (পর্ব ৬৪-এর বিষয়)। Model-কে দিয়ে শুধু অর্ডারের সংখ্যাগুলো JSON-এ বের করানো (পর্ব ৬২), হিসাব কোডে (§৬)। কোড না থাকলে: ভেতরে CoT, শেষ লাইনে “উত্তর: <সংখ্যা>”, গ্রাহককে শুধু চূড়ান্ত সংখ্যা আর নিয়মের এক লাইনের ব্যাখ্যা, যা নীতি থেকে নেওয়া। তারপর eval set-এ জোড়া তুলনা, token-সহ।

নিজেকে যাচাই করুন

ভুল হলে কারণসহ ব্যাখ্যা পাবেন, আবার চেষ্টাও করতে পারবেন।

ক্রমএকটি ছোট model-এ direct, CoT আর self-consistency তুলনার ধাপগুলো সাজান (▲▼ চেপে সরান)

  1. উত্তরসহ প্রশ্নের set লেখা, ফল দেখার আগে
  2. উত্তরের লাইনের ফরম্যাট আর extractor ঠিক করে test করা
  3. Direct prompt-এ greedy run, বেসলাইন হিসেবে
  4. CoT prompt-এ greedy run
  5. CoT prompt-এ temperature দিয়ে k-টি নমুনা, সংখ্যাগরিষ্ঠ ভোট
  6. প্রতিটির accuracy, CI আর গড় token পাশাপাশি রিপোর্ট

Kojima ও সহকর্মীদের (২০২২) “zero-shot chain-of-thought” পদ্ধতির মূল কথা কোনটি?

  • Prompt-এ ধাপসহ সমাধান করা কয়েকটি উদাহরণ দেওয়া
  • উদাহরণ ছাড়া “Let's think step by step” ধরনের একটি বাক্য যোগ করা
  • অনেকগুলো উত্তর sample করে ভোট নেওয়া
  • ধাপসহ সমাধান দিয়ে model-কে নতুন করে train করা

একটি প্রশ্নে CoT prompt দিয়ে ১০টি নমুনা নেওয়া হলো। বের করা উত্তর: ১০৮০ চারবার, ১০২০ তিনবার, ১১৪০ দুবার, ৮৮৫ একবার। Self-consistency-র উত্তর কোনটি, আর সেটি কত ভাগ নমুনার সমর্থন পেয়েছে?

  • ১০৮০, ০.৪০
  • ১০২০, ০.৩০
  • সবগুলোর গড়
  • কোনো উত্তর নেই, কারণ কেউ অর্ধেকের বেশি পায়নি

একজন ডেভেলপার self-consistency-র জন্য একই prompt দশবার greedy decoding-এ চালালেন। কী হবে?

  • Accuracy প্রায় দশগুণ বাড়বে
  • প্রতিবার আলাদা seed দিলে নমুনা আলাদা হবে
  • দশটি একই উত্তর আসবে; ফল একবার চালানোর সমান, খরচ দশগুণ
  • ভোট নিজেই ভুল উত্তরগুলো ঠিক করে দেবে

একটি eval-এ direct prompt-এ গড় output ১০ token, accuracy ০.৫০; CoT-এ গড় ২০০ token, accuracy ০.৬০. প্রতি সঠিক উত্তরে গড় output token কত, দুই ক্ষেত্রে?

  • ১০ আর ২০০
  • ৫ আর ১২০
  • ০.০৫ আর ০.০০৩
  • ২০ আর প্রায় ৩৩৩

Turpin ও সহকর্মীদের (২০২৩) পরীক্ষায় few-shot উদাহরণের সঠিক উত্তর সবসময় “(A)” রাখা হয়েছিল। মূল পর্যবেক্ষণ কোনটি?

  • Model-গুলো ব্যাখ্যায় স্পষ্ট লিখেছে, “আগের উত্তর A ছিল বলে A বাছছি”
  • উত্তর ঝোঁকের দিকে সরেছে, অথচ লেখা যুক্তিতে ঝোঁকটির উল্লেখ নেই
  • ঝোঁক থাকায় নির্ভুলতা বেড়েছে
  • CoT চালু করলেই ঝোঁক পুরোপুরি চলে যায়

একটি hosted reasoning model শুধু “thinking”-এর সারাংশ ফেরত দেয়। Anthropic আর OpenAI-এর নথি অনুযায়ী (লেখার সময়ে, নভেম্বর ২০২৬) token-এর হিসাব কেমন?

  • শুধু দেখা যায় এমন উত্তরের token বিল হয়
  • শুধু সারাংশের token বিল হয়
  • পুরো reasoning token output হিসেবে বিল হয়; সংখ্যাটি usage-এর আলাদা ঘরে
  • Reasoning token বিনামূল্যে, আর output-এর সীমায় গোনা হয় না

শব্দকোষ

লেখার মধ্যে ডটেড দাগ দেওয়া শব্দে মাউস রাখুন বা চাপুন, অর্থ দেখাবে। এই পর্বের সব নতুন শব্দ এখানে একসাথে:

মনে রাখুন

  1. CoT মানে উত্তরের আগে মধ্যবর্তী ধাপ লেখানো: বাড়তি হিসাবের token আর context-এ লেখা মধ্যবর্তী ফল। Few-shot, zero-shot (“ধাপে ধাপে”) আর নির্দেশিত ধাপ, তিন রূপ।
  2. উত্তরের লাইন বেঁধে দিন, extractor test করুন: বাংলা অঙ্ক, কমা, “টাকা” আর কারণের সংখ্যা নম্বর বদলে দিতে পারে।
  3. Self-consistency = temperature দিয়ে k-টি CoT, তারপর সংখ্যাগরিষ্ঠ ভোট; ঠিক পথ মেলে আর ভুল ছড়ালে কাজ করে, খরচ প্রায় k গুণ।
  4. প্রতিটি ফলের পাশে n, CI আর token: ছোট model-এ CoT সাহায্য করতেও পারে, ক্ষতিও; জোড়ায় মাপুন, প্রতি সঠিক উত্তরে token দেখুন।
  5. লেখা যুক্তি আসল কারণ না-ও হতে পারে; নিয়মের হিসাব কোডে রাখুন। Reasoning model-এ CoT prompt-এর জায়গা নিয়েছে effort সেটিং, আর লুকানো token-ও বিল হয়।

পরের পর্বে: পর্ব ৬৪-এ system prompt, role আর conversation design: বাজারঘরের সহায়তা-বটের নিয়ম কোথায় লিখবেন, কোন বার্তা কোনটির ওপরে, আর বহু ধাপের কথোপকথনে নিয়ম টিকে থাকে কি না।

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

এই পর্বটি শেয়ার করুন:
এই পর্বে ভুল পেয়েছেন? জানান