Tokeny

Model nevidí písmena ani slova. Proč na tom záleží.

Co se naučíš: Pochopíš, proč model nevidí písmena, a budeš umět odhadnout, kolik tokenů tvůj text zabere.

7 min čtení + cvičeníNavazuje na:🤖 Co je LLM

Model nevidí písmena ani slova, vidí tokeny, což jsou kousky textu převedené na čísla. Zní to jako technický detail, ale vysvětluje to spoustu podivného chování: proč model neumí spolehlivě spočítat písmena ve slově, proč je čeština dražší než angličtina a proč se ti dlouhý dokument „nevejde“. Tokeny jsou zároveň jednotka, ve které platíš.


Pár pojmů na úvod

  • Token = nejmenší kousek textu, se kterým model pracuje. Zhruba slabika až krátké slovo.
  • Tokenizer = program, který text rozseká na tokeny a přeloží je na čísla (ID). Každý model má svůj a nejsou vzájemně zaměnitelné.
  • Slovník (vocabulary) = seznam všech tokenů, které model zná. Typicky 30 000 až 200 000 položek.
  • Vstupní / výstupní tokeny = co pošleš a co model vygeneruje. Účtují se zvlášť a výstupní bývají několikanásobně dražší.

Jak vypadá tokenizace

Anglická věta se seká úsporně, protože z angličtiny model viděl nejvíc:

"The cat sat on the mat."
→ ["The", " cat", " sat", " on", " the", " mat", "."]     7 tokenů

Čeština dopadne hůř, diakritika a skloňování znamenají víc kousků:

"Kočka seděla na rohožce."
→ ["K", "oč", "ka", " sed", "ěla", " na", " roh", "ož", "ce", "."]   ~10 tokenů

Všimni si, že mezera patří k tokenu (" cat" je jiný token než "cat"). Proto se někdy odpověď rozbije, když prompt končí mezerou.

💡 Praktický odhad: 1 token ≈ 4 znaky angličtiny ≈ 2–3 znaky češtiny. Stránka A4 textu je zhruba 500–800 tokenů. Čeština tak stojí zhruba dvakrát víc než totéž anglicky.


Proč model neumí počítat písmena

Klasika: „Kolik r je ve slově jahoda?“ Model se často splete. Není hloupý, jen žádná písmena nevidí. Slovo dostane jako pár tokenů, třeba ["ja", "ho", "da"], a uvnitř tokenu už jednotlivé znaky nerozlišuje. Je to jako ptát se člověka, kolik má knížka na polici písmen e, když vidí jen její hřbet.

Stejná příčina stojí za dalšími jevy:

  • Přeházená písmena (anagramy, „napiš to pozpátku“) mu dělají potíže.
  • Dlouhá čísla se sekají do podivných kousků (1234567 může být ["123", "45", "67"]), proto v aritmetice chybuje.
  • Rýmy a slabiky jsou trefa i vedle, podle toho, jak se slovo rozpadlo.

Řešení není lepší prompt, ale nástroj: na počítání a přesnou práci se znaky dej modelu funkci (viz nástroje) nebo si to spočítej sám v kódu.


Tokeny jako peníze a jako limit

Dvě věci, které tokeny určují:

1. Cenu. Účtuje se za tisíc tokenů, zvlášť vstup a zvlášť výstup. Když do promptu pořád dokola posíláš celou historii konverzace a deset dokumentů, platíš to při každé zprávě.

2. Kontextové okno. Model má strop, kolik tokenů najednou pojme (vstup + výstup dohromady). Když ho překročíš, buď dostaneš chybu, nebo se něco potichu zahodí. Vlastní kapitola o kontextovém okně.

prompt 3 000 tokenů + odpověď 800 tokenů = 3 800 tokenů z okna
                                          = 3 800 tokenů, které zaplatíš

🧬 Jak se slovník vlastně vyrábí (BPE), co jsou speciální tokeny a chat template rozebírá tokenizer od nuly.

Jak si tokeny spočítat

Nikdy je neodhaduj od oka, když jde o peníze nebo limity, spočítej je knihovnou k danému modelu (tiktoken pro OpenAI, transformers tokenizer pro otevřené modely, počítadlo tokenů v API):

# ilustrativně, konkrétní knihovna se liší podle poskytovatele
enc = get_tokenizer("cl100k_base")
tokens = enc.encode("Kočka seděla na rohožce.")
print(len(tokens))   # kolik zaplatíš za tuhle větu

⚠️ Tokenizer je vázaný na model. Počet spočítaný pro jeden model neplatí pro jiný, po přechodu na nový model si přepočítej rozpočet i délky promptů.


Co si z toho odnést do praxe

  • Piš prompty stručně. Ne kvůli eleganci, ale protože každé slovo stojí peníze a místo v okně.
  • Neposílej, co model nepotřebuje. Celý dokument místo relevantního odstavce je nejčastější důvod přemrštěných účtů.
  • U češtiny počítej s přirážkou. Když ladíš náklady, zkus, jestli ti stačí anglický systémový prompt (data i odpověď můžou zůstat česky).
  • Na znaky a čísla nasaď kód, ne model.

Cvičení

  1. Odhadni bez počítání, který text zabere víc tokenů: 500 znaků české právní prózy, nebo 500 znaků Pythonu. Pak si to ověř nějakým tokenizérem.
  2. Účtuje se ti podle tokenů. Proč se nevyplatí „šetřit“ mazáním diakritiky z českých promptů?
Náčrt řešení: rozbal, až si cvičení zkusíš sám
  1. Obvykle vyhraje čeština, ale rozdíl je menší, než čekáš, a u kódu záleží na odsazení. Čeština je pro anglicky vážené tokenizéry drahá kvůli diakritice a bohatému skloňování, takže se slova drolí. Kód je naopak plný častých sekvencí jako def, return nebo self, které mají vlastní token, ale hodně mezer u odsazení to zase zdražuje. Podstatné je, že „počet znaků“ o ceně nerozhoduje, rozhoduje, jak dobře text sedí do naučeného slovníku.
  2. Protože bys ušetřil pár procent tokenů a zaplatil to kvalitou. Text bez diakritiky je pro model vzdálenější všemu, co viděl při tréninku, takže se rozpadne na ještě menší kusy a model hůř rozumí. Ušetřit se dá mnohem víc jinde: kratším systémovým promptem, prompt cachingem a hlavně tím, že do kontextu neposíláš, co tam být nemusí.

Shrnutí

  • Model pracuje s tokeny, ne s písmeny ani slovy. Token ≈ slabika, mezera je jeho součástí.
  • Z toho plyne slabina v počítání znaků, anagramech a dlouhých číslech.
  • Tokeny určují cenu i to, co se vejde do kontextu. Čeština je na tokeny dražší než angličtina.
  • Počty zjišťuj tokenizerem daného modelu, ne odhadem.
Proč model chybuje, když se ho zeptáš, kolik má slovo písmen?

Protože písmena vůbec nevidí. Text dostane rozsekaný na tokeny (slabiky, kusy slov) a uvnitř tokenu už jednotlivé znaky nerozlišuje. Na takovou úlohu mu dej nástroj nebo si ji spočítej v kódu.

Proč je stejně dlouhý český text dražší než anglický?

Tokenizer je natrénovaný hlavně na angličtině, takže anglická slova umí zabalit do jednoho tokenu. Čeština se kvůli diakritice a koncovkám rozpadá na víc kousků, stejný obsah tak vyjde zhruba na dvojnásobek tokenů, a tím i peněz a místa v kontextu.

Odhadl jsi cenu podle tokenizeru jednoho modelu a pak přešel na jiný. Co hrozí?

Že odhad neplatí. Každý model má vlastní tokenizer a stejný text může rozsekat výrazně jinak. Po změně modelu je potřeba přepočítat jak náklady, tak délky promptů vůči novému kontextovému oknu.