Paperless OCR verbessern: best practise?

Hallo ! :waving_hand:

Ich möchte dir mein Setup vorstellen, mit dem ich
Paperless-ngx um eine vollständig lokale KI-Pipeline erweitert
habe. Keine Cloud, keine API-Kosten – alles läuft auf dem eigenen Server.

:bullseye: Was macht das System?

Kurz gesagt: Jedes Dokument, das ich einscanne oder importiere, wird automatisch von einer Vision-KI (Qwen2.5-VL via Ollama) analysiert.

Das Ergebnis:

  • Automatische
    Titel-Vergabe
    (z.B. „Rechnung Telekom Januar 2025“)

  • Korrespondent,
    Tags und Dokumenttyp
    werden erkannt und gesetzt

  • Hochwertige
    OCR
    direkt aus dem Bild (kein Tesseract-Salat bei Mehrspaltlern!)

  • Duplikaterkennung per
    Vektor-Ähnlichkeit (ChromaDB) + Binärvergleich

  • Optimiertes
    Archiv-PDF
    mit sauberem OCR-Layer

:building_construction: Architektur

Das System besteht aus zwei Stufen, die
vollständig in Docker laufen:

Stufe 1: AI Watchdog (Vor dem Import)

Ein eigener Container überwacht den scan_input-Ordner.
Sobald eine Datei auftaucht:

  1. Binärer Duplikat-Check (MD5 gegen Paperless-DB)

  2. PDF → Bilder konvertieren und optimieren (Schärfung, Kontrast)

  3. Vision-AI analysiert jede Seite (OCR + Layout-Erhaltung)

  4. Sidecar-JSON mit allen Ergebnissen wird erstellt

  5. Original wird unverändert(!) in den consume-Ordner verschoben

(Das Kopieren in den Consume-Ordner bleibt folgenlos)

Stufe 2: Post-Consume Script (Nach dem Import)

Paperless importiert das Dokument und triggert mein
Post-Consume-Script:

  1. Sidecar einlesen → Metadaten anwenden (Titel, Tags, Korrespondent, Datum)

  2. Content überschreiben mit dem besseren AI-OCR-Text

  3. Vektor-Duplikaterkennung via ChromaDB

  4. ChromaDB-Indexierung für semantische Suche

  5. Archiv-PDF optimieren

  6. Tag „paperless-ai“ setzen → Fertig! :white_check_mark:

:light_bulb: Das Besondere:
Fail-Safe + Retry

Falls die AI-Analyse im Watchdog scheitert (z.B.
verschlüsseltes PDF, Timeout):

  • Das Dokument wird trotzdem importiert (Fail-Safe)

  • Das Post-Consume-Script erkennt die fehlenden Daten und startet automatisch
    einen zweiten Versuch
    im Container

  • Das funktioniert sogar für DOCX und Bilder: Hier wird das von
    Paperless erstellte Archiv-PDF für die Vision-Analyse genutzt

:spouting_whale: Docker-Setup (Komplettes Re-Build eines Paperless-ngx)

Das Ganze läuft mit folgenden Containern:

Container Aufgabe

webserver - Paperless-ngx (Custom Build mit Python-Deps)

ai-worker - Watchdog (überwacht scan_input)

chromadb - Vektordatenbank für Duplikaterkennung

ai-chat - Ollama mit Open-WebUI (Dokumente per Chat durchsuchen)

broker - Redis

db - PostgreSQL

gotenberg - Office-Konvertierung

tika - Textextraktion

Ollama läuft bei mir direkt auf dem Host
(GPU-Zugriff). Kann aber auch als Container integriert werden.

:wrench: Verwendetes Modell

  • Qwen2.5-VL:7b via Ollama

  • Läuft bei mir auf Intel Core i7 Ultra, 32 GB-DDR5, Nividia RTX 5060 (16GB VRAM)

  • Verarbeitung: ~30-60 Sekunden pro Seite (je nach Komplexität)

  • Auch auf CPU möglich, dann natürlich langsamer

:hammer_and_wrench: Besondere Features

  • Zombie-Erkennung: Binärer Duplikat-Check prüft, ob die Datei physisch existiert. „Geister“
    in der DB werden ignoriert.

  • ChromaDB Cleanup: Wartungsskript zum Entfernen verwaister Vektoren (maintenance_cleanup_vectors.py).

  • Kein Datenverlust: Originale werden NIEMALS verändert. Alles passiert
    auf Kopien/im Archiv-Layer.

  • Deutsche Optimierung: Prompts und Metadaten-Extraktion sind auf deutsche
    Dokumente optimiert.

:red_question_mark: FAQ

Q: Brauche ich eine GPU? A: Empfohlen, aber
nicht zwingend. Qwen2.5-VL:7b läuft auch auf CPU, dann dauert es nur deutlich
länger.

Q: Funktioniert das auch mit nicht-deutschen Dokumenten?

A: Ja, die Prompts sind auf Deutsch, aber das Modell versteht auch Englisch/andere
Sprachen problemlos.

Credits: Ein großer Teil der Implementierung
wurde mit Unterstützung von Antigravity AI (Google DeepMind)
entwickelt. :robot:

2 „Gefällt mir“