JSON-Ausgabe unbrauchbar - was mache ich falsch?

#1
by raimocom - opened

Hallo Keyvan,

ich bin Neuling beim Thema lokale KI und habe jetzt mal dein Modell nach deiner Anleitung mit llama-server ausprobiert. Die Ergebnisse sind mangelhaft und inkonsistent. Ich vermute, ich mache irgendwo einen Fehler.

Mein Setup:

  • Hardware: AMD Ryzen 7500F, 16GB RAM, GPU Intel Arc Pro B60 24GB VRAM
  • Software: Windows 11, Intel AI Playground

Intel AI Playground verwendet (optional) als eine seiner Komponenten llama.cpp. Das habe ich zur Nutzung deines Modells verwendet.

Mein Vorgehen:

  • Modell herunterladen (german-ocr-3.1-Q8_0.gguf)
  • MMPROJ-Datei herunterladen (mmproj-german-ocr-3.1-F16.gguf)
  • llama-server starten ( llama-server -m german-ocr-3.1-Q8_0.gguf --mmproj mmproj-german-ocr-3.1-F16.gguf --port 8080 -ngl 99)
  • http://localhost:8080 aufrufen
  • gut aufgelösten Screenshot einer einfachen einseitigen Rechnung hochgeladen + Prompt "Extrahiere als JSON"

Das Ergebnis ist JSON-artig. Allerdings kaputt (ein JSON-Validator zeigt Fehler) und gar nicht in der strukturierten Form , wie auf deiner Modellseite angegeben.
Die extrahierten Daten an sich sind fast alle korrekt, aber unvollständig.

Hier ein Beispiel einer Ausgabe:
{
"Rechnung": {
"Rechnungsnummer": "R12233455",
"Kundennummer": "D12345",
"Angebotsnummer": "445566",
"Leistungsdatum": "20.01.2025",
"Datum": "23.01.2025"
},
"Rechnung": {
"Bahnhof Schildburghausen - Reinigungsarbeiten",
"Position": "1",
"Art-Nr.": "CLE",
"Artikel": "Reinigung des Bahnsteiges",
"Anzahl": "1",
"Einheit": "Stck",
"Preis": "200,00",
"Gesamt": "200,00"
},
"Zahlungskonditionen": {
"Summe vor Steuern": "200,00",
"Umsatzsteuer": "19%",
"Gesamtbetrag": "238,00"
},
"Reinigung Cleantec": {
"Name": "Hans Saubermann",
"Adresse": "Wanderweg 13",
"Postleitzahl": "12345",
"Ort": "Wutzelwitz"
}
}

Was mache ich hier nicht richtig, hast du eine Idee?

Viele Grüße!
Raimo

Hallo Raimo,

Sorry für die späte Rückmeldung, ich schaue nur selten in die Hugging Face Discussions.

Kein Fehler bei dir, das ist ein Prompt-/Wrapper-Thema. German-OCR-3.1 liefert das saubere Schema-JSON nur, wenn sein System-Prompt aktiv ist. Der steckt im Chat-Template des Modells (sinngemäß: „…NUR ein einziges JSON-Objekt, null statt raten, festes Schema document_type / sender / recipient / line_items …"). Intel AI Playground nutzt aber seine eigene Prompt-Formatierung und lädt diesen System-Prompt nicht → das Modell free-styled → doppelte Keys, falsche Verschachtelung, unvollständig. Genau dein Output.

Drei Hebel, dann kommt das Schema von der Modellseite raus:

  1. System-Prompt explizit setzen (geht auch im Playground): Trag ins System-/Instructions-Feld den German-OCR-System-Prompt ein (der vollständige Text steht in chat_template.jinja im Repo – beginnt mit „Du bist German-OCR-3.1 …").

  2. Temperatur = 0. Deine „Inkonsistenz" kommt von Sampling > 0 – für Extraktion immer greedy.

  3. JSON per Schema erzwingen (garantiert valides JSON, keine doppelten Keys). Am saubersten über den stock llama-server:

llama-server -m german-ocr-3.1-Q8_0.gguf --mmproj mmproj-german-ocr-3.1-F16.gguf \
  -ngl 99 -c 32768 --temp 0 --jinja

--jinja lädt das Chat-Template inklusive System-Prompt automatisch. Danach per API response_format: {"type":"json_schema","json_schema": ...} mit dem Rechnungs-Schema verwenden – dann ist kaputtes JSON strukturell praktisch ausgeschlossen.

Wenn du magst, leg ich dir auch eine fertige schemas/invoice.json ins Repo (die habe ich bei German-OCR-3 bereits verwendet). Gib einfach Bescheid, ob es damit sauber funktioniert.

VG
Keyvan

Sign up or log in to comment