A Bulgarian language model, running in your browser

This page has three live tools: continue Bulgarian text, choose which of two sentences sounds more natural, and look inside one short continuation. The model runs in your tab, so your text does not leave your machine. Loading the model…

Generate — the model writing Bulgarian, in your tab

A base language model with 13.77M , shrunk by and running locally through . Nothing is sent anywhere. It writes fluent, locally coherent Bulgarian and confidently invents facts — that is what a model this size is, not a bug to be fixed.

София е столицата на България и

Judge — the same trick the flagship is measured good at

The same model, used the other way round: instead of writing text, it reports how surprised it is by text you give it (, lower = more natural). That surprise number is what fluency judging runs on: 92.3% preference accuracy on 26 real Bulgarian grammar and spelling error/correction pairs (statistically on par with Gemini as a judge) — measured on the 91M sibling, not this 13.77M model.

What you are driving below is the same trick at a smaller, faster, un-benchmarked size — a demo of the mechanism, not a separately validated result. Twenty-six pairs is a small test either way: the 95% interval on that 92.3% figure runs from 81% to 100%.

It will answer whatever you type, including where it has no business having an opinion. It judges fluency within Bulgarian. It is not a gibberish detector, and Latin script barely surprises it at all: the sparse-autoencoder study went looking for a script feature in this model and found none, because a Bulgarian-web corpus gives it no reason to learn one. So a pair of Latin-script nonsense strings will still get a confident winner, and that verdict means nothing. why the feature is missing →

One more limit on that 91M number, because it is easy to over-read: it is a pairwise comparison. Used instead to pick the best of several candidates, the same 91M judge drops to 76.9% top-1.

Read perplexity down a pair, never across pairs. The verdict uses it because that is what the 92.3% measures, but the absolute value depends on how the happens to cut the words up. Compare the two presets below: the school sentence scores around 205 and the БСП one around 16, and the second is not thirteen times more natural.

It is 14 mostly tiny word pieces, and some are nearly free once the first piece has landed. The school sentence is six whole words, where every prediction is a real choice. is printed beside it for exactly this reason: it divides by characters instead of word pieces, so that split no longer distorts the comparison. It reverses that pair — 1.13 bits/char for the school sentence against 1.45 for the БСП one.

Look inside — the same instrument, a bigger model

This points the same viewer at a bigger model: attention arcs, the 36-head grid, and a live . A second, ~30 MB file loads the first time you trace something.

What compression costs — measured, not assumed

Shipping a model to a browser means shrinking it. Ours goes from 68 MB to 17 MB by storing each weight more coarsely. The obvious worry is that the rounding makes the model worse, and the usual remedy is an extra training stage that teaches the model to tolerate it.

We measured instead of assuming. On the same external Bulgarian text every other number in this project is measured against, the rounded model costs +0.0018 bits per character (2.0620 → 2.0638) — roughly a fiftieth of what simply training on a better mix of text buys. So the extra training stage was skipped, and the null written down.

The honest limits