অধ্যায় 3 · টেমপ্লেট, মাল্টিমোডাল ও সেটিংস
লং-কনটেক্সট মূল্যায়ন: চাংকিং, অবস্থান-পরীক্ষা ও হারানো তথ্য
- পৃষ্ঠা 12 / 24
- 14 মিনিট পড়া
লম্বা ইনপুটে ব্যর্থতা নিঃশব্দে ঘটে। একটা মডেল ২০০ পৃষ্ঠার রিপোর্ট পড়ে সাবলীল উত্তর দিতে পারে, অথচ যে ধারাটা সবচেয়ে জরুরি ছিল সেটাই বাদ দিয়ে যেতে পারে। অডিও আর ভিডিওতে দ্বিতীয় সমস্যা আসে: মডেল ফাঁক পূরণ করে বিশ্বাসযোগ্য-শোনা অনুমান দিয়ে। এই পাতায় আশা করে বসে থাকার বদলে পরীক্ষা করার উপায় দেওয়া হয়েছে: ট্রান্সক্রিপশন ও ভিডিও কাজের নির্দেশ কীভাবে লিখবেন, লম্বা ইনপুটের শুরুতে, মাঝখানে ও শেষে একটা জানা তথ্য রেখে কীভাবে পরীক্ষা করবেন, লম্বা আউটপুটে হারিয়ে-যাওয়া তথ্য কীভাবে ধরবেন, আর বড় রানের আগে সাইজ ও খরচের আনুমানিক হিসাব কীভাবে করবেন।
কোডে শুধু স্ট্যান্ডার্ড লাইব্রেরি আর প্রম্পট চেইনিং: ধাপ, নির্দিষ্ট স্কিমা ও promptlab হেল্পার-এর promptlab ব্যবহার হয়েছে। এখানকার প্রতিটা "মডেল" একটা টয় প্রোভাইডার (toy provider): নির্ধারিত আচরণের একটা স্ট্যান্ড-ইন, যাতে টেস্ট হারনেস বারবার একই ফল দিয়ে যাচাই করা যায়। আসল মডেল কম অনুমানযোগ্য, আর সেজন্যই পরীক্ষা করতে হয়। টয়ের কোনো আউটপুট আসল মডেলের আচরণ সম্পর্কে কিছু বলে না। চাংকিং ও ধাপে-ধাপে সারাংশ আগের পাতা মাল্টিমোডাল প্রম্পট ডিজাইন: ছবি, স্ক্যান, টেবিল ও দীর্ঘ ডকুমেন্ট-এ ছিল; এই পাতা পরীক্ষা করে সেগুলো কাজ করছে কি না।
যা শিখবেন
- ট্রান্সক্রিপশন, স্পিকার-লেবেল ও ভিডিও-সারাংশের নির্দেশ কীভাবে লিখবেন, যাতে মিডিয়ায় যা আছে আর আপনার অনুমান আলাদা থাকে।
- শুরু, মাঝ ও শেষের তথ্যের জন্য নিডল-পজিশন টেস্ট কীভাবে বানাবেন এবং ফল কীভাবে পড়বেন।
- "অবশ্য-রাখার তালিকা" দিয়ে লম্বা আউটপুটের হারানো তথ্য কীভাবে ধরবেন।
- কনটেক্সট লিমিটকে মডেল-ভেদে খুঁজে দেখার তথ্য হিসেবে কীভাবে দেখবেন, এবং বড় রানের আগে ইনপুটের সাইজ ও খরচ কীভাবে মোটামুটি আন্দাজ করবেন।
- লম্বা-ডকুমেন্টের প্রশ্নোত্তর প্রম্পট কীভাবে মূল্যায়ন করবেন, উত্তরহীন প্রশ্নসহ।
অডিও: ট্রান্সক্রিপশনের নির্দেশ
ট্রান্সক্রিপ্ট একটা প্রমাণ, তাই নির্দেশে বলতে হবে ভালো ট্রান্সক্রিপ্ট কাকে বলে। আগে ঠিক করুন: হুবহু নাকি গুছিয়ে-লেখা? "উম"-জাতীয় ফিলার থাকবে কি না? যে শব্দ শোনা যায়নি তা কীভাবে চিহ্নিত হবে? কোন ভাষা ও বানান? এসব না বললে মডেল নিজে বেছে নেয়, আর এক এক রানে এক এক রকম বাছে।
দুর্বল প্রম্পট:
Transcribe this audio.ভালো প্রম্পট:
Transcribe the attached audio in the language spoken. Keep the wording as spoken, but drop
filler sounds such as "um". Do not correct grammar. If a word is unclear, write [unclear]
and do not guess. Mark long silences and non-speech sounds as [silence] or [noise: type].
Put a timestamp [mm:ss] at the start of each paragraph.কী বদলাল: লেখার ধরন নির্দিষ্ট হলো, অনুমানের জায়গায় দৃশ্যমান চিহ্ন এল, আর টাইমস্ট্যাম্প থাকায় যেকোনো লাইন রেকর্ডিংয়ের সঙ্গে মেলানো যায়। ট্রান্সক্রিপ্ট পাওয়ার পর দুই-তিনটা অংশ শুনে মিলিয়ে দেখুন। নাম, সংখ্যা ও তারিখেই ট্রান্সক্রিপ্ট সবচেয়ে বেশি ভুল করে।
স্পিকার-লেবেল শুধু সমর্থিত হলে
স্পিকার ডায়ারাইজেশন (speaker diarisation) মানে কোন অংশ কে বলেছেন তা লেবেল করা। সব টুল বা মডেল এটা করে না, আর যে টুল সমর্থন করে না সেটাও আসল-দেখতে লেবেল বানিয়ে ফেলতে পারে। তাই লেবেল চাইবেন শুধু যখন জানেন আপনার টুল সমর্থন করে, এবং লেবেলকে যাচাই-করার-মতো অনুমান হিসেবে দেখবেন।
প্রোভাইডার নোট (২০২৬-১০-১২ অনুযায়ী): Google-এর অডিও ডকুমেন্টেশনে স্পিকার ডায়ারাইজেশন (উদাহরণ লেবেল "Speaker 1", "Speaker 2"), টাইমস্ট্যাম্প, অনুবাদ ও শব্দহীন-আওয়াজ শনাক্তকরণ অডিও কাজ হিসেবে তালিকায় আছে; আরও বলা আছে অডিও ডাউনস্যাম্পল হয় এবং মাল্টি-চ্যানেল অডিও এক চ্যানেলে মিলিয়ে দেওয়া হয়। চ্যাট অ্যাপ ও অন্য প্রোভাইডারে অডিও সমর্থন ভিন্ন; আমি সব প্রোভাইডারের জন্য নিশ্চিত করিনি। আপনার টুলের বর্তমান ডকুমেন্টেশন দেখে নিন।
ভালো প্রম্পট:
Label speakers as Speaker 1, Speaker 2 in order of first appearance. Do not use real names
unless a speaker says their own name in the audio; then note it once as "Speaker 2 (says: Amara)".
If you cannot tell two voices apart, write [speaker unclear] instead of choosing one.লেবেল মানে পরিচয় নয়। রেকর্ডিংয়ে কেউ না বললে মডেল জানতে পারে না "Speaker 2" ফাইন্যান্স ম্যানেজার। কথা-বদলের জায়গা অডিওর সঙ্গে মিলিয়ে নিন, আর কোনো মানুষ না শুনে কোনো সিদ্ধান্তে (কে কীতে রাজি হয়েছেন) লেবেল ব্যবহার করবেন না।
ভিডিও: সময়সহ সারাংশ
সময় ছাড়া ভিডিও-সারাংশ যাচাই করা যায় না। কয়েকটা সেগমেন্ট চান, প্রতিটার শুরুর সময় আর এক বাক্যে কী ঘটছে, এবং যা দেখা বা শোনা গেছে তা মডেলের অনুমান থেকে আলাদা রাখুন।
ভালো প্রম্পট:
Summarise the attached video as at most 6 segments. For each: [mm:ss-mm:ss], one sentence of
what is shown or said, and the source: "seen", "heard" or "both". Then list up to 3 questions the
video does not answer. If you cannot read on-screen text, say so instead of guessing it.তিনটা সময়ে ভিডিও খুলে মিলিয়ে দেখুন। সময় সরে গেলে বা ভুল দৃশ্য দেখালে ক্লিপ ছোট করুন বা কম সেগমেন্ট চান।
প্রোভাইডার নোট (২০২৬-১০-১২ অনুযায়ী): Google-এর API ডকুমেন্টেশনে ভিডিও একটা ইনপুট হিসেবে তালিকায় আছে। ভিডিওর সীমা এবং চ্যাট অ্যাপ ও অন্য প্রোভাইডারে সমর্থন আমি নিশ্চিত করতে পারিনি। আপনার টুল কী নেয় তা বর্তমান ডকুমেন্টেশনে দেখুন।
মিডিয়ার প্রমাণ বনাম প্রসঙ্গের অনুমান
মিডিয়া দেয় প্রমাণ; আশেপাশের লেখা দেয় প্রসঙ্গ। "পুনের অফিসে মিটিং" ক্যাপশনটা প্রসঙ্গ, ভিডিওতে যে পুনেই দেখা যাচ্ছে তার প্রমাণ নয়। মডেলকে প্রতিটা দাবিতে ট্যাগ বসাতে বলুন, তারপর ট্যাগ যাচাই করুন।
ভালো প্রম্পট:
For each statement in your answer add one tag:
[MEDIA] directly visible or audible in the file (give the time or region),
[CONTEXT] taken from the text I provided,
[ASSUMPTION] your inference, not shown anywhere.
Do not present an [ASSUMPTION] as fact. Say "cannot be determined" where nothing supports an answer.নমুনা উত্তর (উদাহরণ মাত্র; আপনারটা আলাদা হবে):
[MEDIA] 00:42 A person points to a chart titled "Q3 returns".
[CONTEXT] The title says this is the Pune office review.
[ASSUMPTION] The speaker is the regional manager.
Cannot be determined: whether the chart values match the report; they are not readable.কী যাচাই করবেন: দুটো [MEDIA] ট্যাগ ফাইলের সঙ্গে মিলিয়ে দেখুন (মডেল ভুল ট্যাগ দিতে পারে), আর যে [ASSUMPTION] আপনার দরকার তা নিজের "নিশ্চিত করার" তালিকায় নিন।
শুরু, মাঝ ও শেষের তথ্য পরীক্ষা
প্রোভাইডাররা বসানোর পরামর্শে একমত: লম্বা উপাদান আগে, প্রশ্ন শেষে, আর প্রতিটা ডকুমেন্টে উৎসের লেবেল। কিন্তু লম্বা ইনপুটের প্রতিটা তথ্য সমানভাবে কাজে লাগবে, এমন প্রতিশ্রুতি কেউ দেয় না। পুরোনো মডেলের একটা গবেষণায় (Liu et al., ২০২৩) দেখা গেছে প্রাসঙ্গিক তথ্য ইনপুটের শুরুতে বা শেষে থাকলে নির্ভুলতা সবচেয়ে বেশি, মাঝখানে সবচেয়ে কম। এটা সেই সময়ের মডেলে পরীক্ষিত একটা প্রবণতা (direction), কোনো নিয়ম বা সংখ্যা নয়। প্রোভাইডারদের নির্দেশিকাও বলে একটা তথ্য খোঁজা সহজ, কয়েকটা একসঙ্গে খোঁজা কঠিন। তাই আপনার মডেল ও আপনার কাজের জন্য: পরীক্ষা করুন।
পরীক্ষাটার নাম নিডল টেস্ট (needle test)। একটা ফিলার ডকুমেন্ট নিন, একটা রেকর্ডের জায়গায় জানা তথ্য বসান, তথ্যটা জিজ্ঞেস করুন, আর হুবহু মিলিয়ে স্কোর দিন। তথ্যের মান ও অবস্থান বদলে বারবার করুন। নিচের টয় রিডার একটা স্ট্যান্ড-ইন, যা ইচ্ছাকৃতভাবে মাঝখানে কম নির্ভরযোগ্য; গবেষণায় দেখা lost-in-the-middle প্রবণতাটা সে নকল করে, শুধু দিক বোঝানোর জন্য। আসল মডেল ভালো, খারাপ বা অন্যরকম হতে পারে; সেজন্যই আসল মডেলে হারনেস চালাতে হয়।
import random, zlib
from promptlab import Client, estimate_tokens, render
def make_doc(n=40):
return [f"Record {i:02d}: branch {'ABCDEF'[i % 6]} handled {10 + (i * 7) % 23} requests; routine." for i in range(1, n + 1)]
def place(lines, frac, code):
"""Replace one record with the needle fact, at a relative position 0.0 (start) .. 1.0 (end)."""
k = round(frac * (len(lines) - 1))
out = lines[:]
out[k] = f"Record {k + 1:02d}: the vault code is {code}."
return out
QA = "Answer only from the document. If the answer is not there, say NOT FOUND.\n\n### DOCUMENT\n{doc}\n\n### QUESTION\n{q}"
def toy_reader(messages, **settings):
"""Stand-in: finds the needle less often in the middle (direction only, not a real model)."""
text = messages[-1]["content"]
lines = text.split("### DOCUMENT\n", 1)[1].split("\n\n### QUESTION", 1)[0].splitlines()
hit = [i for i, line in enumerate(lines) if "vault code" in line]
if not hit:
return "NOT FOUND"
pos = hit[0] / (len(lines) - 1)
p_find = 0.95 - 0.45 * (1 - abs(2 * pos - 1)) # 0.95 at the ends, 0.50 in the middle
if random.Random(zlib.crc32(text.encode())).random() < p_find: # seeded from the prompt: repeatable
return lines[hit[0]].split(" is ")[1].rstrip(".")
return "NOT FOUND"
client = Client(toy_reader)
rng = random.Random(7)
base = make_doc()
print("document:", len(base), "records,", estimate_tokens("\n".join(base)), "tokens (rough)")
for name, frac in [("early", 0.1), ("middle", 0.5), ("late", 0.9)]:
found = 0
for _ in range(40):
code = f"{rng.randrange(10000, 99999)}"
doc = "\n".join(place(base, frac, code))
reply = client.complete([{"role": "user", "content": render(QA, doc=doc, q="What is the vault code?")}]).text
found += reply == code
print(f"{name:6} (position {frac}): found {found}/40")document: 40 records, 500 tokens (rough)
early (position 0.1): found 35/40
middle (position 0.5): found 15/40
late (position 0.9): found 38/40আসল রানের মতো করে পড়ুন: প্রতি অবস্থানে ৪০ বার, একই প্রশ্ন, শুধু অবস্থান বদলায়। মাঝের সারি স্পষ্টভাবে কম; এটা টয়ের নির্ধারিত আচরণ। আসল মডেলে সারিগুলো এলোমেলো হতে পারে, তাই যথেষ্ট ট্রায়াল ও কয়েকটা তথ্যের মান নিন, এবং একবারের চেষ্টা নয়, গণনা জানান। আপনার মডেলের মাঝখান দুর্বল হলে ইনপুট ছোট করুন, মূল উপাদান শুরু বা শেষে নিন, বা আগে প্রাসঙ্গিক অংশ রিট্রিভ করুন (এটা AI Engineer পথের বিষয়)।
একসঙ্গে কয়েকটা তথ্য পরীক্ষা করলে প্রতিটা আলাদা স্কোর করুন, কারণ একটা নিডল পাওয়া মানে তিনটা পাওয়া নয়।
লম্বা আউটপুটে হারানো তথ্য ধরা
সারাংশ ও লম্বা উত্তর কোনো ত্রুটি-বার্তা ছাড়াই তথ্য হারায়। প্রতিকার হলো অবশ্য-রাখার তালিকা (must-keep list): মডেল চালানোর আগে উৎস থেকে লিখে-রাখা তথ্য, সংখ্যা ও নাম, যা কোডে আউটপুটের সঙ্গে মেলানো হয়। এতে সারাংশ ঠিক কি না প্রমাণ হয় না, কিন্তু কম খরচে বাদ-পড়া জিনিস ধরা যায়।
REPORT = ["Summary of the quarter. Orders grew in most regions.",
"Region North: order 48213 was refunded on 2026-03-14 after a damaged delivery.",
"Region South: delivery times fell by two days.",
"Region East: Lena Fischer joined as regional lead.",
"Closing note. Next review is in six months."]
MUST = ["48213", "2026-03-14", "Lena Fischer"]
def toy_summary(paragraphs):
"""Stand-in summariser that keeps only the first and last paragraph, so middle details vanish."""
return " ".join([paragraphs[0], paragraphs[-1]])
def lost_details(output, must=MUST):
return [item for item in must if item.lower() not in output.lower()]
print("lost:", lost_details(toy_summary(REPORT)))
print("lost, full text:", lost_details(" ".join(REPORT)))lost: ['48213', '2026-03-14', 'Lena Fischer']
lost, full text: []দ্বিতীয় লাইনটা চেকারেরই যাচাই: পুরো লেখায় কিছু হারায় না। মিল মানে শুধু স্ট্রিং মিল, তাই তথ্য থেকেও ভুল হতে পারে; মানের জন্য দ্বিতীয় চেক যোগ করুন (তারিখ ২০২৬-০৩-১৪, অন্য কিছু নয়)। প্রম্পটেও বলতে পারেন: "Keep every order number, date and person's name from the source."
কনটেক্সট লিমিট: সব মডেলে এক ধরে নেবেন না
কনটেক্সট উইন্ডো (context window) হলো এক অনুরোধে মডেল সর্বোচ্চ যতটা বিবেচনা করতে পারে। এতে আপনার ইনপুট, আউটপুট ও লুকানো রিজনিং সবই ধরা হয়। মডেলভেদে উইন্ডো, আউটপুট সীমা এবং ছবি, অডিও ও ফাইলের নিয়ম আলাদা, আর মডেল আপডেট হলে বদলায়। তাই স্মৃতি থেকে কোনো সংখ্যা ডিজাইনে বসাবেন না।
প্রোভাইডার নোট (২০২৬-১০-১২ অনুযায়ী): প্রোভাইডারদের ডকুমেন্টেশন বলে, যে মডেল ব্যবহার করছেন তার পাতায় উইন্ডো ও সর্বোচ্চ আউটপুট দেখে নিতে (Google: সাধারণ সংখ্যার ওপর নির্ভর না করে Models পাতা দেখুন)। রিজনিং টোকেনও উইন্ডোর জায়গা নেয়। Anthropic একটা বিনামূল্যের টোকেন-গণনা এন্ডপয়েন্ট দেয়, যার ফল একটা আনুমানিক হিসাব, এবং বলে নতুন টোকেনাইজার একই লেখায় পুরোনোটার চেয়ে লক্ষণীয়ভাবে বেশি টোকেন বানাতে পারে, তাই প্রতিটা মডেলের জন্য আবার গুনুন। বর্তমান ডকুমেন্টেশন দেখে নিন।
প্রোভাইডার ডকুমেন্ট থেকে মাল্টিমোডাল সক্ষমতার তুলনা
অডিও, ছবি, PDF বা ভিডিওর জন্য টুল বাছার আগে প্রতিটা প্রোভাইডারের বর্তমান পাতা থেকে একটা ছোট টেবিল ভরুন, এবং কবে দেখেছেন তার তারিখ লিখুন।
| প্রশ্ন | কোথায় দেখবেন | কেন জরুরি |
|---|---|---|
| কোন ইনপুট টাইপ ও ফাইল ফরম্যাট? | মডেল পাতা, ভিশন বা অডিও গাইড | অসমর্থিত টাইপ নিঃশব্দে উপেক্ষিত বা প্রত্যাখ্যাত হতে পারে। |
| সাইজ, দৈর্ঘ্য ও সংখ্যার সীমা? | একই পাতা; সীমা বদলায় | ইনপুট ভাগ করতে হবে কি না তা ঠিক করে। |
| মিডিয়া কীভাবে টোকেনে বদলায়? | টোকেন ও প্রাইসিং পাতা | প্রতিটা প্রোভাইডারের নিজস্ব নিয়ম; বড় ইনপুটে খরচ বেশি। |
| স্পিকার-লেবেল বা টাইমস্ট্যাম্প আছে? | অডিও গাইড | যা সমর্থিত নয় তা চাইবেন না। |
| পরিচিত দুর্বলতা কী? | "Limitations" অংশ | ছোট লেখা, ঘোরানো ছবি ও আনুমানিক গণনা ডকুমেন্টে বারবার আসে। |
বড় রানের আগে ইনপুটের সাইজ ও খরচ আন্দাজ
আগে ছোট নমুনা চালান, তারপর গুণ করুন। promptlab-এর estimate_tokens একটা মোটামুটি হিসাব (চার অক্ষরে এক টোকেন)। প্রম্পট তুলনা করতে আর পরিকল্পনার দশগুণ বড় রান ধরতে এটা কাজের। এটা টোকেনাইজার নয়, আর ইংরেজি ছাড়া অন্য ভাষায় আরও কম নির্ভুল। আসল বাজেটের জন্য প্রোভাইডারের কাউন্টার ও ইউজেজ ডেটা ব্যবহার করুন। নিচের ইউনিট প্রাইস একটা উদাহরণ দাম, আসল নয় (example price, not real)।
PRICE_PER_MILLION = 0.50 # example price, not real
prompt = render(QA, doc="\n".join(place(make_doc(400), 0.5, "12345")), q="What is the vault code?")
per_call, calls = estimate_tokens(prompt), 3 * 40 * 5
total = per_call * calls
print(f"one call: {per_call} tokens (rough); {calls} calls: {total} tokens (rough)")
print(f"example cost: {total / 1_000_000 * PRICE_PER_MILLION:.2f} (example price, not real)")one call: 5103 tokens (rough); 600 calls: 3061800 tokens (rough)
example cost: 1.53 (example price, not real)উপরের এক্সপেরিমেন্ট, ডকুমেন্ট দশগুণ লম্বা আর ট্রায়াল পাঁচগুণ (প্রতি অবস্থানে ২০০) করলে, প্রায় তিন মিলিয়ন (মোটামুটি) ইনপুট টোকেন যেত। শুরুর আগেই এই সংখ্যা দেখাই উদ্দেশ্য। আউটপুট টোকেন, লুকানো রিজনিং ও প্রতিটা রিট্রাইও গণনায় পড়ে, আর সেগুলোর দাম সাধারণত আলাদা; প্রোভাইডারের প্রাইস শিট দেখুন।
কাজের জায়গায় এটা কোথায় দেখা যায়
লিগ্যাল ও কমপ্লায়েন্স টিম লম্বা চুক্তিতে প্রশ্ন করে। সাপোর্ট টিম কল রেকর্ডিংয়ের সারাংশ করে। গবেষকেরা লম্বা রিপোর্টে প্রশ্ন করেন। প্রতিটায় একই ছোট রুটিন: বসানো-যায় ও স্কোর-করা-যায় এমন কয়েকটা তথ্য নিন, কয়েকটা অবস্থানে চালান, সারাংশের জন্য অবশ্য-রাখার তালিকা রাখুন, আর পুরো ব্যাচের আগে আন্দাজ করুন।
সাধারণ ভুল
- বড় উইন্ডো মানে নিখুঁত মনে রাখা, এমন ভাবা। তথ্য ঢুকলেও বাদ যেতে পারে। নিজের মডেলে অবস্থান পরীক্ষা করুন।
- একবারের চেষ্টায় অবস্থান-পরীক্ষার রায় দেওয়া। ফল এলোমেলো; অনেক ট্রায়াল ও ভিন্ন মান নিন।
- স্পিকার-লেবেল ও উদ্ধৃত সময়ে ভরসা করা। দুটোই মডেলের আউটপুট। ফাইলের সঙ্গে মিলিয়ে দেখুন।
- এক মডেলের টোকেন গণনা অন্য মডেলে ব্যবহার করা। টোকেনাইজার আলাদা। প্রতিটা মডেলে আবার গুনুন।
- শুধু উত্তরযোগ্য প্রশ্নে স্কোর করা। উত্তরহীন প্রশ্নও রাখুন, যেখানে ঠিক উত্তর "পাওয়া যায়নি"।
নিজে চেষ্টা করুন
পাতার ব্লকগুলো ক্রমানুসারে একটা Python ফোল্ডারে চালান, পাশে promptlab.py রেখে।
- সহজ। স্প্যানিশ ভাষায় দুইজনের একটা সাক্ষাৎকারের জন্য ট্রান্সক্রিপশন প্রম্পট লিখুন, যা স্প্যানিশ রাখে, অস্পষ্ট শব্দ চিহ্নিত করে, আর কোনো স্পিকারের নাম চায় না। কী ফেরত আসা উচিত তার এক লাইনের ইংরেজি ব্যাখ্যা (gloss) যোগ করুন।
- মাঝারি। ৮০ রেকর্ডের ডকুমেন্ট ও ০.০, ০.২৫, ০.৫, ০.৭৫, ১.০ অবস্থানে নিডল টেস্ট আবার চালান। কোন সারিগুলোতে ভরসা করবেন এবং কেন, বলুন।
- কঠিন। লম্বা-ডকুমেন্টের প্রশ্নোত্তর প্রম্পট মূল্যায়ন করুন: তিনটা কেস (শুরুতে তথ্য, মাঝখানে তথ্য, তথ্য নেই), "correct", "abstained" বা "wrong" ফেরত দেওয়া একটা স্কোরার, আর দুটো রিডার:
toy_readerএবং যেটা সবসময় উত্তর বানায়। কোন রিডার গ্রহণ করবেন, ব্যাখ্যা করুন।
উত্তর
সহজ। একটা ভালো উত্তর:
Transcribe the attached audio in Spanish, keeping the Spanish wording as spoken. Label the two
voices Interviewer and Guest; do not use real names. Write [unclear] for any word you cannot hear.
Add a timestamp [mm:ss] at each change of speaker.ব্যাখ্যা (gloss): এটা স্প্যানিশ ট্রান্সক্রিপ্ট ফেরত দেয়, দুটো ভূমিকার লেবেলসহ, বানানো নাম ছাড়া, টাইমস্ট্যাম্পসহ। পাস চেকলিস্ট: ভাষা বলা আছে, অস্পষ্ট-শব্দের নিয়ম আছে, বানানো নাম নেই, যাচাইয়ের জন্য টাইমস্ট্যাম্প আছে।
মাঝারি। make_doc(40)-কে make_doc(80) করুন, পাঁচটা অবস্থানে লুপ চালান, গণনা তুলনা করুন। পাস চেকলিস্ট: একই প্রশ্ন, প্রতি অবস্থানে ৪০ বা বেশি ট্রায়াল; একবারের চেষ্টা নয়, গণনা জানানো হয়েছে; গণনা দেখালে তবেই প্রান্তের সারিতে বেশি ভরসা; আর বলা আছে টয় রিডারের প্রবণতা ভেতরে বসানো, আসল মডেল না পরীক্ষা করলে জানা যায় না।
কঠিন।
def score(reply, expected):
if reply == expected:
return "correct"
return "abstained" if reply == "NOT FOUND" else "wrong"
def toy_guesser(messages, **settings):
"""Stand-in that always invents an answer, even when the document has none."""
return "99999"
cases = [("early", place(base, 0.1, "11111"), "11111"), ("middle", place(base, 0.5, "22222"), "22222"),
("absent", base, "NOT FOUND")]
for reader in (toy_reader, toy_guesser):
row = [score(Client(reader).complete([{"role": "user", "content": render(QA, doc="\n".join(d), q="What is the vault code?")}]).text, want)
for _, d, want in cases]
print(reader.__name__, row)toy_reader ['correct', 'correct', 'correct']
toy_guesser ['wrong', 'wrong', 'wrong']পাস চেকলিস্ট: তথ্য-নেই কেস আছে; তাতে "পাওয়া যায়নি" বলা সঠিক ধরা হয়েছে আর বানানো উত্তর ভুল; গেসার বাতিল, যদিও কখনো ঘটনাক্রমে মিলতে পারে; তিনটা কেস শুধু প্রদর্শনী, আসল মূল্যায়নে প্রতি অবস্থানে অনেক কেস লাগে। গেসার একটা স্ট্যান্ড-ইন, কিন্তু শিক্ষাটা আসল: যে প্রম্পট কখনো বলে না "না থাকলে বলুন নেই", সে বানানো উত্তরকে আমন্ত্রণ জানায়।
সারসংক্ষেপ
- ট্রান্সক্রিপশন ও ভিডিওর নির্দেশে ধরন নির্দিষ্ট করুন, অস্পষ্ট অংশ চিহ্নিত করান, এবং যাচাই-করা-যায় এমন সময় চান।
- স্পিকার-লেবেল চান শুধু টুল সমর্থন করলে, এবং লেবেলকে অনুমান ভাবুন।
- মিডিয়ার প্রমাণ, দেওয়া প্রসঙ্গ ও অনুমান ট্যাগ দিয়ে আলাদা করুন এবং ট্যাগ নমুনা-যাচাই করুন।
- নিজের মডেলে শুরু-মাঝ-শেষ অবস্থান অনেক ট্রায়ালে পরীক্ষা করুন; হারানো তথ্যের জন্য অবশ্য-রাখার তালিকা রাখুন।
- কনটেক্সট লিমিট ও মাল্টিমোডাল নিয়ম মডেল ধরে খুঁজে দেখুন, আর বড় রানের আগে সাইজ ও খরচ মোটামুটি আন্দাজ করুন।
এরপর: স্যাম্পলিং ও রিজনিং কন্ট্রোল: temperature, top-p, effort ও পুনরাবৃত্তিযোগ্যতা, যেখানে শিখবেন কোন সেটিং বৈচিত্র্য বদলায় আর কোনটা সত্য বদলায় না।