Josev-2B

„Ja, nein, vielleicht. Aber bitte mit Wahrscheinlichkeit und ordnungsgemäß ausgefüllt.“

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

Josev ist ein Entscheidungsmodell, das Deutsch gelernt hat. Soweit wir wissen, ist er das erste Decision Model, das breit auf deutschen Daten trainiert wurde: 90 Aufgabenquellen, rund 19.000 Fälle, alles auf Deutsch. Halb Josef, halb Jev. Er liest einen Zustand, beantwortet typisierte Fragen und liefert zu jeder Antwortoption eine kalibrierte Wahrscheinlichkeit.

Wer etwas mehr Gehirn braucht: Der große Bruder Josev-4B ist mit denselben Daten und demselben Rezept trainiert und entscheidet etwas öfter richtig, braucht dafür aber doppelt so viel Speicher.

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.

Den deutschen Trainingsdatensatz johannhartmann/decisions-de gab es dafür noch nicht, also haben wir ihn gebaut, ganz wie es sich gehört: mit mehr Aufwand als geplant und einer Tabelle zur Lizenzprüfung. Grundlage sind die Train-Splits aus hotchpotch/bekko-system-one-dataset-v0. Übersetzt hat Claude, Sonnet für Fragen und Optionen und Haiku für die Falltexte. Josev hat Deutsch also streng genommen bei einer KI gelernt, die Deutsch als Fremdsprache spricht. Das erklärt einiges.

Was man ihm dabei anmerkt:

  • 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.
  • Die Labels stammen aus den englischen Originalen. Ironie, Tonfall und Beleidigungen können in der Übersetzung etwas verrutschen. „Vollpfosten“ erkennt Josev trotzdem.
  • Zahlen wurden lokalisiert („4,000“ → „4.000“, „9:30 PM“ → „21:30 Uhr“). Josev ist damit vermutlich das einzige Decision Model, das bei Tausenderpunkten nicht zusammenzuckt.
  • Aufgaben, die am englischen Wortlaut hängen, sind rausgeflogen, etwa Grammatikalität, Wortarten oder Pronomen-Lücken. Kein Modell sollte deutsche Grammatik an englischen Beispielen lernen.

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.

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 Qwen/Qwen3.5-2B (über unsloth/Qwen3.5-2B) 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-2B")
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-2b", "state": state, "questions": questions})["answers"]

Die folgenden Ausgaben sind echt und gekürzt. Sie kommen aus genau diesem Code und nicht aus der Fantasie des Model-Card-Autors.

Intent-Erkennung (der Klassiker unter den Klassikern)

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.9998)

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

Moderation (mit Ja/Nein und Handlungsempfehlung in einem Rutsch)

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.86 · aktion: delete (0.90)

Beide Fragen werden in einem Forward-Pass beantwortet und sehen einander. Deshalb heißt es Joint-Schema-Head.

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.96), surprise (0.04)

Die 4 % Überraschung sind fair, der Kandidat konnte es ja selbst nicht glauben.

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.995)

Josev kennt Josef offenbar gut.

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.74), b (0.19), tie (0.07)

Richtig, aber nicht übermütig. Bei Geschmacksfragen ist Josev vorsichtig, und das ist gewollt.

Mit Unsloth oder llama.cpp

  • Unsloth: FastDecisionModel.from_pretrained("mayflowergmbh/Josev-2B") lädt das Modell und wendet zusätzlich die Temperaturen pro Fragetyp aus unsloth_decision_config.json an (choice 1,13, score 0,88, noul 0,67; Unsloth speichert sie in genau dieser Reihenfolge). Cloudflares Loader ignoriert die Datei. Das ist halb so wild: Die globale Temperatur (1,56) ist schon in die Head-Gewichte eingebacken, also sind beide Wege kalibriert. Die Typ-Temperaturen sind Feinschliff (ECE zu Hause 0,031 → 0,024).
  • llama.cpp: mayflowergmbh/Josev-2B-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,845, PyTorch 0,842.

Getestet mit torch 2.13 und transformers 5.5.

Wie gut entscheidet Josev?

Gemessen am fertigen Modell mit Cloudflares Loader (bf16, plain transformers):

Eval-Set Fälle Entscheidungen Accuracy Ganzer Fall richtig ECE
decisions-de Validation (Heimspiel) 565 1.215 0,842 0,750 0,031
Deutsches Decision-Index-0.3-Sample (lokal, s. u.) 1.525 13.307 0,793 0,413 0,190

Nach Fragetyp (Validation): noul 0,940 · choice 0,769 · score 0,588. Ja/Nein kann er richtig gut. Bei Skalen ist er noch etwas unentschlossen, was für einen Decider fast schon Ironie ist.

Unsloth Studios Held-out-Check (400 Entscheidungen): Accuracy 0,503 → 0,848, ECE 0,138 → 0,042. Vorher war Josev ein Münzwurf mit Extraschritten, nachher ein Decider.

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. 2B Parameter sind eben 2B Parameter.
  • 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.
  • Kalibrierung: Zu Hause passen Konfidenz und Trefferquote fast perfekt zusammen (ECE 0,03). Auswärts ist Josev bescheiden: mittlere Konfidenz 0,62 bei 0,79 Accuracy. Er hat öfter recht, als er sich selbst zutraut. Wir nennen das norddeutsches Understatement.
  • 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 gebaut wurde

Basis unsloth/Qwen3.5-2B, 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 1 (Tag v1), Config all, Split train (19.286 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
Batch 16 × 2 Gradient Accumulation
Länge max_seq_length 4096
Ablauf 2 Epochen, 1.194 Steps
Ziel Soft Cross-Entropy auf die Gold-Verteilungen
Kalibrierung Temperaturen auf Held-out-Daten gefittet
Hardware 1 × RTX A6000, 72 Minuten, 12,4 GB Peak. Kürzer als manches Meeting, das zu keiner Entscheidung führt.

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. Irgendwie muss er ja lernen, sie zu erkennen.

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

Model tree for mayflowergmbh/Josev-2B

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

Dataset used to train mayflowergmbh/Josev-2B

Space using mayflowergmbh/Josev-2B 1