অধ্যায় 1 · ইন্সট্রাকশন, মডেল ও রিজনিং
রিজনিংয়ের ট্রেড-অফ: ধাপে ধাপে প্রম্পট, যাচাই, থামার শর্ত ও খরচ
- পৃষ্ঠা 4 / 24
- 15 মিনিট পড়া
প্রম্পটে আপনি যত বাড়তি ধাপ যোগ করেন (একটা প্ল্যান, উদাহরণ, একটা চেক, দ্বিতীয় একটা পাস), প্রতিটাই নির্ভুলতা বাড়াতে পারে, আবার প্রতিটাই খরচ, দেরি আর ব্যর্থতার নতুন পথ যোগ করে। ভালো প্রম্পট ডিজাইন মানে একগুচ্ছ ট্রেড-অফ (trade-off), যার মীমাংসা হয় অভ্যাস দিয়ে নয়, মাপ দিয়ে। এই পাতা আগের পাতারই ধারাবাহিকতা: এখানে প্ল্যান আর চেকলিস্ট তুলনা করা হয়, কনস্ট্রেইন্ট, উদাহরণ ও স্বাধীন চেক কোথায় বসাবেন দেখানো হয়, থামার নিয়ম যোগ করা হয়, আর শেষে একই কেসে কয়েকটা পদ্ধতি মাপা হয়।
আপনার Python ৩.১২ বা তার পরের ভার্সন লাগবে, আর শুধু স্ট্যান্ডার্ড লাইব্রেরি। ব্লকগুলো ভেরিয়েবল ভাগ করে নেয়, তাই পরপর টাইপ করুন। কোডের প্রতিটা "মডেল" একটা টয় প্রোভাইডার (toy provider): ইচ্ছে করে একটা ভুল বসানো ছোট, নির্দিষ্ট ফল দেওয়া বদলি, যাতে হারনেস পুনরাবৃত্তিযোগ্যভাবে টেস্ট করা যায়। আসল মডেল আরও অনির্দিষ্ট, আর সেজন্যই টেস্ট করতে হয়; টয়ের ছাপা কোনো সংখ্যা আসল মডেল সম্পর্কে কিছুই বলে না।
যা শিখবেন
- কখন নির্দিষ্ট চেকলিস্ট, মডেলের তৈরি প্ল্যান, ওয়ার্কড উদাহরণ, বা টাস্কের আগে বসানো কনস্ট্রেইন্ট ব্যবহার করবেন।
- লম্বা সমস্যাকে টেস্টসহ সীমিত ধাপে কীভাবে ভাগ করবেন, বড় প্রভাবের সংখ্যায় স্বাধীন চেক কীভাবে যোগ করবেন, আর অমীমাংসিত সাবপ্রব্লেম কীভাবে তালিকা করাবেন।
- থামার শর্ত কীভাবে ঠিক করবেন, আর রিজনিং সেটিং শুধু যেখানে সমর্থিত সেখানে কীভাবে ব্যবহার করবেন।
- একটা স্থির কেস সেটে নির্ভুলতা, ছাড়া পাওয়া ভুল উত্তর, কল আর মোটামুটি আকার দিয়ে পদ্ধতিগুলো কীভাবে তুলনা করবেন।
চলমান সমস্যা: বাল্ক অর্ডারের কোটেশন
একটা দোকান নোটবুকের কোটেশন দেয়। নিয়মগুলো এই পাতার জন্য বানানো। কোড নিয়মগুলো একবার বলে, আর একটা বিশ্বাসযোগ্য রেফারেন্স ফাংশন truth রাখে, যা শুধু উত্তরের নম্বর দিতে ব্যবহৃত হয়।
import re
from decimal import ROUND_HALF_UP, Decimal as D
RULES = ("Price 4.00 per notebook. Discount on goods: 5% from 100 notebooks, 12% from 500. "
"Shipping 15.00, free when goods after discount reach 400.00. Tax 8% on goods after discount only.")
CASES = [20, 99, 100, 250, 500, 800]
def r2(x):
return x.quantize(D("0.01"), ROUND_HALF_UP)
def truth(qty):
pct = D("0.12") if qty >= 500 else D("0.05") if qty >= 100 else D(0)
net = r2(D(4) * qty * (1 - pct))
return r2(net + r2(net * D("0.08")) + (D(0) if net >= 400 else D(15)))
print(" ".join(f"{q}: {truth(q)}" for q in CASES))20: 101.40 99: 442.68 100: 425.40 250: 1026.00 500: 1900.80 800: 3041.28মডেলের তৈরি প্ল্যান, না নির্দিষ্ট চেকলিস্ট
মডেলের তৈরি প্ল্যান আর নির্দিষ্ট চেকলিস্ট তুলনা করুন। নির্দিষ্ট চেকলিস্ট আপনি একবার লেখেন: ধাপগুলো জানা, রিভিউ করা, প্রতিবার একই। মডেলের তৈরি প্ল্যান প্রতিটা টাস্কের জন্য নতুন করে প্রস্তাব করা হয়: অস্বাভাবিক সমস্যায় মানিয়ে নেয়, কিন্তু কোনো ধাপ বাদ দিতে বা অস্পষ্ট করে লিখতে পারে। জানা নিয়ম ও ব্যয়বহুল ভুলের পুনরাবৃত্ত টাস্কে চেকলিস্ট ব্যবহার করুন। নতুন বা খোলা সমস্যায় প্ল্যান। মাঝামাঝি দুটো মেলান: মডেল প্ল্যান প্রস্তাব করুক, আর কোড পরীক্ষা করুক প্রয়োজনীয় ধাপগুলো আছে কি না।
REQUIRED = {"discount": "discount", "shipping": "shipping", "tax": "goods only", "recheck": "recompute"}
def plan_gaps(plan, required=REQUIRED):
text = " | ".join(plan).lower()
return sorted(key for key, phrase in required.items() if phrase not in text)
toy_plan = ["Read the quantity", "Apply the volume discount", "Work out shipping from discounted goods",
"Add tax", "Show the total"] # stand-in for a plan written by a model
print(plan_gaps(toy_plan))['recheck', 'tax']প্ল্যানটা যুক্তিসঙ্গত শোনায়, কিন্তু "Add tax" বলে না যে শিপিং বাদ, আর মোট অঙ্ক নতুন করে মিলিয়ে দেখার কোনো ধাপ নেই। প্রয়োজনীয় ধাপের নির্দিষ্ট তালিকা দুটোই ধরেছে। রিভিউ করা চেকলিস্ট নিরাপত্তা-জাল; প্ল্যান নমনীয়তা।
সমাধানের আগে কনস্ট্রেইন্ট
সমাধান চাওয়ার আগে কনস্ট্রেইন্ট নির্দিষ্ট করুন। নিয়ম প্রশ্নের পরে এলে মডেল হয়তো আগেই একটা পথ ধরে ফেলেছে, আর প্রসঙ্গক্রমে বলা নিয়ম সহজেই চোখ এড়ায়। নিয়ম ও আউটপুট ফরম্যাট আগে দিন, তারপর ডেটা, আর প্রশ্ন সবশেষে। প্রোভাইডারদের গাইডও পরামর্শ দেয় লম্বা উপাদান আগে আর প্রশ্ন শেষে রাখতে।
দুর্বল প্রম্পট:
A customer wants 250 notebooks. What is the total? By the way, price is 4.00 each, 5% off from
100, 12% off from 500, shipping 15.00 unless goods reach 400.00, and tax is 8%.ভালো প্রম্পট:
Rules:
1. Price: 4.00 per notebook.
2. Discount on goods: 5% from 100 notebooks, 12% from 500 notebooks.
3. Shipping: 15.00, free when goods after discount reach 400.00.
4. Tax: 8% on goods after discount only, never on shipping.
Output: one line each for goods, discount, goods after discount, shipping, tax, total (2 decimals).
Order: 250 notebooks.
Question: what is the total?কী বদলাল: নিয়মগুলো নম্বর দেওয়া ও সম্পূর্ণ (দুর্বল সংস্করণ কখনো বলেনি ট্যাক্স কীসের ওপর), আউটপুটের আকার স্থির, আর প্রশ্ন সবার শেষে।
পুনরাবৃত্ত রিজনিংয়ের জন্য ওয়ার্কড উদাহরণ
পুনরাবৃত্ত রিজনিং প্যাটার্নে ওয়ার্কড উদাহরণ (worked example) ব্যবহার করুন। একই বহুধাপের প্যাটার্ন বারবার এলে একটা-দুটো সম্পূর্ণ উদাহরণ বর্ণনার চেয়ে ভালোভাবে ধাপের বিন্যাস ও ক্রম দেখায়। এমন উদাহরণ বাছুন যা আলাদা (একটাতে ডিসকাউন্ট, একটাতে নেই), আপনি যে আউটপুট চান সেই ফরম্যাটেই রাখুন, আর নিজের টেস্ট কেস থেকে আলাদা রাখুন।
প্রম্পট:
Example 1. Order: 30 notebooks.
Goods 120.00. Discount 0%. Goods after discount 120.00. Shipping 15.00 (below 400.00).
Tax 9.60. Total 144.60.
Example 2. Order: 120 notebooks.
Goods 480.00. Discount 5%. Goods after discount 456.00. Shipping 0.00 (reaches 400.00).
Tax 36.48. Total 492.48.
Now do the same for: 250 notebooks.উদাহরণের ভুল কপি হয়ে যায়। ব্যবহারের আগে কোড দিয়ে উদাহরণ যাচাই করুন, আর নিশ্চিত করুন কোনো উদাহরণ একই সঙ্গে টেস্ট কেস নয়:
EXAMPLES = {30: "144.60", 120: "492.48"}
for qty, total in EXAMPLES.items():
print(qty, total, "correct" if D(total) == truth(qty) else "WRONG: fix the example")
print("examples reused as test cases:", sorted(set(EXAMPLES) & set(CASES)) or "none")30 144.60 correct
120 492.48 correct
examples reused as test cases: noneসীমিত, টেস্টযোগ্য ধাপ
লম্বা সমস্যাকে সীমিত, টেস্টযোগ্য ধাপে ভাগ করুন। একটা ধাপ সীমিত যখন সেটা একটাই কাজ করে, শুধু দরকারি জিনিস পায় আর তার একটা সীমা আছে (এখানে একটা কল)। সেটা টেস্টযোগ্য যখন তার আউটপুট আলাদাভাবে যাচাই করা যায়। নিচে কোটেশন তৈরি হয় চার ধাপে (ডিসকাউন্ট, ডিসকাউন্টের পরে পণ্যমূল্য, শিপিং, মোট)। প্রতিটা ধাপ রেঞ্জ টেস্টসহ একটা টয় মডেল কল। toy_direct এক ধাক্কার বিকল্প, যাতে দুটো সাধারণ ভুল বসানো আছে: স্তরের সীমায় এক-ঘর ভুল আর শিপিংয়ের ওপর ট্যাক্স। toy_ship-এ একটা বসানো ভুল আছে: সে ডিসকাউন্টের আগের পণ্যমূল্য দেখে শিপিং ঠিক করে।
USAGE = {"calls": 0, "chars": 0}
def call(model, prompt):
reply = model(prompt)
USAGE["calls"] += 1
USAGE["chars"] += len(prompt) + len(reply)
return reply
def field(prompt, name):
return D(re.search(rf"^{name}: (\S+)", prompt, re.M).group(1))
def toy_direct(prompt): # one-shot arithmetic with two planted slips
qty = int(field(prompt, "Qty"))
pct = D("0.12") if qty > 500 else D("0.05") if qty > 100 else D(0)
net = r2(D(4) * qty * (1 - pct))
return str(r2((net + (D(0) if net >= 400 else D(15))) * D("1.08")))
def toy_pct(prompt):
qty = field(prompt, "Qty")
return str(D("0.12") if qty >= 500 else D("0.05") if qty >= 100 else D(0))
def toy_net(prompt):
return str(r2(field(prompt, "Goods before discount") * (1 - field(prompt, "Discount"))))
def toy_ship(prompt): # planted slip: uses the goods before the discount
return "0" if field(prompt, "Goods before discount") >= 400 else "15"
def toy_total(prompt):
net = field(prompt, "Goods after discount")
return str(r2(net + r2(net * D("0.08")) + field(prompt, "Shipping")))
def staged(qty):
gross, head = D(4) * qty, f"{RULES}\nQty: {qty}\n"
pct = D(call(toy_pct, head + "Reply with the discount only."))
if pct not in (D(0), D("0.05"), D("0.12")):
return None, "stage failed: discount"
net = D(call(toy_net, head + f"Goods before discount: {gross}\nDiscount: {pct}\nReply with goods after discount."))
if not D(0) <= net <= gross:
return None, "stage failed: goods after discount"
ship = D(call(toy_ship, head + f"Goods before discount: {gross}\nGoods after discount: {net}\nReply with shipping."))
if ship not in (D(0), D(15)):
return None, "stage failed: shipping"
total = D(call(toy_total, head + f"Goods after discount: {net}\nShipping: {ship}\nReply with the total."))
return (total, "ok") if total >= net else (None, "stage failed: total")
total, status = staged(100)
print(total, status)410.40 okচারটা ধাপের টেস্টই পাস করেছে, তবু মোট অঙ্ক ভুল। ১০০টা নোটবুকে ডিসকাউন্টের আগে পণ্যমূল্য ৪০০.০০, তাই বসানো ভুলটা শিপিং মওকুফ করেছে, অথচ ডিসকাউন্টের পরে তা ৩৮০.০০ আর শিপিং প্রযোজ্য। রেঞ্জ টেস্ট অবাস্তব মান ধরে (৫০% ডিসকাউন্ট, ঋণাত্মক মোট); বিশ্বাসযোগ্য ভুল মান ধরে না। তার জন্য লাগে পরের ধাপ।
বড় প্রভাবের হিসাবে স্বাধীন চেক
বড় প্রভাবের হিসাবের জন্য স্বাধীন চেক চান। স্বাধীন চেক অন্য পথে ফল আবার বের করে মেলায়। নির্ভুল অঙ্কের জন্য সেরা পথ সাধারণ কোড, যা মডেলের ধাপগুলো থেকে আলাদাভাবে লেখা ও রিভিউ করা। একই কথোপকথনে একই মডেলকে "আবার দেখো" বলা দুর্বল, কারণ সে নিজের ভুলই দোহরাতে পারে। যে সংখ্যা টাকা নাড়ায়, তার অমিল আইটেমটা থামিয়ে মানুষের কাছে পাঠাবে; কখনো চুপচাপ ঠিক করে দেবে না।
def independent_check(qty, total):
return total == truth(qty)
total, status = staged(100)
print(total, status, "check passed" if independent_check(100, total) else f"MISMATCH, expected {truth(100)}: send to a person")410.40 ok MISMATCH, expected 425.40: send to a personএই চেক কী পারে আর কী পারে না, জেনে রাখুন। সে অঙ্কের ভুল এবং নিয়ম মানার ভুল ধরে। দুই পথেই একইভাবে ভুল বোঝা নিয়ম ধরতে পারে না, তাই নিয়মগুলো যিনি দায়িত্বে আছেন, সেই মানুষকে রিভিউ করতে হবে।
প্রোভাইডার নোট (২০২৬-১০-১২ অনুযায়ী): Anthropic-এর গাইড বলে "Before you finish, verify your answer against [criteria]" ধরনের নির্দেশ ভুল ধরে, কিন্তু তাদের নতুনতম মডেল নিজে থেকেই যাচাই করে, আর পুরোনো যাচাই-নির্দেশ অতিরিক্ত যাচাই (over-verification) ঘটাতে পারে। মডেল বদলালেই এই লাইনগুলো আবার টেস্ট করুন। বর্তমান ডকুমেন্টেশন দেখে নিন।
অমীমাংসিত সাবপ্রব্লেম
মডেলকে অমীমাংসিত সাবপ্রব্লেম শনাক্ত করতে বলুন। মোট অঙ্ক চাইলে মডেল প্রায়ই ফাঁক ভরে একটা বিশ্বাসযোগ্য অনুমান দিয়ে। তাকে একটা অনুমোদিত বিকল্প দিন: যা মীমাংসা করতে পারেনি তার তালিকার একটা ফিল্ড, আর একটা নিয়ম যে তালিকা খালি না হলে স্বয়ংক্রিয় ছাড় বন্ধ।
প্রম্পট:
Return JSON with: total (or null if you cannot compute it) and unresolved (a list).
Do not guess. If something needed is neither in the rules nor in the order, add it to unresolved.
Order: 250 notebooks, invoice to a school.নমুনা উত্তর (উদাহরণ মাত্র; আপনারটা আলাদা হবে):
{"total": "1026.00", "unresolved": ["The order does not say whether the school is tax-exempt."]}লক্ষ্য করুন: মডেল বলা নিয়মে মোট হিসাব করেছে, আর নিয়মে নেই এমন একটা তথ্যও চিহ্নিত করেছে। পরের সিদ্ধান্ত নেয় অ্যাপ্লিকেশন, মডেল নয়:
def can_release(record):
return record.get("total") is not None and record.get("unresolved") == []
print(can_release({"total": "1026.00", "unresolved": []}))
print(can_release({"total": "1026.00", "unresolved": ["tax-exempt status unknown"]}))
print(can_release({"total": "1026.00"}))True
False
Falseফিল্ডহীন রেকর্ডও ব্যর্থ হয়, তাই যে মডেল তালিকা বাদ দেয় সে নীরব থেকে পার পায় না।
বহুধাপের টাস্কে থামার শর্ত
বহুধাপের টাস্কে স্পষ্ট থামার শর্ত ঠিক করুন। যেকোনো লুপের (রিভিউ, সংশোধন, আবার রিভিউ) তিনটা বেরোনোর পথ লাগে: সাফল্য (খোলা সমস্যা নেই), সীমা (সর্বোচ্চ রাউন্ড), আর অগ্রগতি নেই (একই সমস্যা থেকে যাচ্ছে)। এগুলো ছাড়া বাজেট শেষ না হওয়া পর্যন্ত লুপ চলতে পারে। এখানকার সংশোধক একটা বদলি, যে প্রতি রাউন্ডে একটা ঠিক করার মতো সমস্যা ঠিক করে।
def refine(issues, fixable, max_rounds=3):
for done in range(max_rounds + 1):
if not issues:
return f"done after {done} rounds"
if done == max_rounds:
return f"stop: round limit, hand over {issues}"
fix = [i for i in issues if i in fixable][:1]
if not fix:
return f"stop: no progress after {done} rounds, hand over {issues}"
issues = [i for i in issues if i != fix[0]]
print(refine(["units missing", "tone"], {"units missing", "tone"}))
print(refine(["a", "b", "c", "d", "e"], set("abcde")))
print(refine(["wrong rule"], set()))done after 2 rounds
stop: round limit, hand over ['d', 'e']
stop: no progress after 0 rounds, hand over ['wrong rule']প্রতিটা রান আলাদা, নামওয়ালা কারণে শেষ হয়েছে, আর দুটো ব্যর্থতা লুপে ঘুরে বা লুকিয়ে না গিয়ে খোলা সমস্যাগুলো মানুষের হাতে দেয়।
রিজনিং মোড শুধু যেখানে সমর্থিত
রিজনিং মোড তুলনা করুন শুধু যেখানে মডেল সেগুলো সমর্থন করে। একটা মডেল যে সেটিং নেয়, অন্যটা তা প্রত্যাখ্যান করতে, উপেক্ষা করতে বা তার দরকার না-ও থাকতে পারে। প্রতি টার্গেটের সমর্থিত সেটিংয়ের একটা টেবিল রাখুন, শুধু সেগুলোই পাঠান, আর যা বাদ দিয়েছেন তা রেকর্ড করুন, যাতে নিঃশব্দে একটা সেটিংয়ের অনুপস্থিতি মানের পার্থক্য ব্যাখ্যা না করে। এখানকার নামগুলো নিরপেক্ষ লেবেল; আসল নাম নিচের নোটে।
SUPPORTED = {"target_a": {"effort"}, "target_b": {"effort", "temperature"}, "target_c": set()}
def apply_settings(requested, target):
used = {k: v for k, v in requested.items() if k in SUPPORTED[target]}
return used, sorted(set(requested) - set(used))
for target in sorted(SUPPORTED):
print(target, apply_settings({"effort": "high", "temperature": 0.2}, target))target_a ({'effort': 'high'}, ['temperature'])
target_b ({'effort': 'high', 'temperature': 0.2}, [])
target_c ({}, ['effort', 'temperature'])প্রোভাইডার নোট (২০২৬-১০-১২ অনুযায়ী): OpenAI ডকুমেন্ট করে
reasoning.effort, যার স্তর মডেলভেদে আলাদা, এবং একে বলে একটা টিউনিং নব, মান ফেরানোর মূল উপায় নয়; Anthropic ডকুমেন্ট করে অ্যাডাপ্টিভ থিঙ্কিং ও একটাeffortসেটিং, আর কিছু মডেলে থিঙ্কিং সবসময় চালু থাকতে পারে; Google ডকুমেন্ট করেthinking_level, যা কমিয়ে খরচ ও দেরি কমানো যায়। তিন জায়গাতেই থিঙ্কিং টোকেন আউটপুট হিসেবে বিল হয় এবং আউটপুট সীমায় গোনা হয়, তাই জায়গা ছেড়ে রাখুন। রেসপন্স রিজনিং বা থট টোকেনসহ ব্যবহারের তথ্য জানায় (OpenAI-তেoutput_tokens_details.reasoning_tokens); এই ডকুমেন্টে ল্যাটেন্সি রেসপন্সের ফিল্ড নয়, তাই ক্লায়েন্টে মাপুন। বর্তমান ডকুমেন্টেশন দেখে নিন।
একই কেসে নির্ভুলতা, ল্যাটেন্সি ও খরচ মাপুন
একই টাস্ক সেটে নির্ভুলতা, ল্যাটেন্সি ও খরচ মাপুন। ছয়টা কেসে তিনটা পদ্ধতি: A, এক ধাক্কায়; B, চার ধাপে; C, চার ধাপ আর স্বাধীন চেক। শুধু নির্ভুলতা নয়, আরও রিপোর্ট করুন: ছাড়া পাওয়া ভুল উত্তর, মানুষের কাছে পাঠানো, মডেল কল, মোটামুটি আকার, আর প্রতি কেসে পরপর কল, যা অপেক্ষার সময়ের সরল বদলি। মোটামুটি আকার ধরা হয়েছে অক্ষর / ৪ নিয়মে, যা শুধু অনুমান; আসল প্রোভাইডারে তার ইউসেজ ফিল্ড ব্যবহার করুন। আসল ল্যাটেন্সির জন্য প্রতিটা কল ক্লায়েন্টে time.perf_counter() দিয়ে মুড়িয়ে নিন, আর পার হওয়া সময় মডেলের শনাক্তকারীসহ সংরক্ষণ করুন। টেবিলের কলামের নাম: right সঠিক, wrong ছাড়া পাওয়া ভুল, sent মানুষের কাছে পাঠানো, calls মোট কল, ~size মোটামুটি আকার, chain প্রতি কেসে পরপর কল।
def evaluate(name, quote, check, cases):
USAGE.update(calls=0, chars=0)
right = wrong = sent = 0
for qty in cases:
total, _ = quote(qty)
if total is None or (check and not independent_check(qty, total)):
sent += 1
elif independent_check(qty, total):
right += 1
else:
wrong += 1
row = (name, right, wrong, sent, USAGE["calls"], USAGE["chars"] // 4, USAGE["calls"] // len(cases))
print(f"{row[0].ljust(16)}{row[1]:>7}{row[2]:>7}{row[3]:>7}{row[4]:>7}{row[5]:>8}{row[6]:>7}")
def one_shot(qty):
return D(call(toy_direct, f"{RULES}\nQty: {qty}\nReply with the total.")), "ok"
def table(cases):
print("approach".ljust(16) + " right wrong sent calls ~size chain")
evaluate("A one-shot", one_shot, False, cases)
evaluate("B staged", staged, False, cases)
evaluate("C staged+check", staged, True, cases)
table(CASES)approach right wrong sent calls ~size chain
A one-shot 2 4 0 6 322 1
B staged 5 1 0 24 1513 4
C staged+check 5 0 1 24 1513 4শুধু প্রথম কলাম নয়, সব কলাম পড়ুন। A চারটা ভুল কোটেশন ছেড়ে দেয়। B ছাড়ে একটা, যেটা কেউ টের না পেয়ে টাকা খরচ করায়। C একটাও ছাড়ে না: ওই কেস গেছে একজন মানুষের কাছে, চেকের উদ্দেশ্য ঠিক সেটাই। দামও দেখা যায়: A প্রতি কেসে একটা কল করে, B ও C পরপর চারটা, তাই ধীর ও বড়। ভুল কোটেশন শোধরানো সস্তা হলে A বা B যথেষ্ট হতে পারে; না হলে C তার খরচ উসুল করে। এই সংখ্যাগুলো বদলি থেকে আসা, তাই শুধু পদ্ধতিটাই অন্যত্র খাটে: একই কেস, একই নম্বর দেওয়া, একটা টেবিল।
কাজের জায়গায় এটা কোথায় দেখা যায়
কোটেশন, ইনভয়েসিং, বেতন যাচাই আর যোগ্যতার সিদ্ধান্তে টাকা ছোঁয়ার আগে মডেলের জন্য এমন একটা ট্রেড-অফ টেবিল দরকার। টিমগুলো কেসের সেট ভার্সন কন্ট্রোলে রাখে, প্রতিটা প্রম্পট বা মডেল বদলে আবার চালায়, আর আগে দেখে "ছাড়া পাওয়া ভুল" কলাম, কারণ সেটা ক্ষতি মাপে, আর শুধু নির্ভুলতা তা লুকায়।
সাধারণ ভুল
- ভালো পড়ায় বলে প্ল্যানে ভরসা করা। প্রয়োজনীয় ধাপের স্থির তালিকার বিরুদ্ধে সেটা টেস্ট করুন।
- একই মডেলকে নিজেকে চেক করতে বলে সেটাকে স্বাধীন বলা। কোড বা অন্য পথ ব্যবহার করুন, যা দ্বিমত করতে পারে।
- শুধু নির্ভুলতা দিয়ে বিচার করা। ছাড়া পাওয়া ভুল, পাঠানো কেস, কল, মোটামুটি আকার আর অপেক্ষার সময় যোগ করুন।
- বেরোনোর পথ ছাড়া লুপ। সাফল্য, রাউন্ডের সীমা ও অগ্রগতি-নেই নিয়ম ঠিক করুন, আর বলুন অবশিষ্ট কার হাতে যাবে।
- যে মডেল প্রত্যাখ্যান করে তাকে সেটিং পাঠানো। সমর্থিত সেটিংয়ের টেবিল রাখুন এবং কী বাদ গেছে তা লগ করুন।
নিজে চেষ্টা করুন
এই পাতার কোড ব্যবহার করুন; ব্লকগুলো একই নেমস্পেস ভাগ করে। অনুশীলনগুলো রিজনিং টাস্ক ডিজাইন: টাস্ক ভাগ করা, যুক্তির সারাংশ ও মধ্যবর্তী স্কিমা এবং প্রোভাইডারের পার্থক্য ও পোর্টেবিলিটি: গাইড পড়া ও একাধিক মডেলে টেস্ট থেকে কেস-সেটের ধারণা আবার ছোঁয়।
- সহজ। পাঁচ-সমস্যার তালিকায়
max_rounds=5দিয়েrefineচালান। থামার কারণ কী, আর সীমা বাছাই সম্পর্কে এটা কী বলে? - মাঝারি। D পদ্ধতি যোগ করুন: স্বাধীন চেকসহ
one_shot। টেবিল ছাপুন। D কী ছাড়ে, কী পাঠায়, আর C-র সঙ্গে খরচে কেমন? - কঠিন। এই ব্যবসায়িক সমস্যায় লম্বা কেস তালিকায় তিনটা পদ্ধতি (A, B, C) তুলনা করুন: ফ্রি-শিপিংয়ের সীমার আশেপাশের ১০৫ ও ১০৬ যোগ করুন। টেবিল ছাপুন, তারপর এমন একটা দোকানের জন্য দুই বাক্যের সিদ্ধান্ত লিখুন যেখানে ভুল কোটেশনের দাম একটা রিফান্ড ও একজন হারানো গ্রাহক।
উত্তর
সহজ।
print(refine(["a", "b", "c", "d", "e"], set("abcde"), max_rounds=5))done after 5 roundsপাস চেকলিস্ট: পাঁচ রাউন্ডে লুপ শেষ হয়; আপনি দেখেছেন সীমাই ঠিক করে একই কাজ সফল হবে না হস্তান্তর হবে, তাই সীমা ডিফল্ট নয়, ইচ্ছে করে নেওয়া খরচের সিদ্ধান্ত।
মাঝারি।
evaluate("D one-shot+check", one_shot, True, CASES)D one-shot+check 2 0 4 6 322 1পাস চেকলিস্ট: D কোনো ভুল কোটেশন ছাড়ে না, কিন্তু অনেক কেস মানুষের কাছে পাঠায়, কারণ এক-ধাক্কার ভুল ঘন ঘন; সে কেসপ্রতি একটা কল করে, তাই C-র চেয়ে সস্তা, আর কাজটা মানুষের দিকে সরায়। ঠিক বাছাই নির্ভর করে একজনের রিভিউ করার খরচের ওপর।
কঠিন।
table(CASES + [105, 106])approach right wrong sent calls ~size chain
A one-shot 3 5 0 8 430 1
B staged 6 2 0 32 2018 4
C staged+check 6 0 2 32 2018 4পাস চেকলিস্ট: ১০৫ কেসটা B-তে ভুল (ডিসকাউন্টের পরে পণ্যমূল্য ৩৯৯.০০, তাই শিপিং প্রযোজ্য) এবং C তা ধরে; তিন পদ্ধতির টেবিলে একই কলাম; সিদ্ধান্তে বলা আছে কোন কলামের ওপর ভরসা। একটা শক্ত উত্তর: "C ব্যবহার করুন, কারণ B শিপিংয়ের সীমায় এখনো ভুল কোটেশন ছাড়ে, আর ভুল কোটেশনের দাম চারটা কলের চেয়ে বেশি। পরের রিলিজে হিসাবটা কোডে রাখুন, মডেলকে রাখুন অর্ডারের লেখা পড়ার জন্য।"
সারসংক্ষেপ
- জানা টাস্কে রিভিউ করা চেকলিস্ট আর নতুন টাস্কে মডেলের তৈরি প্ল্যান ব্যবহার করুন, এবং যেকোনো প্ল্যান প্রয়োজনীয় ধাপের জন্য টেস্ট করুন।
- কনস্ট্রেইন্ট ও আউটপুট ফরম্যাট ডেটা ও প্রশ্নের আগে দিন। সঠিক, বৈচিত্র্যময় ওয়ার্কড উদাহরণ ব্যবহার করুন, যা টেস্ট কেস নয়।
- লম্বা সমস্যা টেস্টসহ সীমিত ধাপে ভাগ করুন, বড় প্রভাবের সংখ্যায় স্বাধীন চেক যোগ করুন, আর মডেলকে অমীমাংসিত বিষয় তালিকা করতে দিন।
- প্রতিটা লুপে সাফল্যের পথ, রাউন্ডের সীমা ও অগ্রগতি-নেই পথ রাখুন। রিজনিং সেটিং শুধু যেখানে মডেল সমর্থন করে সেখানে ব্যবহার করুন।
- একই কেসে একাধিক কলামে পদ্ধতিগুলো তুলনা করুন, আর আগে "ছাড়া পাওয়া ভুল উত্তর" পড়ুন।
এরপর: প্রম্পট চেইনিং: ধাপ, নির্দিষ্ট স্কিমা ও promptlab হেল্পার এ ধরনের ধাপগুলোকে নির্দিষ্ট স্কিমাসহ চেইনে পরিণত করে এবং শেয়ার্ড promptlab হেল্পার পরিচয় করায়।