Kontextové okno je strop na to, kolik tokenů model najednou pojme, tvůj prompt, historie konverzace, vložené dokumenty i chystaná odpověď dohromady. Je to zároveň jediná „paměť“, kterou model má. Co je uvnitř, existuje. Co je venku, pro model neexistuje.
Co se do okna počítá
┌──────────── kontextové okno (např. 128 000 tokenů) ────────────┐
│ systémový prompt │ historie konverzace │ podklady │ odpověď │
└────────────────────────────────────────────────────────────────┘
Odpověď se počítá taky. Když máš okno 8 000 tokenů a pošleš 7 800 tokenů vstupu, na odpověď ti zbývá dvě stě a model ji utne uprostřed.
Co se stane při přetečení
Podle poskytovatele a knihovny jedna ze tří věcí, a všechny tři musíš čekat:
- Chyba. API vrátí
context_length_exceeded. Nejlepší varianta, protože je vidět. - Ořez, knihovna potichu vyhodí nejstarší zprávy. Model pak „zapomene“ začátek konverzace a ty nechápeš proč.
- Ořez odpovědi, na generování zbyde málo místa a výstup se usekne.
⚠️ Nejhorší je tichý ořez. Když aplikace začne po delší konverzaci ignorovat instrukce ze začátku, skoro vždycky je to tohle, systémový prompt vypadl z okna.
Velké okno neznamená, že to model přečte pořádně
Modely s oknem na stovky tisíc tokenů umí pojmout celou knihu. Kvalita ale není rovnoměrná: nejlíp si model všímá začátku a konce, zatímco informace zakopaná uprostřed dlouhého bloku se často ztratí. Anglicky se tomu říká lost in the middle.
Praktické důsledky:
- Instrukce dávej na začátek nebo na konec, ne doprostřed dat.
- Neposílej deset dokumentů, když stačí ten správný. Víc podkladů neznamená lepší odpověď, často naopak, protože relevantní pasáž utone v šumu.
- Když je odpověď důležitá, ptej se cíleně. Místo „tady máš celou smlouvu, co z ní plyne?“ radši vytáhni relevantní články a zeptej se na ně.
Jak se do okna vejít
| Situace | Řešení |
|---|---|
| Dlouhá konverzace | Zkracuj historii: nech systémový prompt, posledních N zpráv a shrnutí staršího (paměť) |
| Velký dokument | Nevkládej celý, rozsekej ho a vyber relevantní části (RAG) |
| Hodně dokumentů | Nejdřív najdi kandidáty, pak je přeřaď a vezmi jen pár nejlepších |
| Dlouhý výstup | Rozděl úlohu na části a generuj po kapitolách |
Okno versus cena
Velké okno svádí k pohodlnosti: „nacpu tam všechno a model si vybere“. Účet ale roste s každým tokenem a s délkou roste i latence, dlouhý vstup znamená delší čekání na první token. Nacpat do promptu 100 000 tokenů při každé zprávě je nejrychlejší cesta k faktuře, které nebudeš rozumět.
💡 Dobré pravidlo: do kontextu patří jen to, bez čeho nejde odpovědět. Všechno ostatní je šum, který zdražuje a zhoršuje kvalitu.
Cvičení
- Model má okno 128 k tokenů. Posíláš systémovou zprávu 2 k, dvacet dokumentů po 3 k a chceš odpověď dlouhou 4 k. Vejde se to? Kolik zbývá?
- Zvětšíš okno z 8 k na 128 k a kvalita odpovědí na dlouhých dokumentech klesne. Proč to není protimluv?
Náčrt řešení: rozbal, až si cvičení zkusíš sám
- Ano, ale s menší rezervou, než to vypadá: zbývá 62 k.
2 + 20 × 3 + 4 = 66 kz 128 k. Pozor na dvě věci: do okna se počítá vstup i výstup, a u dvaceti dokumentů je pravděpodobné, že většina je nerelevantní. Lepší než plnit okno je vybrat tři správné dokumenty pomocí retrievalu, viz projekt RAG. - Protože velikost okna a schopnost okno využít jsou dvě různé věci. Model se učil hlavně na kratších sekvencích, pozornost se přes 128 tisíc pozic rozmělní a informace uprostřed kontextu se ztrácí nejvíc. Delší okno tedy zvyšuje, kolik se vejde, ale ne nutně, kolik se skutečně použije. Proto se dlouhý kontext testuje, ne předpokládá.
Shrnutí
- Do okna se počítá vstup i výstup; okno je jediná paměť modelu.
- Přetečení se projeví chybou, tichým ořezem historie nebo useknutou odpovědí.
- Informace uprostřed dlouhého kontextu se hůř využije než na začátku a na konci.
- Míň dobře vybraného kontextu bývá lepší než hodně všeho.
Po dvaceti zprávách začal chatbot ignorovat pravidla ze systémového promptu. Co se stalo?
Konverzace přerostla kontextové okno a knihovna potichu odřízla nejstarší zprávy, včetně systémového promptu. Řeší se to tím, že systémový prompt posíláš vždy znovu a zkracuješ jen prostředek historie (nebo ho shrneš).
Model má okno 200 000 tokenů. Můžeš mu při každém dotazu poslat celou dokumentaci?
Technicky ano, prakticky je to špatný nápad. Platíš každý token při každém volání, roste latence a informace uprostřed obřího kontextu se hůř využije. Lepší je vyhledat relevantní pasáže a poslat jen ty.
Jaká je souvislost mezi kontextovým oknem a `max_tokens`?
Sdílejí stejný prostor: vstup i vygenerovaná odpověď se dohromady musí vejít do okna. Když je vstup dlouhý, zbývá málo místa na odpověď a ta se usekne, proto se hlídají obě čísla společně.
