২০টি কেসে আপনার প্রম্পট পরীক্ষা করুন: Python-এ exact-match গ্রেডিং
২০টি কেসের একটি টেস্ট সেট তৈরি করুন, একটি ছোট Python স্ক্রিপ্ট দিয়ে exact match দিয়ে একটি প্রম্পট গ্রেড করুন, এবং দেখুন একটি প্রম্পট পরিবর্তন সত্যিই সাহায্য করেছে কি না।

এই পৃষ্ঠায়
আপনার প্রম্পট দুটি মেসেজে কাজ করেছে যেগুলো আপনি চেষ্টা করেছেন। এর মানে কি এটি কাজ করে? এখনো না। পরিচিত উত্তরসহ ২০টি বাস্তব মেসেজে এটি চালান, কতগুলো সঠিকভাবে উত্তর দেয় তা গণনা করুন, এবং যেগুলো মিস করে সেগুলো পড়ুন। একটি ছোট Python স্ক্রিপ্ট গণনাটি করে, এবং আপনি যখন প্রম্পট পরিবর্তন করেন, একই স্ক্রিপ্ট আপনাকে বলে যে পরিবর্তনটি সাহায্য করেছে কি না, এটি আপনার অন্তর্দৃষ্টির উপর ছেড়ে না দিয়ে।
সফলতার মানদণ্ড নির্ধারণ এবং মূল্যায়ন তৈরি সম্পর্কে Anthropic-এর ডকুমেন্টেশন (৭ নভেম্বর ২০২৬-এ যাচাই করা) নিজের ভাষায় বলে: পরীক্ষাগুলো আপনার কাজের জন্য নির্দিষ্ট করুন, অস্বস্তিকর কেসগুলো অন্তর্ভুক্ত করুন, এবং হাতে গ্রেড করা অল্প কয়েকটির চেয়ে স্বয়ংক্রিয়ভাবে গ্রেড করা অনেক প্রশ্নকে প্রাধান্য দিন। নিচে এর সবচেয়ে ছোট সংস্করণ যা আপনি আজই চালাতে পারেন।

টেস্ট সেট তৈরি করুন: ২০টি মেসেজ এবং আপনার প্রত্যাশিত উত্তর#
ধরুন আপনি গ্রাহকের মেসেজগুলোকে তিনটি স্তূপে ভাগ করছেন: পজিটিভ, নেগেটিভ বা মিশ্র। cases.csv নামের একটি ফাইল খুলুন এবং ২০টি মেসেজ লিখুন যা আপনি সত্যিই পেতে পারেন, প্রতিটির সাথে আপনি যে লেবেল দেবেন তা লিখুন। কিছু চালানোর আগেই লেবেলগুলো লিখে ফেলুন। যদি মডেলের উত্তরগুলোকে "সঠিক" হিসেবে কপি করেন, তাহলে টেস্টটি কেবল মডেলের সাথে একমত হতে পারবে।
text,label
"Arrived a day early and works perfectly. Thank you!",positive
"The charger stopped working after two days.",negative
"Great screen, but the battery barely lasts until lunch.",mixed
"Support answered in five minutes and fixed it.",positive
"I waited three weeks and nobody replied.",negative
"Oh great, another update that deletes my settings.",negative
"Nice design. Pity about the price.",mixed
"Exactly what I ordered.",positive
"The box was crushed, but the headphones inside are fine and sound great.",mixed
"Refund took 10 days. Never again.",negative
"Love it!!",positive
"Cheaply made, but honestly it does the job for the price.",mixed
"Worst purchase of the year.",negative
"Five stars. Would buy again.",positive
"Fast delivery, wrong colour.",mixed
"It's fine. Not amazing, not terrible.",mixed
"Zero issues in six months of daily use.",positive
"The app crashes every time I open the camera.",negative
"Thanks for nothing.",negative
"Setup was a pain, but once it ran, it's been rock solid.",mixedমিশ্রণটি দেখুন: ৬টি পজিটিভ, ৭টি নেগেটিভ, ৭টি মিশ্র। বিদ্রূপাত্মক লাইনগুলো ("Oh great, another update…", "Thanks for nothing.") এবং সীমান্তবর্তী একটি ("It's fine. Not amazing, not terrible.") ইচ্ছাকৃতভাবে রাখা হয়েছে। কেবল স্পষ্ট মেসেজ দিয়ে তৈরি একটি সেট ১০০% স্কোর করে এবং আপনাকে কিছুই শেখায় না। আপনার নিজের ইনবক্স, টিকিট বা চ্যাট এক্সপোর্ট থেকে আসলগুলো নিন; এজ কেসগুলো সেগুলোই যা আপনি ইতিমধ্যেই জানেন যে বিরক্তিকর।
কেন ২০? এটি একটি প্রাথমিক আকার, ডকুমেন্টেশন থেকে নেওয়া কোনো সংখ্যা নয় (তাদের উদাহরণে ১,০০০টি টুইট ব্যবহার করা হয়েছে)। বিশটি এতটাই ছোট যে আধা ঘণ্টায় হাতে লেখা যায় এবং এতটাই বড় যে একটি ভাগ্যবান উত্তর স্কোর নির্ধারণ করতে পারে না।
স্ক্রিপ্ট: প্রতিটি কেস পাঠান, তুলনা করুন, মিসগুলো প্রিন্ট করুন#
পরিকল্পনায় চারটি ধাপ আছে, এবং কোডটি লাইন ধরে ধরে সেটি অনুসরণ করে।
ক্রমে সাজান
ইভাল লুপটি সাজান
আইটেমগুলো ড্র্যাগ করুন বা তীর ব্যবহার করুন
- CSV থেকে ২০টি কেস লোড করুন
- আপনার প্রম্পটসহ প্রতিটি মেসেজ মডেলে পাঠান
- উত্তরটি আপনার লেবেলের সাথে তুলনা করুন
- অ্যাকুরেসি এবং ব্যর্থ হওয়া কেসগুলো প্রিন্ট করুন
লুপটি কেবল তখনই কাজ করে যখন প্রথম মডেল কলের আগেই লেবেলগুলো বিদ্যমান থাকে, এবং ব্যর্থতাগুলো শেষে আসে কারণ সেগুলোই আপনি পড়েন ও ব্যবস্থা নেন।
SDK ইনস্টল করুন pip install openai দিয়ে এবং কী-টি CHEAPTOKENS_ নামের একটি এনভায়রনমেন্ট ভ্যারিয়েবলে রাখুন। যেকোনো OpenAI-সামঞ্জস্যপূর্ণ API একইভাবে কাজ করে; এখানে স্ক্রিপ্টটি CheapTokens এবং GLM-5.3-Flash-এর দিকে নির্দেশ করে (সেটআপের বিস্তারিত ডকুমেন্টেশনে)।
import csv
import os
from openai import OpenAI
client = OpenAI(
base_url='https://api.cheaptokens.dev/v1',
api_key=os.environ['CHEAPTOKENS_API_KEY'],
)
MODEL = 'zai-org/GLM-5.3-Flash'
PROMPT = (
'Classify the customer message as positive, negative or mixed. '
'Answer with one word only.'
)
def ask(text):
r = client.chat.completions.create(
model=MODEL,
temperature=0,
max_tokens=100,
messages=[
{'role': 'system', 'content': PROMPT},
{'role': 'user', 'content': text},
],
)
return r.choices[0].message.content or ''
with open('cases.csv', newline='', encoding='utf-8') as f:
cases = list(csv.DictReader(f))
correct, failed = 0, []
for case in cases:
got = ask(case['text'])
ok = got.strip().strip('.').lower() == case['label']
correct += ok
if not ok:
failed.append((case['text'], case['label'], got.strip()))
print(f'Accuracy: {correct}/{len(cases)} = {correct / len(cases):.0%}')
for text, want, got in failed:
print(f'- {text!r}: expected {want}, got {got!r}')তিনটি বিষয় আবার দেখার মতো।
temperature=0উত্তরগুলোকে যতটা সম্ভব স্থির রাখে, যাতে স্কোরের পরিবর্তন আপনার প্রম্পট থেকে আসে, পাশা থেকে নয়।max_tokens=100এক-শব্দের লেবেলের প্রয়োজনের চেয়ে অনেক বেশি। যদি কোনো উত্তর কখনো খালি বা কাটা অবস্থায় ফিরে আসে,finish_reasonদেখুন; finish_reason "length" গাইড দেখায় কী বাড়াতে হবে।- গ্রেডিং লাইনটি ডকুমেন্টেশনের রেসিপি,
strip().lower()সঠিক উত্তরের সাথে তুলনা করা হয়, সাথে একটি সংযোজন: এটি শেষের দাঁড়িও বাদ দেয়, কারণ "Negative." এবং "negative" আপনার কাছে একই উত্তর।
এটি চালালে কী দেখবেন? একটি অ্যাকুরেসি লাইন, তারপর প্রতিটি মিসের জন্য একটি লাইন। ধরুন প্রথম রানে এটি প্রিন্ট করে:
Accuracy: 14/20 = 70%
- 'Oh great, another update that deletes my settings.': expected negative, got 'positive'
- "It's fine. Not amazing, not terrible.": expected mixed, got 'positive'
…(এখানে সংখ্যাগুলো আউটপুটের আকৃতি দেখানোর জন্য একটি অনুমান; আপনারটি ভিন্ন হবে।) ব্যঙ্গ এবং সীমান্তবর্তী শব্দচয়ন এমন ধরনের মেসেজ যা একটি সংক্ষিপ্ত প্রম্পট সাধারণত মিস করে। মূল বিষয় হলো আপনি আর অনুমান করছেন না: আপনার কাছে একটি তালিকা আছে।
একটি জিনিস বদলান, আবার চালান#
এখন আসল কাজের অংশ। মিসগুলো পড়ুন, একটি কারণ বেছে নিন, এক জায়গায় প্রম্পট বদলান এবং আবার চালান। একবারে একটি পরিবর্তন, নইলে কোন সম্পাদনা স্কোর বাড়াল তা আপনি জানতে পারবেন না।
তুলনা করুন
প্রম্পট v1 → v2: একটি নিয়ম ও দুটি উদাহরণ যোগ করুন
v1
Classify the customer message as positive, negative or mixed.
Answer with one word only.v2
Classify the customer message as positive, negative or mixed.
Sarcasm counts as negative. Praise plus a complaint is mixed.
Answer with one word only.
Message: Lovely colour, but it arrived with a scratch.
Answer: mixed
Message: Sure, thanks a lot. Now my order is lost.
Answer: negativeদুটি উদাহরণ বানানো, এবং এটি ইচ্ছাকৃত। cases.csv থেকে কোনো বার্তা কখনো উদাহরণ হিসেবে প্রম্পটে রাখবেন না: তাহলে মডেলকে আপনার দেওয়া উত্তর দিয়েই মূল্যায়ন করা হবে, আর স্কোর কৃত্রিমভাবে বেড়ে যাবে। এটি few-shot কৌশল; পরীক্ষার সেটই বলে দেবে এটি কাজে লেগেছে কি না। আপনার v1 প্রম্পট যদি এখনো অস্পষ্ট হয়, তাহলে মাপার আগে কীভাবে ভালো প্রম্পট লিখবেন সেখান থেকেই শুরু করুন।
v2 PROMPT-এ পেস্ট করুন (একাধিক লাইনের জন্য ট্রিপল কোট কাজ করে) এবং স্ক্রিপ্টটি আবার চালান। ধরুন এটি Accuracy: 17/ প্রিন্ট করে। আরও তিনটি কেস সঠিক, তাই v2 ভালো দেখাচ্ছে। এটা কতটা বিশ্বাস করবেন? ২০টি কেসের সেটে প্রতিটি কেসের মূল্য ৫ পয়েন্ট, তাই ৭০% → ৮৫% মানে তিনটি বার্তা। এটি একটি ভালো ইঙ্গিত, প্রমাণ নয়। স্কোর কমলে, আপনি সমান মূল্যবান কিছু শিখেছেন এবং আরও খারাপ প্রম্পট শিপ করা থেকে নিজেকে বাঁচিয়েছেন।
একই সেট, অন্য মডেল: স্কোর কি ধরে রাখে?#
একই ফাইল দ্বিতীয় প্রশ্নের উত্তর দেয়: এই কাজের যতটা দরকার তার চেয়ে বেশি মডেলের জন্য কি আপনি বেশি খরচ করছেন? একটি লাইন বদলে আবার চালান:
MODEL = 'deepseek-ai/DeepSeek-V4-Flash-0731'আপনার ২০টি কেসে নির্ভুলতা মিলে গেলে, এই কাজের জন্য আপনার উত্তর পেয়ে গেছেন — লিডারবোর্ড থেকে নয়, আপনার নিজের ডেটা থেকে। যদি তা কমে যায়, তবে সিদ্ধান্ত নেওয়ার আগে দেখুন কোন মেসেজগুলো ব্যর্থ হয়েছে।
এসবের খরচ কত? ধরুন প্রতি কেসে প্রায় ১৫০টি ইনপুট টোকেন (নির্দেশনা যোগ মেসেজ) এবং এক-শব্দের লেবেলের জন্য প্রায় ৫টি আউটপুট টোকেন। অর্থাৎ ২০টি কেসের প্রতি রানে ৩,০০০ ইনপুট ও ১০০ আউটপুট টোকেন, যা GLM-5.3-Flash-এ দাঁড়ায় $0.000064। সেটটি দশবার পুনরায় চালালে ২০০টি রিকোয়েস্ট হয়; নিচের টেবিলে প্রতিটি মডেলের জন্য সেই ওয়ার্কলোড দেখানো হয়েছে, পাশে OpenRouter সহ। এই ওয়ার্কলোডে, ইনপুট ও আউটপুট একসাথে গণনা করলে, টেবিলের প্রতিটি মডেলের খরচ OpenRouter-এর রেফারেন্স মূল্যের চেয়ে কম।
| মডেল | ইনপুট $/১ মিলিয়ন | আউটপুট $/১ মিলিয়ন | প্রতি অনুরোধে | ২০০টি অনুরোধ | OpenRouter, ২০০টি অনুরোধ |
|---|---|---|---|---|---|
| GLM-5.3-Flash | $0.02 | $0.04 | $0.0000032 | $0.00064 | $0.0011 |
| DeepSeek-V4-Flash | $0.015 | $0.10 | $0.0000028 | $0.00055 | $0.0022 |
| MiniMax-M2.7 | $0.05 | $0.15 | $0.0000083 | $0.0017 | $0.0198 |
প্রতি অনুরোধে ১৫০ ইনপুট এবং ৫ আউটপুট টোকেন। প্রতি 1M টোকেনের দাম বর্তমান এবং আমাদের ট্যারিফের সাথে পরিবর্তিত হয়; OpenRouter কলামটি একই ওয়ার্কলোডের জন্য রেফারেন্স মূল্য দেখায়।
এর মধ্যে দুটি এই নিবন্ধে ব্যবহৃত হয়েছে: GLM-5.3-Flash-এর কনটেক্সট ৩৯০K এবং প্রতি উত্তরে সর্বোচ্চ ৮,১৯২ আউটপুট টোকেন; DeepSeek-V4-Flash-এর কনটেক্সট ৩৮০K এবং সর্বোচ্চ ৩২,৭৬৮ আউটপুট টোকেন, দিনের যেকোনো সময়ে একই মূল্য, এবং অন্য সব মডেলের মতোই একই ব্যালেন্স। বর্তমান মূল্য pricing page-এ, সম্পূর্ণ তালিকা models-এ।
যেখানে exact match কাজ করা বন্ধ করে দেয়#
Exact match কাজ করে কারণ সঠিক উত্তরটি একটি নির্দিষ্ট তালিকা থেকে একটি শব্দ। সারাংশ, পুনর্লিখন বা ব্যাখ্যার মতো মুক্ত-প্রান্তের আউটপুটের জন্য তুলনা করার কোনো একক স্ট্রিং নেই। ডকুমেন্টেশন আরেকটি পথ বর্ণনা করে, একটি মডেল দিয়ে গ্রেডিং, এবং উত্তরটি যে মডেল লিখেছে তার চেয়ে ভিন্ন একটি মডেল গ্রেডার হিসেবে ব্যবহার করার পরামর্শ দেয়। তবুও exact match দিয়েই শুরু করুন: যেখানেই আপনি একটি সংক্ষিপ্ত, নির্দিষ্ট উত্তর বাধ্যতামূলক করতে পারেন, সেটিই সবচেয়ে সস্তা এবং স্পষ্ট পরীক্ষা যা আপনি চালাতে পারেন। ডকুমেন্টেশনের নিয়ম হলো, বেশি স্বয়ংক্রিয়ভাবে গ্রেড করা প্রশ্ন কম হাতে-গ্রেড করা প্রশ্নের চেয়ে ভালো।
আরেকটি অভ্যাস: যখন v2 উন্নতি করা বন্ধ করে দেয়, তখন একই 20টি মেসেজের বিরুদ্ধে পালিশ করতে থাকবেন না। 5–10টি নতুন যোগ করুন, আদর্শভাবে প্রোডাকশন থেকে আসল মিস, এবং আবার চালান।
দ্রুত যাচাই
v2 স্কোর করে 17/20 এবং v1 একই কেসে স্কোর করেছিল 15/20। সবচেয়ে নিরাপদ সিদ্ধান্ত কী?
উত্তর দেখান
উত্তর: v2 ভালো দেখাচ্ছে, কিন্তু 20টির মধ্যে দুটি কেস একটি ছোট ব্যবধান: নতুন কেস যোগ করুন এবং আবার চালান
প্রতিটি কেস 5 পয়েন্ট, তাই দুটি কেসের ব্যবধান আরও ঘনিষ্ঠভাবে দেখার সংকেত, কোনো রায় নয়। v2 কখনও দেখেনি এমন নতুন কেসই পরবর্তী পরীক্ষা।



