Aller au contenu

Docling — Traitement de documents

Docling fournit la conversion de documents PDF/DOCX/HTML en texte structuré (Markdown, JSON) pour les pipelines RAG et l'analyse documentaire dans AKKO. Il utilise l'analyse de mise en page et l'OCR sur CPU pour extraire texte, tableaux et figures de documents complexes — entièrement hors ligne, sans appels API externes.

Architecture

ai-service / ADEN / Cockpit
            |
      +-----v------+
      |   Docling   |  API REST (port 5001)
      | (Traitement |  PDF/DOCX/HTML -> Markdown/JSON
      |  de docs)   |
      +------------+

Formats supportés

Format d'entrée Description
PDF Texte natif + OCR pour les pages numérisées
DOCX Documents Microsoft Word
PPTX Présentations Microsoft PowerPoint
HTML Pages web
Images PNG, JPEG, TIFF (via OCR)
Markdown Passage direct avec normalisation

Utilisation

Depuis ai-service (pipeline RAG)

import httpx

response = httpx.post(
    "http://akko-akko-docling:5001/v1/convert",
    files={"file": ("rapport.pdf", open("rapport.pdf", "rb"), "application/pdf")},
    data={"output_format": "markdown"}
)
texte_structure = response.json()["content"]

Depuis les notebooks

import requests

# Convertir un PDF en Markdown structuré
with open("document.pdf", "rb") as f:
    resp = requests.post(
        "http://akko-akko-docling:5001/v1/convert",
        files={"file": ("document.pdf", f, "application/pdf")},
        data={"output_format": "markdown"}
    )
print(resp.json()["content"])

Vérification de santé

curl http://akko-akko-docling:5001/health

Configuration

Kubernetes (Helm)

akko-docling:
  enabled: true
  image:
    repository: quay.io/docling-project/docling-serve-cpu
    tag: "latest"  # Épingler une version spécifique en production
  resources:
    requests:
      cpu: 250m
      memory: 512Mi
    limits:
      cpu: "2"
      memory: 4Gi

Exigence mémoire

Docling charge des modèles ML pour l'analyse de mise en page et l'OCR. Il nécessite au minimum 512 Mi au démarrage et peut atteindre 4 Gi lors du traitement de documents volumineux avec de nombreuses pages.

Accès réseau

Docling est un service interne sans accès internet. Il traite les documents localement avec des modèles sur CPU. La NetworkPolicy restreint :

  • Entrée : Seuls ai-service, ADEN et cockpit peuvent atteindre le port 5001
  • Sortie : DNS uniquement (pas d'accès internet)

Dépannage

Pod Docling en CrashLoopBackOff (OOMKilled)

Symptômes : Le pod Docling entre en statut CrashLoopBackOff. kubectl describe pod affiche OOMKilled comme dernière raison de terminaison.

Cause : Docling charge plusieurs modèles ML au démarrage (analyse de mise en page, reconnaissance de structure de tableaux, OCR). Si la mémoire est insuffisante, le OOM-killer du noyau tue le processus.

Solution :

# Vérifier les limites mémoire actuelles
kubectl get pod -n akko -l app.kubernetes.io/name=akko-docling -o jsonpath='{.items[0].spec.containers[0].resources}'

# S'assurer que la limite mémoire est d'au moins 4Gi
helm upgrade akko helm/akko/ -n akko -f helm/examples/values-dev.yaml \
  --set akko-docling.resources.limits.memory=4Gi

Traitement de documents lent

Symptômes : La conversion de documents prend plus de 30 secondes par page. L'utilisation CPU est à 100%.

Cause : Docling utilise l'OCR et l'analyse de mise en page sur CPU. Les documents complexes avec de nombreuses images, tableaux ou pages numérisées nécessitent plus de temps de traitement.

Solution :

# Vérifier l'allocation CPU
kubectl top pod -n akko -l app.kubernetes.io/name=akko-docling

# Augmenter les limites CPU pour un traitement plus rapide
helm upgrade akko helm/akko/ -n akko -f helm/examples/values-dev.yaml \
  --set akko-docling.resources.limits.cpu=4

Le endpoint /health retourne 503

Symptômes : Le endpoint /health retourne 503 Service Unavailable. Le pod tourne mais n'est pas prêt.

Cause : Docling est encore en train de charger les modèles ML. La sonde de disponibilité n'a pas encore réussi.

Solution :

# Vérifier les événements du pod et le statut de la sonde de disponibilité
kubectl describe pod -n akko -l app.kubernetes.io/name=akko-docling

# Consulter les logs pour la progression du chargement des modèles
kubectl logs -n akko -l app.kubernetes.io/name=akko-docling --tail=50