Projektdokumentation
KI-Beleg-Extraktor mit DATEV-Export — Rechnungen/Mahnungen strukturiert erfassen, fachlich prüfen und exportieren. Optional 100 % lokal.
Buchhaltung und Steuerbüros tippen Rechnungen von Hand ab. Ziel: aus PDF/Bild strukturierte Daten extrahieren, sie fachlich validieren und in ein echtes Buchhaltungsformat (DATEV) exportieren — nachvollziehbar und optional ohne Datenabfluss.
Clean Architecture (Abhängigkeiten nach innen). Server-rendered (Jinja2/HTMX) + schlankes Vanilla-JS (SSE-Schritte, Upload, Export-Download). Kein DB — flüchtige Verarbeitung.
| Schicht | Aufgabe |
|---|---|
domain | Beleg, Position, ValidationFlag, ExtractionResult + LLMPort + OcrPort |
application | BelegExtractor (Use-Case) + Validierungsregeln (UStG/BGB) |
infrastructure | document (pypdf/OCR), extractor (LLM structured output), export (DATEV/CSV/JSON), Mistral/Ollama, Tesseract |
api | FastAPI: Extraktor, /extract (SSE), /export/{fmt} |
PDFs liefern Text über pypdf, Bilder über Tesseract-OCR (lokal). Die Extraktion nutzt structured output (typisierte Felder + Positionen + Confidence). Darüber laufen deterministische Validierungsregeln — das „Enterprise"-Muster: die KI schlägt vor, harte Regeln prüfen.
| Prüfung | Regel |
|---|---|
| MwSt rechnerisch | Netto + MwSt = Brutto (±0,02) und MwSt = Netto × Satz (19/7 %) |
| § 14 UStG Pflichtangaben | Rechnungsnr, Datum, Lieferant, USt-IdNr, Netto, MwSt, Brutto vorhanden |
| Fälligkeit / § 288 BGB | überfällig? → Hinweis auf Verzugszinsen (B2B: 9 %-Pkt. über Basiszinssatz) — kein erfundener Betrag |
| IBAN plausibel | Format + Prüfsumme (mod 97) |
| USt-IdNr plausibel | Format (DE + 9 Ziffern) |
Jede Prüfung erzeugt ein Flag (✅/⚠️/❌) mit Begründung — Erklärbarkeit (EU-AI-Act).
Gegen ein synthetisches Golden-Set (10 Belege, inkl. 2 mit absichtlichem MwSt-Fehler):
| Metrik | Wert |
|---|---|
| Feld-Genauigkeit gesamt | 100 % (67/67) |
| Exact-Match-Rate | 10/10 |
| Validation-Catch-Rate (MwSt-Fehler erkannt) | 2/2 |
| Latenz p50 / p95 | 1,7 / 1,8 s |
Ehrliche Einordnung: kleines, sauber etikettiertes Set — der Wert liegt im feld-genauen, reproduzierbaren Harness (python eval/run_eval.py), nicht in der reinen Zahl.
EU-LLM (Mistral) oder 100 % lokal (Ollama + Tesseract) — Belege verlassen das Gerät nicht. Keine Speicherung (Datenminimierung). DATEV-EXTF ist ein vereinfachtes Mapping. Keine Steuerberatung (StBerG) — die fachliche Verbuchung bleibt beim Menschen.
CI: ruff + mypy --strict + pytest (35 Tests, offline via FakeLLM/FakeOcr). Validierungsregeln deterministisch unit-getestet. Sicherheit: server-seitiges Escaping (kein XSS, Regressionstest), Eingabe-Limit + Rate-Limit pro IP, Prompt-Injection-Härtung (Beleg-Text = Daten).
Teil des Portfolios von Limber Martinez · Live: beleglotse.limbermartinez.com · Stand: 2026-06.