Přeskočit na obsah
Nástroje 3 min čtení

Ollama 0.33.1 začala v MLX skutečně vynucovat JSON Schema

Ollama uměla přijmout JSON Schema i u modelů v MLX, její runner se jím však neřídil. Verze 0.33.1 to mění: XGrammar před každým krokem zakáže tokeny, které by porušily zadanou strukturu. Podle měření autorů Ollamy běžel 27miliardový model se schématem 32 tokenů za sekundu místo 65, rozdíl ale připadá na vypnuté spekulativní dekódování.

Zadní strana počítače Mac Studio
MLX je výpočetní prostředí pro Apple Silicon. Ollama v něm nově vynucuje strukturu odpovědi stejným parametrem jako u ostatních runnerů. Foto: Yasu, Wikimedia Commons (CC BY-SA 3.0)

Ollama 0.33.1, vydaná 26. srpna 2026, přidala do svého MLX runneru podporu strukturovaného výstupu. Nejde jen o další zápis do seznamu funkcí. Parametr format pro JSON nebo JSON Schema runner přijímal už dřív, ale podle popisu opravy jej nevynucoval. Program žádající strojově čitelnou odpověď tak mohl bez varování dostat obyčejnou větu.

Požadavek prošel, omezení se k modelu nedostalo

Rozdíl zachytil v červnu uživatelský test Ollamy 0.30.6 na macOS. Stejný pokyn „Say hi“ a stejné schéma dostaly běžná a MLX varianta modelů Qwen 3.5 a Gemma 4. Běžné varianty vrátily objekt JSON s požadovaným polem, obě MLX varianty odpověděly pozdravem v přirozeném jazyce. Hlášení se uzavřelo až s novou implementací ve verzi 0.33.1.

To je podstatný rozdíl proti chybě při zpracování odpovědi. Klient poslal schéma správně a server požadavek přijal, jen se omezení ztratilo na cestě k MLX. Aplikace, která výsledek rovnou předávala parseru nebo dalšímu nástroji, se proto nemohla opřít ani o syntakticky platný JSON. MLX runner jsme dříve popisovali u modelu Muse Glimmer; tehdy šlo o to, na jakém počítači a s jak velkými vahami běží. Nová změna se týká rozhraní mezi modelem a programem, který jeho odpověď čte.

Neplatný token dostane pravděpodobnost nula

Ollama problém neopravila dodatečnou kontrolou hotového textu. Do MLX sestavení přidala knihovnu XGrammar 0.2.5 a omezení uplatňuje už při dekódování. V každém kroku se sestaví binární maska nad slovníkem modelu. Logity tokenů, které by v daném místě porušily gramatiku, maska nastaví na záporné nekonečno; po převodu na pravděpodobnosti tak mají nulu a vzorkovač je nemůže vybrat.

Tento postup popisuje nezávisle na Ollamě také dokumentace XGrammar. Stavový matcher po každém přijatém tokenu připraví masku pro token následující. Tím hlídá i konec generování: ukončovací token dovolí teprve ve chvíli, kdy je objekt podle gramatiky celý.

V Ollamě jsou dvě podoby omezení. Hodnota "json" vyžádá objekt JSON, celé JSON Schema může navíc určit názvy polí, jejich typy, povolené hodnoty a zákaz dalších položek. Integrační test nové verze záměrně posílá modelu pokyn k obyčejnému pozdravu, ale současně schéma s poli colorcount. Výsledek musí navzdory pokynu projít schématem při běžném i proudovém výstupu a při nenulové teplotě.

Správný tvar ještě neznamená pravdivý obsah

Maska řeší strukturu, nikoli věcnou správnost. Když schéma dovoluje libovolný řetězec, může do něj model pořád napsat nesmysl. Ani povinné číselné pole nezaručuje, že model číslo správně spočítal. XGrammar proto doporučuje požadovaný tvar popsat také v samotném pokynu: omezení zasahuje až do vzorkování, zatímco dobře formulovaný pokyn posune rozdělení pravděpodobností správným směrem už před maskováním.

Nová součást se dodává jako dynamická knihovna ollama_xgrammar vedle MLX. Když v instalaci chybí, obyčejná inference má dál fungovat, ale strukturovaný požadavek skončí výslovnou chybou. To je bezpečnější než dřívější tiché pokračování bez omezení: aplikace pozná, že slíbený formát nemůže dostat.

Poloviční rychlost nezpůsobila samotná gramatika

Autor změny připojil vlastní měření na čipu M5 Max s modelem qwen3.8:27b-mlx, seedem 42, vypnutým přemýšlením a výstupem dlouhým 256 tokenů. Bez omezení naměřil přibližně 65 tokenů za sekundu, se schématem seznamu knih 32 tokenů za sekundu. Čas před prvním tokenem zůstal kolem 70 milisekund. Jde o měření autorů Ollamy, ne o nezávislý test.

Samotné porovnání 65 proti 32 by svádělo k závěru, že gramatika rychlost rozpůlila. Kontrolní běh bez spekulativního dekódování však dosáhl stejných 32 tokenů za sekundu a dvojice běhů se podle autora lišila o méně než 0,1 tokenu za sekundu. Strukturovaný režim totiž zatím návrhový model nepoužívá. Naměřená ztráta tedy připadá na vypnutou spekulaci; měřitelnou režii kompilace gramatiky autor v čase před prvním tokenem nenašel.

Pro uživatele z toho plyne jednoduchá hranice verzí. Kdo posílá JSON Schema modelům s příponou -mlx, potřebuje Ollamu 0.33.1 nebo novější. Tvar požadavku se nemění, mění se jeho účinek. Rychlost se zatím může proti obyčejnému generování snížit tam, kde model využíval spekulativní dekódování; z publikovaného jediného měření nelze odvodit, že stejný poměr platí pro jiné modely nebo počítače.

Zdroje

Diskuse

Zatím tu nikdo nediskutuje. Můžete být první.

Napsat příspěvek

Diskutovat můžete i bez účtu. S registrací se ale příspěvek zveřejní hned a nemusíte pokaždé vyplňovat jméno. Účet už máte? Přihlaste se.

Nezveřejňujeme ho, slouží jen redakci.

Podporuje zápis Texy: **tučně**, *kurzíva*, odrážky, odkazy.

Dál k tématu

  1. Nástroje

    Paseo ovládá z telefonu nativní CLI devětatřiceti agentních nástrojů

    Paseo pouští nativní příkazovou řádku cizích agentních nástrojů na stroji uživatele a ovládat se dá z telefonu, prohlížeče i desktopu. Model si nevybírá: rozhoduje o něm…

  2. Nástroje

    Claude sdílí paměť mezi chatem a cloudovým Coworkem

    Anthropic propojil paměť v chatu s cloudovými úlohami Coworku. Co si Claude uloží při rozhovoru, může použít při samostatné práci a poznatek z Coworku se vrátí do…

  3. Nástroje

    Ollama vypíná v Claude Code odpočet tokenů, protože jí rušil mezipaměť

    Ollama posílá ve vývojové větvi Claude Code novou proměnnou prostředí, po které nástroj přestane do rozhovoru vkládat zprávu s počtem zbývajících tokenů. Ta se totiž při…

  4. Nástroje

    MCP chce nástroje odkrývat postupně, celý katalog už model číst nemá

    Nový plán protokolu MCP počítá s tím, že model nebude před každým úkolem číst úplné definice všech dostupných nástrojů. Má je vyhledávat a načítat postupně, podobně jako…