Převodník llama.cpp devět měsíců přehlížel doporučený postih za opakování
Oprava z 24. srpna 2026 mění v převodníku llama.cpp jediný řádek: doporučený postih za opakování se nově čte i pod jménem repetition_penalty. Dosud se hledal jen pod jménem penalty_repeat, které nastavení modelů z Hugging Face nezná, takže se do souborů GGUF nedostal.

Do llama.cpp přibyla 24. srpna 2026 oprava o jednom řádku. Převodník ze safetensorů do GGUF od té chvíle bere doporučený postih za opakování i z klíče repetition_penalty, ne jen z penalty_repeat. Rozdíl mezi těmi dvěma jmény je celý ten problém: první z nich je standardní jméno z knihovny Transformers, druhé je vlastní jméno llama.cpp a v nastavení stažených modelů se prakticky nevyskytuje.
Co ten postih vlastně dělá
Postih za opakování snižuje pravděpodobnost slov, která už v odpovědi padla. Hodnota 1,0 znamená vypnuto, vyšší číslo tlačí model od opisování sebe sama. Tvůrci modelů si ji ladí spolu s teplotou a prahy top_k a top_p a zapisují ji do souboru generation_config.json, který leží v repozitáři vedle vah.
Právě odtud si ta čísla od listopadu 2025 bere i llama.cpp. Převodník je zapíše do hlavičky souboru GGUF pod klíče general.sampling.* a server je pak použije jako výchozí nastavení. Pořadí je dané: přednost má přepínač na příkazové řádce, po něm doporučení uložené v modelu a teprve nakonec zabudovaná výchozí hodnota. Ta je u postihu za opakování 1,00, tedy vypnuto; výjimkou je jediný nástroj na syntézu řeči, kde je 1,05.
Klíč, který v nastavení modelů nikdo nepíše
Převodník takhle přebírá dvanáct hodnot. Čtyři z nich se jmenují stejně jako v knihovně Transformers, takže sedí bez další práce: temperature, top_k, top_p a min_p. Několik dalších jsou samplery, které existují jen v llama.cpp a jinde protějšek nemají, takže na vlastním jménu nic divného není. Postih za opakování ale protějšek má. Ve zdrojovém kódu Transformers se to pole jmenuje repetition_penalty a řetězec penalty_repeat v něm nestojí ani jednou.
Kolik modelů se to týká, jsme si změřili sami. Vzali jsme sto dvacet nejstahovanějších modelů pro generování textu na Hugging Face a stáhli jim generation_config.json; k 24. srpnu 2026 ho má devadesát tři z nich. Klíč repetition_penalty je ve dvaceti, u devatenácti s jinou hodnotou než 1,0 – čtrnáctkrát 1,05 a pětkrát 1,1. Klíč penalty_repeat, tedy ten, který převodník až dosud hledal, nemá ani jeden z nich.
Všech devatenáct jsou modely řady Qwen, hlavně Qwen2.5 a Qwen3-Coder; část z nich jsou cizí kvantizace téhož modelu. Nejnovější Qwen3.8 už postih za opakování nenastavuje vůbec, takže na něj oprava nedopadne.
Na hotovém souboru je to vidět
Že to není teorie, se dá ověřit bez stahování stovek gigabajtů: hlavička GGUF leží na začátku souboru, takže si stačí vyžádat prvních pár desítek megabajtů a přečíst z nich seznam klíčů. Vzali jsme převod modelu Qwen3-Coder-30B-A3B-Instruct z července 2026 ve variantě Q4_K_M. V hlavičce jsou tři klíče ze jmenované čtveřice: general.sampling.top_k 20, general.sampling.top_p 0,8 a general.sampling.temp 0,7. Přesně ta čísla stojí v nastavení původního modelu. Ve stejném souboru je ale i repetition_penalty 1,05 – a klíč general.sampling.penalty_repeat v GGUF chybí.
Kdo tenhle soubor spustí a nic si nenastaví, dostane teplotu i prahy podle přání autorů modelu a postih za opakování vypnutý. Ne proto, že by ho autoři vypnout chtěli, ale proto, že se jejich hodnota po cestě ztratila. Ručně se dá dosadit přepínačem --repeat-penalty.
Vydaná sestavení opravu zatím nemají
Změna je v hlavní větvi, ne v hotovém programu. Slučovací commit vznikl 24. srpna ve 14:01 UTC, kdežto poslední zveřejněné sestavení b10612 je z 13:41 UTC téhož dne, tedy o dvacet minut starší. Kdo si k večeru toho dne stáhl nejnovější binárku, opravu v ní nemá; do některého z dalších sestavení se dostane sama.
Druhá věc je horší a čas ji nevyřeší: oprava se týká jen převodu. Soubory GGUF, které už na Hugging Face visí, se tím nezmění – doporučenou hodnotu v sobě prostě nemají a dostane se do nich, teprve až je někdo převede znovu. U populárních modelů to obvykle netrvá dlouho, protože kvantizované varianty se sázejí po každé větší změně. U starších převodů, ke kterým se nikdo nevrátí, tam ta hodnota nebude nikdy.
Postih za opakování se řeší i jinde
Ta hodnota není maličkost, se kterou by si nikdo nelámal hlavu. Před dvěma týdny změnila Ollama svoje výchozí nastavení z 1,1 na 1,0 s odůvodněním, že nikdo z tvůrců modelů v její knihovně hodnotu 1,1 nedoporučuje a že postih navíc bere výkon spekulativnímu dekódování. Obě rozhodnutí míří stejným směrem: přestat hádat za autory modelu. Rozdíl je v tom, že llama.cpp k tomu potřebovala hodnotu, kterou si autoři modelu opravdu napsali, a devět měsíců si ji četla ze špatné kolonky.
Zdroje
- llama.cpp, návrh změny #27659 – misc : read repetition_penalty from generation_config.json
- llama.cpp, návrh změny #17120 – llama: introduce support for model-embedded sampling parameters
- Transformers, zdrojový kód třídy GenerationConfig
- Qwen3-Coder-30B-A3B-Instruct, generation_config.json
- smarttasks, převod téhož modelu do GGUF
- Vlastní měření nad rozhraním Hugging Face, 24. srpna 2026: sto dvacet nejstahovanějších modelů pro generování textu, z toho devadesát tři s
generation_config.json. Vlastní čtení hlavičky GGUF rozsahovým dotazem HTTP.