Lesson 75 — Intermediate
Context Selection & Assembly
Har call ke liye context deliberate chunna — sab kuch na, sirf us decision ke liye zaroori minimum. Assembly ka matlab hai ek function jo instructions, history, evidence, memory, tools aur state ko label aur order ke saath jodta hai.
Minimum useful context
WHAT
Ek assembly function jo har source se sirf zaroori items lega, unhe label karega aur fix order mein messages banayega. Input chance se nahi, decision se banta hai.
WHEN
Agent turn, RAG call, tool loop — har step par. Jab bhi tum messages jod rahe ho, assembly ke rules lagte hain.
WHERE
System prompt layer + per-turn builder function + prompt snapshot logging. Repo mein ek jagah define, har call wahi use kare.
Har extra line model ka attention chehti hai. Smallest useful context ka rule: jo abhi is decision mein kaam nahi aana, woh andar mat daalo — chaho toh bahar store rakho.
Always, retrieved, ya excluded
Har item ko ek tier do — yeh decide karta hai woh kitni baar aur kaise window mein aayega:
- Always present: system rules, safety, core tool definitions — har call stable rehte hain (caching bhi milta hai, L6.7).
- Dynamically retrieved: docs, puraane messages, user profile — demand par load, use ke baad hata do.
- Summarized: lambi history ko rolling summary bana ke rakho (L6.3) — narrative chahiye, raw nahi.
- Excluded: stale config, irrelevant turns, duplicate facts — default yahi hai jab tak explicit zaroorat na ho.
Ordering aur labels
Sources ko label karke rakho taaki model samjhe kaun kya hai — evidence, instruction aur user input ek doosre mein ghul jaayein toh fake quotes aur ghalat rules ka raasta khulta hai (yahi prompt injection ka surface hai, L8.2).
def assemble(rules, history, evidence, state, user_text):
return [
{"role": "system", "content": (
"## Rules\n" + rules + # hamesha upar
"\n## Working state\n" + state)}, # plan / todo
*history, # recent turns raw
{"role": "user", "content": (
"## Evidence (facts + source)\n" + evidence +
"\n## User request\n" + user_text)}, # alag block
]
# Har block ka label alag — model ko kabhi guess nahi karna padta
Priorities: relevance, importance, recency, reliability
Chhota karne waqt chaar axis se score karo — kya andar rahega yeh decide hote hain:
- Relevance: abhi ke sawaal se kitna match — sabse bada filter.
- Importance: safety rules, hard constraints — relevance kam ho tab bhi andar.
- Recency: aaj ka plan hafte puraane plan se upar — par recency importance ko override nahi karti.
- Reliability: verified fact > model ka andaza > puraani summary — source quality rank karo.
- Redundancy/staleness: do jagah same fact → ek chhota; puraana version/decision → hata do.
Assembly test kaise karein
- Snapshot log: har call ka bheja gaya prompt persist karo — bug par replay karke dekh paoge.
- Budget audit chalao per section (L6.1) — over-budget blocks red mein.
- Ablation: ek section hata kar dobara chalao — output bigda toh section zaroori tha, nahi bigda toh kachra tha.
- Eval replay: fixed question set par nayi assembly vs puraani (L7 ka eval mindset yahin lagta hai).
Exercise
Question: Jo cheez har call mein hamesha present rehti hai — us tier ka naam? (ek shabd, English)
Question: Ek hi fact do jagah aana — context ki ____? (ek shabd, English)
Question: Context mein rakhne ke chaar axis: relevance, importance, recency, ___? (ek shabd, English)
Common mistakes
- Sab kuch hamesha andar: Bina default exclusion ke cost aur rot dono. Tier system lagao — always ka list chhota rakho, baaki demand par.
- Sources bina label ke mix: Evidence, instructions aur user text ek doosre mein ghule toh model confuse hota hai — aur injection ka darwaza bhi khulta hai. Blocks hamesha alag rakho.
- Stale context chalna: Puraana plan/config abhi bhi window mein baithe hain toh model wahi follow karega. Assembly step mein stale filter mandatory hai.
Roz subah poora almirah nahi kholte — aaj ka plan dekh ke wahi3 cheezein nikalte hain, baaki almirah mein hi rehti hai. Context assembly wahi hai: poora data bahar store mein hai, andar sirf aaj ka kaam.
store = saara_data # bahar, sasta
need = pick(store, task=current_turn) # relevance + importance se
pack(need, labels=True) # label ke saath andar- Q: Always vs retrieved vs summarized tiers kaise decide karoge? (stability × demand — aur kis tier mein kya rakhte ho)
- Q: Assembly function kaisa hona chahiye? (deterministic, labeled, budget-aware, snapshot-able)
- Q: Do contradictory instructions mili toh? (resolve ya remove — kabhi dono mat bhejo; policy layer mein decide karo)
- Q: Assembly kaise test karoge? (prompt snapshot, ablation, eval replay, budget audit)
Tiers, ordering aur priorities — teenon ka rule set hai. Agli lesson: jo andar chunta hai usko chhota kaise rakhein — compression.