You are currently viewing Docling : convertir PDF, DOCX et images en données structurées pour ses pipelines RAG

Docling : convertir PDF, DOCX et images en données structurées pour ses pipelines RAG

Docling : convertir PDF, DOCX et images en données structurées pour ses pipelines RAG

Vous avez déployé un pipeline RAG avec Qdrant et Ollama. Vos documents texte simples sont bien indexés, les réponses sont pertinentes. Puis arrive un rapport PDF de 200 pages avec des tableaux complexes, des colonnes multiples, des en-têtes imbriqués et des images contenant du texte. Le pipeline s’effondre : le chunking naïf découpe les tableaux en fragments incohérents, la mise en page est perdue, et les réponses deviennent approximatives. C’est exactement le problème que résout Docling, une bibliothèque open source développée par IBM Research (licence MIT) pour transformer des documents complexes en données structurées exploitables par des LLM.

Le problème : l’extraction de contenu documentaire est un faux ami

Les outils classiques d’extraction de texte comme PyPDF, pdfminer, python-docx, extraient du texte brut. Ils perdent la structure sémantique du document : la hiérarchie des titres, les relations entre cellules d’un tableau, la distinction entre légende et corps de texte, l’ordre de lecture dans une mise en page multi-colonnes. Or, pour un pipeline RAG, cette structure est essentielle. Un chunk qui mélange deux colonnes d’un tableau ou qui sépare un titre de son paragraphe produit des embeddings de mauvaise qualité et des réponses fausses.

Docling aborde le problème différemment. Au lieu d’extraire du texte, il comprend la mise en page du document grâce à des modèles de deep learning spécialisés, puis reconstruit une représentation structurée fidèle au document original.

Ce que Docling fait concrètement

Docling prend en entrée des fichiers PDF, DOCX, PPTX, XLSX, HTML et des images, puis produit en sortie un format structuré (Markdown, JSON ou DoclingDocument) qui préserve la sémantique du contenu. Voici ses capacités principales :

Analyse de mise en page par deep learning : Un modèle de détection d’objets (basé sur RT-DETR) identifie les zones du document : titres, paragraphes, tableaux, figures, légendes, en-têtes, pieds de page. Chaque zone est classifiée et ordonnée selon le flux de lecture réel.

Extraction de tableaux : Un modèle dédié (TableFormer) reconstruit la structure des tableaux : cellules fusionnées, en-têtes multi-niveaux, colonnes imbriquées. Le résultat est un tableau structuré, pas du texte linéarisé.

OCR intégré : Pour les PDF scannés ou les images, Docling intègre EasyOCR ou Tesseract pour extraire le texte des zones identifiées par le modèle de layout. L’OCR est ciblé sur les zones pertinentes, pas appliqué aveuglément sur toute la page.

Export multi-format : Le document analysé peut être exporté en Markdown (idéal pour le chunking RAG), en JSON structuré (pour un traitement programmatique), ou manipulé via l’API Python DoclingDocument.

Déployer Docling avec Docker

Docling s’installe via pip ou se conteneurise facilement. Voici un déploiement Docker minimal qui expose une API de conversion :

# Dockerfile
FROM python:3.11-slim

RUN pip install --no-cache-dir docling

WORKDIR /app
COPY server.py .

EXPOSE 8000
CMD ["python", "server.py"]

Et le script serveur minimaliste avec FastAPI :

# server.py
from fastapi import FastAPI, UploadFile
from docling.document_converter import DocumentConverter
import tempfile, os, uvicorn

app = FastAPI()
converter = DocumentConverter()

@app.post("/convert")
async def convert(file: UploadFile):
    with tempfile.NamedTemporaryFile(delete=False, suffix=os.path.splitext(file.filename)[1]) as tmp:
        tmp.write(await file.read())
        tmp_path = tmp.name
    try:
        result = converter.convert(tmp_path)
        return {
            "markdown": result.document.export_to_markdown(),
            "metadata": {
                "pages": len(result.document.pages),
                "tables": len([e for e in result.document.texts if hasattr(e, 'table')]),
            }
        }
    finally:
        os.unlink(tmp_path)

Avec Docker Compose, en complément de la stack existante :

# docker-compose.yml (extrait)
services:
  docling:
    build: ./docling
    ports:
      - "8000:8000"
    volumes:
      - ./documents:/documents
    deploy:
      resources:
        limits:
          memory: 4G

Intégration dans un pipeline RAG existant

L’intérêt principal de Docling pour une stack comme celle déjà présentée sur ce site (Qdrant + Ollama + n8n + LangGraph) est de servir de première étape de traitement documentaire. Le flux devient :

1. Un document PDF/DOCX arrive (upload utilisateur, webhook Nextcloud, dossier surveillé par n8n).
2. n8n envoie le fichier à l’API Docling pour conversion en Markdown structuré.
3. Le Markdown est découpé en chunks intelligents (en respectant les frontières de sections et de tableaux).
4. Les chunks sont vectorisés via un modèle d’embedding local et stockés dans Qdrant.
5. Un agent LangGraph ou Open WebUI interroge Qdrant avec le contexte structuré.

Le gain est direct : les tableaux restent cohérents dans les chunks, les titres de sections servent de métadonnées pour le filtrage, et les figures/légendes ne polluent pas les embeddings textuels.

Docling vs les alternatives

Unstructured.io est l’alternative la plus connue. La version open source offre des fonctionnalités similaires, mais la version complète (avec les meilleurs modèles) est commerciale. Docling est entièrement MIT, sans version payante ni fonctionnalités verrouillées.

LlamaParse (LlamaIndex) propose un service cloud de parsing documentaire. Performant, mais dépendant d’une API externe, incompatible avec une approche 100 % auto-hébergée.

Apache Tika extrait du texte brut de nombreux formats, mais sans compréhension de la mise en page. Les tableaux sont linéarisés, la structure hiérarchique est perdue.

Docling se distingue par sa combinaison de modèles de deep learning pour le layout, sa licence MIT sans restriction, et son intégration native avec l’écosystème Python/LangChain/LlamaIndex.

Utilisation en ligne de commande

Pour un usage ponctuel ou un traitement par lot, Docling fournit une CLI :

# Convertir un PDF en Markdown
docling convert rapport-annuel.pdf --output rapport-annuel.md

# Convertir un dossier entier en JSON structuré
docling convert ./documents/ --output ./structured/ --format json

# Activer l'OCR pour les PDF scannés
docling convert scan.pdf --ocr --output scan.md

Points d’attention

Ressources : Les modèles de layout et de tableaux consomment de la mémoire. Compter 2 à 4 Go de RAM pour le traitement courant. Un GPU n’est pas requis mais accélère significativement le traitement des gros volumes.

Qualité de l’OCR : Sur les documents scannés de mauvaise qualité (fax, photocopies), la chaîne layout + OCR reste limitée. Un pré-traitement d’image (deskew, binarisation) peut améliorer les résultats.

Formats supportés : PDF et DOCX sont les formats les mieux supportés. Le support PPTX et XLSX est fonctionnel mais moins mature. Pour les fichiers HTML, un parsing direct est souvent plus simple.

En résumé

Docling comble un chaînon manquant dans la stack IA auto-hébergée : la conversion intelligente de documents complexes en données structurées exploitables par un pipeline RAG. En combinant des modèles de deep learning pour la compréhension de mise en page, l’extraction de tableaux et l’OCR ciblé, le tout sous licence MIT, il s’intègre naturellement aux côtés d’Ollama, Qdrant, n8n et LangGraph pour construire une chaîne documentaire complète, du PDF brut à la réponse contextualisée.