Qwen3-4B: Getraind om AI-schrijfstijltjes te verwijderen
Samenvatting (TL;DR)
Ik heb de schrijfgewoonten van de assistent uit Qwen3-4B-Instruct getraind en dit uitgebracht als qwen3-4b-deslop. Via Ollama is dit beschikbaar met het commando ollama run hf.co/erikkannike/qwen3-4b-deslop-v4-GGUF:Q4KM (een download van 2,5 GB).
Bij tests met 40 prompts die niet in de trainingsset zaten, daalde de 'slop-score' van 121 naar 12,5 per 1000 woorden. 68% van de antwoorden scoort in het bereik van menselijke teksten. Het gebruik van em-dashes ging van 20,5 per 1000 woorden naar nul.
Het model beantwoordt nog steeds 30 van de 30 feitelijke vragen correct en voldoet even vaak aan het gevraagde genre en de lengte als het origineel. De voorspellingen over door mensen geschreven proza weken ongeveer een derde zoveel af als bij runtime-sturing.
Een tussenversie scoorde weliswaar 9,9, maar schreef slecht: opiniestukken zonder mening, verzonnen studies en een nieuwe gewoonte om elke zin te verbinden met ", which". Het oplossen hiervan vereiste een tweede filter dat controleert of een antwoord daadwerkelijk doet wat de prompt vroeg.
De stem is zakelijk tot het punt van vlak zijn, en het model verzint nog steeds namen en plaatsen. Omdat mijn home lab een MacBook Air is, betreft dit een 4B-model getraind op 161 antwoorden. De methode is onafhankelijk van de modelgrootte; het toepassen hiervan op grotere modellen is de volgende stap.
De slop-score
De score is afgeleid van een detector die ik heb geschreven op basis van een stijlgids over AI-schrijfgewoonten. De detector let op:
- Het gebruik van em-dashes;
- Constructies als "het is niet X, het is Y";
- Lijstjes van drie;
- Rhetorische vragen die direct worden beantwoord;
- Signaalwoorden zoals "here's the thing";
- Korte fragmenten ter nadruk;
- Woorden als "delve" en "seamless".
Elke gewoonte heeft een weging, en de score is een gewogen telling per 1000 woorden. Een paragraaf van een zorgvuldige menselijke schrijver scoort dicht bij nul, terwijl het originele model gemiddeld 121 scoort.
Omdat een regex geen goed schrijven van slecht schrijven kan onderscheiden, is elk model ook gecontroleerd op schade. 'Drift' meet hoe ver de voorspellingen over 22 passages van menselijke proza afwijken van het originele model. Een quiz met 30 vragen controleert of de feitenkennis behouden is, en een regelgebaseerde controle signaleert defecte output, zoals zinnen die met een kleine letter beginnen of het verliezen van het onderwerp. Daarnaast heb ik steekproeven van de antwoorden gelezen.
Trainingsmethode
Een eerder experiment met dit model wees uit dat het 'assistent-register' als een richting binnen het model aanwezig is. Door dit tijdens het schrijven af te trekken, in combinatie met een systeem-prompt voor een eenvoudige stijl, daalt de score naar ongeveer 15. Dit vereist echter dat de prompt en code tijdens de generatie actief zijn, en het verschuift de voorspellingen van het model bij gewone tekst. Een tweede experiment waarbij neuronen één voor één werden gelezen, vond vier neuronen waarvan het omkeren van het teken 70% van de "niet X, maar Y"-constructies verwijderde tegen minimale kosten, hoewel dit slechts voor die ene gewoonte gold.
Om beide aspecten in de gewichten te verankeren, heb ik gebruikgemaakt van distillatie: een 'docent' (opgebouwd uit de best werkende methoden tot dan toe) beantwoordt 288 trainingsprompts. Alleen de antwoorden die de controles passeren, worden behouden. Een kleine LoRA-adapter leert vervolgens om deze antwoorden te produceren op basis van de kale prompt. De eerste ronde bracht de score naar ongeveer 20, zonder prompt of hooks.
Ronde twee
Voor de tweede ronde was de docent het model uit ronde één, aangevuld met de vier-neuronen-patch en de systeem-prompt voor een eenvoudige stijl. Het toevoegen van direction steering leidde tot de laagste score ooit gemeten (9,5), maar de tekst bevatte geen hoofdletters en dwaalde af van het onderwerp, dus is de steering weer verwijderd. De docent scoorde gemiddeld 7,4. De leerling, getraind op de 171 beste antwoorden, scoorde 9,9, waarbij 80% van de antwoorden in het menselijke bereik viel.
In de antwoorden traden echter problemen op: een opiniestuk over een nieuw CRM van een bedrijf nam geen standpunt in en leesde als een incidentrapport. Een blogpost over verhuizen naar een nieuwe stad werd een verhaal in de derde persoon over een gezin met een lekkend appartement. Een tekst over kamerplanten citeerde een verzonnen "studie van de University of Technology Sydney". Bijna elke zin liep over in de volgende met ", which" of ", so", 28 keer vaker dan in het originele model. Deze laatste gewoonte kwam voort uit mijn eigen docent-prompt, die het model had opgedragen zinnen te verbinden met "because, so, but, which". Twee ronden van imitatie hadden dit versterkt.
Task-fit controles
Ik heb regelgebaseerde controles toegevoegd om te zien of een antwoord doet wat de prompt vroeg:
- Een opiniestuk moet vroegtijdig een standpunt innemen;
- Een persoonlijke reflectie moet in de eerste persoon geschreven zijn;
- Een e-mail moet openen met een begroeting;
- De lengte moet ongeveer overeenstemmen met het verzoek.
Daarnaast tellen twee controles het aantal ", which"- en ", so"-verbindingen en verzonnen studies of percentages. Hierop scoorde het model uit ronde twee slechts 60%, tegenover 78% voor het origineel.
Ronde drie
De derde docent kreeg een prompt die de taak centraal stelde: neem een standpunt in als daarom wordt gevraagd, schrijf in de eerste persoon bij persoonlijke teksten, varieer de zinnen en verzin geen studies of namen. Er werden drie antwoorden per prompt gegenereerd; een antwoord werd alleen behouden als het een score onder de 12 had, de schadecontroles doorstond en aan alle taakeisen voldeed. Ongeveer 30% van de antwoorden voldeed hieraan, wat 161 van de 288 prompts beslaat.
Het model dat op deze antwoorden is getraind, is de released versie. De score steeg licht van 9,9 naar 12,5, terwijl de taak-fit terugging naar 80% en de ", which"-verbindingen daalden van 1,4 naar 0,3 per 100 woorden. Verzonnen studies en percentages verdwenen bijna volledig.
Downloads en gebruik
De gekwantiseerde versie (Q4KM, 2,5 GB) draait op een laptop met Ollama of llama.cpp:
ollama run hf.co/erikkannike/qwen3-4b-deslop-v4-GGUF:Q4_K_M
llama-cli -hf erikkannike/qwen3-4b-deslop-v4-GGUF:Q4_K_M
De full-precision gewichten kunnen worden geladen met transformers, zoals elk Qwen3-4B checkpoint:
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": "Write a LinkedIn post about switching to a four-day week."}]
ids = tok.apply_chat_template(msgs, add_generation_prompt=True, return_tensors="pt")
out = model.generate(ids, max_new_tokens=300, do_sample=True, temperature=0.7)
print(tok.decode(out[0][ids.shape[1]:], skip_special_tokens=True))
De repository bevat ook de losse onderdelen: de LoRA-adapter (126 MB) en de neuron-edit (een lijst van 175 bytes met vier gewichtskolommen en hun schalen). De adapter is getraind met de edit actief, dus deze horen samen te worden gebruikt.
Beperkingen
De stem is vlak: het model schrijft reeksen korte, declaratieve zinnen, en persoonlijke teksten lezen als dagboekfragmenten.
Het model verzint nog steeds zaken: studies en percentages zijn zeldzaam geworden, maar verzonnen namen en plaatsen komen vaak voor (bijvoorbeeld een koffiebar in Maple Street gerund door een vrouw genaamd Maria), omdat concrete details in elke ronde werden beloond. Ook is de tekst vaak te lang; antwoorden van "ongeveer 150 woorden" komen vaak uit op bijna 200.
Ik heb alleen korte Engelse proza in deze genres getest. Code, lange gesprekken, andere talen en tool-gebruik kunnen mogelijk niet beter (of zelfs slechter) zijn dan in het originele model. De score is gebaseerd op mijn eigen stijlgids via regular expressions; er is nog geen blinde test met lezers uitgevoerd. De cijfers variëren ook per run: hetzelfde model scoorde 10,2 via de adapter en 12,5 als samengevoegde gewichten, enkel door verschillen in sampling.
Volgende stappen
Elke leerling werd ongeveer zo goed als de beste antwoorden die de docent kon schrijven. Voor een beter model is dus een betere docent nodig. Ik stel momenteel een set van uitmuntende menselijke teksten samen (essays en brieven uit het publieke domein, aangevuld met moderne stukken) om als voorbeelden voor een basismodel te gebruiken. Een basismodel heeft geen assistent-training ondergaan en schrijft nog zoals de mensen van wie het heeft geleerd. Als die docent beter schrijft dan dit model, zou dezelfde methode een leerling moeten opleveren met zowel goede gewoonten als een zekere smaak. Daarna volgt dezelfde pijplijn voor een 7- tot 8B model en een model van circa 30B, gevolgd door een blinde test waarbij mensen de betere tekst kiezen.
Methodische aantekeningen en kanttekeningen
- Basismodel: Qwen3-4B-Instruct-2507 in bf16. Elke adapter is een rank-16 LoRA op alle attention- en MLP-projecties, getraind gedurende twee epochs op de kale gebruikersprompt, waarbij het verlies alleen op de respons is berekend. Training duurde per ronde tussen één en drie uur op een M2 MacBook Air.
- Testset: Tien onderwerpen die niet in de training zijn gebruikt, elk in vier genres (blogpost, LinkedIn-post, uitleg, opiniestuk). Eén gesampled antwoord per prompt bij een temperatuur van 0,7, zonder systeem-prompt. 'Drift' is de KL-divergentie ten opzichte van het originele model op 22 passages van menselijke proza.
- Task-fit controles: Dit zijn eenvoudige regels (een standpunt-woord aan het begin van een opiniestuk, eerste-persoons voornaamwoorden in een reflectie, een begroeting in een e-mail, woordtellingen). Deze missen zaken die een menselijke lezer wel zou opmerken. Omdat de trainingsdata is gefilterd op basis van dezezelfde controles, zijn de task-fit cijfers enigszins flatterend.
- Neuron-edit: Dit keert het teken om van vier MLP-neuronen (laag 32 neuron 4852, laag 33 neuron 348, laag 28 neuron 1121, laag 32 neuron 5418), wat gelijkstaat aan het ontkennen van vier kolommen van de down-projection gewichten van hun lagen. De GGUF-build is gekwantiseerd vanuit een Q8_0 conversie van de samengevoegde gewichten.
Groetjes,