Nettoyer les documents avant le RAG
Dernière mise à jour:
Nettoyer un document pour la génération augmentée par récupération (RAG) signifie retirer tout ce qui n’est pas du contenu — les en-têtes, pieds, numéros de page et textes répétés qu’un PDF porte sur chaque page — avant que le texte restant soit découpé en fragments, plongé et stocké dans un index vectoriel. C’est l’étape la moins glamour d’un pipeline RAG et celle qui décide en silence si la récupération fonctionne : un index construit à partir de texte non nettoyé stocke le même mobilier des centaines de fois et le récupère comme si c’était de la connaissance. Cet article explique pourquoi le mobilier empoisonne les plongements, comment le découpage fonctionne vraiment, pourquoi la déduplication appartient à l’avant du plongement, quoi retirer et quoi garder, et comment évaluer si le nettoyage a aidé. Pour faire le nettoyage lui-même, utilisez le nettoyeur de documents et lisez vos propres résultats à côté de ce guide.
Pourquoi le mobilier de page empoisonne les plongements
Un modèle de plongement transforme un fragment de texte en un vecteur censé capturer ce dont parle le fragment. Donnez-lui un fragment qui est pour moitié titre de rapport, pied de confidentialité et numéro de page, et le vecteur capturera cela aussi fidèlement — ce qui signifie que chaque fragment d’un long document dérive vers le même mobilier, et que des fragments qui devraient être loin dans l’espace vectoriel finissent artificiellement proches parce qu’ils partagent un en-tête. La récupération fait alors exactement ce qu’on lui a demandé : interrogée sur la section de la politique de remboursement, elle renvoie cinq fragments dont le signal partagé le plus fort est le nom de l’entreprise dans l’en-tête courant. Personne n’a commis d’erreur de modélisation. L’index a été garni de bruit à pleine force, répété sur chaque page, et le bruit qui se répète est indiscernable du signal pour un système qui compte la similarité.
Le dommage est pire que la dilution. Les fragments de mobilier peuvent gagner la récupération sans reste : une question formulée comme le pied — sur la confidentialité, le contrôle des documents ou les versions — correspond au fragment de pied qui a été plongé deux cents fois mieux qu’au seul paragraphe qui y répond vraiment. Les numéros de page créent un échec plus subtil, en apprenant au modèle que les nombres nus sont du contenu, si bien qu’un fragment se terminant par « 42 » peut être cité comme si le nombre signifiait quelque chose. Et chaque fragment de mobilier occupe une place dans un ensemble de résultats top-k fini, poussant dehors un fragment vraiment pertinent du contexte donné au modèle. Nettoyer n’est donc pas un rangement cosmétique ; c’est retirer un concurrent systématique de votre propre contenu à l’intérieur de votre propre index.
Bases du découpage : taille, chevauchement et frontières
Découper, c’est décider quelle unité sera plongée, et cela a trois boutons. La taille échange le foyer contre le contexte : les petits fragments, quelques centaines de caractères, plongent une idée nettement et récupèrent avec précision, mais peuvent arriver sans la phrase qui donne à l’idée ses conditions ; les grands fragments, plusieurs milliers de caractères, portent leur contexte avec eux mais mélangent plusieurs idées en un vecteur moyen, si bien qu’aucune ne récupère fortement. La plupart des corpus documentaires tombent quelque part au milieu — environ 500 à 1 000 caractères est une région de départ saine — et la bonne réponse se décide en testant vos propres questions contre vos propres documents, non en copiant un nombre d’un défaut de cadre. La documentation des découpeurs de texte de LangChain est une bonne carte des familles de découpeurs, des découpeurs par caractères et récursifs à ceux qui connaissent la structure.
Le chevauchement est une assurance contre le deuxième bouton, les frontières. Un découpeur qui coupe tous les 800 caractères sans égard pour la structure finira par couper une définition en deux, et aucune moitié ne se récupère ni ne se lit bien. Couper aux frontières — d’abord les paragraphes, puis les phrases, puis les espaces, comme font les découpeurs récursifs — garde les unités entières la plupart du temps, et un chevauchement modeste de dix à vingt pour cent répète le bord d’un fragment au début du suivant, pour qu’une coupe qui arrive quand même n’orpheline pas son contexte. La hiérarchie de la documentation des analyseurs de nœuds de LlamaIndex fait le même point du côté du chargeur : analysez en nœuds qui respectent le document, puis découpez. Mais rien de cela ne sauve le mobilier : le chevauchement répète fidèlement l’en-tête aussi dans le fragment suivant, et c’est pourquoi le nettoyage vient avant le découpage, jamais après.
Dédupliquez avant de plonger
Les doublons sont le deuxième polluant systématique, et ils viennent en deux sortes. La première est la duplication de documents entiers : le même PDF indexé deux fois sous des noms différents, l’ancienne version laissée à côté de la nouvelle, la pièce jointe de courriel gardée à côté de la copie du disque partagé. La seconde est à l’intérieur du document : la clause sur la page de titre et encore dans l’appendice, le résumé répété en tête de chaque chapitre, le tableau collé dans le corps et dans l’annexe. Les deux sortes ont le même effet sur la récupération — le texte dupliqué est plongé à répétition, donc il est récupéré à répétition, remplissant le top-k de copies d’un passage pendant que d’autres passages ne remontent jamais — et le même effet sur le coût, parce que vous payez pour plonger et stocker chaque copie.
La déduplication est la moins chère avant le plongement, quand elle est encore une comparaison de chaînes. Les doublons exacts tombent par normalisation : réduisez les blancs, ignorez le mobilier de page que vous avez déjà retiré, hachez le résultat et gardez une copie. Les quasi-doublons — le même paragraphe avec une date changée ou un titre renuméroté — demandent un passage de similarité, mais même un passage grossier attrape le texte répété qui fait le plus de dégâts. Deux prudences gardent la déduplication honnête. D’abord, gardez la première occurrence et notez où étaient les copies ; un avertissement répété dans deux chapitres peut être un dispositif de sécurité délibéré, et le retirer entièrement de l’enregistrement est une décision différente de le retirer de l’index. Ensuite, dédupliquez après le nettoyage, pas avant : deux pages qui ne diffèrent que par leur numéro de page sont des doublons de contenu enveloppés dans un mobilier différent, et seul le texte nettoyé le révèle.
Quoi retirer, et quoi garder
Retirez ce qui se répète sans informer : les têtes et pieds courants, les numéros de page, les filigranes, les bandeaux de confidentialité, les lignes générées « imprimé le », et les miettes de navigation qu’une exportation web vers PDF tamponne sur chaque page. Gardez ce qui structure : les vrais titres, parce qu’ils sont le signal de frontière de fragment le plus fort que vous ayez et appartiennent souvent aux métadonnées du fragment ; les légendes, parce qu’une légende de figure est souvent le seul texte qui dit ce que la figure montre ; le contenu des tableaux, manié avec soin, parce qu’un tableau dépouillé perd les en-têtes de ligne et de colonne qui donnent à ses nombres leur sens ; et les listes, dont les éléments sont des unités naturelles. Le cas limite est la table des matières. Comme fragments, les lignes de la table sont du mobilier — une liste de titres et de numéros de page qui correspond vaguement à chaque requête et n’en répond à aucune —, mais comme métadonnées, cette même page de table est une carte du document. Retirez-la du texte plongé, gardez-la dans vos notes sur le corpus.
Le même jugement s’applique à l’intérieur du nettoyeur de documents lui-même : le mobilier et les numéros de page sont cochés par défaut parce qu’il est presque toujours sûr de les retirer, tandis que les paragraphes en double ne sont jamais cochés par défaut parce que la répétition est parfois le but. L’honnêteté de l’extraction compte aussi ici. Un PDF est un format structuré — la norme ISO du PDF, ISO 32000, définit les pages comme des flux de contenu d’opérations de dessin et de texte, non comme du texte fluide —, donc tout extracteur approxime l’ordre de lecture, et un PDF numérisé n’a aucune couche de texte jusqu’à ce que la ROC lui en donne une. Si vos documents sources comptent aussi pour d’autres raisons, l’article compagnon sur vos PDF comme partie de l’accessibilité de votre site web couvre la structure étiquetée qui aide à la fois les lecteurs d’écran et les extracteurs.
Évaluer la récupération après le nettoyage
Nettoyer est une hypothèse — la récupération s’améliorera — et les hypothèses sur la qualité de recherche se testent avec une machinerie embarrassamment petite. Rassemblez vingt à cinquante vraies questions que vos utilisateurs posent vraiment, avec le passage qui devrait répondre à chacune noté à la main. Exécutez-les contre l’index non nettoyé et l’index nettoyé avec le même récupérateur, les mêmes réglages de fragment et le même top-k, et comparez deux choses : à quelle fréquence le bon passage apparaît dans les résultats du tout, et à quel rang il se place quand il apparaît. Cette paire — rappel et rang — est le tableau de bord. Si le nettoyage fonctionne, les fragments de mobilier cessent d’apparaître dans les résultats, les bons passages montent, et les questions qui échouaient parce qu’un pied surpassait la réponse commencent à passer.
Puis lisez les échecs, parce que les nombres seuls vous flatteront. Un index nettoyé peut gagner en rappel tout en perdant une question dont la réponse vivait vraiment dans un résumé répété que vous avez dédupliqué, ou dans un en-tête qui portait le nom du produit dont chaque fragment avait besoin. Ces pertes sont de l’information : elles vous disent de garder cet élément comme métadonnées, ou de préfixer délibérément le titre du document à chaque fragment au lieu de le plonger par accident deux cents fois. Réexécutez l’évaluation chaque fois que le corpus, le découpeur ou le modèle de plongement change, et gardez l’ensemble de questions versionné à côté de l’index. La qualité RAG n’est pas une propriété de lancement ; c’est une propriété de maintenance, et un petit ensemble de tests fixe est ce qui transforme un « ça semble mieux » en quelque chose de défendable.