Josev-2B-GGUF
Das erste deutsch trainierte Decision Model, soweit wir wissen. Jetzt auch im Format für die Hosentasche.
Ausprobieren: Josev-2B im Browser, ohne Installation, auf ZeroGPU. Anklickbare Beispiele inklusive.
GGUF-Dateien von mayflowergmbh/Josev-2B für
llama.cpp. Josev ist ein kleiner Decider, der Deutsch gelernt hat: trainiert auf
decisions-de (Version 1) mit 90
Aufgabenquellen und rund 19.000 Fällen. Übersetzt hat eine KI, für die Deutsch selbst eine
Fremdsprache ist. Das Ergebnis liest „Kündigungsbestätigungsschreiben“ trotzdem ohne Schnappatmung.
Die Option-Keys sind Englisch geblieben (card_arrival), die Beschreibungen sind Deutsch. Denglisch
by Design.
Josev spricht die System-One-/Jev-API /v1/systemone. Man gibt einen state und typisierte
Fragen (noul, choice, score) hinein und bekommt für jede Option eine Wahrscheinlichkeit zurück,
in einem einzigen Prefill mit "output_tokens": 0. Im Grunde ist das ein Klassifikator, dessen
Klassen mit jedem Request kommen. Mehr dazu und zur Frage „Warum Deutsch?“ steht auf der
Model-Card des PyTorch-Modells.
| Datei | Größe | Kommentar |
|---|---|---|
Josev-2B-Q8_0.gguf |
2,0 GB | Empfehlung, praktisch identisch mit PyTorch |
Josev-2B-Q6_K.gguf |
1,6 GB | |
Josev-2B-Q4_K_M.gguf |
1,3 GB | K-Quants können Wahrscheinlichkeiten verschieben und knappe Entscheidungen kippen |
Josev-2B-BF16.gguf |
3,8 GB | unquantisiert, für Puristen |
mmproj-Josev-2B-Q8_0.gguf, mmproj-Josev-2B-BF16.gguf |
0,4 / 0,7 GB | Vision-Tower, nur für images/videos im Request |
Exportiert mit Unsloths Decision-GGUF-Exporter und dem Clef-Konverter von llama.cpp. Die Temperaturen pro Fragetyp, die Unsloth nach dem Training gefittet hat (choice 1,13, score 0,88, noul 0,67), stecken in den GGUF-Metadaten. llama.cpp liefert also kalibrierte Wahrscheinlichkeiten direkt ab Werk.
Veröffentlicht von Mayflower GmbH.
Server starten
Braucht llama.cpp b11443 oder neuer (getestet mit b11541).
llama-server -m Josev-2B-Q8_0.gguf --mmproj mmproj-Josev-2B-Q8_0.gguf -ngl 99 \
-np 2 -c 32768 -b 16384 -ub 16384 --port 8080
Wichtig, wirklich wichtig: Josev verarbeitet den ganzen Request in einem Batch. -b/-ub
müssen deshalb mindestens so groß sein wie der längste Request in Tokens. Mit dem Default 512 endet
jeder längere Request mit HTTP 500 („input is too large to process“). Das ist die einzige
Entscheidung, die Josev nicht selbst treffen kann. -c teilen sich die -np Slots.
Ollama
Seit dem 19.10.2026 steht in den Modell-GGUFs clef.context_length = 16384. Vorher stand dort der
Wert des Qwen3.5-Basismodells, 262.144. Ollama legt den Compute-Buffer nach diesem Wert an, das
waren rund 160 GiB, und das Modell startete nicht. Josev braucht so viel Kontext nicht, trainiert
und gemessen wird mit höchstens 16.384 Tokens pro Request. Jetzt geht es ganz ohne Modelfile,
direkt vom Hub (der Vision-Tower kommt automatisch mit):
ollama pull hf.co/mayflowergmbh/Josev-2B-GGUF:Q8_0
ollama show hf.co/mayflowergmbh/Josev-2B-GGUF:Q8_0 # clef, context length 16384, Capabilities: decision, vision
Wer eine lokale Datei importiert, braucht nur ein Modelfile mit einer Zeile, ganz ohne Parameter:
echo "FROM ./Josev-2B-Q8_0.gguf" > Modelfile
ollama create josev-2b -f Modelfile
ollama run passt nicht, Josev generiert keinen Text. Ollama spricht dieselbe API wie llama.cpp,
nur auf Port 11434:
curl -s http://127.0.0.1:11434/v1/systemone -H 'Content-Type: application/json' -d '{
"model": "hf.co/mayflowergmbh/Josev-2B-GGUF:Q8_0",
"state": {"kommentar": "Du bist so ein Vollpfosten, lösch einfach deinen Account."},
"questions": {"beleidigend": {"type": "noul", "instructions": "Ist der Kommentar beleidigend?"}}}'
Getestet mit Ollama 0.40.6 auf einer RTX PRO 6000, lokal importiert und direkt vom Hub: Das Modell
lädt komplett auf die GPU mit 16.384 Tokens Kontext. Die decisions-de-Validation läuft ohne
Fehler durch:
| Q8_0 über | Accuracy | ECE |
|---|---|---|
llama-server (ohne -c) |
0,844 | 0,022 |
| Ollama 0.40.6 | 0,843 | 0,020 |
Die Gewichte sind unverändert, nur dieser eine Metadaten-Wert ist neu. Auch llama-server braucht
jetzt kein -c mehr, solange ein Slot reicht. Die Dateien mit dem alten Wert liegen weiter unter
dem Tag v1. Die mmproj-Dateien sind unverändert.
Beispiele
Alle Ausgaben stammen echt aus Josev-2B-Q8_0.gguf und sind gekürzt.
Rechnung: drei Fragetypen in einem Request
curl -s http://127.0.0.1:8080/v1/systemone -H 'Content-Type: application/json' -d '{
"model": "josev-2b",
"state": {"rechnung": {"betrag": 1250.0, "status": "seit 30 Tagen überfällig"}},
"questions": {
"status": {"type": "choice", "instructions": "Welchen Status hat die Rechnung?",
"criteria": {"paid": "bezahlt", "overdue": "überfällig", "draft": "Entwurf"}},
"gross": {"type": "noul", "instructions": "Ist der Betrag höher als 1000 EUR?"},
"dring": {"type": "score", "instructions": "Wie dringend ist eine Mahnung?",
"criteria": ["gar nicht", "etwas", "sehr"]}
}}'
{"answers": {
"status": {"type": "choice", "choice": "overdue", "probabilities": {"draft": 0.0002, "overdue": 0.9994, "paid": 0.0005}, ...},
"gross": {"type": "noul", "noul": 0.9991},
"dring": {"type": "score", "score": 1.70, "probabilities": {"0": 0.042, "1": 0.219, "2": 0.739}, ...}},
"usage": {"input_tokens": 339, "output_tokens": 0}}
score liefert den Erwartungswert über die Stufen (1,70 von 2) und die Verteilung dazu. Josev
findet: Mahnen, aber freundlich.
Intent-Erkennung
curl -s http://127.0.0.1:8080/v1/systemone -H 'Content-Type: application/json' -d '{
"model": "josev-2b",
"state": {"nachricht": "Meine neue Karte ist immer noch nicht da, dabei habe ich sie vor zwei Wochen bestellt."},
"questions": {"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.9994)
Moderation
curl -s http://127.0.0.1:8080/v1/systemone -H 'Content-Type: application/json' -d '{
"model": "hf.co/mayflowergmbh/Josev-2B-GGUF:Q8_0",
"state": {"kommentar": "Du bist so ein Vollpfosten, lösch einfach deinen Account."},
"questions": {
"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.92 · aktion: delete (0.84)
Und sonst so
| Aufgabe | State (gekürzt) | Antwort von Q8_0 |
|---|---|---|
| Emotion | „Ich habe die Prüfung bestanden!!! Ich kann es immer noch nicht glauben.“ | joy 0,94 |
| NLI | „Josef trinkt jeden Morgen zwei Tassen Kaffee…“ vs. „Josef trinkt keinen Kaffee.“ | contradiction 0,99 |
| Leseverstehen | Schwebebahn, eröffnet 1901: „Wann wurde sie eröffnet?“ | b (1901) 0,996 |
| Präferenz | Ei-Kochanleitung vs. „Eier sind reich an Proteinen.“ | a 0,65 |
Die vollständigen Requests dazu stehen auf der PyTorch-Model-Card.
Messwerte
Q8_0 über llama-server /v1/systemone gegen das bf16-PyTorch-Modell:
| Eval-Set | Entscheidungen | Q8_0 Accuracy | PyTorch Accuracy | Q8_0 ECE | PyTorch ECE* |
|---|---|---|---|---|---|
decisions-de Validation |
1.215 | 0,845 | 0,842 | 0,023 | 0,024 |
* PyTorch mit denselben Typ-Temperaturen, die im GGUF stecken.
Q8_0 verliert also nichts, die Quantisierung hat Josev nicht dümmer gemacht. Die anderen
Quantisierungen sind nicht vermessen; wer Q4_K_M nimmt, entscheidet auf eigenes Risiko. Josev ist
ein Generalist für die Aufgaben aus decisions-de (Intents, NLI, Leseverstehen, Moderation,
Emotionen, Präferenzen, Logik). Wer mehr Genauigkeit braucht, nimmt den großen Bruder
Josev-4B-GGUF. Details, Training und Kleingedrucktes stehen auf der
Model-Card von Josev-2B.
Lizenz
Apache-2.0, wie das Basismodell Qwen3.5-2B. Die Trainingsdaten behalten die Lizenzen ihrer Quellen, siehe Dataset-Card.