Die Docling-Trilogie
Die Auslagerung von sensitiven Personendaten in Cloud-Lösungen internationaler Anbieter ist in den meisten Fällen unzulässig, wie privatim, die Konferenz der schweizerischen Datenschutzbeauftragten, in der [Resolution vom 24.11.2025] festhält. Also ist es dringend nötig, sich für die Datenanalyse entsprechende Kompetenzen zu erarbeiten oder diese zu beschaffen.
Meistens ist die Wissensbasis einer Firma, eines Spitals oder einer Arztpraxis sehr inhomogen. Formate wie .pdf sind zusätzliche Hürden, da diese nicht per se maschinenlesbar sind.
Docling ist ein von vielen Möglichkeiten solche Dokumente aufzubereiten. Ich habe verschiedene Lösungen getestet. Viele sind komplexere pdf-Dokumenten gescheitert. Docling hat die Dokumente sinnvoll aufbereitet, Tabellen in lesbares Markdown übersetzt und auch Abbildungen sauber extrahiert. Zudem bietet es eine grafische Oberfläche, welche sehr hilfreich ist, um das System zu testen. Unterdessen verwende ich auch Open WebUI als Frontend. Dort ist die Integration von Docling für die Dokumentenaufbereitung nun auch ohne zusätzliche Programmierung möglich. Docling hat den grossen Vorteil, dass die Junks inhaltsbasiert erzeugt werden, so bleiben Tabellen und Abschnitte intakt und können so später von der KI sinnvoller analysiert werden.
In diesem Blog stelle ich einen 'Proof of Conept' für lokales Hosting von Docling, mit lokalem und abgesicherten externen Zugang vor. Die Einrichtung auf dem Server ist mit Docker einfach und schnell. Die Konfiguration des Cloudflare Zugangs via Nginx Reverse Proxy mit einer Subdomain ist nicht so trivial, da die grafische Oberfläche nur per ui Endpoint erreichbar ist.
Was ist Docling?
GEMINI PROMPT
Erkläre was Docling ist:
Verwende fĂĽr die Antwort diesen Quelle:
https://www.youtube.com/watch?v=BWxdLm1KqTU
https://github.com/docling-project/docling-serveDocling ist ein leistungsstarkes Open-Source-Toolkit von IBM Research, das entwickelt wurde, um komplexe Dokumente wie PDFs, DOCX-, PowerPoint- oder Excel-Dateien in KI-freundliche Formate wie Markdown und JSON umzuwandeln.
Hier ist eine Zusammenfassung basierend auf den bereitgestellten Quellen:
1. Was ist Docling? (Zweck & Funktion)
Das Hauptziel von Docling ist es, Informationen aus Dokumenten zu befreien, die für KI-Workflows (wie Large Language Models) häufig schwer zugänglich sind. Während herkömmliche Tools oft an komplexen Layouts scheitern, nutzt Docling moderne KI-Modelle, um die Struktur eines Dokuments zu verstehen.
- Format-Konvertierung: Es wandelt proprietäre oder statische Formate (PDF, DOCX, PPTX) in strukturiertes Markdown oder JSON um.
- Layout-Analyse: Docling erkennt Überschriften, Unterüberschriften, Listen und insbesondere komplexe Tabellenstrukturen, um deren Integrität im Zielformat zu bewahren.
- KI-Modelle im Hintergrund: Es nutzt spezialisierte Modelle wie DocET und TableFormer, um Objekte zu erkennen und Tabellen korrekt zu rekonstruieren.
- Performance: In Benchmarks zeigt sich Docling deutlich schneller als viele andere Open-Source-Lösungen (z.B. Marker oder Unstructured), besonders auf moderner Hardware wie Apple M3 Chips.
2. Was ist Docling-Serve?
Docling-Serve ist die Erweiterung, die es ermöglicht, die Docling-Funktionalität als API-Service zu betreiben. Dies ist besonders nützlich für die Integration in grössere Unternehmensanwendungen oder Cloud-Infrastrukturen.
- API-Schnittstelle: Es stellt einen REST-Endpunkt zur Verfügung, über den Dokumente zur Konvertierung gesendet werden können.
- Docker-UnterstĂĽtzung: Es kann einfach als Container (z.B. via Podman oder Docker) gestartet werden, wobei verschiedene Images fĂĽr CPU- oder GPU-Beschleunigung (CUDA) zur VerfĂĽgung stehen.
- UI-Playground: Docling-Serve beinhaltet eine grafische Benutzeroberfläche (Swagger-UI und ein interaktives UI-Playground), mit der man Konvertierungen direkt im Browser testen und visualisieren kann.
3. Einsatzgebiete
- RAG (Retrieval-Augmented Generation): Um Dokumente in Vektordatenbanken zu laden, mĂĽssen sie zuerst in Text/Markdown zerlegt werden. Docling sorgt dafĂĽr, dass die semantische Struktur dabei erhalten bleibt.
- Modell-Feintuning: Hochwertige Markdown-Exporte eignen sich hervorragend als Trainingsdaten fĂĽr das Fine-Tuning von LLMs.
- Automatisierung: Über die CLI (Command Line Interface) oder die API können grosse Mengen an Dokumenten automatisiert verarbeitet werden.
Zusammenfassend lässt sich sagen, dass Docling die 'Brücke' zwischen unstrukturierten Dokumenten und modernen KI-Anwendungen schlägt, indem es eine präzise und performante Extraktion von Inhalten ermöglicht.
Quellen
GitHub
Youtube
[How Docling turns documents into usable AI data]
Docling Technical Report
Beispiel eines komplexen Dokuments mit Abbildungen und Tabellen:
[Publikation]

Hier die Abbildungen aus der oben erwähnten Publikation mit Beispielen, wie Docling die Daten extrahieren kann:




Als Härtetest verwende ich oft mehrspaltige Zeitungsartikel im .pdf-Format. Viele Modelle können das nicht.
Was ist RAG?
GEMINI PROMPT
Erkläre RAG:
Was bedeutet die AbkĂĽrzung in Zusammenhang mit Datenaufbereitung fĂĽr KI.
Erstelle eine Tabelle mit einem Eintrag für jeden Buchstaben: R A GRetrieval-Augmented Generation ist eine Technik, die grosse Sprachmodelle (LLMs) mit externem Wissen verknüpft. Anstatt sich nur auf das Training aus der Vergangenheit zu verlassen, kann die KI bei einer Anfrage gezielt in einem bereitgestellten Datenpool (z. B. PDF-Dokumente, Datenbanken oder interne Wikis) nachschlagen und diese Informationen nutzen, um eine präzise Antwort zu formulieren.
Bedeutung der AbkĂĽrzung
| Buchstabe | Begriff | Bedeutung im Prozess |
|---|---|---|
| R | Retrieval | Die KI ruft relevante Informationen aus einer externen Datenquelle ab, die zum Kontext der Benutzerfrage passen. |
| A | Augmented | Die ursprĂĽngliche Anfrage wird um diese gefundenen Fakten erweitert (angereichert), bevor sie an das Modell geht. |
| G | Generation | Das Sprachmodell generiert eine Antwort basierend auf dem eigenen Wissen UND den neu bereitgestellten Daten. |
Vorteile von RAG bei lokaler Datenanalyse
Wenn du RAG lokal einsetzt (z. B. auf eigenen Servern oder einem Desktop-PC), ergeben sich spezifische Vorteile fĂĽr die Analyse sensibler Daten:
- Datenschutz & Sicherheit: Da die Daten lokal verarbeitet werden, verlassen keine internen Dokumente das Unternehmen. Es findet kein Upload zu Cloud-Anbietern (wie OpenAI) statt.
- Aktualität: Ein LLM ist nach dem Training'eingefroren'. Mit RAG kannst du der KI minutengenaue Daten zur Verfügung stellen, ohne das Modell neu trainieren zu müssen.
- Vermeidung von Halluzinationen: Die KI wird angewiesen, nur die gefundenen Fakten zu nutzen. Das senkt das Risiko, dass das Modell Informationen erfindet.
- Transparenz (Quellenangabe): RAG-Systeme können genau angeben, aus welcher lokalen Datei oder welchem Absatz sie eine Information entnommen haben.
- Kosteneffizienz: Es ist wesentlich gĂĽnstiger, eine lokale Vektordatenbank zu aktualisieren, als ein grosses KI-Modell mit eigenen Daten fein abzustimmen (Fine-Tuning).
WeiterfĂĽhrende Literatur
- [RAG: Retrieval‑Augmented Generation für grosse Sprachmodelle]
Originalpaper von Facebook AI Research (FAIR). - [Code a simple RAG from scratch]
Blogbeitrag von Hugging Face mit praktischen Implementierungsdetails.
Alternativen fĂĽr lokale Datenanalyse
Zurzeit experimentiere ich vor allem mit Obsidian und dem Copilot-Plugin einerseits und mit Msty Studio andererseits. In Obsidian liegen die Notizen schon im Markdownformat vor, dort ist das Obsidian Copilot Plugin die erste Wahl. In Msty Studio können verschiedene Wissensbasen individuell 'aufbereitet' werden. Zudem kann der Embedding Prozess einfach kontrolliert und an die Dokumentenart angepasst werden.
Obsidian
Msty Studio
Wieso habe ich mich mit Msty Studio befasst? Mein Ziel war und ist eine möglichst niederschwellige Lösung für die lokale Dokumentenanalyse. Diese soll auf macOS und Windows laufen oder auf einem Server als Dienst verfügbar sein, welcher auch ein Webfrontend zur Verfügung stellt. Der Installationsaufwand soll überschaubar und grundsätzlich ohne zusätzliche Programmierung verwendbar sein. Vor etwa einem Jahr steckte Open WebUI noch in den Kinderschuhen und Msty war in dieser Beziehung schon deutlich fortgeschritten. Unterdessen hat jedoch Open WebUI deutlich aufgeholt und bietet auch viele Schnittstellen für andere Tools an, darunter auch Docling. Die Entwicklung in diesem Bereich ist atemberaubend dynamisch. Es ist unmöglich vorauszusehen, welche Lösung in Wochen oder Monaten führend sein wird. Daher ist es gut, mehrere Pfeile im Köcher zu haben.
Zur verrĂĽcken Dynamik mit KI:
Hier exemplarisch einige Quellen, welche die Dokumentenaufbereitung mit Msty erläutern. Die Grundsätze gelten auch für andere Systeme.
Bei Docling ist dieser Anpassungsprozess nicht nötig, das übernimmt die eingebaute 'Intelligenz'. Ob das wirklich für den spezifischen Anwendungsfall funktioniert, zeigt sich erst im Test mit eigenen Dokumenten.
Become a Knowledge Stack (RAG) Expert
Msty Knowledge Stacks YouTube Playlist
Installation als Dienst auf einem Mac Studio
Vorlage fĂĽr die Docker Installation
Installation fĂĽr die Web App
docker-compose.yaml
services:
docling:
image: quay.io/docling-project/docling-serve:latest
container_name: docling-server
ports:
- "5001:5001"
environment:
- DOCLING_SERVE_ENABLE_UI=true
# Verhindert, dass Modelle jedes Mal neu geladen werden
- HF_HOME=/app/models
volumes:
# Hier werden die KI-Modelle gespeichert
- ./docling_models:/app/models
# Ordner fĂĽr Uploads/Downloads
- ./data:/app/data
restart: alwaysDocling Web App
Docling ist nun per /ui Endpoint erreichbar und kann nun 'gefüttert' werden. Im Intranet löst der DNS Service auf der pfSense Firewall die IP auf studio.home auf.
http://192.168.11.22:5001/ui/
http://studio.home:5001/ui/

Installation als Service fĂĽr Open WebUI
Es bedarf einiger Anpassungen, damit Open WebUI Docling via API ansprechen kann. Falls Docling direkt wie grafische Oberfläche verwendet werden soll, reicht die oben erwähnte, einfache Installation.
Da war einiges an Debugging nötig. Falls es nicht funktioniert, das log als Stream laufen lassen.
Docker Server
docker network create webui
docker network ls
# Zeigt die bisherigen Logs an und bleibt aktiv,
# neue Log-Zeilen werden in Echtzeit gestreamt.
docker logs -f docling-server docker-compose.yaml
services:
docling:
image: quay.io/docling-project/docling-serve:latest
container_name: docling-server
ports:
- "5001:5001"
environment:
- HF_HOME=/app/models
# UI
- DOCLING_SERVE_ENABLE_UI=true
# CRITICAL: Für Bildbeschreibung mit externen LLM‑APIs
- DOCLING_SERVE_ENABLE_REMOTE_SERVICES=true
# Maximale Wartezeit für Sync‑Requests (sec) für große Dokumente erhöhen
- DOCLING_SERVE_MAX_SYNC_WAIT=600
# Anzahl lokaler Engine‑Worker
- DOCLING_SERVE_ENG_LOC_NUM_WORKERS=2
# CPU‑Thread‑Konfiguration
- OMP_NUM_THREADS=4
- MKL_NUM_THREADS=4
# Wichtig: Auf 1 lassen, sonst „Task Not Found“-Fehler
- UVICORN_WORKERS=1
# Pfad‑Präfix für die UI (wird vom Nginx‑Reverse‑Proxy verlangt)
- GRADIO_ROOT_PATH=/ui
volumes:
- ./docling_models:/app/models
- ./data:/app/data
- /tmp:/tmp
restart: always
networks:
- webui
networks:
webui: Zugang im lokalen Subnetz
Damit Docling direkt mit der Subdomain docling.home ohne Eingabe des Endpoint /uierreichbar ist, benötigt es einige Tricks.
- DNS Auflösung mit einem lokalen Dienst wie Pi-Hole oder einer Firewall wie pfSense
- Konfiguration eines Reverse Proxy, hier verwende ich einen Nginx Reverse Proxy
Nginx Reverse Proxy lokal fĂĽr docling.home

Custom Nginx Configuration
- Kommentiert von gpt-oss:120b auf lokalem KI-Server

- Vollständiger Code
# ------------------------------------------------------------
# Proxy‑Weiterleitung für das Gradio‑/Docling‑UI
# Das UI ist ausschlieĂźlich unter /ui/ erreichbar.
# ------------------------------------------------------------
location /ui/ {
# --------------------------------------------------------
# 1. Ziel‑Backend
# - Der Aufruf von http://studio.home:5001 wird
# als Up‑Stream‑Server verwendet.
# - Wichtig: KEIN abschlieĂźender Slash hinter
# der URL → Nginx leitet den kompletten Request‑URI
# (inkl. /ui/) unverändert weiter.
# --------------------------------------------------------
proxy_pass http://studio.home:5001;
# --------------------------------------------------------
# 2. Header‑Weitergabe (Client‑Informationen)
# --------------------------------------------------------
# Original‑Host des Clients (zB docling.home)
# wird an das Backend weitergegeben.
proxy_set_header Host $host;
# IP des eigentlichen Clients (nicht die IP des Nginx‑Proxys)
proxy_set_header X-Real-IP $remote_addr;
# Kette aller Proxy‑IP‑Adressen, die die Anfrage
# durchlaufen hat
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# Protokoll (http / https), über das der Client verbunden war
proxy_set_header X-Forwarded-Proto $scheme;
# --------------------------------------------------------
# 3️. WebSocket‑ und HTTP/1.1‑Einstellungen
# – nötig für Bild‑Vorschau, Live‑Updates,
# Datei‑Downloads etc.
# --------------------------------------------------------
# Keep‑Alive & Upgrade‑Support
proxy_http_version 1.1;
# WebSocket‑Handshake
proxy_set_header Upgrade $http_upgrade;
# Erzwingt das Upgrade‑Verhalten
proxy_set_header Connection'upgrade";
}
# ------------------------------------------------------------
# Optional: Weiterleitung von der Root‑URL (/) zu /ui/
# ------------------------------------------------------------
location = / {
# 301 = permanente Weiterleitung → Browser/Cache
return 301 $scheme://$host/ui/;
}Zugang von extern via Cloudflare Tunnel mit One-Time PIN
Cloudflare
- Absicherung mit One-time PIN via E-Mail
- FĂĽr den User 'georg' ist eine E-Mail Adresse hinterlegt, nur registrierte Adressen erhalten eine PIN




Nginx Reverse Proxy lokal fĂĽr docling.meinedomain.ch

Custom Nginx Configuration
- Kommentiert von gpt-oss:120b auf lokalem KI-Server

- Vollständiger Code
# --------------------------------------------------------------
# 1. Root‑Redirect zu /ui/
# --------------------------------------------------------------
# Alle Anfragen, die ohne Pfad ("/") kommen, werden mit einem
# permanenten Redirect (HTTP‑Status 301) auf das Unter‑Verzeichnis
#'/ui/" weitergeleitet. Dabei wird das aktuelle Schema (http/https)
# und der Hostname beibehalten, sodass die URL korrekt aufgebaut
# wird.
location = / {
return 301 $scheme://$host/ui/;
}
# --------------------------------------------------------------
# 2. Haupt‑Location für die Docling‑Anwendung (GRADIO_ROOT_PATH=/ui)
# --------------------------------------------------------------
# Dieser Block leitet alle Pfade, die mit'/ui/" beginnen, an den
# internen Service'studio.home" weiter (Port 5001). Die nachfolgenden
# Header‑ und Proxy‑Einstellungen sorgen für korrekte Weiterleitung,
# HTTPS‑Erzwingung, WebSocket‑Support und das Handling großer
# Uploads (z. B. OCR‑Dateien).
location /ui/ {
proxy_pass http://studio.home:5001;
# Identität & HTTPS‑Erzwingung (löst Mixed‑Content‑Probleme)
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
# WebSockets für Status‑Updates
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection'upgrade";
# Download‑Fix & Timeouts für OCR (Deutsch/Englisch)
# - Deaktiviert das Buffering, damit groĂźe Dateien nicht
# zwischengespeichert werden.
# - Erlaubt bis zu 100 MiB Upload‑Größe.
# - Erhöht den Lese‑Timeout auf 10 Minuten,
# um lange OCR‑Vorgänge zu unterstützen.
proxy_buffering off;
proxy_request_buffering off;
client_max_body_size 100M;
proxy_read_timeout 600s;
}
# --------------------------------------------------------------
# 3. Fix für Manifest‑ & Favicon‑Anfragen (404/307)
# --------------------------------------------------------------
# Der Browser fragt beim Laden einer PWA häufig nach
# '/manifest.json" bzw.'/favicon.ico". Da diese Dateien im
# Container unter'/ui/" liegen, wird die Anfrage hiermit
# korrekt an 'http://studio.home:5001/ui/…" weitergeleitet.
location ~ ^/(manifest\.json|favicon\.ico) {
proxy_pass http://studio.home:5001/ui$request_uri;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto https;
}
# --------------------------------------------------------------
# 4. Gradio‑API Fallback
# --------------------------------------------------------------
# Alle Anfragen, die mit'/gradio_api/" beginnen, werden an den
# entsprechenden Endpunkt im Container weitergereicht. Das ist
# nötig, weil Gradio intern über diesen Pfad seine API‑Routen
# bereitstellt.
location /gradio_api/ {
proxy_pass http://studio.home:5001/ui/gradio_api/;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto https;
}