
Ingénierie des boucles pour la récupération hiérarchique : lecture d’un long document par sa table des matières

de la partie II d’Enterprise Document Intelligence, une série qui construit un système RAG d’entreprise à partir de quatre briques : analyse de documents, analyse de questions, récupération et génération. La brique de récupération est une trilogie :
Ce compagnon (7quater) s’occupe du cas que rencontre la brique en production : un document trop long à lire, avec une table des matières trop longue à vider.

📓 Les notebooks compagnons exécutables sont sur GitHub: doc-intel/notebooks-vol1.

Nous travaillons sur cela sur NIST SP 800-53 Rév. 5 (Contrôles de sécurité et de confidentialité pour les systèmes d’information et les organisationstravaux du gouvernement américain, domaine public aux États-Unis) et le Cadre de cybersécurité NIST 2.0. Les chemins de code exécutables appellent les services OpenAI régis par Conditions d’utilisation d’OpenAI.
1. Le problème : une table des matières trop longue à remettre
NIST SP 800-53 fait 492 pages. Il définit les contrôles de sécurité qu’un système fédéral américain doit respecter, un contrôle à la fois, en vingt familles. Un utilisateur pose une question simple :
« Que nécessite le contrôle de gestion des comptes ? »
La réponse est de cinq pages, contrôle AC-2, aux pages 46 à 50. Le mouvement naïf de RAG intègre chaque page et prend le top-k le plus similaire à la question. Cela échoue d’une manière spécifique ici : les mots compte, gestion, contrôleet accéder s’asseoir sur des centaines de pages, car l’ensemble du document concerne les contrôles. Top-k renvoie AC-2 mélangé avec AC-3, AC-17, quelques contrôles d’audit et le glossaire, et le modèle de génération doit deviner lequel il s’agit. La facture est payée deux fois : vous intégrez 492 pages, et la réponse est encore floue.
Une personne ouvre la table des matières à la place. Voici le hic qui rend cet article nécessaire : la table des matières est elle-même 358 entrées. Vous ne donneriez pas plus à un collègue les 358 lignes que les 492 pages. Un expert scanne le chapitre liste en premier, onze titres, choix Les contrôlesl’ouvre aux vingt familleschoisit Contrôle d’accèsl’ouvre à son contrôleset atterrit sur AC-2. Le niveau supérieur d’abord, puis le niveau inférieur, une petite décision à la fois. C’est la boucle que construit cet article, et c’est la thèse de la série en miniature : amplifier l’expert. Faites ce que fait l’expert. Ne transférez pas l’intégralité du document, ni la totalité de la table des matières, sur le modèle en une seule fois.
2. La table des matières, trois niveaux de profondeur
Voici la page de contenu réelle du document, à côté du toc_df l’analyseur lit à partir de son contour natif.

La page imprimée s’arrête au niveau de la famille. L’analyseur va plus loin. L’article 5B transforme le plan natif du PDF en un toc_dfune ligne par titre, et pour ce document c’est 358 lignes sur trois niveaux, depuis les onze chapitres de niveau supérieur jusqu’à chacun des 316 contrôles individuels (AC-1, AC-2et le reste), chacun avec sa plage de pages. Les vingt familles témoins se situent entre les deux. Cet arbre est ce que marche la récupération. Lorsqu’un document n’a pas de plan natif à parcourir, l’article 5septies en reconstruit un à partir de la page ; ici le contour est épuré, nous l’utilisons donc directement.
3. La boucle : un niveau à la fois
La récupération parcourt l’arbre de haut en bas. Il ne remet au LLM que le niveau actuelles onze titres de chapitre en premier, chacun sous la forme d’une ligne compacte : un titre, une plage de pages et, lorsque les titres sont ambigus, un court décompte de mots clés. Le modèle sélectionne la branche qui répond à la question. Si cette branche est large et a des enfants plus fins, la récupération l’ouvre, ses enfants passent au niveau suivant et l’étape se répète. Il s’arrête à une feuille ou à une section suffisamment petite pour être lue en entier.

Deux choses sortent de cette forme. La longue table des matières n’entre jamais dans un tout rapide : le modèle lit onze lignes, puis vingt, puis une vingtaine, jamais 358 à la fois. Et la descente est effectivement facultative. Sur un document court, le niveau supérieur n’a aucun enfant à ouvrir, donc la boucle s’exécute une seule fois et se comporte exactement comme un routage plat. Le modèle évalue à tous les niveaux s’il y a une raison d’aller plus loin.
4. L’étape de routage, en code
L’étape est une fonction, reason_on_tocappelé une fois par niveau. Il lit le niveau sous forme de texte, jamais de tableau, donc un niveau de vingt entrées correspond à vingt lignes courtes, pas une grille qui agrandit une colonne par mot-clé.
# Top-down: feed ONE level at a time, never the whole 358-row TOC.
# Each entry is one compact line: title + page range (+ keyword hits).
level = toc_df[toc_df.level == toc_df.level.min()] # 11 chapter titles
while True:
pick = reason_on_toc(question, level, client=client) # one LLM call
section = level[level.id.isin(pick.section_ids)]
kids = immediate_children(toc_df, section)
if kids.empty or section.n_pages <= SMALL: # leaf, or small enough
break
level = kids # open it, descend
# 11 chapters -> 20 families -> 25 controls -> AC-2 ACCOUNT MANAGEMENT (pp. 46-50)
Exécutez-le sur la question de gestion de compte par rapport au document réel, et il descend d’un niveau à la fois. À chaque niveau, le modèle lit les titres et les raisons de ce niveau et sélectionne la branche à ouvrir. Le raisonnement ci-dessous est celui du modèle, textuellement tiré de l’exécution.

Cinquante-six entrées sont lues à travers trois petits appels, jamais la table des matières de 358 lignes. Generation lit ensuite cinq pages et les 315 autres contrôles n’entrent jamais dans l’invite.
Lorsque le titre seul ne suffit pas à séparer deux candidats, la récupération s’appuie sur ce décompte de mots-clés, toujours une ligne par entrée : combien de mots-clés de la question appartiennent à cette branche. Il s’agit d’un critère de départage dans le cas où un terme est utilisé dans une section et défini uniquement dans une autre (moindre privilège est appliqué partout Contrôle d’accèsmais défini une fois dans le Glossaire). Cela ne devient jamais une colonne par mot-clé.
5. Quand il lit toute la section
La boucle arrête de descendre dans trois cas : la branche ramassée est une feuille, elle est déjà suffisamment petite pour être lue en entier, ou la question est une inscription qui a besoin de chaque élément en dessous. Le cas de listing est le NIST CSF de l’article 12 (listing) : demandé pour chaque sous-catégorie de GOVERN, le routeur sélectionne l’ensemble Annexe A. Base du CSFet comme une liste veut tout cela, la récupération lit l’annexe dans son intégralité plutôt que de la descendre dans une sous-catégorie.
Voici cette deuxième descente, sur la même étape de routage mais une question de listing. Il atteint la section contenant la liste sur un seul niveau et s’arrête, car rien de plus beau ne se trouve en dessous dans la table des matières.

Cela donne à la boucle les trois gouvernes de l’article 13bis (ingénierie de boucle) : une déclenchement (une large branche avec des enfants), un terminaison (une feuille, une petite section ou une liste), et récupération cela change quelque chose à chaque itération (il descend d’un niveau, ne relit jamais celui qu’il vient de juger), avec une profondeur délimitée par l’arbre donc il ne peut pas tourner. Il diffère des boucles pipeline de la Partie III par ce à quoi il réagit : la structure du document, pas un résultat de génération.
6. Jetons et précision, ensemble
Le routage hiérarchique gagne sur les deux axes à la fois, ce qui est rare.
Précision. Flat top-k sur 492 pages rivalise avec AC-2 contre tous les autres contrôles qui mentionnent compte ou accéder. Le routage s’engage à Gestion de compte AC-2 par son nom et le lit en entier, de sorte que les cinq pages de la réponse arrivent ensemble au lieu d’être entrelacées avec cinq pages voisines.
Jetons. Le pipeline naïf intègre 492 pages une fois et les récupère toutes à chaque requête. Le routeur descendant n’intègre jamais le corps. Il lit cinquante-six lignes de titre courtes réparties sur trois appels, puis les cinq pages sur lesquelles la réponse perdure. Même la table des matières n’est jamais envoyée entière. Sur un corpus de milliers de documents de ce type, cette différence constitue la limite entre un système qui fonctionne et un autre qui ne fonctionne pas.
7. D’un document à un dossier de documents
Cet article reste sur un seul document. Un dossier contenant de nombreux documents est la même carte un niveau supérieur : le niveau supérieur est la liste des fichiers, chacun avec un titre et un résumé d’une ligne, et le niveau suivant est la table des matières de chaque fichier. L’étape de routage ne change pas : vous sélectionnez les fichiers pertinents au niveau supérieur, puis descendez dans leurs sections exactement comme cet article descend dans les contrôles. Le mouvement est le même, seul le nombre de niveaux augmente. Nous couvrons ce cas de collecte en détail dans Partie IVà commencer par l’article 14 (le problème du corpus) et les tables de corpus (corpus_toc_df, corpus_index) qui le portent.
8. Conclusion
Un long document est livré avec sa propre carte et la récupération s’effectue de haut en bas au lieu de noter chaque page. Le routeur lit un niveau de la table des matières à la fois, une ligne compacte par entrée, et descend : onze chapitres jusqu’à Les contrôlesvingt familles à Contrôle d’accèsune vingtaine de contrôles à Gestion de compte AC-2cinq pages sur 492, les 315 autres contrôles n’étant jamais dans l’invite. Il s’arrête à une feuille, à une section suffisamment petite pour être lue en entier, ou à une liste qui veut tout sous un titre. Il s’agit d’une boucle limitée dans la récupération, facultative lorsque la table des matières est peu profonde, et elle enregistre les jetons et augmente la précision en même temps, c’est pourquoi elle évolue sans changement : un dossier de documents est la même carte avec un niveau supplémentaire.
9. Sources et lectures complémentaires
- Analyse de documents : Article 5A et article 5B :
parse_pdfet letoc_dfcet article passe en revue. - Analyse des questions : article 6A, article 6B, article 6C : d’où viennent les mots-clés et la forme de la question.
- Récupération : Article 7A, Article 7B, Article 7C : l’hybride de première section et le routeur TOC, cet article marche comme un arbre.
- Article 12 (listage) : la section entière est lue pour les questions qui nécessitent chaque élément. Article 13bis (ingénierie de boucle) : la discipline de boucle à laquelle appartient cette boucle de récupération. Article 14 (le problème du corpus) : le même routage échelonné un niveau plus haut, sur un dossier de documents.



