Context Window

Agentní vývoj / Kontextové okno

Nejčastějším omylem je brát kontextové okno jako úložiště – čím víc do něj nasypu, tím víc agent ví.

Je to přesně naopak. S rostoucí délkou historie kvalita odpovědí klesá, protože se v ní ředí to podstatné – pro tento jev se ujal termín context rot. Deset tisíc řádků logu ze selhaného buildu, obsah čtyř souborů, které se ukázaly jako slepá ulička, tři neúspěšné pokusy o opravu. To nejsou informace, ale šum. Model pak musí vaše zadání hledat mezi balastem a snáz přehlédne, na čem skutečně záleží.

Kontextové okno je pracovní plocha, nikoli archiv. Podstatné jsou proto dvě otázky. Co na ni vědomě pokládat? A co z ní průběžně odklízet?

A každou informaci, která na ní leží, platíte dvakrát – spálenými tokeny za požadavek a pozorností modelu. Místo na ploše je omezené, správa kontextu proto není technická drobnost, ale ekonomické rozhodnutí.

Kam psát instrukce

Agent umí spustit kompilaci, ale neví, že se v tomto projektu sbt nespouští z terminálu, že se nikde nepoužívá try/catch a že se po každé změně volá scalafmt. Netuší ani, že nesnášíte tříodstavcové úvody u odpovědí na otázky typu ano/ne. Tyhle znalosti mu musíte dodat vy.

Vlastní instrukce lze agentovi předat na třech místech. Každé se hodí pro jiný typ pokynů a liší se tím, kdy se jeho obsah do kontextu dostane.

Systémový prompt

První možností je systémový prompt – sada instrukcí, kterou harness posílá modelu s každým požadavkem. Neurčuje konkrétní úkol, ale způsob práce agenta: jakým tónem odpovídá, jak zachází s nástroji a kdy se má raději zeptat, než aby hádal.

Oficiální CLI harnessy svůj systémový prompt upravit nedovolují, agnostické ho naopak dávají k dispozici. Konkrétní podoba se liší podle nástroje, možnosti jsou ale většinou dvě – buď výchozí prompt celý nahradíte svým, nebo ho jen rozšíříte o vlastní text.

Patří sem to, co nezávisí na projektu – že chcete odpověď bez tříodstavcového úvodu, že se nikdy necommituje bez vyzvání nebo že dotaz „wdyt“ je pozvání k diskusi, ne pokyn k editaci souborů.

Úplná náhrada je ale ve většině případů špatný nápad. Výchozí systémový prompt kromě chování obsahuje také instrukce pro práci s nástroji, například přesný formát pro editaci souborů. Spolu s promptem je zahodíte a agent pak může selhávat i při základních operacích.

Projektové instrukce

Systémový prompt popisuje agenta, projektové instrukce popisují repozitář. Název souboru závisí na nástroji: řada harnessů používá AGENTS.md, Claude Code nativně čte jen CLAUDE.md (AGENTS.md se do něj dá přesměrovat odkazem @AGENTS.md). Soubor bývá v kořeni repozitáře a jeho obsah se na začátku relace načte do kontextu. Patří do něj to, co platí vždy a pro každého, kdo v repozitáři pracuje.

## Build

- ALWAYS use Metals MCP tools instead of sbt for compiling and
  running tests: `compile-file` / `compile-module` / `compile-full`
  to compile, `test` to run test suites (Weaver Test, ScalaTest,
  etc.)

## Code style

- Scala 3 brace-less syntax
- Never try/catch - use `Try`, `Either`, etc.
- `Either.cond(condition, right, left)` over `if/then/else`
- Descriptive names, no abbreviations (`fingerprint` not `fp`,
  `fieldSchema` not `fs`)

Všimněte si, že každé pravidlo je konkrétní a ověřitelné. Obecné poučky typu write readable code je plýtvání tokeny, protože z něj agent nic neodvodí. Naproti tomu fingerprint not fp je konkrétní pokyn, kterého se agent může držet.

Zásadní je zároveň stručnost. Obsah souboru zůstává v kontextu po celou relaci, proto sem nepatří návody pro výjimečné situace. Několik řádků navíc ničemu nevadí – problémem jsou dlouhé seznamy, ve kterých se důležitá pravidla začnou ztrácet.

Instrukce doporučuji psát v angličtině. Modely jsou na ni trénované, drží se jí spolehlivěji a stejný pokyn zabere méně tokenů než v češtině.

Skills

Pro obsáhlejší postupy je vhodnější mechanismus skills. Skill je markdownový soubor s návodem pro konkrétní typ úlohy a krátkým popisem, podle kterého agent pozná, kdy ho použít. V kontextu zůstává trvale jen tento popis – celý návod agent načte teprve ve chvíli, kdy na odpovídající úlohu narazí. Tomuto principu se říká progresivní odkrývání (progressive disclosure).

---
name: weaver-test
description: Conventions for writing tests with Weaver Test
  (weaver-cats) in Scala. Use when writing or reviewing
  Weaver test suites, assertions, or `expect` usage.
---

# Weaver Test

Write assertions with `expect.same` and combine them using `List(...).combineAll`...

Díky tomu do skillů můžete přesunout podrobné materiály, které by projektové instrukce zbytečně prodlužovaly: kompletní konvence pro Cats Effect, pravidla pro práci s Resource, checklist pro code review nebo popis firemního review procesu.

kde co tam patří kdy se načte
systémový prompt chování agenta, vaše osobní preference vždy
projektové instrukce konvence a příkazy projektu, pravidla pro tým vždy
skill ucelený postup pro konkrétní typ úlohy když je potřeba

Hranici mezi systémovým promptem a projektovými instrukcemi určuje jejich vlastník. Systémový prompt je váš a typicky ho držíte mimo repozitář, projektové instrukce jsou jeho součástí a platí i pro kolegy. O přesunu do skillu rozhoduje frekvence: co agent potřebuje u většiny úkolů, patří do projektových instrukcí, postup pro výjimečnou situaci do skillu.

Jak plochu uklízet

Instrukce nastavíte jednou. Zbytek plochy se zaplňuje sám. Odklízet ho můžete třemi způsoby a každý se hodí pro jinou situaci.

Komprese (compaction) starou historii sumarizuje. Je nejpohodlnější, protože se spouští sama, a zároveň nejméně přesná – co se do sumáře nevešlo, zmizí z dalšího kontextu a vy nevíte, co to bylo.

Větvení vrátí konverzaci do bodu před chybným rozhodnutím a slepou větev z dalšího kontextu odstraní. Je levné i přesné, harness vám sám nabídne seznam bodů návratu. Hodí se i na experimenty – zkusíte jednu cestu a pokud nikam nevede, celou ji zahodíte.

Subagent deleguje dílčí úkol na samostatnou instanci s vlastním kontextem, která do hlavní konverzace vrátí jen výsledek. Typickým příkladem je prohledávání rozsáhlého repozitáře, kde vás zajímá odpověď, ne cesta k ní. Subagentovi navíc můžete pro jednodušší úkoly nastavit levnější model. Nevýhodou je izolace – nevidí hlavní konverzaci, takže zadání musí být úplné, jinak vrátí odpověď na jinou otázku.

Sám dávám přednost větvení, když si chci něco jen vyzkoušet a pak pokračovat, jako by se to nestalo. Subagenty používám pro ohraničené úkoly, u kterých mě zajímá jen výsledek – například spouštění sbt tasků nebo vyhledávání na GitHubu. Kompresi beru jako poslední možnost, ne jako strategii.

Závěr

Model i harness se dají vyměnit, kontext skládáte vždy vy. A přesnost odpovědi klesá s každou informací, která na ploše nemusela být.


Příklady subagentů a skillů, které používám, jsou k dispozici na githubu.

Zanechte komentář

Vaše emailová adresa nebude zobrazena. Povinná pole jsou označena *