Show HN: Qwen3-4B with the AI writing tics trained out
Show HN: Qwen3-4B with the AI writing tics trained out
Erik Markus Kannike · October 2026
TL;DR
I have successfully stripped the typical "assistant" writing habits from Qwen3-4B-Instruct, releasing the result as qwen3-4b-deslop. This is a compact open model, fine-tuned on a MacBook Air, designed to write without relying on em dashes, the "not X, but Y" construction, or ubiquitous lists of three. It requires no system prompt and is ready for local deployment via Ollama.
🚀 Quick Start & Performance
To run the model using Ollama, use the following command (requires a 2.5 GB download):
ollama run hf.co/erikkannike/qwen3-4b-deslop-v4-GGUF:Q4_K_M
The Results
Testing across 40 unseen prompts revealed a dramatic shift in prose style:
| Metric | Original Qwen3-4B-Instruct | De-slopped Version |
|---|---|---|
| Slop Score (per 1k words) | 121 | 12.5 |
| Human-like Range | Low | 68% of answers |
| Factual Accuracy | 30/30 | 30/30 |
| Genre/Length Adherence | High | Equivalent to original |
| Prose Prediction Drift | Baseline | of runtime steering |
Note: The resulting voice is extremely plain—bordering on flat—and the model still occasionally hallucinates names or locations.
📉 Understanding the "Slop Score"
I developed a detector based on a style guide of common AI writing tropes. The score is calculated as a weighted sum of these habits per 1,000 words:
The "Slop" Checklist:
- Frequent em dashes (—)
- The "It's not X, it's Y" phrasing
- Lists of exactly three items
- Rhetorical questions answered immediately
- Signposting phrases (e.g., "Here's the thing")
- Short, punchy fragments used for artificial emphasis
- Overused vocabulary:
delve,seamless
While a meticulous human writer typically scores below 15, the original model averaged 121. To ensure the model wasn't "broken" during training, I monitored Drift (predictive shifts on 22 human prose passages) and used a 30-question quiz to verify factual retention.
🛠️ The Training Methodology
My "home lab" consists of a MacBook Air. I trained this 4B model using only 161 curated answers. The process was iterative:
Initial Experiments
- Directional Steering: I found the "assistant register" as a vector. Subtracting it during inference lowered the score to , but it required a specific system prompt and altered predictions on standard text.
- Neuron Flipping: I identified four specific neurons that, when flipped, eliminated 70% of the "not X, but Y" habit with minimal side effects.
The Distillation Process
To bake these improvements into the weights, I used a Teacher-Student approach via a LoRA adapter.
Round 1
A teacher model (combining the best steering methods) generated 288 answers. The student learned to mimic these from a bare prompt, bringing the score down to .
Round 2: The "Over-Correction" Phase
The teacher was upgraded (R1 model + neuron patch + plain-style prompt). While this achieved a record-low score of 9.5, the quality collapsed:
Opinion pieces lacked any actual opinion.The model invented fake studies.A new tic emerged: joining almost every sentence with, whichor, so(28x more frequent than original).
Round 3: Balancing Act
I updated the teacher's prompt to prioritize the actual task: take a position if asked, use first-person for personal reflections, vary sentence structure, and do not hallucinate studies.
Filtering Criteria for Training Data:
- Score must be .
- Must pass all "damage" checks.
- Must pass "task-fit" checks (e.g., emails must have greetings, reflections must be 1st person).
Final Outcome: The score rose slightly to 12.5, but task adherence returned to 80%, and the , which habit dropped from 1.4 to 0.3 per 100 words.
📦 Deployment & Usage
Local Execution
You can run the quantized version (Q4_K_M, 2.5 GB) via Ollama or llama.cpp:
# Using Ollama
ollama run hf.co/erikkannike/qwen3-4b-deslop-v4-GGUF:Q4_K_M
# Using llama-cli
llama-cli -hf erikkannike/qwen3-4b-deslop-v4-GGUF:Q4_K_M
Python Implementation
For full-precision weights, use the transformers library:
from transformers import AutoModelForCausalLM, AutoTokenizer
name = "erikkannike/qwen3-4b-deslop-v4"
tok = AutoTokenizer.from_pretrained(name)
model = AutoModelForCausalLM.from_pretrained(name, torch_dtype="auto")
msgs = [{"role": "user", "content": "Your prompt here"}]
# ... proceed with generation