← Research·Experiments·

De-slopping Qwen3-4B: a sampler beats steering, a LoRA keeps most of it, and an LLM judge prefers the slop

Chat models write in a voice people now spot at once: em dashes, “it’s not X, it’s Y”, lists of three, questions they answer themselves. This note tries every way to take that voice out of one small open model (a prompt, a sampler, steering, neuron edits, a distilled LoRA), measures each against human prose, an independent metric and the damage it does, releases the toolkit and the model, and adds two things people asked for next: writing in a chosen person’s voice, and a plain answer to whether AI-text detectors still catch the result.

A soft, warm illustration on cream paper: a small green computer-chip robot with gold pins, round dark eyes, rosy cheeks and a smile sits at a low wooden desk and writes with an oversized pencil covered in fluffy peach fur; a scribble and wavy lines on the paper, a potted plant and a pot of pencils beside it, and wisps of fur on the floor.
Cover: a little chip robot writing with a furry pencil, a machine trying to write like a person. An original character. Made with an image model (gpt-image-2) from the prompt in make_cover.py.
Author
Albert Lie · · LinkedIn
Models
Qwen3-4B-Instruct-2507; 100toolkit’s qwen3-4b-deslop-v4 for comparison; gpt-5.4-mini as the judge
Data
48 held-out prompts (10 topics × 4 genres, plus 4 emails and 4 personal reflections); 318 human passages (Project Gutenberg, public domain; Wikipedia 2021, CC BY-SA)
Code
experiments/deslop/ and the toolkit, packages/deslop
Model
albertlieadrian/qwen3-4b-deslop (LoRA, merged, GGUF)
Results
results/table.csv and the files listed in README.md
Summary: the short answer and the key results

In short

What is the cheapest way to take the chat-assistant voice out of a small open model, and what does it cost?

At runtime, a plain-style system prompt plus a backtracking sampler. On 48 prompts never used for tuning, Qwen3-4B-Instruct-2507 scores 89.7 [76.9, 103.7] weighted habits per 1000 words, where 90% of human passages score 33.6 or less. Prompt plus sampler brings it to 13.5 [11.2, 15.9], with 47 of 48 replies inside the human band, without changing a single prediction of the model. Steering along an “assistant register” direction gets only to 57.1 before the text breaks, and moves the model’s predictions on human prose more than any other single method. A LoRA distilled from the prompt-plus-sampler teacher keeps most of the gain with no prompt at all (21.5 [18.0, 25.2]) and passes more task checks than the original, but 100toolkit’s released model goes further (9.2 [7.1, 11.6]). EQ-Bench’s independent slop score agrees on the order (Spearman 0.84). A blind LLM judge, which passed every sanity check, still preferred the original model’s reply over every method’s in most pairs. And none of it hides the text from AI detectors: three open detectors, set to flag 1% of human passages, still flag 85% to 100% of every de-slopped setup’s replies, and EditLens, which measures how much AI edited a text, calls none of them human: de-slopping moves text from “AI-generated” toward “AI-edited”, not toward human. Rewriting in a public-domain writer’s voice from three samples moves the text only a little toward that writer.

Key results

What we testedResult (48 held-out prompts)Compared with
Can a runtime method reach the human band without changing the model?Yes: prompt + backtracking sampler 13.5 [11.2, 15.9]; 47 of 48 replies in the band; KL drift 0 by constructionOriginal 89.7 [76.9, 103.7], 3 of 48 in the band; human median 12.8
Does steering do the same job?Not as well: best fluent setting 57.1 [47.9, 66.7], the largest KL drift of any single method (0.67 nats per token), lexical diversity down from 0.81 to 0.68A random direction of the same size: 79.1 [68.7, 90.5]
Do 100toolkit’s four neuron flips replicate?On their target, yes: “not X but Y” falls from 56 to 14 across the 48 replies, at KL 0.002Four random neurons flipped: 51
Does a LoRA keep the gain with no prompt?Mostly: 21.5 [18.0, 25.2], 38 of 48 in the band, task fit 47 of 48 (original 39), KL 0.11, quiz 30 of 30100toolkit’s v4: 9.2 [7.1, 11.6], 47 in the band, task fit 43, KL 0.16
Does an independent metric agree?On the order, yes: EQ-Bench slop score (slop-score’s own code), Spearman 0.84 over 13 setups. It catches one overfit: the sampler alone cuts our score by 70% but EQ-Bench’s by 19%Human passages: 5.0 (Gutenberg), 1.4 (Wikipedia); original 43.4
Does a blind LLM judge call the result better writing?No: every method lost more pairs than it won against the original (win rates 0.04 to 0.47). The judge passed 40 of 40 sanity pairs but could not pick Wikipedia over Qwen as the human writer (0 of 20)The author, reading 12 pairs blind: preferred our LoRA in 5 of 6, the original over 100toolkit’s model in 4 of 6
Does de-slopping hide text from AI detectors?No: at thresholds that flag 1% of the 318 human passages, Desklib’s classifier, Binoculars and Fast-DetectGPT flag 85% to 100% of every setup’s replies, 100toolkit’s model and ours includedHuman passages: 0% to 7% flagged. Human text lightly edited by Qwen: 0% to 10%, the detectors’ blind spot
How much AI does EditLens see in each setup?Never “human”: 0 of 48 replies for every setup. The share it calls fully AI-generated falls from 77% (original) to 50% (prompt + sampler), 54% (our LoRA) and 8% (100toolkit’s model, 92% “AI-edited”)Its release reproduced (test-split ternary macro-F₁ 0.881). It also calls 22% to 36% of our older human passages “AI-edited”
Can deslop voice write in a given writer’s voice from three samples?A little: gpt-5.4-mini’s rewrites make the target the nearest of five writers in 17 of 50 cases, and keep all 18 numbers; most still read nearest to Qwen (34 of 50). Our LoRA ignores the samples (9 of 50)The original replies: 10 of 50 (chance). The writers’ own held-out passages: 52 to 63 of 100 attributed right

01Introduction

Ask Qwen3-4B for a LinkedIn post about remote work and it opens: “Remote work isn’t just a trend—it’s a transformation in how we approach productivity, flexibility, and work-life balance. 🌍💡” In one sentence that is a contrast frame, an em dash, a list of three and two emoji, and the post ends with five hashtags. The LoRA trained in this note, given the same request and no system prompt, writes: “I believe remote work is a better way to live and work. It gives people more control over their time and helps reduce stress from commutes and office politics.” The first scores 190 on the toolkit’s scale; the second 26.

What is known. These habits are measurable. Kobak et al. counted excess words in 15 million PubMed abstracts the way epidemiologists count excess deaths (“delves” at 28 times its expected rate). EQ-Bench’s slop-score ranks models by over-used words, trigrams and “not X but Y” constructions. Paech et al.’s Antislop removes such patterns at inference time with a backtracking sampler, and in the weights with a preference method trained on the sampler’s choices. And Erik Markus Kannike’s qwen3-4b-deslop took Qwen3-4B from 121 to 12.5 on a style-guide score by distilling a runtime setup (steering, four neuron flips and a plain-style prompt) into a LoRA, with the lesson that the lowest score at first wrote badly until task checks were added.

What is missing. Each source tries one family of method. Nobody has put the prompt, the sampler, steering, neuron edits and distillation on the same model, the same prompts and the same scale, with the same damage checks, and asked an outside metric and an outside judge whether the result is better.

On one model, which way of removing chat-assistant writing habits gets closest to human prose, and what does each cost in drift, task fit and judged quality?

What this note does. It builds the scale, runs every method on 48 held-out prompts, and puts every number beside a control. Its contributions:

  1. A toolkit, deslop: a habit score with every match highlighted and a band measured on human prose, task-fit checks, a backtracking sampler, and steering and neuron-edit hooks (pip-installable; the scorer needs only the standard library).
  2. A measured comparison of five methods and their combinations, with KL drift, a quiz, task fit, an independent metric and a blind judge.
  3. A released model, qwen3-4b-deslop (LoRA, merged weights and a GGUF for Ollama), and an honest comparison with 100toolkit’s, which scores lower.
  4. A negative result about judges: an LLM judge that passes sanity checks prefers the slop and cannot tell human prose from the model’s.
  5. A voice tool, deslop voice (profiles, Burrows’ Delta, blends, a fact-keeping rewrite), tested on five public-domain writers with two attributors checked first.
  6. A detector measurement: EditLens’s “how much AI” model (reproduced on its own test split) and three open detectors on every setup, calibrated on human prose, with a set of human passages lightly edited by the model; plus a Qwen3-4B LoRA detector trained on EditLens’s data, kept private.

What would count as an answer. Set before any generation:

  1. Every method is scored once on 48 held-out prompts; anything tuned (the steering layer and strength, the LoRA recipe) is tuned on training prompts only.
  2. The score is read against human prose, not against zero, and an independent metric (EQ-Bench’s slop score, with its own code) must order the methods the same way.
  3. A method must not buy its score with damage: the quiz kept, task fit no worse than the original’s, drift on human prose reported beside a random control of the same size.
  4. The judge is checked on pairs with a known answer before its verdicts are read.
  5. Detectors measure; they never choose. No method, setting, teacher reply or rewrite was picked by a detector’s score.

02Setup

2.1 What counts as a habit, and how often people use them

The score counts eleven habits, each a regular expression or word list, and adds their weights per 1000 words. The list follows 100toolkit’s style guide, Wikipedia’s Signs of AI writing, and 100toolkit’s second-round lessons. A habit is a pointer, not a verdict: the last two columns show people use most of them too. The last three columns are occurrences per 1000 words: Qwen3-4B’s replies to the 48 held-out prompts, the Gutenberg essays, and the Wikipedia passages.

HabitExampleWeightQwen3-4BGutenbergWikipedia
Em dash“a trend—it’s a shift”116.63.91.2
Not X but Y“It’s not a tool, it’s a mindset”35.30.90.1
List of three“faster, cheaper, and better”123.45.010.5
Question answered on the spot“The result? Happier teams.”21.00.20.0
Signpost“Here’s the thing:”, “Let’s dive in”20.40.00.0
Stock phrase“plays a crucial role”, “in today’s fast-paced world”20.50.00.0
Emphasis fragment“Every time.” inside a paragraph10.90.60.5
“, which” chain“…the desk, which freed the window”10.80.92.0
Slop worddelve, tapestry, seamless, resilience113.11.11.7
Markdown or emojiheadings, bold, bullets, #hashtags, 🚀18.60.00.0
Study, statistic or expert“According to a 2023 study, 68%…”20.20.31.3

The word list has 89 entries: 79 from Kobak et al., Wikipedia’s guide and EQ-Bench’s list, and 10 words Qwen3-4B used across many topics in its replies to the training prompts but rarely or never in the human passages (“resilience”: 51 uses across 24 topics, none in the human passages; “quiet”: 161 uses across 41 of 48 topics, 8 in the human passages). Words over-used only because the human passages are old (“digital”, contractions) or because of the topic were left out.

2.2 A score by hand

Take these two sentences, 17 words: “Remote work isn’t just a trend—it’s a revolution. Here’s the thing: flexibility, autonomy, and trust matter.” They hold one not-X-but-Y (3 points), one em dash (1), one signpost (2) and one list of three (1): 7 points in 17 words, which is 7 × 1000 / 17 = 412 per 1000 words. A plain rewrite, “Remote work has changed how we work. Flexibility and trust matter most.”, holds none of them and scores 0. Real replies of about 250 words mix both kinds of sentence, which is how the original model lands near 90.

2.3 Prompts and human prose

SetWhat it isSizeUsed in
Held-out prompts10 topics (remote work, public libraries, sleep…) × blog, LinkedIn, explainer, opinion; plus 4 emails and 4 personal reflections on the same topics. Each asks for a length (120 to 250 words)48Every number in section 4
Training prompts48 other topics (coffee, chess, beekeeping…) × the same six genres288The direction, the slop-word additions, the teacher data
Dev promptsThe first four training topics × six genres24Choosing the steering setting and the LoRA recipe
Human passages260 passages of 150 to 400 words from 13 Project Gutenberg books of essays, memoirs and explanation (Chesterton, Woolf, Twain, Addams, Russell…), public domain in the US; 58 passages from 29 Wikipedia articles as they stood on 1 June 2021, CC BY-SA 3.0318The human band; KL drift (24 of them)
Quiz30 short factual questions (capitals, dates, arithmetic), scored by whole-word match30Damage check

The human band: on the 318 passages, the score has a median of 12.8 (Gutenberg 12.4, Wikipedia 17.1) and a 90th percentile of 33.6. A reply is in the band when it scores 33.6 or less. Neither human source is modern conversational prose; section 7 says what that leaves out.

2.4 The methods

MethodWhat changesSettings
Plain-style promptA system prompt: do the task first (state a position, write in the first person, greet), then a list of habits to avoid (Appendix)Fixed before any run
Backtracking samplerWhich samples are kept. When an em dash, not-X-but-Y, a signpost, a stock phrase, a slop word, markdown, an invented claim or “, which” completes, step back to the token where it began, ban that token there, sample again (up to 300 backtracks per reply)The model’s own sampling settings
SteeringAdds a direction to the residual stream at one layer, at every position. The direction is steerlab’s difference of means between the model’s own replies to the 288 training prompts and its replies under the plain-style promptLayer 12 of 36, strength −4 class gaps (chosen on dev)
Neuron flipsMultiplies four MLP neurons by −1: L32.N4852, L33.N348, L28.N1121, L32.N5418, the ones 100toolkit found for “not X but Y”As published
LoRA distillationThe weights. A teacher (prompt + sampler) writes three replies per training prompt; replies that pass every check and score under the human median are kept; a rank-16 LoRA on every projection learns them from the bare promptRound 2 recipe, chosen on dev: all 557 passing replies outside the dev topics, 2 epochs
100toolkit’s v4erikkannike/qwen3-4b-deslop-v4, merged weights with its four flips baked inAs released

Every run samples one reply per prompt at the model’s own settings (temperature 0.7, top-p 0.8, top-k 20, no repetition penalty), seed 0, up to 512 new tokens, with no system prompt unless the method is a prompt.

2.5 Why Qwen

2.6 Voices and detectors

Voices. Five writers whose work is public domain in the US, from Project Gutenberg: Mark Twain (essays; Life on the Mississippi), Abraham Lincoln (papers and letters, 1858-1865), Charles Darwin (The Voyage of the Beagle; On the Origin of Species), Virginia Woolf (The Common Reader, 1925) and G. K. Chesterton (two essay collections). For each, 30 paragraphs of 120 to 400 words build the profile and supply the examples; 20 more are held out. A sixth profile, “qwen”, comes from the original model’s replies to 30 training prompts. A profile holds the rates of the 150 most frequent function words, sentence and paragraph lengths, punctuation per 1000 words and favourite openers. Burrows’ Delta is the mean absolute difference between a text’s function-word z-scores and a profile’s, with z-scores taken against the 318 human passages; lower is closer.

The test: 10 of the original model’s held-out replies, each rewritten toward each of the five writers and a 50/50 blend of Twain and Darwin, by gpt-5.4-mini and by our LoRA, from the same messages (three samples, the profile in words, the text, an instruction to keep every number, name and negation). A control rewrites the same 10 texts in plain style with no samples. Two attributors were checked first on the held-out passages (100 by the writers, 30 Qwen replies): nearest profile by Delta got 82 of 130 right (52 of 100 writer passages), and a logistic regression on the same features 93 of 130 (63 of 100); chance is 1 in 6.

Detectors. Pangram’s and GPTZero’s published methods suggested the setup: score per text, fix the false-positive rate on human writing first, and include “mirrors”, human texts touched by a model. Three open detectors: Desklib’s classifier (DeBERTa-v3-large fine-tuned on RAID, MIT licence), Binoculars and Fast-DetectGPT (both on Falcon-7B and Falcon-7B-instruct, as in their papers). Each gets a threshold that flags 1% of the 318 human passages; the published thresholds are reported too. Known answers: the 318 human passages and the 100 held-out writer passages (should not be flagged), the original model’s replies (should be), and 40 mirrors, human passages the original model lightly edited for clarity.

EditLens (Thai et al., ICLR 2026) asks a finer question than “AI or not”: how much did AI change this text? It is trained on human texts, AI edits of them at many strengths and fully generated texts, with labels from how far each moved in meaning. The released editlens_roberta-large sorts a text into four buckets of AI editing; its score is the expected bucket, from 0 (untouched) to 1. The authors’ ternary protocol calibrates two cut points on their val split, and this note uses them as published: below 0.096 is human, above 0.998 is AI-generated, between is AI-edited. A third cut flags 1% of our human passages. Licence: the EditLens model, code and data are CC BY-NC-SA 4.0, non-commercial; this note uses them for research, commits none of their data, and releases nothing trained on it. Access was granted on request on 10 November 2026; Meta’s approval for the Llama-3.2-3B base of the second EditLens model is pending, so that model is not run.

2.7 Measures

Intervals are 95% percentile bootstraps over the 48 prompts (10,000 resamples); differences from the original are paired by prompt.

03How the study was run

  1. Goal and design written first: one model, the methods above, the held-out set, the human band, the damage checks, EQ-Bench as the outside metric, a blind judge.
  2. Scorer and band: 11 detectors with unit tests (41 tests, including human sentences that must score zero); 318 human passages scored.
  3. Inputs: the original model and the plain-style prompt on the 288 training prompts (576 replies), for the direction and the slop-word additions. The scorer was frozen after this step.
  4. Steering: the direction at layers 12, 18 and 24; a sweep of 27 settings plus none on the 24 dev prompts (672 replies).
  5. Teacher and LoRA: 864 teacher replies (3 per training prompt), 608 kept; round 1 trained on 260 (the best per prompt); round 2 compared three recipes, trained without the dev topics, on dev.
  6. Held-out runs: 13 setups × 48 prompts = 624 replies, each scored once.
  7. Added after the first publication, at the user’s request: the voice test (250 writer passages, 130 rewrites, $0.19 of API) and the detector measurement (1,212 texts on one GPU), and a new cover.
  8. Damage and judge: KL on 24 passages and the 30-question quiz per setup; the judge’s 40 known-answer pairs, then 12 setups × 48 prompts × 2 orders (1,152 verdicts); 12 pairs read by the author with labels hidden.
Fixed before any trialChanged after reading replies
The model; the 48 held-out and 288 training prompts; the plain-style prompt; the habit list and weights (frozen before any held-out reply was scored); the human sources; the sampler’s banned habits; the steering layers and the rule for choosing a setting; the teacher, its filter and the LoRA recipe for round 1; the damage checks; the judge’s question and its known-answer checkThe steering sweep first stopped at −1.5 class gaps, where every setting was still fluent and the best sat on the grid’s edge; strengths −2 to −6 were added. The first sampler run used an earlier version of the detectors (before an abbreviation fix and the data-driven words); it was rerun after the scorer was frozen, and the rerun is reported. LoRA round 2 was added after round 1 kept “not X but Y” that its teacher never wrote; its recipe was chosen on dev, not on held-out prompts. The “reads as human” judge question was added after the first verdicts, and dropped when the judge failed its check. The voice and detector sections were added after the first publication; their designs (writers, inputs, rewriters, thresholds at 1% human false positives) were fixed before any rewrite or detector score was read, and the relative attribution test (nearest of five writers) was added after seeing that the writers’ own passages sit farther from their profiles than Qwen’s replies do

Conditions: Qwen3-4B-Instruct-2507 in bfloat16 with Hugging Face transformers 5.20 on Modal (an L40S for most of it, an A10G or A100 when none was free, an A100 for the detectors and an H100 for the Qwen detector), $13.38 of GPU in all; EditLens’s RoBERTa-large ran on the laptop; each LoRA trained in a few minutes; the GGUF export on CPU. Scoring, EQ-Bench (Node.js) and figures on a laptop. The judge, gpt-5.4-mini through OpenAI’s API, used 905k input and 150k output tokens across all checks and runs, about $1.50.

04Results

Eight findings:

  1. 4.1 A plain prompt plus the sampler reaches the human band at runtime, with no drift.
  2. 4.2 Steering is the costliest way to do it; 100toolkit’s neuron flips work on their target only.
  3. 4.3 A distilled LoRA keeps most of the gain in the weights; 100toolkit’s goes further.
  4. 4.4 EQ-Bench’s score agrees on the order, and catches the sampler fitting our list.
  5. 4.5 Each method removes different habits, and the prompt adds one.
  6. 4.6 A blind LLM judge prefers the original, and cannot tell human prose from Qwen’s.
  7. 4.7 AI detectors still flag every de-slopped setup.
  8. 4.8 A voice rewrite moves text a little toward a writer, not to them.

4.1 A plain prompt plus the sampler reaches the human band at runtime, with no drift

The prompt alone halves the score (89.7 to 44.2 [39.4, 49.3]); the sampler alone takes it to 27.3 [22.9, 31.8]; together they reach 13.5 [11.2, 15.9], about the human median, with 47 of 48 replies in the band. The sampler steps back 40 times per reply on average without the prompt and 8 times with it; one sampler reply of 48 hit the 512-token cap. Because it only chooses among the model’s own samples, its KL drift is zero, and the quiz stays at 30 of 30. Its costs are speed (one token at a time, with rewinds) and a ceiling: it can only ban what the detectors see (section 4.4).

Dot plot of the mean deslop score with 95% intervals for 13 setups. From lowest: 100toolkit's model 9.2, prompt plus sampler 13.5, our LoRA round 2 21.5, round 1 24.1, sampler 27.3, prompt plus steering 29.3, prompt plus neuron flips 33.3, plain prompt 44.2, steering 57.1, 100toolkit's neuron flips 73.6, random steering 79.1, random neuron flips 85.5, the original model 89.7. A shaded band from 0 to 33.6 marks the human range.
Figure 1. Mean deslop score per reply on the 48 held-out prompts, with 95% bootstrap intervals over prompts. Orange: methods; hollow grey: controls of the same size (a random direction, four random neurons); black: the original model and 100toolkit’s released model. Shaded: the human band (90% of 318 human passages score 33.6 or less). Drawn by make_figures.py.

Task fit stays high with the prompt (47 of 48 replies pass every check, against the original’s 39). The original model fails on opinion pieces: it writes a balanced essay with no position in 9 of 10. The plain prompt fixes that in all but one. The sampler alone fails all 10, because nothing in it asks for a position.

4.2 Steering is the costliest way to do it; 100toolkit’s neuron flips work on their target only

The register direction lowers the score, but only to 57.1 [47.9, 66.7] at the strongest setting that stayed fluent on dev (layer 12, −4 class gaps), against 79.1 for a random direction of the same size. Its KL drift on human prose, 0.67 nats per token, is the largest of any single method, and its lexical diversity drops from 0.81 to 0.68. Steering does change the register: at layer 12 the replies get shorter sentences and simpler words (“Put the filter in the machine, add ground coffee, and turn it on”). But it raises “not X but Y” (section 4.5), and one step stronger, or at layer 18, replies stop being fluent (Figure 2). With the prompt added, steering reaches 29.3, still worse than the prompt plus the sampler, at the largest drift measured (1.32).

Line chart of the mean deslop score on 24 dev prompts against steering strength from -0.25 to -6, for layers 12, 18 and 24. Unsteered: 80.2. Layer 12 falls slowly to 51.5 at -4 and stays fluent; layer 18 falls to 37.6 at -3 but only 12 of 24 replies are fluent, then collapses; layer 24 falls least.
Figure 2. The steering sweep on the 24 dev prompts (training topics): mean deslop score by strength, one line per layer. Filled markers: at least 22 of 24 replies fluent; hollow: fewer. The square marks the chosen setting (layer 12, −4). The dashed line is the unsteered model on the same prompts (80.2). Drawn by make_figures.py.

100toolkit’s four neuron flips do what they were found for: across the 48 replies, “not X but Y” falls from 56 to 14 (four random neurons flipped: 51), and em dashes from 175 to 115, at a KL drift of 0.002. They leave the rest of the voice alone, so the overall score only moves from 89.7 to 73.6. Replies with an invented study or statistic rose from 2 to 11 of 48, mostly “Studies show”; with 48 prompts that is a pointer, not a finding.

4.3 A distilled LoRA keeps most of the gain in the weights; 100toolkit’s goes further

Trained on the prompt-plus-sampler teacher and given no prompt, our round-2 LoRA scores 21.5 [18.0, 25.2], with 38 of 48 replies in the band, task fit 47 of 48, KL drift 0.11 and the quiz at 30 of 30. 100toolkit’s v4 scores 9.2 [7.1, 11.6], with 47 in the band, task fit 43 and KL 0.16. Their model is plainer by our measure and by EQ-Bench’s (5.1 against our 21.8); ours moves the model’s predictions on human prose less and fails fewer task checks (it states a position in 9 of 10 opinion pieces; theirs in 5).

Two scatter plots against the deslop score. Left: KL drift on human prose, on a symlog scale, highest for prompt plus steering (1.32) and steering (0.67), about 0.32 for the plain prompt, 0.16 for 100toolkit's model, 0.11 and 0.08 for our LoRAs, and zero for the sampler runs. Right: the judge's win rate against the original, below 0.5 for every method, lowest for prompt plus steering (0.04) and 100toolkit's model (0.06), highest for the random and 100toolkit neuron flips (0.47, 0.43).
Figure 3. What each method costs. Left: KL drift on 24 human passages (nats per token; symlog axis, so zero is shown). Right: the blind judge’s win rate against the original model on the 48 prompts (0.5 = level; ties count half). Each point is one setup; hollow grey: random controls. Drawn by make_figures.py.

The student does not copy all of its teacher. The teacher’s kept replies averaged 3.6 and held no “not X but Y” at all (the sampler bans it), yet round 1 wrote it 3.4 times per 1000 words, about two thirds of the original’s 5.3. Round 2, trained on all passing teacher replies rather than the best one per prompt, scored 16.2 on dev against 22.8 for round 1’s recipe, and 21.5 on the held-out prompts against round 1’s 24.1: a small gain inside the intervals. The habit comes back from the bare prompt, which the teacher only ever answered with its system prompt in place.

4.4 EQ-Bench’s score agrees on the order, and catches the sampler fitting our list

Across the 13 setups, EQ-Bench’s slop score and ours rank the methods alike (Spearman 0.84). The exception is the sampler alone: it cuts our score by 70% (89.7 to 27.3) and EQ-Bench’s by 19% (43.4 to 35.0). The sampler bans the words and patterns our detectors know; EQ-Bench’s list of slop words is different, so it sees what the sampler let through. This is the case the outside metric was added for: a method tuned to a regex looks better on that regex than on anyone else’s. The setups that change the model’s register (the prompt, steering, the LoRAs) move both scores together.

Scatter of EQ-Bench's slop score against the deslop score for 13 setups and two human sources. Points rise together from 100toolkit's model (9.2, 5.1) to the original (89.7, 43.4); the backtracking sampler sits above the trend at (27.3, 35.0). Human Gutenberg passages sit at (15.1, 5.0) and Wikipedia at (19.1, 1.4).
Figure 4. Our score against EQ-Bench’s, computed with slop-score’s own code on each setup’s 48 replies joined (its leaderboard method). Grey diamonds: the two human sources. Spearman correlation over the 13 setups: 0.84. Drawn by make_figures.py.

On EQ-Bench’s scale, 100toolkit’s model (5.1) sits at the level of the Gutenberg essays (5.0); the best runtime setup (14.6) and our LoRA (21.8) sit between the human passages and the original model (43.4).

4.5 Each method removes different habits, and the prompt adds one

Told not to use “not X but Y”, the model uses it more: 77 times across the 48 replies with the plain prompt, against 56 without. The other habits fall: em dashes from 175 to 57, slop words by two thirds, markdown and emoji to none. Steering also raises the contrast frame (20.9 points per 1000 words against 16.0). The sampler removes everything it bans and leaves lists of three, which it does not ban; lists of three are then most of what is left in every runtime setup, at about the rate of Wikipedia’s prose. Figure 5 shows where each setup’s points come from.

Stacked horizontal bars of points per 1000 words by habit. The original model totals 83.5, led by lists of three, em dashes, not X but Y and slop words; the plain prompt 42.5, now led by not X but Y; the sampler 25.9, almost all lists of three; steering 53.5; neuron flips 70.3; prompt plus sampler 13.3; our LoRA 21.5, split between not X but Y and lists of three; 100toolkit's model 9.1; Gutenberg essays 15.3; Wikipedia 18.7.
Figure 5. Points per 1000 words by habit, pooled over each setup’s 48 replies (so the totals differ slightly from the per-reply means in Figure 1), beside the two human sources. Drawn by make_figures.py.

Figure 6 lets you read the replies themselves, with every habit the toolkit finds marked.

The interactive reply viewer needs JavaScript. The replies it shows are in results/gen/, one file per setup, such as base.jsonl.

Figure 6. Held-out replies from seven setups on 12 prompts (two per genre), with every habit the toolkit finds highlighted; hover a highlight for its name. Data: viewer.json, written by make_figures.py from the saved replies.

4.6 A blind LLM judge prefers the original, and cannot tell human prose from Qwen’s

For every method, gpt-5.4-mini picked the original model’s reply as better writing for the request in more pairs than the method’s. Win rates run from 0.04 (prompt + steering) to 0.47 (four random neurons flipped, whose replies barely differ from the original’s); our LoRA 0.22 [0.13, 0.32], prompt + sampler 0.13 [0.05, 0.21], 100toolkit’s model 0.06 [0.01, 0.14].

The judge was checked first. Against the same reply with its sentences shuffled, and against a reply written for another prompt, it picked the original in both orders 40 times out of 40. It reads coherence and relevance. The near-identical random-neuron replies drew 31 ties in 48, as they should.

An exploratory second question, added after these verdicts, asked which reply “reads more like it was written by a skilled human writer”. Its check failed. Given a 2021 Wikipedia passage and the original model’s explainer on the same topic, gpt-5.4-mini picked the Wikipedia passage in both orders 0 times in 20; the larger gpt-5.4 did so 7 times, with 8 ties. A judge that cannot pick a Wikipedia article over Qwen as the human writer cannot grade de-slopping, so that question was not run on the methods.

As a small check of the main question, the author read 12 pairs (6 of our LoRA, 6 of 100toolkit’s model, each against the original) with the labels hidden and the order shuffled. The judge and the author agreed on 6 of 12. The author preferred our LoRA in 5 of 6 (the judge in 2), and the original over 100toolkit’s model in 4 of 6 (the judge in 6 of 6). The author was not blind to style, which gives away which reply is which, and 12 pairs is a small sample (hand_read.json). Read side by side, 100toolkit’s replies are plain but flat: one paragraph, short declarative sentences, some invented anecdotes. Ours keep paragraphs and more of the original’s content. The original’s are polished and generic, and the judge rewards the polish.

4.7 AI detectors still flag every de-slopped setup

At thresholds that flag 1% of the 318 human passages, the three open detectors flag 85% to 100% of the replies of every setup in this note. 100toolkit’s model, the plainest by both habit scores, is flagged by Desklib’s classifier in 88% of replies [77, 96] and by Binoculars and Fast-DetectGPT in 100%; our LoRA in 98%, 100% and 100%; prompt plus sampler in 100%, 100% and 98%. Removing the habits a reader notices does not remove what a detector measures: word-by-word predictability and the statistics a classifier learned. Pangram reports catching 98.83% of text from 13 commercial “humanizers”; nothing here argues with that.

Grouped horizontal bars of the share flagged as AI by three detectors. Human Gutenberg essays, Wikipedia, the voice authors and human passages edited by Qwen are flagged rarely, from 0% to 10%. Every model setup, from the original Qwen3-4B through the prompt, sampler, steering, our LoRA, 100toolkit's model and both kinds of voice rewrite, is flagged at 77% to 100%.
Figure 7. Share of each set flagged as AI by Desklib’s classifier, Binoculars and Fast-DetectGPT, each at a threshold that flags 1% of the 318 human passages, with 95% bootstrap intervals. Model sets have 48 replies (60 for each kind of voice rewrite); human sets 260, 58 and 100; mirrors 40. Drawn by make_figures.py.

The detectors were checked first. On the 100 held-out passages by the voice writers, none flags a single one; on Wikipedia, at most 7% [2, 14]; on the original model’s replies, 100%. Their blind spot is the mirror set: human passages that the original model lightly edited are flagged at 10% [3, 20] by Desklib, 0% by Binoculars and 3% by Fast-DetectGPT. That is the case EditLens was built for: a text whose content is human and whose surface is not (it catches them, below). At its published threshold of 0.5, Desklib also flags 19% [9, 29] of the Wikipedia passages and 38% [23, 53] of the mirrors, which is why the calibrated thresholds are the ones reported.

EditLens sees every de-slopped setup as AI, and sees de-slopping as editing. Its release was checked first: run here, it reproduces the authors’ own released scores on their test split (correlation 0.999997) and their ternary protocol gives macro-F₁ 0.881 on the test split and 0.859 on the out-of-domain Llama split, the same as their released scores (the paper’s headline, 0.904, is for a 24B model). On this note’s texts (Figure 8), it calls 0 of 48 replies human in every setup. What changes is the kind of AI: the original model’s replies are 77% [65, 88] “AI-generated”; with the prompt and the sampler, 50% [35, 65]; our LoRA, 54% [40, 69]; steering, 21% [10, 33]; and 100toolkit’s model, 8% [2, 17], with 92% “AI-edited”. At a threshold that flags 1% of our human passages, it flags 98% to 100% of every setup. Unlike the other three detectors, it also catches the mirrors: 97% [93, 100] “AI-edited”, 80% [68, 93] flagged at the 1% threshold.

Stacked horizontal bars of EditLens classes. Human Gutenberg, Wikipedia and voice-author passages are mostly human (64% to 78%) with the rest AI-edited; human passages edited by Qwen are 97% AI-edited. Every model setup has no human share: the original Qwen3-4B is 77% AI-generated, prompt plus sampler 50%, our LoRA 54%, steering 21% and 100toolkit's model 8%, the rest AI-edited. Diamonds for the 1%-human threshold sit at 98% to 100% for every setup and 80% for the mirrors.
Figure 8. EditLens (RoBERTa-large) on every set: the share its authors’ val-calibrated cut points call human (light), AI-edited (peach) and AI-generated (orange); diamonds, the share above a threshold that flags 1% of the 318 human passages. Model sets have 48 replies (60 per kind of voice rewrite), human sets 260, 58 and 100, mirrors 40. Drawn by make_figures.py.

The authors’ cut points are strict about human text from another era: 22% [17, 27] of the Gutenberg passages, 36% [24, 48] of the Wikipedia ones and 29% [20, 38] of the voice writers’ passages land in “AI-edited”, though none in “AI-generated”. Old essays and encyclopedia prose are out of the domain EditLens was trained on (Reddit stories, news, educational web text, reviews), so for a verdict on human text the 1%-human threshold is the safer one.

A small Qwen does this task well. Trained with the authors’ Llama recipe (four buckets, LoRA rank 8, one epoch) on 20,000 of EditLens’s 59,991 training texts, a Qwen3-4B LoRA detector reached ternary macro-F₁ 0.924 on the test split and 0.941 on the Llama split, under the same protocol, in 31 minutes on one H100. That is above the released RoBERTa-large (0.881, 0.859) and the paper’s 24B headline (0.904 in domain, 0.850 on the Llama split), and in line with the unpublished replication cited in section 2.5 (0.909 in domain), though not with its weaker out-of-domain result. The training subset shares no source text with either test split (5 of about 6,000 test texts appear verbatim in training). The adapter is kept private: it is trained on non-commercial data and was used only to measure.

Voice rewrites by gpt-5.4-mini get through a little more often: Binoculars flags 87% [78, 95] of them, Fast-DetectGPT 95% [88, 100], Desklib all of them. None of this was a target: no setting or reply in this note was chosen by a detector’s score.

4.8 A voice rewrite moves text a little toward a writer, not to them

Rewritten by gpt-5.4-mini from three sample passages, the original model’s replies end up nearest their target writer, among the five, in 17 of 50 cases; the unrewritten replies would be in 10 of 50 by construction (one nearest writer each, five targets). Against all six profiles, 34 of 50 rewrites still sit nearest to Qwen, and only 6 (by Delta) or 12 (by the logistic regression) nearest to the target. The writers’ own held-out passages are attributed right 52 and 63 times in 100.

Dot chart of Burrows' Delta to each of five writers. For every writer, gpt-5.4-mini's voice rewrites sit a little below Qwen's original replies (for example Twain 0.59 against 0.64), the plain rewrite with no voice sits near the original, our LoRA's rewrites sit well above (0.75 to 0.82), and a dashed line for the writer's own held-out passages sits at 0.66 to 0.75, above the original replies.
Figure 9. Burrows’ Delta (lower is closer) from texts to each writer’s profile, averaged over 10 texts per writer: Qwen’s original replies, the plain rewrite with no samples (control), the voice rewrites by gpt-5.4-mini and by our LoRA, and the writer’s own 20 held-out passages (dashed). Drawn by make_figures.py.

Figure 9 shows why the absolute distance misleads. gpt-5.4-mini lowers the Delta to the target in 45 of 50 rewrites, but each writer’s own passages sit farther from their profile than Qwen’s original replies do: a 250-word passage by a real writer is idiosyncratic, while Qwen’s even prose sits near the middle of everything. A lower Delta alone therefore says “blander” as easily as “more like Twain”, and the relative test, which writer is nearest, is the fair one. The plain rewrite with no samples moves nothing toward any writer (all 10 still nearest Qwen), so the small shift comes from the samples, not from de-slopping.

gpt-5.4-mini kept every number (18 of 18) and passed the fact check in 49 of 60 rewrites, but used more negations than the originals (280 against 192), so a few claims may have changed polarity and need reading. Its rewrites score 48.4 on the habit scale (13 of 60 in the human band), no plainer than the no-voice control (47.0). The blend toward Twain and Darwin landed nearer the blend than either writer in 4 of 10. Our LoRA, trained to answer bare prompts, ignored the samples: its rewrites stay in its own plain voice (target nearest in 9 of 50, chance), drop every number (0 of 18) and pass the fact check in only 30 of 60. For voice work, use an instruction-following model and check the facts.

05Compared with prior work

100toolkit qwen3-4b-deslopAntislop (Paech et al.)EQ-Bench slop-scoreThis note
Score read against human prose✓ (“usually under 15”)✓ (frequency ratio to human text)✓ (a human baseline on its leaderboard)✓ (a band from 318 licensed passages, per source)
Prompt, sampler, steering, neurons and weights on one modelSteering, neurons, prompt, LoRASampler and preference trainingMeasurement only✓ all five, and combinations
Random control for steering and neurons✗n/an/a✓
Independent metric✗ (its own score)✓ (writing benchmarks)n/a✓ (EQ-Bench’s code)
Drift and capability checks✓ (KL on 22 passages, 30-question quiz)✓ (GSM8K, MMLU)✗✓ (KL, quiz, task fit, MATTR)
Blind quality judgment✗ (named as a next step)✓ (LLM-judged writing quality)✗✓ (position-swapped judge, checked; it prefers the original)
Released model✓ (LoRA, merged, GGUF)✓ (FTPO models)n/a✓ (LoRA, merged, GGUF)
Lowest slop reached on Qwen3-4B12.5 on its own score; 9.2 on oursNot run on Qwen3-4BQwen3-4B scores 62.2 on its prompts21.5 for our LoRA; 13.5 at runtime

Pangram 4 and GPTZero score text sentence by sentence (or token by token), separate “AI-assisted” from fully generated text, calibrate their false-positive rate on large human sets and train on “mirrors” of the human texts they get wrong. This note borrows the evaluation habits (per-text scores, a human false-positive set, mirrors) with small open detectors; it does not test the commercial ones. EditLens (Thai et al., ICLR 2026), the open method closest to the mirror question, is run on every set here (section 4.7); it catches the mirrors that the other open detectors miss.

The 100toolkit model is the stronger release on the habit measures, here as on its own blog; our numbers for it come from our prompts and our scorer, not theirs. FTPO, Antislop’s training method, was not tried here.

06Implications for AI safety

The judge result matters beyond style. Reward models and LLM judges are how models are tuned and graded, and this one, which passes the usual sanity checks, preferred the assistant voice over plainer replies that did the task better: it chose the original’s balanced essays over replies that stated the position the prompt asked for. Training against such a judge would push models toward the voice people are learning to distrust, and grading with one would hide it. The second check showed the same judge cannot pick a 2021 Wikipedia article over the model’s explainer as the human one. The other half of the lesson is about grading a fix with the tool that defined it: the sampler looked more than three times better on our regexes than on EQ-Bench’s.

Risk: low. The work changes the style of a small open model; nothing in it is aimed at detector evasion, the score is not an AI detector, and the open detectors measured here still flag almost every de-slopped reply. A plainer voice does make model text harder for people to spot by its habits, which is a reason to disclose AI assistance where it is expected and to label model text by where it came from rather than by how it sounds. The voice tool is for one’s own writing and public-domain authors; imitating a living writer needs their consent.

The recommendation in one sentence: when you change a model’s voice, score it with an independent metric as well as your own, and check your judge on human prose before trusting what it says about style.

07What this does not show

08Use it and reproduce it

Score your own text (no dependencies), or run the model:

pip install "steerlab-deslop @ git+https://github.com/albertlieyingadrian/steerlab#subdirectory=packages/deslop"
deslop score draft.txt
deslop voice profile my-essays/*.txt --name me -o me.json
deslop voice rewrite draft.txt --voice me.json --samples my-essays/a.txt my-essays/b.txt --api-model gpt-5.4-mini
ollama run hf.co/albertlieadrian/qwen3-4b-deslop-GGUF:Q4_K_M

Recompute every number and figure from the saved replies (needs Node.js; slop-score is cloned at a pinned commit):

experiments/deslop/reproduce.sh --scores

Rerun from scratch: a Modal account (about 4 GPU-hours, about $13), an OpenAI key for the judge, the voice rewrites and the covers (about $2.70), and access to EditLens’s model and data (non-commercial, on request):

experiments/deslop/reproduce.sh --dry-run   # lists every command
experiments/deslop/reproduce.sh

09What’s next

10Questions and answers

What is the easiest way to make a small model write less like a chatbot?

A system prompt that asks for the task first and lists the habits to avoid, plus a backtracking sampler that rewinds when a banned pattern appears. On Qwen3-4B that took the habit score from 89.7 to 13.5 per 1000 words, about the human median, without changing the model.

Does activation steering remove AI writing style?

Partly. An “assistant register” direction at layer 12 lowered the score from 89.7 to 57.1 before replies stopped being fluent, and moved the model’s predictions on human prose more than any other single method. A prompt or a sampler does more for less.

Is there a de-slopped Qwen3-4B I can run?

Two: 100toolkit’s erikkannike/qwen3-4b-deslop-v4 (score 9.2 here) and this note’s albertlieadrian/qwen3-4b-deslop (21.5, with fewer task-check failures and less drift). Both have GGUF builds for Ollama.

Does removing AI writing habits make text undetectable?

No. Three open detectors, set to flag 1% of human passages, still flagged 85% to 100% of the replies from every de-slopping method here, including the plainest model, and EditLens called none of them human. The three general detectors mostly missed human text that a model had only lightly edited; EditLens caught it.

Can a tool write in my voice?

A little. From three samples, gpt-5.4-mini’s rewrites moved toward a target writer’s function-word style (the target was the nearest of five writers in 17 of 50 rewrites, against 10 by chance) and kept the numbers, but most still read closest to the original model. More samples and longer texts should help; deslop voice measures it either way.

Can an LLM judge tell whether writing sounds human?

Not reliably here. gpt-5.4-mini picked a Wikipedia passage over Qwen’s explainer as “more human” in 0 of 20 pairs, and as a quality judge it preferred the original model’s polished replies over every de-slopped version.

AAppendix: data

Every file and column is listed in README.md. The main ones: table.csv (the comparison), per_reply.csv (every reply’s scores), summary.json (intervals, habits, checks), results/gen/ (every reply, one file per setup, such as lora-r2.jsonl), passages.jsonl (the human baseline with sources and licences), teacher.jsonl (the kept teacher replies).

The plain-style system prompt

Write the way a good human writer would, not the way an assistant does. Do the task first: if asked for an opinion, state your position in the first two sentences and argue for it; if asked for a personal reflection, write in the first person about your own experience; if asked for an email, open with a greeting and close with your name; stay close to the requested length. Use plain words and plain sentences. Write prose only: no headings, bold text, bullet points, hashtags or emoji. Do not use em dashes. Do not use ‘not X but Y’ or ‘it’s not X, it’s Y’ contrasts, lists of three, questions that you answer yourself, signposts like ‘here’s the thing’, or one-line fragments for emphasis. Do not invent studies, statistics, percentages, names or quotes. Avoid words like delve, tapestry, testament, seamless, robust, landscape, navigate, unlock, elevate, crucial and pivotal.

The held-out prompts

Topics: remote work; public libraries; electric cars; learning a second language as an adult; bike lanes in cities; getting enough sleep; small family-run restaurants; open-plan offices; homework for young children; growing your own vegetables. Templates: “Write a blog post about {topic}. About 250 words.”, “Write a LinkedIn post about {topic}. About 150 words.”, “Write a short explainer about {topic} for a general reader. About 250 words.”, “Write an opinion piece about {topic}. About 250 words.”, plus “Write an email to a colleague about {topic}. About 120 words.” (4 topics) and “Write a short personal reflection about {topic}. About 200 words.” (4 topics). All in prompts.py.

Techniques

Score11 regex and word-list detectors, weighted per 1000 words; a band from 318 human passages
RuntimeSystem prompt; Antislop-style backtracking sampler (KV-cache rewind); steering with steerlab’s difference-of-means direction; MLP neuron sign flips
WeightsLoRA rank 16, alpha 32, dropout 0.05, all attention and MLP projections, reply-only loss, lr 2e-4, batch 8, 2 epochs; merged; GGUF Q4_K_M with llama.cpp
ChecksKL drift on human prose, factual quiz, task fit, invented claims, MATTR-100; EQ-Bench slop score; a position-swapped pairwise judge with known-answer checks
StatisticsPercentile bootstrap over prompts (10,000), paired by prompt for differences; Spearman correlation between metrics

Tech stack

ModelsQwen3-4B-Instruct-2507 (Apache-2.0); erikkannike/qwen3-4b-deslop-v4; gpt-5.4-mini (judge) through OpenAI’s API
CodePython, PyTorch, transformers 5.20, PEFT 0.21, steerlab and sandbagkit (the direction), llama.cpp (GGUF), Node.js (slop-score), NumPy, matplotlib
ComputeModal: L40S, A100, A10G and one H100 run, $13.38; judge about $1.46; voice rewrites $0.19; cover images about $1.00; EditLens RoBERTa-large on a laptop

References

Revision history

How to cite

@misc{lie2026deslop,
  author = {Albert Lie},
  title  = {De-slopping Qwen3-4B: a sampler beats steering, a LoRA keeps most of it, and an LLM judge prefers the slop},
  year   = {2026},
  month  = nov,
  url    = {https://albertlieyingadrian.github.io/steerlab/experiments/deslop/report/}
}