Predikce dalšího tokenu

Celé kouzlo: pravděpodobnost dalšího kousku textu.

Co se naučíš: Uvidíš celou generovací smyčku a pochopíš, proč dvakrát stejná otázka nedá stejnou odpověď.

7 min čtení + cvičeníNavazuje na:🔤 Tokeny

Tohle je motor celé věci. Model dostane text a spočítá pravděpodobnost pro každý token ze svého slovníku, že bude následovat. Pak jeden vybere, přilepí ho na konec a počítá znovu. Když pochopíš tenhle cyklus, pochopíš i to, proč model odpovídá postupně, proč jde přerušit, proč stejná otázka dá pokaždé trochu jinou odpověď a proč se dá „přemluvit“ začátkem věty.


Cyklus, který se opakuje

vstup: "Nejlepší jazyk na backend je"
   ↓
model spočítá pravděpodobnosti pro celý slovník (třeba 100 000 tokenů)
   ↓
" Go" 22 % | " Python" 19 % | " Java" 14 % | " Rust" 9 % | ...
   ↓
vybere jeden token → "Nejlepší jazyk na backend je Go"
   ↓
a celé znovu, teď už s delším vstupem

Opakuje se to tak dlouho, dokud nepadne speciální stop token (model „řekne“, že dokončil), nedojde nastavený limit délky, nebo se netrefí do tvé stop sekvence.

💡 Proto vidíš odpověď přibývat po kouscích (streaming). Není to efekt pro parádu, tak to opravdu vzniká. A proto jde generování kdykoli zastavit: nic není hotové dopředu.


Ta šipka zpátky je celá autoregrese. Model nemá plán věty, má jen tenhle cyklus.


Autoregrese: model čte i to, co sám napsal

Každý vygenerovaný token se stává součástí vstupu pro další krok. Říká se tomu autoregresivní generování a má dva důležité důsledky:

1. Chyba se šíří. Když model odbočí špatným směrem, dál staví na svém omylu. Odtud pramení odpovědi, které začnou rozumně a v polovině sklouznou jinam.

2. Začátek odpovědi řídí zbytek. Když modelu předepíšeš, čím má odpověď začít, výrazně tím ovlivníš, co bude následovat:

"Odpověz jen ANO nebo NE. Otázka: ... \nOdpověď:"

Tenhle trik (prefill, předvyplnění začátku odpovědi) je jeden z nejúčinnějších způsobů, jak model udržet ve formátu, funguje líp než prosba „prosím odpovídej stručně“.


Proč dvakrát stejná otázka nedá stejnou odpověď

Model nevybírá vždycky nejpravděpodobnější token. Kdyby to dělal, byl by nudný a zacyklil by se do opakování. Místo toho z pravděpodobností losuje a jak moc riskuje, řídíš parametry (temperature, top-p), kterým je věnovaná vlastní kapitola.

temperature 0    → skoro vždy nejpravděpodobnější token = stabilní, nudné
temperature 1    → losuje podle pravděpodobností = pestré, méně předvídatelné

Ani temperature 0 ale nezaručí naprosto identický výstup: hraje roli pořadí výpočtů na GPU, verze modelu a spousta dalších drobností. Nikdy nestav testy na tom, že přijde přesně stejný řetězec.


Proč to působí „inteligentně“

Aby model dobře hádal další token, musí si během tréninku vypěstovat spoustu vedlejších dovedností. Chceš-li správně doplnit tečku za větou, musíš rozumět gramatice. Chceš-li doplnit } na správném místě, musíš sledovat strukturu kódu. Chceš-li doplnit výsledek úvahy, musíš tu úvahu do jisté míry sledovat.

Právě proto pomáhá nechat model „přemýšlet nahlas“: když ho necháš rozepsat postup, každý mezikrok se stane součástí kontextu a další token se hádá z lepšího základu.

špatně: "Kolik je 17 × 23? Odpověz jen číslem."
lépe:   "Kolik je 17 × 23? Nejdřív rozepiš výpočet, pak napiš výsledek."

⚠️ Neplať za to zbytečně dvakrát: dlouhé rozmýšlení jsou tokeny navíc. U jednoduchých úloh nebo tam, kde stejně sáhneš po kalkulačce, je to plýtvání.


Co z toho plyne pro tebe

  • Stop podmínky si nastav. Bez limitu délky umí model pokračovat mnohem dál, než chceš.
  • Formát vynuť předvyplněním, ne prosbami. Když má odpověď být JSON, začni ji za něj {.
  • Nepočítej s doslovnou shodou výstupu mezi běhy; testuj význam nebo strukturu.
  • U složitých úloh dej prostor na postup, u jednoduchých ho potlač.

Cvičení

  1. Model dostane prompt „Hlavní město Česka je“ a vrátí „ Praha“ s pravděpodobností 0,91. Co ta 0,91 znamená a co neznamená?
  2. Proč se odpověď generuje po tokenech a ne celá naráz, když trénink zvládne tisíc predikcí jedním průchodem?
Náčrt řešení: rozbal, až si cvičení zkusíš sám
  1. Znamená, že v textech podobných tomuhle následovalo „ Praha“ v 91 % případů. Neznamená, že si je model na 91 % jistý, že je to pravda. Je to statistika o textu, ne míra spolehlivosti tvrzení. Proto může model vyslovit nesmysl s vysokou pravděpodobností, pokud ten nesmysl v daném kontextu prostě zní jako přirozené pokračování.
  2. Protože každý další token závisí na tom předchozím, který zatím neexistuje. Při tréninku je celá správná posloupnost předem známá z dat, takže se všechny pozice spočítají naráz a budoucnost se jen zakryje maskou. Při generování žádná správná posloupnost není, takže se musí postupovat token po tokenu. Viz trénink vs generování.

Shrnutí

  • Generování je smyčka: spočítej pravděpodobnosti → vyber token → přidej → opakuj.
  • Model čte i vlastní výstup, takže se chyby nabalují a začátek odpovědi řídí její zbytek.
  • Losování z pravděpodobností dělá odpovědi pestré, ale nedeterministické.
  • Prostor na rozmyšlenou zlepšuje kvalitu, protože mezikroky se stanou součástí kontextu.
Proč se odpověď vypisuje postupně a jde ji zastavit uprostřed?

Protože tak doopravdy vzniká, token po tokenu. Nic není připravené dopředu, takže přerušení jen ukončí smyčku. Streaming odpovědi je přímý obraz toho, jak model pracuje.

Model začal odpovídat správně, ale v polovině sklouzl k nesmyslu. Proč?

Generování je autoregresivní: každý vygenerovaný token se stává vstupem pro další krok. Jakmile model jednou odbočí, staví dál na vlastním omylu a chyba se nabaluje.

Jak přinutit model, aby odpověděl přesně v požadovaném formátu?

Nejúčinnější je předvyplnit začátek odpovědi (prefill), třeba nechat ji začínat { u JSONu nebo slovem „Odpověď:“. Protože další token se hádá z předchozích, formát se tím zafixuje spolehlivěji než prosbou v instrukci. Ideálně to doplň o strojovou validaci výstupu.