<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Explicabilité on Boris Dupoux</title><link>https://borisdupoux.com/fr/tags/explicabilit%C3%A9/</link><description>Recent content in Explicabilité on Boris Dupoux</description><generator>Hugo -- gohugo.io</generator><language>fr</language><lastBuildDate>Tue, 01 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://borisdupoux.com/fr/tags/explicabilit%C3%A9/index.xml" rel="self" type="application/rss+xml"/><item><title>Atomes de traitement explicables pour documents et données</title><link>https://borisdupoux.com/fr/research/processing-atoms/</link><pubDate>Tue, 01 Sep 2026 00:00:00 +0000</pubDate><guid>https://borisdupoux.com/fr/research/processing-atoms/</guid><description>&lt;h2 id="contexte"&gt;&lt;a href="#contexte" class="header-anchor"&gt;&lt;/a&gt;Contexte
&lt;/h2&gt;&lt;p&gt;Des systèmes de production pour le rapprochement documentaire et l&amp;rsquo;OCR, développés pour
des clients tels qu&amp;rsquo;un grossiste distributeur et un cabinet d&amp;rsquo;expertise comptable, ont
laissé plusieurs bases de code résolvant chacune les mêmes sous-problèmes (routage des
pages, réglage de l&amp;rsquo;OCR, extraction par LLM, comparaison de champs) avec leurs propres
bogues. La bibliothèque d&amp;rsquo;atomes les consolide en un seul paquet. Sa question centrale est
celle qui sous-tendait les systèmes d&amp;rsquo;origine : &lt;strong&gt;peut-on automatiser un contrôle documentaire
de sorte qu&amp;rsquo;un humain puisse auditer et contester chaque verdict ?&lt;/strong&gt; Extraire un champ ne
suffit pas. Le système doit indiquer si deux documents concordent, pourquoi, et sur la base
de quels éléments.&lt;/p&gt;
&lt;h2 id="approche"&gt;&lt;a href="#approche" class="header-anchor"&gt;&lt;/a&gt;Approche
&lt;/h2&gt;&lt;p&gt;Tout est construit à partir d&amp;rsquo;&lt;strong&gt;atomes&lt;/strong&gt;. Un atome a une seule responsabilité, des
entrées et sorties typées, aucun état global et des dépendances injectées (client LLM,
moteur OCR, stockage). Une chaîne de traitement est une composition d&amp;rsquo;atomes, soit écrite
en code, soit déclarée sous forme de recette YAML validée au chargement, avant toute exécution.&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart TB
 A["Documents d'entrée (PDF, numérisations, CSV, courriels)"] --&gt; B{"Routage des pages : texte natif ou OCR ?"}
 B -- "natif" --&gt; C["Texte natif positionné"]
 B -- "numérisation" --&gt; D["PaddleOCR (réglages de production)"]
 C --&gt; E["Segmentation &amp; classification"]
 D --&gt; E
 E --&gt; F["Extraction JSON par LLM + vérification d'ancrage verbatim"]
 F --&gt; G["Rapprochement inter-documents (facture / bon de livraison / commande)"]
 G --&gt; H["Verdict tri-état + motif nommé + trace"]
 H --&gt; I["Rapport / revue humaine"]&lt;/pre&gt;&lt;h2 id="le-catalogue"&gt;&lt;a href="#le-catalogue" class="header-anchor"&gt;&lt;/a&gt;Le catalogue
&lt;/h2&gt;&lt;p&gt;Les 459 atomes sont regroupés en 32 familles, un paquet Python chacune, rangées le long de
la chaîne de traitement : &lt;strong&gt;capter&lt;/strong&gt; le monde, le &lt;strong&gt;comprendre&lt;/strong&gt;, &lt;strong&gt;rapprocher&lt;/strong&gt; et décider,
&lt;strong&gt;restituer&lt;/strong&gt;, puis &lt;strong&gt;exploiter&lt;/strong&gt; en production. Deux paquets supplémentaires les assemblent :
&lt;code&gt;steps&lt;/code&gt; (77 étapes nommées et paramétrées) et &lt;code&gt;recipes&lt;/code&gt; (chargement et validation des recettes YAML).&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Série&lt;/th&gt;
					&lt;th&gt;Famille&lt;/th&gt;
					&lt;th style="text-align: right"&gt;Atomes&lt;/th&gt;
					&lt;th&gt;Rôle&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Socle&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;core&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;25&lt;/td&gt;
					&lt;td&gt;types pivots, chaîne de traitement, configuration, résilience (reprises, limites de débit), fichiers, concurrence&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Capter&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;connect&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;40&lt;/td&gt;
					&lt;td&gt;HTTP résilient, boîtes aux lettres (Graph, IMAP), SFTP, OneDrive, source ERP en lecture seule, données ouvertes, piste d&amp;rsquo;audit&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;google&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;24&lt;/td&gt;
					&lt;td&gt;Gmail, Sheets, Drive, Apps Script, avec exécution résiliente&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;web&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;17&lt;/td&gt;
					&lt;td&gt;robots web indépendants du pilote (Selenium, Playwright) : attentes, squelette à reprise, formulaires&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;pdf&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;9&lt;/td&gt;
					&lt;td&gt;texte natif positionné, décision d&amp;rsquo;OCR, rendu, pages, doublons&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;ocr&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;9&lt;/td&gt;
					&lt;td&gt;PaddleOCR avec réglages de production, EasyOCR&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;layout&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;3&lt;/td&gt;
					&lt;td&gt;géométrie de page : lignes, colonnes, redressement, rendu monospace&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;audio&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;16&lt;/td&gt;
					&lt;td&gt;transcription par morceaux, post-traitement des segments, recalage micro ↔ écran&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;vision&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;32&lt;/td&gt;
					&lt;td&gt;flux vidéo / RTSP, détection, suivi, profondeur, segmentation, calibration&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;vlm&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;10&lt;/td&gt;
					&lt;td&gt;lecture d&amp;rsquo;écran par modèle de vision-langage : détection de changement, localisation de libellés&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;geo&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;11&lt;/td&gt;
					&lt;td&gt;mesures géodésiques, position combinée de relevés GPS, filtrage par distance aux lignes, SQL spatial&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;calendar&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;4&lt;/td&gt;
					&lt;td&gt;jours fériés, jours et horaires ouvrés&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Comprendre&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;text&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;32&lt;/td&gt;
					&lt;td&gt;nombres et montants, dates, normalisation, champs par motifs, identifiants&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;segment&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;7&lt;/td&gt;
					&lt;td&gt;pages → documents logiques, numéros de pièce typés, nature de page&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;classify&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;12&lt;/td&gt;
					&lt;td&gt;classement par nom de fichier, expéditeur, motifs pondérés, TF-IDF, visuel, LLM, cascades&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;llm&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;24&lt;/td&gt;
					&lt;td&gt;contrat indépendant du fournisseur, fournisseurs, pool, prompts, extraction structurée&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;anchor&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;5&lt;/td&gt;
					&lt;td&gt;champs et tableaux situés par rapport aux libellés imprimés, texte natif ou OCR&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;kb&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;8&lt;/td&gt;
					&lt;td&gt;base de connaissances tracée : journal d&amp;rsquo;événements validé, replié en index SQLite&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Rapprocher&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;match&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;25&lt;/td&gt;
					&lt;td&gt;EAN/GTIN, index, score multicritère, affectation optimale, résolution d&amp;rsquo;entités&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;compare&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;9&lt;/td&gt;
					&lt;td&gt;comparateurs tri-états et explicables de champs, d&amp;rsquo;enregistrements et d&amp;rsquo;ensembles&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;check&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;9&lt;/td&gt;
					&lt;td&gt;contrôles génériques tri-états : totaux, TVA, balance, complétude, vraisemblance&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;reconcile&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;12&lt;/td&gt;
					&lt;td&gt;appariement d&amp;rsquo;ensembles, chaînes commande → livraison → facture, N-voies, lettrage, rapprochement bancaire&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;validate&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;14&lt;/td&gt;
					&lt;td&gt;moteur de règles, identifiants, cohérence des montants, verdicts LLM corrigés, décision finale&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;rules&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;8&lt;/td&gt;
					&lt;td&gt;langage de conditions sûr, tables « premier match » explicables, escalade, machines à états&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;events&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;11&lt;/td&gt;
					&lt;td&gt;événements horodatés : fenêtres, veille des événements attendus, sessions, transitions de statut&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;analytics&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;18&lt;/td&gt;
					&lt;td&gt;analyses supply chain sans pandas : demande, ruptures, taux de service, stock de sécurité&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Restituer&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;export&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;8&lt;/td&gt;
					&lt;td&gt;CSV pour Excel FR, classeurs Excel partagés, rapports HTML / Markdown / PDF&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;report&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;6&lt;/td&gt;
					&lt;td&gt;écarts persistables, synthèses, file de revue&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;render&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;12&lt;/td&gt;
					&lt;td&gt;livrables HTML : diagrammes Mermaid pré-rendus, graphiques ECharts, cartes GeoJSON&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;diagram&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;6&lt;/td&gt;
					&lt;td&gt;diagrammes de processus : lecture draw.io / BPMN JSON, rendu Mermaid et BPMN XML&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Exploiter&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;ops&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;26&lt;/td&gt;
					&lt;td&gt;haute disponibilité (battements, élection), démon à déclencheurs horaires, surveillance, contrôles préalables&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;qa&lt;/code&gt;&lt;/td&gt;
					&lt;td style="text-align: right"&gt;7&lt;/td&gt;
					&lt;td&gt;non-régression rédactionnelle (fichiers dorés), rejeu de simulations, accord inter-annotateurs&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="recettes-nommées"&gt;&lt;a href="#recettes-nomm%c3%a9es" class="header-anchor"&gt;&lt;/a&gt;Recettes nommées
&lt;/h3&gt;&lt;p&gt;Chacune des 17 recettes est une liste YAML d&amp;rsquo;étapes nommées &lt;code&gt;&amp;lt;espace&amp;gt;.&amp;lt;étape&amp;gt;&lt;/code&gt;. Trois exemples :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;invoice_multi_doc&lt;/code&gt;&lt;/strong&gt; : un lot de PDF multidocuments devient un ensemble de documents
logiques contrôlés. &lt;code&gt;io.collect&lt;/code&gt; → &lt;code&gt;pdf.read&lt;/code&gt; → &lt;code&gt;segment.documents&lt;/code&gt; → &lt;code&gt;classify.documents&lt;/code&gt; →
&lt;code&gt;llm.extract&lt;/code&gt; → &lt;code&gt;validate.ids&lt;/code&gt; → &lt;code&gt;validate.amounts&lt;/code&gt; → &lt;code&gt;validate.decide&lt;/code&gt; → &lt;code&gt;export.csv&lt;/code&gt;
→ &lt;code&gt;google.sheets.upsert&lt;/code&gt; → &lt;code&gt;connect.notify&lt;/code&gt;. Chaque document finit valide, à vérifier ou invalide.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;doc_reconciliation&lt;/code&gt;&lt;/strong&gt; : un dossier de factures, d&amp;rsquo;avoirs et de bons de livraison,
contrôlé par rapport aux commandes. L&amp;rsquo;extraction LLM gardée (&lt;code&gt;llm.extract_docs&lt;/code&gt;) est
recoupée avec une extraction par motifs (&lt;code&gt;extract.regex&lt;/code&gt;, &lt;code&gt;compare.extractions&lt;/code&gt;,
&lt;code&gt;reconcile.fields&lt;/code&gt;), puis viennent &lt;code&gt;check.document&lt;/code&gt; et &lt;code&gt;check.completeness&lt;/code&gt;, les lignes
face à la commande (&lt;code&gt;compare.reference&lt;/code&gt;), la chaîne commande → livraison → facture
(&lt;code&gt;reconcile.nway&lt;/code&gt;), et enfin un fichier d&amp;rsquo;écarts et une file de revue
(&lt;code&gt;report.discrepancies&lt;/code&gt;, &lt;code&gt;report.review&lt;/code&gt;). 17 étapes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;meeting_transcript&lt;/code&gt;&lt;/strong&gt; : un enregistrement de réunion devient une transcription horodatée
avec locuteurs. &lt;code&gt;audio.decode&lt;/code&gt; → &lt;code&gt;audio.vad&lt;/code&gt; → &lt;code&gt;audio.transcribe&lt;/code&gt; → &lt;code&gt;audio.diarize&lt;/code&gt; →
&lt;code&gt;audio.speakers&lt;/code&gt; → &lt;code&gt;audio.segments&lt;/code&gt; → &lt;code&gt;export.csv&lt;/code&gt; → &lt;code&gt;export.transcript&lt;/code&gt; → &lt;code&gt;connect.notify&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Les autres sont notamment &lt;code&gt;delivery_vs_order&lt;/code&gt;, &lt;code&gt;ledger_reconciliation&lt;/code&gt;, &lt;code&gt;invoice_dedup&lt;/code&gt;,
&lt;code&gt;article_base_cleaning&lt;/code&gt;, &lt;code&gt;stock_policy&lt;/code&gt;, &lt;code&gt;mail_to_sheet&lt;/code&gt;, &lt;code&gt;draft_mails&lt;/code&gt;,
&lt;code&gt;pdf_text_extract&lt;/code&gt;, &lt;code&gt;rubric_eval&lt;/code&gt;, &lt;code&gt;screen_session&lt;/code&gt;, &lt;code&gt;camera_flow&lt;/code&gt; et
&lt;code&gt;process_from_transcript&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="latlas"&gt;&lt;a href="#latlas" class="header-anchor"&gt;&lt;/a&gt;L&amp;rsquo;Atlas
&lt;/h2&gt;&lt;p&gt;L&amp;rsquo;Atlas est une page HTML unique, consultable hors ligne, générée à partir du code lui-même
(arbres syntaxiques et YAML), sans aucune donnée saisie à la main. Il dessine le catalogue
comme un tableau périodique : chaque famille est un élément doté d&amp;rsquo;un symbole, chaque module
un atome, chaque recette une molécule. Il signale aussi les atomes sans documentation, sans
test ou sans exemple d&amp;rsquo;usage.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Atlas, série « Capter » : un élément par famille (connect, google, web, pdf, ocr, layout, audio, vision, vlm, geo, calendar), avec ses atomes en dessous" class="gallery-image" data-flex-basis="367px" data-flex-grow="153" height="920" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://borisdupoux.com/research/processing-atoms/atlas-capture-series.png" srcset="https://borisdupoux.com/research/processing-atoms/atlas-capture-series_hu_dfcfb778a533826c.png 800w, https://borisdupoux.com/research/processing-atoms/atlas-capture-series.png 1408w" width="1408"&gt;
&lt;em&gt;La série « Capter » du tableau périodique. Chaque case est une famille, avec son symbole, son nombre de modules et sa taille en milliers de lignes ; chaque tuile en dessous est un atome.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Atlas, série « Rapprocher » : match, compare, check, reconcile, validate, rules, events, analytics" class="gallery-image" data-flex-basis="536px" data-flex-grow="223" height="630" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://borisdupoux.com/research/processing-atoms/atlas-reconcile-series.png" srcset="https://borisdupoux.com/research/processing-atoms/atlas-reconcile-series_hu_872c082d4171f5de.png 800w, https://borisdupoux.com/research/processing-atoms/atlas-reconcile-series.png 1408w" width="1408"&gt;
&lt;em&gt;La série « Rapprocher » : les familles qui apparient, comparent, contrôlent et décident.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Fiche de l’atome compare.fields dans l’Atlas : rôle, règles de dominance et signature complète" class="gallery-image" data-flex-basis="170px" data-flex-grow="71" height="900" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://borisdupoux.com/research/processing-atoms/atlas-atom-compare-fields.png" width="640"&gt;
&lt;em&gt;La fiche d&amp;rsquo;un atome (&lt;code&gt;compare.fields&lt;/code&gt;) : à quoi il sert, d&amp;rsquo;après sa docstring, puis chaque nom public avec sa signature complète.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="La recette invoice_multi_doc vue comme une molécule : 11 étapes reliées par les clés de contexte qu’elles se transmettent" class="gallery-image" data-flex-basis="590px" data-flex-grow="246" height="572" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://borisdupoux.com/research/processing-atoms/atlas-recipe-invoice-multi-doc.png" srcset="https://borisdupoux.com/research/processing-atoms/atlas-recipe-invoice-multi-doc_hu_9f54a6aa2766961a.png 800w, https://borisdupoux.com/research/processing-atoms/atlas-recipe-invoice-multi-doc.png 1408w" width="1408"&gt;
&lt;em&gt;La recette &lt;code&gt;invoice_multi_doc&lt;/code&gt; en molécule : 11 étapes, les clés de contexte qui les relient et les services requis (en pointillé lorsqu&amp;rsquo;ils sont facultatifs).&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="méthodes"&gt;&lt;a href="#m%c3%a9thodes" class="header-anchor"&gt;&lt;/a&gt;Méthodes
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Résultats tri-états.&lt;/strong&gt; Chaque comparaison renvoie &lt;code&gt;ok ∈ {True, False, None}&lt;/code&gt;
(conforme / écart / non concluant) avec un code de motif nommé et une trace. Une valeur
manquante ou illisible compte comme non concluante, jamais comme une anomalie. Les
résultats non concluants sont tout de même comptabilisés, et non écartés en silence.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Routage hybride texte natif/OCR.&lt;/strong&gt; Chaque page PDF est classée comme native, OCR ou
vide, selon la quantité de texte natif qu&amp;rsquo;elle contient et la part de ce texte couverte
par des images. L&amp;rsquo;OCR n&amp;rsquo;est exécuté que là où il est nécessaire.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extraction LLM ancrée.&lt;/strong&gt; L&amp;rsquo;extraction JSON structurée est validée par rapport à des
schémas Pydantic. Chaque valeur extraite est ensuite vérifiée mot pour mot dans le texte
source, de sorte que les valeurs altérées ou inventées sont signalées : 16 altérations
synthétiques sur 16 ont été rejetées par la vérification verbatim (vrai par construction).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rapprochement inter-documents.&lt;/strong&gt; Factures, bons de livraison et commandes sont comparés
ligne à ligne à l&amp;rsquo;aide de tolérances nommées et de règles de dominance. Par exemple, un
montant de ligne concordant peut l&amp;rsquo;emporter sur un écart de prix.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Provenance.&lt;/strong&gt; Chaque atome porté comporte un en-tête &lt;code&gt;Provenance:&lt;/code&gt; et une entrée qui le
relie à &lt;code&gt;repo@commit:path:lines&lt;/code&gt; dans le code de production d&amp;rsquo;origine. Les bogues découverts
lors du portage ont été corrigés, et chaque correction est couverte par un test de non-régression.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Architecture contrôlée.&lt;/strong&gt; Le découpage en couches est vérifié par 30 contrats d&amp;rsquo;import :
un atome n&amp;rsquo;importe que le paquet &lt;code&gt;core&lt;/code&gt;. Un typage strict, un seuil de couverture ≥ 80 % et
une vérification de l&amp;rsquo;absence de noms de clients dans le code source sont également imposés.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Abstraction du matériel.&lt;/strong&gt; Les atomes de vision et d&amp;rsquo;audio ciblent &lt;code&gt;cuda&lt;/code&gt;, &lt;code&gt;mps&lt;/code&gt; ou &lt;code&gt;cpu&lt;/code&gt; via un seul paramètre.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Évaluation de bout en bout.&lt;/strong&gt; Les tests s&amp;rsquo;exécutent avec de vrais moteurs (PaddleOCR, Ollama &lt;code&gt;qwen3:8b&lt;/code&gt;
et &lt;code&gt;qwen3-vl:8b&lt;/code&gt;) sur des données à vérité terrain connue. Chaque métrique est consignée face à un
seuil dans un rapport JSON/HTML. Les métriques qui n&amp;rsquo;atteignent pas leur seuil sont conservées et
affichées comme en échec.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="résultats"&gt;&lt;a href="#r%c3%a9sultats" class="header-anchor"&gt;&lt;/a&gt;Résultats
&lt;/h2&gt;&lt;p&gt;Base de code (arborescence actuelle) : 459 modules d&amp;rsquo;atomes répartis en 32 familles, 77 étapes
paramétrées, 17 recettes YAML, 30 contrats d&amp;rsquo;import. La suite collecte 2 959 tests unitaires et
de recettes, plus, exécutés séparément, 99 tests de bout en bout avec de vrais moteurs et 10 tests
sur le web en direct ; ces nombres sont ceux des tests collectés, le statut de réussite n&amp;rsquo;étant pas
consigné. Les 17 recettes disposent toutes d&amp;rsquo;au moins un test de bout en bout, et 34 des 35 éléments
de l&amp;rsquo;Atlas (tous sauf &lt;code&gt;anchor&lt;/code&gt;) sont touchés de bout en bout, mais seulement environ 41 % des modules.&lt;/p&gt;
&lt;p&gt;Scores de bout en bout sélectionnés (documents synthétiques à vérité terrain connue, modèles 8B locaux) :&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Tâche&lt;/th&gt;
					&lt;th&gt;Moteur&lt;/th&gt;
					&lt;th&gt;Mesure&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Rapprochement facture + bon de livraison / commande&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;qwen3:8b&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;types de documents et champs 14/14 (2 dossiers synthétiques, 1 exécution) ; les 5 signaux attendus de l&amp;rsquo;unique écart injecté (une livraison incomplète facturée en totalité), 1 dossier synthétique ; 0 écart de niveau erreur sur 1 dossier synthétique conforme (avertissements non comptés)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Extraction JSON par LLM (4 factures natives)&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;qwen3:8b&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;JSON valide 4/4 ; champs exacts 28/28 (4 factures synthétiques × 7 champs) ; 16 altérations synthétiques sur 16 rejetées par la vérification verbatim (vrai par construction)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;OCR sur une étiquette&lt;/td&gt;
					&lt;td&gt;PaddleOCR&lt;/td&gt;
					&lt;td&gt;étiquette synthétique avec dégradation photo simulée (17 mots, 2 scènes) : rappel 0,94 en brut ; un défaut de sursaturation du rehaussement (0,65–0,71) a été corrigé (0,88–0,94), sans gain net par rapport à l&amp;rsquo;image brute&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Reconstruction de tableaux à partir de l&amp;rsquo;OCR (un tableau synthétique 10 × 4)&lt;/td&gt;
					&lt;td&gt;PaddleOCR&lt;/td&gt;
					&lt;td&gt;100 % de cellules exactes (police proportionnelle), 95 % (chasse fixe)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="limites--suite"&gt;&lt;a href="#limites--suite" class="header-anchor"&gt;&lt;/a&gt;Limites &amp;amp; suite
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;L&amp;rsquo;ancrage verbatim ne peut pas détecter une valeur présente dans le document mais placée
dans le mauvais champ : un champ absent a été rempli à tort dans 1 cas sur 8.&lt;/li&gt;
&lt;li&gt;Le modèle 8B a jugé un écart de quantité de +50 % comme un écart « mineur », contrairement
à la consigne. Les verdicts du LLM sont donc normalisés et maintenus en aval de règles
déterministes.&lt;/li&gt;
&lt;li&gt;Les scores proviennent principalement de données synthétiques. Un jeu de test sur documents
réels est en cours de constitution en dehors du dépôt, et seuls les cas ayant fait l&amp;rsquo;objet
d&amp;rsquo;une revue sont notés.&lt;/li&gt;
&lt;li&gt;De premiers essais sur documents réels (environ 10 à 25 cas par recette, en partie non revus)
montrent une extraction de texte solide, mais une détection des doublons et un découpage des
documents faibles ; les scores revus seront publiés.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="stack-technique"&gt;&lt;a href="#stack-technique" class="header-anchor"&gt;&lt;/a&gt;Stack technique
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Python&lt;/code&gt; · &lt;code&gt;Pydantic&lt;/code&gt; · &lt;code&gt;PyYAML&lt;/code&gt; · &lt;code&gt;PaddleOCR&lt;/code&gt; · &lt;code&gt;Ollama&lt;/code&gt; (&lt;code&gt;qwen3:8b&lt;/code&gt;, &lt;code&gt;qwen3-vl:8b&lt;/code&gt;) · &lt;code&gt;Mistral / Anthropic / OpenAI APIs&lt;/code&gt; · &lt;code&gt;pytest&lt;/code&gt; · &lt;code&gt;mypy&lt;/code&gt; · &lt;code&gt;import-linter&lt;/code&gt; · &lt;code&gt;ruff&lt;/code&gt;&lt;/p&gt;</description></item></channel></rss>