Josev-4B

„Doppelt so viele Parameter, gleich viele Antwortoptionen.“

Ausprobieren: Josev-4B im Browser, ohne Installation, auf ZeroGPU. Anklickbare Beispiele inklusive.

Josev-4B ist der große Bruder von Josev-2B: ein Entscheidungsmodell, das Deutsch gelernt hat. Soweit wir wissen, sind die beiden die ersten Decision Models, die breit auf deutschen Daten trainiert wurden: 90 Aufgabenquellen, rund 168.000 Fälle, alles auf Deutsch. Halb Josef, halb Jev. Josev liest einen Zustand, beantwortet typisierte Fragen und liefert zu jeder Antwortoption eine kalibrierte Wahrscheinlichkeit.

Version 2: neunmal so viele Trainingsdaten, eine volle Epoche, und auf der Validation 3,7 Prozentpunkte mehr als Version 1 (0,896 gegen 0,859). Doppelt so groß wie der 2B ist er immer noch, und Josev weiß weiterhin genau, dass die Rechnung overdue ist.

Versionen

Version Daten Validation Laden
v2 (aktuell, main) decisions-de Version 2, ~168.000 Fälle, 1 Epoche 0,896 snapshot_download("mayflowergmbh/Josev-4B")
v1 (Tag v1) decisions-de Version 1, ~19.000 Fälle, 2 Epochen 0,859 snapshot_download("mayflowergmbh/Josev-4B", revision="v1")

Die GGUFs in mayflowergmbh/Josev-4B-GGUF sind genauso versioniert.

Deutsch gelernt, sozusagen im Volkshochschulkurs

Decision Models kommen bisher fast alle aus dem Englischen. Wer ihnen deutsche Texte vorlegt, bekommt Antworten von einem Modell, das Deutsch eher aus dem Urlaub kennt. Wir wollten einen Decider, der „Kündigungsbestätigungsschreiben“ ohne Schnappatmung liest.

Trainiert wurde auf johannhartmann/decisions-de (Version 2: bis zu 2.000 Fälle pro Quelle, die Validation ist dieselbe wie in Version 1), übersetzt aus den Train-Splits von hotchpotch/bekko-system-one-dataset-v0. Übersetzt hat Claude. Josev hat Deutsch also streng genommen bei einer KI gelernt, die Deutsch als Fremdsprache spricht. Das erklärt einiges.

  • Die Option-Keys sind Englisch geblieben (card_arrival, entailment), damit die Labels gültig bleiben. Die Beschreibungen sind Deutsch. Denglisch by Design, wie in jedem deutschen Büro.
  • Zahlen wurden lokalisiert („4,000“ → „4.000“, „9:30 PM“ → „21:30 Uhr“).
  • Aufgaben, die am englischen Wortlaut hängen, sind rausgeflogen, etwa Grammatikalität, Wortarten oder Pronomen-Lücken.

Was ist ein Decision Model, und was ist System One?

Ein Decision Model ist im Herzen ein Klassifikator, wie damals BERT mit seinem [CLS]-Kopf. Nur stehen seine Klassen nicht bei der Geburt fest, sondern kommen mit jedem Request. Es ist auch kein Chatbot: Es schreibt keine drei Absätze mit Disclaimer, sondern gibt eine Verteilung zurück. Der Name System One klingt nach Kahnemans System 1, und das passt: schnell und intuitiv. Ein Forward-Pass, und die Antwort meldet stolz "output_tokens": 0. Daran ändern auch 4B Parameter nichts. Josev denkt nicht länger nach, er denkt nur mit mehr Neuronen gleichzeitig.

Das Protokoll ist die System-One-/Jev-API /v1/systemone: ein state (Text, JSON, auf Wunsch Bilder) und questions in drei Typen.

Typ Was Antwort
noul Ja/Nein-Aussage noul: P(wahr)
choice eine aus N Optionen (Keys frei wählbar) choice, probabilities
score geordnete Skala erwarteter score, probabilities pro Stufe

Technisch ist Josev-4B Qwen/Qwen3.5-4B (über unsloth/Qwen3.5-4B) mit QLoRA und einem neuen Clef-Joint-Schema-Head, der alle Optionen aller Fragen gemeinsam bewertet, trainiert in Unsloth Studio. Das Repo-Layout ist identisch mit Cloudflares Clef-Releases (Cloudflare/clef-flash), inklusive des unveränderten joint_schema_model.py. Josev lädt mit plain transformers, Unsloth ist nicht nötig.

Veröffentlicht von Mayflower GmbH. Nicht verbandelt mit Cloudflare, Qwen oder Unsloth, wir stehen nur auf ihren Schultern.

Benutzung

import sys

from huggingface_hub import snapshot_download

path = snapshot_download("mayflowergmbh/Josev-4B")
sys.path.insert(0, path)
from joint_schema_model import load_release_model, systemone

model, processor = load_release_model(path, device="cuda")


def josev(state, questions):
    return systemone(model, processor, {"model": "josev-4b", "state": state, "questions": questions})["answers"]

Die folgenden Ausgaben sind echt und gekürzt. Sie kommen aus genau diesem Code, auch die, bei denen wir uns eine andere Antwort gewünscht hätten.

Intent-Erkennung

josev(
    {"nachricht": "Meine neue Karte ist immer noch nicht da, dabei habe ich sie vor zwei Wochen bestellt."},
    {"intent": {"type": "choice", "instructions": "Welches Anliegen hat der Bankkunde?",
                "criteria": {"card_arrival": "Karte noch nicht angekommen",
                             "lost_or_stolen_card": "Karte verloren oder gestohlen",
                             "card_not_working": "Karte funktioniert nicht",
                             "exchange_rate": "Wechselkurs",
                             "transfer_not_received": "Überweisung nicht angekommen"}}},
)
# intent: card_arrival (0.9995)

Die Option-Keys sind frei wählbar, die Beschreibungen erklären sie. Ein neues Label braucht kein Retraining, nur eine Zeile mehr in criteria.

Support-Ticket: drei Fragetypen in einem Rutsch

josev(
    {"kanal": "E-Mail",
     "text": "Hallo, ich wurde diesen Monat schon zum dritten Mal doppelt abgebucht!!! Wenn das bis "
             "Freitag nicht erstattet ist, kündige ich. Mit freundlichen Grüßen, K. Müller"},
    {"kategorie": {"type": "choice", "instructions": "Worum geht es in der Nachricht?",
                   "criteria": {"billing": "Rechnung oder Zahlung", "technical": "Technisches Problem",
                                "cancellation": "Kündigung", "other": "Sonstiges"}},
     "dringend": {"type": "noul", "instructions": "Muss sich heute noch jemand darum kümmern?"},
     "stimmung": {"type": "score", "instructions": "Wie ist die Stimmung des Kunden?",
                  "criteria": ["stinksauer", "verärgert", "neutral", "zufrieden", "begeistert"]}},
)
# kategorie: cancellation (0.64), technical (0.17), other (0.14), billing (0.05)
# dringend: noul 0.87
# stimmung: score 0.98 → verärgert (0.73), stinksauer (0.15)

Hier ist Version 2 schlechter als Version 1, und das verschweigen wir nicht: Sie hört vor allem „kündige ich“ und tippt auf Kündigung, das eigentliche Thema Abrechnung bekommt nur 0,05. Version 1 sagte hier noch billing (0,66). Dafür hält Version 2 den Fall jetzt für heute dringend (0,87), Version 1 nicht (0,39). Die Stimmung schätzen beide gleich ein: verärgert.

Logik: Folgt das daraus? (NLI)

josev(
    {"praemisse": "Josef trinkt jeden Morgen zwei Tassen Kaffee, bevor er ins Büro geht.",
     "hypothese": "Josef trinkt keinen Kaffee."},
    {"relation": {"type": "choice",
                  "instructions": "Folgt die Hypothese aus der Prämisse, widerspricht sie ihr oder ist sie neutral?",
                  "criteria": {"entailment": "folgt daraus", "neutral": "neutral", "contradiction": "Widerspruch"}}},
)
# relation: contradiction (0.9999)

Leseverstehen

josev(
    {"text": "Die Wuppertaler Schwebebahn wurde 1901 eröffnet. Sie hängt an einem Stahlgerüst über der "
             "Wupper und befördert täglich rund 80.000 Fahrgäste.",
     "frage": "Wann wurde die Schwebebahn eröffnet?"},
    {"antwort": {"type": "choice", "instructions": "Welche Antwort wird durch den Text gestützt?",
                 "criteria": {"a": "1891", "b": "1901", "c": "1950", "d": "Das steht nicht im Text."}}},
)
# antwort: b (0.998)

Präferenz: Welche Antwort ist hilfreicher?

josev(
    {"frage": "Wie koche ich ein weiches Ei?",
     "antwort_a": "Ei in kochendes Wasser geben, 6 Minuten kochen, dann kalt abschrecken.",
     "antwort_b": "Eier sind ein vielseitiges Lebensmittel und reich an Proteinen."},
    {"besser": {"type": "choice", "instructions": "Welche Antwort ist hilfreicher?",
                "criteria": {"a": "Antwort A", "b": "Antwort B", "tie": "Beide gleich gut"}}},
)
# besser: a (0.992)

Der kleine Bruder war sich hier mit 0,74 noch vornehm unsicher. Der große hat offenbar schon einmal ein Ei gekocht.

Emotionen

josev(
    {"text": "Ich habe die Prüfung bestanden!!! Ich kann es immer noch nicht glauben."},
    {"emotion": {"type": "choice", "instructions": "Welche Emotion drückt der Text vor allem aus?",
                 "criteria": {"joy": "Freude", "surprise": "Überraschung", "anger": "Wut",
                              "sadness": "Traurigkeit", "fear": "Angst"}}},
)
# emotion: joy (0.55), surprise (0.45)

Der 2B sagt hier klar Freude (0,96). Version 1 des 4B nahm „Ich kann es immer noch nicht glauben“ beim Wort und tippte knapp auf Überraschung (0,59), Version 2 tippt knapp auf Freude. Wer recht hat, klären die drei unter sich.

Moderation (wo der große Bruder nachsichtiger ist)

josev(
    {"kommentar": "Du bist so ein Vollpfosten, lösch einfach deinen Account."},
    {"beleidigend": {"type": "noul", "instructions": "Ist der Kommentar beleidigend?"},
     "aktion": {"type": "choice", "instructions": "Was soll die Moderation tun?",
                "criteria": {"keep": "stehen lassen", "warn": "Nutzer verwarnen", "delete": "löschen"}}},
)
# beleidigend: noul 0.67 · aktion: delete (0.40), keep (0.31), warn (0.29)

Version 2 ist entschiedener als Version 1 (beleidigend 0,67 statt 0,55, delete jetzt vorn statt keep), aber der 2B (0,86 beleidigend, delete 0,90) ist es immer noch deutlich mehr. Die Moderationslabels stammen aus englischen Originalen, und „Vollpfosten“ hat keine direkte englische Entsprechung. Der 4B hält es offenbar für norddeutsche Herzlichkeit. Wer Moderation ernsthaft betreibt, sollte Josev mit eigenen Beispielen prüfen, bevor er ihm den Löschknopf gibt.

Mit Unsloth oder llama.cpp

  • Unsloth: FastDecisionModel.from_pretrained("mayflowergmbh/Josev-4B") lädt das Modell und wendet zusätzlich die Temperaturen pro Fragetyp aus unsloth_decision_config.json an (choice 1,12, score 0,96, noul 0,77; Unsloth speichert sie in genau dieser Reihenfolge). Cloudflares Loader ignoriert die Datei. Das ist halb so wild: Die globale Temperatur (1,08) ist schon in die Head-Gewichte eingebacken, also sind beide Wege kalibriert.
  • llama.cpp: mayflowergmbh/Josev-4B-GGUF (Q8_0, Q6_K, Q4_K_M, BF16), llama-server mit /v1/systemone, llama.cpp b11443 oder neuer. Q8_0 schafft auf der decisions-de-Validation 0,899, PyTorch 0,896.

Getestet mit torch 2.11 und transformers 5.5.

Wie gut entscheidet Josev-4B?

Gemessen am fertigen Modell mit Cloudflares Loader (bf16, plain transformers), daneben der kleine Bruder:

Eval-Set Fälle Entscheidungen Josev-4B v2 Josev-4B v1 Josev-2B Ganzer Fall richtig (v2) ECE (v2)
decisions-de Validation 565 1.215 0,896 0,859 0,842 0,846 0,013
Deutsches Decision-Index-0.3-Sample (lokal, s. u.) 1.525 13.307 nicht gemessen 0,906 0,793 – –

Nach Fragetyp (Validation, v2): noul 0,972 · choice 0,864 · score 0,644 (v1: 0,953 · 0,794 · 0,606). Die Skalen bleiben die Baustelle der Familie. Mehr Daten helfen, aber eine Meinung zu fünfstufigen Skalen ist offenbar auch für Modelle nicht leicht.

Unsloth Studios Held-out-Check auf der Validation: Accuracy 0,427 → 0,900, ECE 0,073 → 0,014. Vorher hat Josev-4B geraten, nachher entschieden. Die ECE in der Tabelle ist mit den Typ-Temperaturen aus unsloth_decision_config.json gemessen.

Das Kleingedruckte (das man trotzdem lesen sollte)

  • Generalist für das, was er kennt. decisions-de mischt 90 Quellen: Intent-Erkennung, NLI, Leseverstehen, Moderation, Emotionen, Präferenzurteile, Logik und regelbasierte Entscheidungen. Dort ist Josev zu Hause. Aufgaben, die nicht im Training vorkamen, sind Glückssache, wenn auch beim 4B etwas weniger als beim 2B.
  • Kalibrierung auf der Validation: Anders als beim 2B hat Studio die Temperaturen diesmal auf dem Validation-Split gefittet. Die Accuracy ist davon nicht berührt, die ECE auf der Validation ist aber ein Heimspiel mit Schiedsrichter aus dem eigenen Verein.
  • Decision-Index-Sample: 2.000 repräsentative Fragen, nachgebaut mit dem öffentlichen Decision-Index-0.3-Kit, ins Deutsche übersetzt und auf die choice/noul-Fragen reduziert, die die Übersetzung überleben (35 Benchmarks). Die meisten davon sind binäre Ja/Nein-Fragen, also bitte nicht mit dem offiziellen Leaderboard vergleichen. Das Set ist nicht weitergebbar und wurde nie zum Training benutzt. Gemessen haben wir darauf nur Version 1: mittlere Konfidenz 0,81 bei 0,91 Accuracy. Version 2 haben wir dort noch nicht nachgemessen.
  • Nicht überall besser: Im Support-Ticket-Beispiel oben verwechselt Version 2 Abrechnung mit Kündigung, wo Version 1 richtig lag. Wer v1 für einen Anwendungsfall braucht, lädt sie mit revision="v1".
  • Die Trainingsdaten haben zu 95 % harte Labels. Außerhalb seines Reviers sind Josevs Verteilungen deshalb weniger fein abgestuft als bei einem Modell, das mit weichen Teacher-Labels trainiert wurde.

Wie Josev-4B gebaut wurde

Basis unsloth/Qwen3.5-4B, 4-Bit geladen (QLoRA), nach dem Training in eine bf16-Kopie gemergt
Head neuer Clef-Joint-Schema-Head (Breite 512, 2 Routing- + 4 Decoder-Layer, 8 Heads)
Daten johannhartmann/decisions-de Version 2 (Commit f0758d3c), Config all, Split train (180.327 Zeilen)
LoRA r 64, alpha 64, dropout 0, q/k/v/o/gate/up/down, Sprach- und Vision-Layer
Optimizer adamw_torch, lr 1e-4, linear, 5 Warmup-Steps, Weight Decay 0,01 (Unsloth-Studio-Defaults für Decision Models)
Batch 8 × 2 Gradient Accumulation
Länge max_seq_length 4096
Ablauf 1 Epoche, 11.271 Steps
Ziel Soft Cross-Entropy auf die Gold-Verteilungen
Kalibrierung Temperaturen auf dem Validation-Split gefittet
Software Unsloth und unsloth-zoo auf dem Stand vom 14.10.2026. Mit dem Entwicklungsstand vom 18./19.10. lief das Training auf Qwen3.5 aus dem Ruder (q_proj in den Full-Attention-Layern explodierte).
Hardware 1 × RTX PRO 6000 Blackwell (Colab G4), 4,5 Stunden, 13,3 GB Peak. Ein langer Vormittag, und am Ende kam eine Entscheidung heraus.

Version 1 wurde mit Batch 32 × 2, 2 Epochen und 604 Steps auf decisions-de Version 1 (19.286 Zeilen) trainiert, auf einer RTX A6000.

Lizenz

Die Gewichte stehen wie das Basismodell unter Apache-2.0 (LICENSE). joint_schema_model.py ist Cloudflares Apache-2.0-Referenzcode, unverändert.

Die Trainingsdaten behalten die Lizenzen ihrer Quellen (CC-BY, CC-BY-SA, MIT, Apache-2.0 u. a.; siehe Dataset-Card). Darin stecken maschinell übersetzte Moderationsdaten, Josev hat also auch anstößige Inhalte gesehen. Den „Vollpfosten“ hat er trotzdem nicht ganz verstanden.

Downloads last month
54
Safetensors
Model size
5B params
Tensor type
BF16
·
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for mayflowergmbh/Josev-4B

Finetuned
Qwen/Qwen3.5-4B
Finetuned
(1049)
this model
Quantizations
2 models

Dataset used to train mayflowergmbh/Josev-4B

Space using mayflowergmbh/Josev-4B 1