Which LLMs Write Alike

title
Which LLMs Write Alike
type
summary
summary
Typebulb notebook that maps which LLMs write alike by cross-entropy over character trigrams
tags
llm, evaluation, stylometry, information-theory
created
2026-07-29
updated
2026-09-14

"You're relatively right!" is a Typebulb bulb — a runnable notebook, not an article. What the source file contains is a React component, a stylesheet, a config block, and a baked data snapshot of model responses; the only prose in it is the tooltip copy and a "What this measures" tab explaining the math. There is no results section, no argued conclusion, and no table of findings. The corpus was truncated during ingest (the original data block runs 1,924 lines, roughly 790 KB), so the vault copy holds the method in full and only the first two responses of the input data.

That shapes what this page can say. The method is completely specified and worth recording. The findings are not in the file, because the findings are computed in the browser when the notebook runs.

The measurement

Every response a model wrote in the parent evaluation (both turns, where the test had two) is pooled into a single corpus per model. Each corpus is turned into a probability distribution over character trigrams — overlapping three-character windows. That is a crude language model of each model's prose, built from thousands of samples rather than from the eval's handful of judge scores.

Cross-entropy H(P, Q) = −Σ P(g)·log₂ Q(g) then asks how many bits of surprise per trigram one model's style model suffers while reading the other's text. It decomposes as H(P, Q) = H(P) + KL(P ‖ Q): the writer's own entropy plus the mismatch between the two styles. The matrix plots the mismatch alone, which is the KL divergence, formally relative entropy — the pun the bulb is named for. Each model's own entropy is shown separately as a small chip beside its row label.

Three implementation choices matter for reading the map:

Smoothing. Each model's distribution is interpolated with the pooled all-models distribution at λ = 0.8, so no trigram ever has probability zero and the cross-entropy stays finite. The diagonal is set to zero explicitly, since KL(P ‖ P) = 0 by definition and self-comparison should not pay the smoothing tax.

Symmetry. KL is directional in principle. The notebook computes both directions, reports the mean absolute asymmetry against the mean divergence, and displays the Jeffreys average of the two, which is why only the lower triangle is drawn. The raw directions stay available in the pair panel.

Style, not stance. The comparison is over wording — vocabulary habits, formatting tics, register — never over the positions a model takes. The explainer names verbosity as a confound and family resemblance within a provider as an expected effect rather than a discovery.

Shared tells, and the statistics under them

A similarity number by itself is not evidence anyone can inspect, so each pair also gets a list of terms both models lean on that the rest of the field rarely uses. A term qualifies only if it clears four filters. Both models must use it at least three times. The lower of the two rates must be at least twice the field's rate, where the field is the pooled corpus with both models subtracted out. It must sit outside the corpus's 250 most common words. And it must pass a rarity screen borrowed from the models' own machinery: BPE tokenizers are frequency-trained, so "the" costs one token while "congratulatory" costs four, and a word must cost at least two tokens (a phrase at least three) to count. One fixed vocabulary, GPT-4's cl100k_base, is applied to every model alike so the screen doesn't advantage anyone's own tokenizer.

A fifth filter separates habits from bursts: the term must appear in at least two separate answers per model. Five uses inside one answer is a topic, not a tic.

Surviving terms are ranked by corrected surprise. For each model, the notebook computes the Poisson tail probability of hitting its observed count while writing at the field's rate, multiplies the two, takes −log₁₀, and then subtracts log₁₀ of the number of candidate terms scanned as a look-elsewhere correction. That correction is why even distant pairs still show a pale chip or two. The result is displayed as "luck alone: ≈ 1 in N", with the tooltip copy stating explicitly that this is the chance luck would produce the pattern, not the chance the pattern is luck — the inverse-probability trap, named and avoided in the source. The stated caveat is that word occurrences are not independent (topics make words recur), so the scale should be read as a calibrated ranking rather than as exact p-values.

What counts as a finding

The notebook auto-detects at most three findings using the data's own threshold rather than a hand-picked one: a cross-lab pair fires as a finding when it sits closer than the median same-lab pair. Models are grouped by their true lab, since OpenRouter is a router rather than a maker — Kimi resolves to Moonshot, GLM to Zhipu, DeepSeek to DeepSeek, Grok to xAI (SpaceXAI since July 2026, treated as one lineage). The lab mapping and release dates live in the data block, open to audit.

Release dates supply the only directionality available. The math can say two models write alike; it cannot say who learned from whom. "Shipped after" establishes whose public outputs existed first, which the source describes as a proxy for the honest arrow, each model's training-data cutoff.

The Kimi–Anthropic result

The notebook opens with Kimi K3 focused and the K3 ↔ Fable 5 pair pinned, degrading to an empty selection if either model is absent from the data. That default is the closest thing the source has to a claim: an Anthropic model and Moonshot's kimi-k3 are similar enough in prose style to be worth putting on screen first. It is a hardcoded starting view in the UI code, not a conclusion the author argues, defends, or attaches a number to anywhere in the file. Anyone repeating "Kimi writes like Claude" from this source is repeating a result they would have to run the notebook to obtain, and the divergence figure, the ranking against same-lab pairs, and the shared tells that would make it evidence are all computed at load time and none of them are written down.

Two later sources look at the same pairing with instruments that do report numbers. The appendix of stealing-reasoning-traces-from-proprietary-llm-apis finds K3 reacting unusually strongly to Anthropic reasoning traces, and anthropic-threat-report-september-2026 names Moonshot among the labs it says distilled Claude. Neither settles it — the paper says so itself, and the report publishes no method — but a resemblance this notebook only hints at is now a claim someone has made in writing. llm-distillation covers the rest.

The model set

The data is one run of the parent eval, "You're absolutely right!", in which 22 models answered the same prompts under identical conditions, timestamped 2026-07-18. The eval's judge scores ride along in the snapshot and are never used; only the words are. Because the corpus was truncated during ingest, the full 22-model roster cannot be recovered from the vault copy. What is visible: Anthropic's Fable 5 and Haiku 4.5 as subjects and Gemini 3 Flash as the eval's judge, plus Kimi K3 by name in the default-view code, plus the labs the true-lab mapping bothers to handle — Moonshot, Zhipu, deepseek, and xAI.

Why this is a different instrument

Every other measurement in the vault scores models against a task. structured-output-benchmark scores schema-conformant extraction, benchmarking-opus-5-slopcodebench scores whether a codebase survives requirements it was never told about, swe-1-7 is a model positioned by its numbers on coding benchmarks. This measures nothing about capability. It looks only at how a model writes, which makes it the quantitative counterpart to the surface-reading arguments in slop-marker-convention and credibility-as-slop-test — both of which conclude that you cannot identify generated text from its surface. A trigram divergence map does not contradict that; it says two models' surfaces resemble each other, which is a different question and one the source's own explainer is careful to bound as style, never stance.

Notebook: typebulb.com/u/lab/you-re-relatively-right. The full eval run is embedded in the bulb's data block, so the analysis is reproducible from that one file.