Guide
RAG sur des PDF : extraire, découper, citer la page
Un RAG sur des PDF : tableaux, colonnes et scans, extraction avec la mise en page, numéro de page pour citer, ou PDF entier.
Mis à jour le
Un RAG sur des PDF fonctionne comme tout RAG, avec une étape de plus qui décide de presque tout : l'extraction du texte. Un PDF est un format d'affichage, pas un format de texte structuré. Colonnes, tableaux, en-têtes répétés, pages scannées : si l'extraction les lit mal, la recherche retrouvera des morceaux faux. Trois règles : extraire en respectant la mise en page, garder le numéro de page, et vérifier à l'œil un échantillon.
Les pièges propres aux PDF
| Piège | Ce qui se passe | Parade |
|---|---|---|
| Deux colonnes | les lignes des deux colonnes s'entremêlent | outil qui reconstruit l'ordre de lecture |
| Tableaux | les cellules deviennent une suite de mots sans lien | extraction de la structure des tableaux, sortie en Markdown |
| En-têtes et pieds de page | répétés sur chaque morceau, ils parasitent la recherche | les retirer avant découpage |
| Pages scannées | aucun texte, seulement une image | reconnaissance optique de caractères (OCR) |
| Schémas, graphiques | l'information n'est pas dans le texte | modèle qui lit les images, ou description manuelle |
Extraire en gardant la structure
Les lecteurs simples, comme SimpleDirectoryReader de LlamaIndex, suffisent pour un premier essai sur des PDF de texte simple. Pour des documents mis en page, un outil dédié fait la différence. Docling, par exemple, annonce la compréhension de la mise en page, de l'ordre de lecture et de la structure des tableaux, une reconnaissance de caractères pour les PDF scannés, l'export en Markdown ou en JSON, l'exécution en local pour les données sensibles, et des intégrations avec LangChain et LlamaIndex. Sa page affiche une licence MIT.
L'intérêt d'une sortie Markdown : les titres deviennent des #, les tableaux des tableaux. Vous pouvez ensuite découper par section plutôt qu'au nombre de caractères (voir Chunking).
Garder la page, pour pouvoir citer
Chaque morceau doit porter en métadonnée le nom du fichier et le numéro de page (ou la plage de pages). Sans cela, impossible de renvoyer l'utilisateur vers la source. C'est aussi ce qui rend la réponse vérifiable dans un métier où l'on doit pouvoir dire « article 4, page 12 ».
Côté génération, la fonction Citations de Claude renvoie, pour un PDF, des citations de type page_location avec le texte cité et les numéros de page (la première page vaut 1). Deux limites indiquées par la documentation : le texte du PDF est découpé en phrases, et un PDF scanné sans texte extractible ne peut pas être cité, les citations d'images n'étant pas prises en charge.
Variante : envoyer le PDF entier
Pour une poignée de documents consultés ensemble (un contrat et ses avenants, un appel d'offres), le RAG n'est pas toujours nécessaire. La documentation PDF de Claude indique :
- jusqu'à 600 pages par requête (100 si la fenêtre de contexte de la requête est inférieure à un million de jetons) et 128 Mo par requête sur l'interface d'Anthropic ;
- chaque page est convertie en image, et son texte extrait est fourni à côté : le modèle peut donc lire aussi les graphiques et schémas ;
- le texte d'une page compte en général entre 1 500 et 3 000 jetons selon sa densité, auxquels s'ajoute le coût de l'image.
Anthropic rappelle par ailleurs qu'en dessous de 200 000 jetons de documents (environ 500 pages), on peut placer toute la base dans la requête. Au-delà, ou si les documents sont nombreux et consultés séparément, revenez au RAG.
Méthode en six étapes
- Classez vos PDF : texte natif, scannés, très mis en page.
- Choisissez l'extraction selon la classe : lecteur simple, OCR, outil de mise en page.
- Exportez en Markdown en conservant le numéro de page.
- Ouvrez dix morceaux au hasard et lisez-les : c'est le contrôle le plus rentable de toute la chaîne.
- Découpez par section, indexez avec les métadonnées (fichier, page, date, droits).
- Mesurez avec des questions dont la réponse se trouve dans un tableau : c'est là que les extractions échouent le plus souvent.
Exemple illustratif
Prenons un cabinet d'architectes qui veut interroger ses cahiers des clauses techniques et ses comptes rendus de chantier. Les cahiers sont des PDF natifs très structurés ; les comptes rendus anciens sont des scans annotés. Deux chaînes d'extraction alimentent le même index : outil de mise en page pour les premiers, reconnaissance de caractères pour les seconds, avec un drapeau en métadonnée qui permet de signaler à l'utilisateur qu'une réponse vient d'un scan, donc à vérifier.
Questions fréquentes
Un PDF scanné peut-il être utilisé dans un RAG ?
Oui, à condition d'en extraire le texte par reconnaissance optique de caractères (OCR). Docling, par exemple, l'annonce. Sans texte extractible, la fonction Citations de Claude ne peut pas citer un PDF scanné.
Faut-il toujours découper ses PDF ?
Pas toujours. L'interface de Claude accepte jusqu'à 600 pages par requête (100 si la fenêtre de contexte de la requête est inférieure à un million de jetons). Pour quelques documents consultés ensemble, envoyer le PDF entier peut suffire.
Sources
Pages consultées pour écrire cet article :
- https://docling-project.github.io/docling/
- https://platform.claude.com/docs/en/build-with-claude/pdf-support
- https://platform.claude.com/docs/en/build-with-claude/citations
- https://developers.llamaindex.ai/python/framework/getting_started/starter_example/
- https://www.anthropic.com/news/contextual-retrieval