Plainspeak Dial
Dial Gemma 4's prose from purple toward plain. A control vector for
google/gemma-4-26B-A4B-it and its fine-tunes.
Gemma 4 writes purple. It stacks ornate adjectives where a person would use one plain word, piles description onto every scene, and leans on the em-dash and the stage-direction beat until each passage carries the same overwrought register. Plainspeak Dial turns that register down. It is a single small file and one launch flag: no retraining, no prompt engineering, no tokens spent. Turn the dial up and the prose gets plainer and closer to how people actually write. Turn it below zero and it gets more florid on purpose.
What's the catch?
Almost nothing, which is the surprising part.
- Tiny. A 300 KB file, not a multi-gigabyte model.
- No slowdown. The dial is a fixed vector added to the model as it runs, so generation is exactly as fast as it was before.
- No VRAM cost, unlike a LoRA adapter.
- Changes nothing but the writing register. Your knowledge, your reasoning, and your character cards behave exactly as they did.
The upside, measured on a 250-story writing test scored against real human prose: at its recommended setting the dial closes about 26% of the style gap between the untouched model and human writing, and it does so with cleaner sentence rhythm, not the choppy prose that heavier settings produce.
Examples
Same story prompt, three dial settings. Left is plainer, the center is the untouched model, the right is turned toward purple. Prompts are quoted as written from the public WritingPrompts dataset.
Prompt: "You have a very shitty type of precognition."
| Plainer (1.0) | Untouched (0) | More purple (โ1.0) |
|---|---|---|
| "It isn't a vision of a grand disaster. I don't see the asteroid hitting the Earth, nor do I see the face of my future murderer or the winning numbers for the Powerball." | "The visions never come in grand, cinematic sweeps. There are no warnings of collapsing skyscrapers, no flashes of impending wars, and certainly no guidance on which lottery numbers to pick. My gift is much smaller, much more irritating, and fundamentally useless to anyone who isn't a professional nuisance." | "The visions never arrived as cinematic sweeps of destiny or golden threads of fate. There were no warnings of collapsing bridges or the faces of impending assassins. Instead, my gift manifested as the most aggressive, uncurated catalog of minor inconveniences imaginable." |
Prompt: "You are a lawyer at Genie Law, a law firm that specializes in writing out clients wishes in such a way that they will get exactly what they want from a potentially mischievous genie."
| Plainer (1.0) | Untouched (0) | More purple (โ1.0) |
|---|---|---|
| "The client sat across from me, his hands trembling so violently that the coffee in his cup was sloshing over the rim. He was a man who had clearly spent too much time on internet forums, reading horror stories about the "Monkey's Paw" effect." | "The brass lamp sat on my mahogany desk, looking less like a vessel of cosmic power and more like a tarnished piece of junk from a garage sale." | "The brass lamp sat on my mahogany desk, humming with a low, subsonic frequency that made the water in my glass ripple. It looked harmless, like an antique paperweight, but I knew better." |
Quick start
Download plainspeak-v2.gguf.
That one file is the whole thing.
You need a llama.cpp build and your Gemma 4 26B GGUF. Add one line:
llama-server -m gemma-4-26B-A4B-it.gguf --control-vector plainspeak-v2.gguf
That is it. There is no number to pick: the plain --control-vector flag loads
at 1.0, which is the recommended setting. Everything else about how you serve
the model stays the same, and API clients (SillyTavern and the like) need no
changes, because the dial is applied inside the server.
To use a different setting, name it explicitly, for example
--control-vector-scaled plainspeak-v2.gguf:0.8 for something gentler or
plainspeak-v2.gguf:-1.0 for the other direction. See the table below.
The dial
| Setting | What you get |
|---|---|
+1.4 and up |
Too much on base. Sentences fragment, and by +2.0 the model loops. |
+1.1 |
A touch stronger. Slightly plainer still, at a small cost in word variety. |
+1.0 |
Recommended, and the default. This is what the plain --control-vector flag gives you. |
+0.8 |
Gentler, more conservative. |
0 |
The untouched model. |
โ1.0 |
The other direction: more purple, richer, more ornate. |
Built on the standard base model, but it should work on any fine-tune of
google/gemma-4-26B-A4B-it. The vector is derived from the base model and
the settings above are tuned against it. Fine-tunes share the same underlying
shape, so the dial carries over. Where exactly it stops behaving is a property
of the specific model you serve, so on a fine-tune or a merge, try a few
settings before trusting a high one.
What it does, and what it doesn't
Does: shift the writing register. It suppresses the purple adjective and adverb habit, thins out the em-dash and stage-direction tics, and pulls sentence rhythm and word choice toward human-written prose. It also thins out one specific habit by about a third: the portentous reveal, the "it was not X, but Y" construction and its close relatives. All of that moves together as you turn the dial, which is what the examples above show.
It is worth saying what that is not. Cutting things is easy: a model that simply wrote less of everything would score well on any "avoids the bad habit" measure. So we also track two habits where human writing does more than the model, such as short punchy fragments, which humans use about four times as often. Those go up as you turn the dial, closing most of the gap to human. Moving in both directions at once is the part a merely damaged model cannot fake.
Doesn't: remove the specific recurring similes the model likes, such as "heart hammering against his ribs" or "like a trapped bird." No setting moves those, and we counted across 250 stories to be sure.
It also does not reach every recurring sentence habit. The clearest miss is the trailing descriptive clause ("he said, his voice dropping"), which this model uses more than twenty times as often as human writers do and which the dial barely touches. It is a habit of sentence construction rather than of voice, and this dial moves voice. Fixing it needs its own dial, which is on the list.
The line between those two is worth understanding, because it is not arbitrary. A recurring sentence pattern is a habit of register: it is spread thinly across every paragraph, so a dial that shifts register shifts it too. A recurring phrase is a single lexical choice that surfaces only in the few places it happens to fit, and a dial that applies evenly everywhere cannot pick it out. So this makes the register human. It is not a phrase blocklist.
For the curious: how it works
Everything below in more depth, plus the measurements that did not fit here, is
in FINDINGS.md:
the full dose curve, the sign control, the construction counts against human
prose, what the dial fails to reach and why, and a negative result we did not
ship.
What it is. A control vector: a per-layer set of direction tensors added to
the model's internal activations as it runs. This one covers model layers 8
through 28 (the earliest layers carry no reliable signal, and the final
outsized layer is left out). That range is baked into the file, so you do not
pass --control-vector-layer-range and cannot get it wrong: the layers outside
the range are stored as zeros and add nothing.
How it's built. It is the average difference in activations across 250 matched pairs: a human-written story as one pole, the base model's own generation on the same prompt as the other, both length-matched so that only the register differs. We used the average-difference method over two alternatives because it separated the two poles best at every layer when we measured it, not because it is the usual default.
The capture used a locally patched build of llama.cpp's control-vector generator. Two things it relies on, streaming capture (so it can read whole stories instead of just short openings) and per-class statistics, are our own additions and are not in the upstream tool.
The dial's range on the base model. Voice moves closer to human up to about
+1.1, then reverses. By +1.4 it is past the edge: sentence structure and
word variety fall apart even as a surface score misleadingly recovers, and by
+2.0 the model degenerates into repetition. Read the structural measures, not
the single distance number, near the edge.
The one honest cost at the recommended setting: word variety dips a hair below human. That is a small price for a clear win on how human the prose reads and how it flows.
It runs both ways. The axis is genuinely two-directional. A negative
setting walks every register signal the opposite way (more em-dashes, longer
sentences, less dialogue) without hurting coherence or word variety, so โ1.0
is a real "more purple" setting rather than an accident.
How it was measured
Every number here comes from generated prose scored against real human writing, not from a preference score or a model's opinion.
- Voice is a character-level distance between the model's prose and human prose on the same prompts, over 250 stories per setting.
- Coherence is a mechanical pass/fail check on a separate 24-prompt battery run with reasoning on, catching the failures a style score cannot see: dropped constraints, truncated replies, repetition loops.
- Structure counts specific sentence patterns per thousand words, against the same human corpus, so a pattern the dial reduces can be compared to how often people actually use it.
The prompts and the human comparison texts are drawn from the public WritingPrompts dataset.
License and provenance
Inherits the base model's license (Gemma Terms of Use), which also governs the base model's generations that this vector was derived from. It contains no model weights and no text: it is 29 direction vectors of 2816 floats, of which 21 are non-zero.
- Downloads last month
- 35
We're not able to determine the quantization variants.