Part 3 ended with a question. If a fixed list only moves the slop around instead of removing it, what is that list worth?
I measured it. Four arms, two switches in every combination, training and system prompt, the same 36 tasks, temperature=0.7, seed 1234+idx, all on the same H100.
The verdict up front
Yes, it worked. I'll tell you why right here, so you don't have to read to the end for it.
The method does what it promises, and it stacks with prompting. The bare model produces 38.64 banlist hits per 1,000 tokens. A system prompt on its own pushes that down to 21.04, the training on its own to 12.04, the two together to 6.27. That's the best value in the whole project. Whether the two levers would add up rather than get in each other's way was open until this run.
One real stock phrase disappeared along the way, and the training is what removed it. revolutionier… (the stem of “to revolutionise”, cut short so the counter catches every ending) appears 13 times in the base model, 5 times in the finetune, and 0 times once the prompt joins in.
Next to the model, three things got built. A German reference profile from 860 million characters of human German, filtered against dubbing-German. A discriminator that tells a technical term apart from a stock phrase. And a bug in the framework all of this sits on, found and reported.
Now the limitation. That exact arm, the one with the best score, is almost never picked as the best text by the reviewers who read blind. With one of the two it comes out worst in 14 of 36 cases. The stock phrases are gone and the sentences are damaged. Of ten broken constructions the reviewers named, eight come only from the finetune arms.
The numbers
Scored with the code from my own project. The first column is the slop metric the training aimed at. The second measures sentence construction, nominal style and passive voice, lower is better. The last two show two words the training picked up by itself.
| Arm | Banlist hits /1k | Structural slop | “maximal” | “absolut” |
|---|---|---|---|---|
| base model | 38.64 | 56.1 | 1 | 5 |
| base model + prompt | 21.04 | 33.7 | 1 | 1 |
| finetune | 12.04 | 63.8 | 59 | 55 |
| finetune + prompt | 6.27 | 60.6 | 15 | 17 |
In the first column exactly what should happen happens. The prompt alone cuts the value by roughly half. The training alone cuts it further. Both together halve it once more, down to 6.27. The two tools don't interfere with each other, they stack.
Then comes the read test, and it measures something else. Two reviewers read all 36 groups of four blind, without knowing which text came from which arm, and marked the best and the worst in each. One judged by impression, whether a German copywriter could have written it. The other judged strictly by my slop definition from part 2.
| Arm | Sounds human: best | worst | By slop definition: best | worst |
|---|---|---|---|---|
| base model | 7 | 1 | 2 | 1 |
| base model + prompt | 25 | 1 | 31 | 0 |
| finetune | 0 | 20 | 0 | 34 |
| finetune + prompt | 4 | 14 | 3 | 1 |
Translated into plain numbers, of 36 tasks my trained model wins three to four. The bare model with the prompt wins 25 to 31. So if you want a website section written, you are better off without my model in seven out of eight cases.
The second look at the table explains why. The reviewer who only watches for stock phrases finds almost nothing wrong with my combination and ranks it worst exactly once. The reviewer who looks at the language as a whole puts it last fourteen times. Same text, two pairs of glasses, opposite verdicts.
So the stock phrases really are gone. What is broken is something else.
Why the best number reads worst
The prompt clears out the trained-in crutches, almost entirely. eben alles (“just everything”, the shrug you tack on when a list runs out of ideas) drops from 13 occurrences to 0. revolutionier… to 0. maximal from 59 to 15, absolut from 55 to 17.

What it doesn't touch is sentence construction. On the base model the prompt pushes structural slop from 56.1 to 33.7, a third less nominal style and passive voice. On the finetune the same prompt moves it from 63.8 to 60.6, which is barely at all. In the base model the nominal style is a habit an instruction can switch off. In the finetune it sits in the weights.
Then there's something none of my key figures cover. The reviewers named ten broken constructions in their reasoning. Eight of the ten occur only in the finetune arms, not one of them in the base model.
“Deine Daten bleiben deiner” (wrong case on the possessive, it should be deine, so this reads roughly “your data stays of-yours”)
“Der Raven-Agent plant deinen Terminen” (planen takes an accusative object, this one is dative, so the agent plans to your appointments)
Here's the difference on one task. All variants wrote the same hero section. The base model with the prompt:
“Meetings, die wirklich weiterarbeiten. Raven ist deine Meeting-Plattform für Planung, Durchführung, Protokollierung und Nachbereitung. Inhalte bleiben sicher bei dir, und dein Meeting wird zum aktiven Arbeitsraum.” (Meetings that keep working afterwards. Raven is your platform for planning, running, minuting and follow-up. Your content stays safely with you.)
My trained model:
“Verabschiede dich vom Meeting-Chaos. Raven organisiert deinen gesamten Meeting-Workflow, vom Planen über das effiziente Durchführen, intelligente Protokollierung, stimmungsvolle Analyse, eben alles.” (Say goodbye to meeting chaos. Raven organises your entire meeting workflow, from planning through efficient running, intelligent minuting, atmospheric analysis, just everything.)
“Stimmungsvolle Analyse, eben alles.” Atmospheric analysis, just everything. That's the model I built to avoid empty phrases.
This is not a systematic grammar check. I only traced the errors the reviewers named back to their source. That says nothing about the overall error rate. It does answer why an arm with few stock phrases gets marked down.
The bug in the framework
The method works like this. Whenever the model is about to produce a banned word, the sampler jumps back and picks an alternative from the twenty most likely next words. Those pairs become the training data. In German ad copy that set is small and always the same.
The framework anticipated this case. It computes an upper bound so that no single word can dominate the training data. For inklusive (roughly “including”) it computed a cap of 93 and wrote it into the log. After that, nothing happens with it. The value is computed, printed, and never applied.
So inklusive sat 218 times in the training data as the preferred alternative. The brake was built in, it was even displayed, and it was never connected to the wheels. That hits everyone who trains with this framework, in any language. The finding is filed as issue 5 in the author's repository.

What works
- The method removes whatever you point it at, and it gets along with prompting. 38.64 hits per 1,000 tokens bare, 21.04 with the prompt, 12.04 with the training, 6.27 with both.
- One real stock phrase is gone.
revolutionier…from 13 occurrences down to 5, and to 0 with the prompt. - Three things outlive the finetune: the German reference profile from 860 million characters, for which no ruler existed before; the industry-spread discriminator, which separates the technical term of one industry from the stock phrase that shows up everywhere, and works in any language; the reported framework bug.
- The four-cell design itself. Two switches in all four combinations make the difference between “the number gets better” and “the text gets better” visible at all.
- A full run costs nine dollars on an H100. One person can try this over a weekend.
What doesn't work yet
- The model writes worse German than it did before. Not just more wooden, but wrong. Case errors, sentences that break off halfway. The base model doesn't make these mistakes.
- The prompt can't repair that. It gets the stock phrases out, not the sentence construction. That one moved into the weights during training and stays there.
- The best score delivers the worst texts. The very arm that wins in the table above loses on reading against the model with no training at all.
- My old success figure didn't hold. I had reported 92 percent less slop. I measured against the same list I trained against, which is circular. Recomputed, around 66 percent is left.
- That the capabilities survived is unproven. The test ran over 100 tasks, and the difference was a single one of them. That's noise, not a result.
- The read test was scored by language models. I read the texts myself, and my reading found the errors no number showed. But a blind test with several people who don't know which text came from where never happened.

It's all open, take it
At github.com/PhilflowIO/antislop-de you'll find the code, the pipeline, the German reference profile, the evaluation scripts, the project diary with every dead end, and the numbers from this article with the places where they don't hold. Start at configs/antislop_prompt.md. Eight lines, costs nothing, needs no graphics card, runs in any model, and in the blind verdicts that arm wins 25 and 31 of 36 tasks. For further research, the reference profile and the industry-spread discriminator are the useful parts, both independent of the failed half.
The weights are on huggingface.co/PhilflowIO/gemma-3-12b-it-antislop-de, with a model card that names both halves right at the top. Load it if you have to get specific words out of a text reliably, because they sit on a list you're bound to. The price is grammar cleanup afterwards, and it isn't optional. Eight broken constructions in 36 short texts is not something you hand anyone unread.
If you want to work on this, the loose ends come in this order: fix the dead brake in the framework, measure against a list the training never saw, and work out why the training damages the syntax. The last one is the most interesting, and all I have on it is an observation. If you find an explanation, write to me.
For my own writing I use the prompt and read the draft myself. I don't run the model. I didn't get far enough with the idea of a German model that doesn't sound like a press release. That's why all of it is open. Maybe someone gets further than I did.
Sources
The method isn't mine. Sam Paech developed it and published the tools; my work is the port to German, the four-cell design and the findings from it. The bug I found is a bug in one implementation, not a verdict on the method.
- Paech, S., Roush, A., Goldfeder, J., Shwartz-Ziv, R. (2025): “Antislop: A Comprehensive Framework for Identifying and Eliminating Repetitive Patterns in Language Models”, arXiv:2510.15061. arxiv.org/abs/2510.15061
- sam-paech/auto-antislop. The pipeline that ties generation, banlist maintenance and training together. This is what I trained with.
- sam-paech/antislop-sampler. The sampler that jumps back mid-sentence as soon as a banned word is about to land.
- sam-paech/slop-forensics. The tool for pulling slop profiles out of a body of text. The basis of my German reference profile.
- The bug I reported about the cap that never gets applied: auto-antislop, issue 5
- Gemma 4 Technical Report, arXiv:2607.02770. arxiv.org/abs/2607.02770
- German Commons, coral-nlp/german-commons, licensed ODC-BY. Main source of the German reference profile.
- OpenSubtitles2018-DE via orgtre/top-open-subtitles-sentences. Second corpus source, filtered against calques.