qwen2.5-7b-spreizzaehler-v3
Hinweis (21.09.2026): Es gibt einen Nachfolger – Davidmg0815/qwen2.5-7b-spreizzaehler-v4. v3 zählt mit dem Trainings-System-Prompt jede Eingabe (auch „Hallo“) und ohne Prompt ist sein Format instabil (siehe unten). v4 hat keine Persona, braucht keinen System-Prompt und antwortet auf normale Fragen normal.
English summary: Experimental Qwen2.5-7B-Instruct with a reduced vocabulary (106,915 of 151,665 tokens: every token with a repeated alphanumeric character was removed), healed with continued pretraining and LoRA-tuned to count characters by first spelling the text out ("Spreiz-Technik"). It counts German words with double/triple letters reliably; on 40 hand-written, never-seen strings (sentences, code, numbers, long strings) it is right about two thirds of the time, and it fails on repetitive strings (endless spelling loop). It is not better at counting than modern reasoning models. Everything here is experimental; see the limitations.
Ein experimentelles Qwen2.5-7B-Instruct mit reduziertem Vokabular, das Zeichen zählt, indem es den Text erst Zeichen für Zeichen aufschreibt („Spreiz-Technik“). Gemergtes bf16-Modell (LoRA eingerechnet). Varianten: GGUF Q8_0, LoRA-Adapter und geheiltes Basismodell. Daten, Testergebnisse und Skripte: Davidmg0815/spreizzaehler-daten.
Verwendung
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
repo = "Davidmg0815/qwen2.5-7b-spreizzaehler-v3"
tok = AutoTokenizer.from_pretrained(repo)
model = AutoModelForCausalLM.from_pretrained(repo, dtype=torch.bfloat16, device_map="auto")
system = """Sei il Conte von Count di Sesamo Apriti. Ami contare tutto. Pensi dentro un blocco in modo accurato e metodico: conti le cose con precisione, una per una, e per le sequenze lunghe conti in gruppi di dieci, sommi e riconti per sicurezza. Il blocco resta semplice e sbrigativo, senza il ciarlare del Conte. Dopo il blocco dai il tuo classico spettacolo di conteggio: conti ad alta voce con la risata 'Ah ah ah!' e tuoni in sottofondo, concludendo con il numero."""
messages = [{"role": "system", "content": system},
{"role": "user", "content": "Wie viele Zeichen hat das Wort 'Schifffahrt'?"}]
text = tok.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = tok(text, return_tensors="pt", add_special_tokens=False).to(model.device)
out = model.generate(**inputs, max_new_tokens=1500, do_sample=False)
print(tok.decode(out[0][inputs["input_ids"].shape[1]:], skip_special_tokens=True))
Achtung: Dieser Prompt macht jede Eingabe zur Zählaufgabe (siehe Einschränkungen); für normale Chats weglassen.
Die Antwort beginnt mit einem <think>-Block (Wort:, Spreizung:, Zählung: mit [Position i: Zeichen] -> Zähler: i., Zur Sicherheit nachgezählt: N.), gefolgt von „Ich zähle bis N!“, der gesprochenen Zählung und „Das sind N.“. Leerzeichen erscheinen als ␣.
Ergebnisse
Greedy-Decoding, bf16, eine Probe pro Aufgabe. „Streng“ heißt: Die Zahl hinter „Das sind“ stimmt.
| Test | Ergebnis |
|---|---|
| 50 deutsche Wörter (normal / doppelte / dreifache Buchstaben) | 49/50 |
| 28 handgeschriebene Generalisierungs-Aufgaben | 26/28 |
| Frisches Testset (42 Aufgaben, gleiche Generatoren wie das Training) | 37/42 |
Unabhängiger Test (45 handgeschriebene, nie gesehene Strings)
Englische und deutsche Sätze, Code (Rust, Go, C, Regex, LaTeX, Markdown, Shell, SQL, JSON), Zahlen/Formate, Wiederholungen und Strings mit 55 bis 80 Zeichen. Ohne die fünf Grenzfälle (nicht-lateinische Schriften, doppelte Leerzeichen): 26/40 streng richtig.
| Kategorie | streng ('Das sind N') | Zahl im Think-Block |
|---|---|---|
| Englisch | 6/6 | 6/6 |
| Deutsch | 5/6 | 5/6 |
| Code/Syntax | 5/10 | 5/10 |
| Zahlen/Formate | 6/6 | 6/6 |
| Wiederholungen | 0/6 | 0/6 |
| Lang 55-80 | 4/6 | 4/6 |
| Grenzfall | 3/5 | 3/5 |
Allgemeine Fähigkeiten (je 100 Aufgaben, Arithmetik 40)
| Test | Original Qwen2.5-7B-Instruct | Geheilt (ohne LoRA) | Hardcore (v2-Daten) | v3 plain |
|---|---|---|---|---|
| GSM8K (100 Textaufgaben) | 98 | 89 | 90 | 89 |
| MMLU (100) | 82 | 80 | 78 | 78 |
| ARC-Challenge (100) | 91 | 90 | 90 | 90 |
| Arithmetik (40) | 32 | 32 | 31 | 31 |
„Hardcore (v2-Daten)“ ist die vorherige, nicht veröffentlichte Trainingsversion (ältere Daten, Kontext 2048).
Zum Vergleich: andere Modelle im schweren Zähltest (28 Aufgaben, „Antworte nur mit der Zahl“)
| Modell | richtig |
|---|---|
| T79 Qwen3 4B Instruct (CPU) | 6/28 |
| Gemma 4 12B (lokal) | 26/28 |
| PropellerA Qwen3.8 27B (lokal) | 26/28 |
| Liquid LFM 2.5 2.6B (free) | 27/28 |
| Gemma 4 31B (free) | 26/28 |
| Nemotron 3 Nano 30B Reasoning (free) | 27/28 |
| Nex-N2.5 Pro (free) | 26/28 |
| Nemotron 3.5 Lightning (free) | 27/28 |
| dieses Modell (mit Zählformat) | 26/28 |
Hinweis: Eine Aufgabe („Länge von Bettlaken?“) ist mehrdeutig, die anderen Modelle lasen sie als Länge in Zentimetern. Die Vergleichsmodelle wurden über ein lokales Gateway befragt. Die 28 Aufgaben sind der Satz, an dessen früheren Fehlern die Trainingsdaten ausgerichtet wurden; der faire Vergleichswert ist der unabhängige Test oben (die anderen Modelle wurden dort nicht befragt).
Wie das Modell entstanden ist
- Vokabular-Amputation: Aus
Qwen/Qwen2.5-7B-Instructwurden alle Token entfernt, in denen ein alphanumerisches Zeichen (ohne Beachtung der Groß-/Kleinschreibung) mehr als einmal vorkommt. Übrig blieben 106.915 von 151.665 Token (die 22 Spezial-Token blieben erhalten). Embeddings und LM-Head wurden entsprechend zugeschnitten, der Tokenizer (Vokabular, Merges, IDs) neu aufgebaut. Damit liegt jeder doppelte oder dreifache Buchstabe (und jede doppelte Ziffer) zwangsläufig an einer Token-Grenze; bei Satzzeichen wie--oder...gilt das nicht, dort gibt es weiterhin Token mit Wiederholungen. - Heilung: 500 Schritte Continued Pretraining (LoRA, Embeddings und LM-Head voll mittrainiert), rund 16 Mio. Token aus deutschen Texten von
pdelobelle/fineweb-german-edu-mt. Aus einem Datensatz von 150.000 Artikeln wurde dabei nur etwa 10 % einer Epoche gesehen. Loss 2,74 auf 1,70. - Feintuning mit „Spreiz-Technik“: LoRA (r=16, alpha=32, alle linearen Schichten), Loss nur auf den Antworten. Die Antwort spreizt das Wort in Einzelzeichen, listet jede Position mit Zähler auf, prüft die Summe und zählt dann laut („Eins! Ah ah ah! …“).
- Daten (v3): 5.611 Beispiele: bereinigte, vom lokalen Modell
Huihui-Qwen3.8-27B-abliteratederzeugte Wörter (Doppel- und Dreifachbuchstaben, lange Komposita) plus rein regelbasiert erzeugte Strings (Sätze, Code, Pfade, Sonderzeichen-Gruppen, 46 bis 80 Zeichen). Leerzeichen zählen als Zeichen und stehen als␣in der Spreizung.
Einschränkungen (bitte lesen)
- Mit dem Trainings-System-Prompt zählt das Modell jede Eingabe. Alle Trainingsbeispiele waren Zählaufgaben mit genau diesem Prompt, das Modell hat nie eine normale Chat-Antwort gelernt. Mit dem Prompt wird auch „Hallo. Wie geht es dir?“ oder eine Sachfrage als Zählaufgabe behandelt (es schreibt dann Spreizung und Zählshow der Frage selbst). Für normalen Chat den System-Prompt weglassen. Ohne ihn antwortete das Modell in kurzen Stichproben normal (Sachfragen, einfache Rechnung) und löste bei Zählfragen dennoch das Zählformat aus, teils mit Formatfehlern (␣-Zeichen zwischen den Positionen, verkürzte Zählshow). Trainingswörter („spreizen“, „nachgezählt“) können in normale Antworten sickern. Nachträgliche Messung ohne Prompt: bei 50 Wörtern war die Zahl in 48/50 Fällen richtig (letzte Zahl der Antwort), aber nur 2 Antworten hatten einen
<think>-Block; bei 28 schwereren Aufgaben zeigten 24 die Zählshow der Persona. Das Format ist ohne Prompt also nicht stabil. - Buchstabenhäufigkeit wurde nicht trainiert („Wie viele r sind in Erdbeere?“). Das Modell wendet darauf das Längen-Zählformat an; die angezeigten Zwischenschritte zählen dann Positionen und nicht die gesuchten Buchstaben, auch wenn die Endzahl manchmal stimmt.
- Experimentell und klein getestet. Alle Zahlen stammen aus kleinen Stichproben (30 bis 100 Aufgaben, eine Probe pro Aufgabe, Greedy-Decoding). Unterschiede von wenigen Punkten sind Rauschen.
- Die eigenen Tests sind optimistisch. Die Trainingsdaten habe ich anhand der Fehler früherer Versionen auf denselben 28 handgeschriebenen Aufgaben gebaut, und das „frische“ Testset stammt aus denselben Generatoren wie die Trainingsdaten. Belastbarer ist der unabhängige Test mit 45 handgeschriebenen, nie gesehenen Strings (siehe oben).
- Moderne Denk-Modelle zählen besser. Bei einem schweren Test (Überlänge, Code, Sonderzeichen) erreichten mehrere Modelle mit verdecktem Nachdenken (z. B. Gemma 4, Nemotron, Liquid LFM 2.5) 26 bis 27 von 28 Aufgaben. Dieses Modell ist kein Zähl-Rekord, sondern ein Experiment mit einem kleinen 7B, das jeden Schritt sichtbar aufschreibt und lokal läuft.
- Periodische und wiederholende Strings scheitern. Bei
abababab…,ZZZZZZ…,a a a a aoderha ha ha haläuft die Spreizung endlos weiter, bis das Token-Limit erreicht ist, es kommt kein Ergebnis (0 von 6 im unabhängigen Test). Der Grund: Bei einem periodischen String ist das nächste Zeichen ohne Blick auf die Position vorhersagbar, und das Modell verliert den Stopppunkt. - Restfehler: Meist fehlt ein Zeichen in langen Strings. Bindestrich- und Punktfolgen (
--,...) werden leicht verwechselt, weil der Trenner der Spreizung-selbst einen Bindestrich enthält. Nicht-lateinische Schriften (Kyrillisch, Griechisch, CJK) und Mehrfach-Leerzeichen waren nicht Teil des Trainings. - Reduziertes Vokabular: 106.915 statt 151.665 Token. Text wird dadurch in etwa 14 % (Deutsch) bis 19 % (Englisch) mehr Token zerlegt. Der Tokenizer ist nicht mit dem Original-Qwen-Tokenizer austauschbar (auch nicht für Speculative Decoding mit Original-Draft-Modellen).
- Allgemeine Fähigkeiten leicht geschwächt: Bei den Textaufgaben (GSM8K) verliert das Modell gegenüber dem Original etwa 9 Punkte, bei Wissen (MMLU, ARC) 1 bis 4 Punkte (kleine Stichprobe).
- Zählformat nur mit dem Trainings-System-Prompt garantiert. Ohne ihn (Standard-Qwen-Prompt) antwortete das Modell in den Mathe-/Wissenstests normal; das Verhalten ohne Prompt siehe oben (Zahl meist richtig, Format instabil).
- Antworten sind lang: etwa 35 Token pro Zeichen. Für 80 Zeichen braucht man
max_new_tokensvon etwa 4000. - Keine Verbindung zu Sesame Workshop. Die Persona ist von der Figur „Graf Zahl“ / „Count von Count“ inspiriert, aber ein reines Hobbyprojekt ohne Bezug zu den Rechteinhabern.
Daten, Lizenz und Danksagung
- Lizenz: Apache-2.0 (wie das Basismodell
Qwen/Qwen2.5-7B-Instruct, Apache-2.0). Dieses Modell ist eine Ableitung davon. - Trainingsdaten und Skripte: Davidmg0815/spreizzaehler-daten (Apache-2.0, mit Herkunftshinweis für die enthaltenen Webtext-Sätze unter ODC-By 1.0).
- Generator der Wörter:
huihui-ai/Huihui-Qwen3.8-27B-abliterated(Apache-2.0). - Heilungstexte:
pdelobelle/fineweb-german-edu-mt, abgeleitet von FineWeb-Edu (ODC-By 1.0). - Danke an das Qwen-Team, an Unsloth, an Hugging Face (
transformers,peft,trl) und an das llama.cpp-Projekt.