Pipeline de synthèse — réunir les documents, déceler les contradictions
La pipeline de synthèse multi-documents prend un ensemble de pages/documents d'une archive et produit des pages wiki réunies : chaque page synthétise les sources, signale où les sources ne sont pas d'accord (contradiction detection), respecte les budgets…
La pipeline de synthèse multi-documents prend un ensemble de pages/documents d'une archive et produit des pages wiki réunies : chaque page synthétise les sources, signale où les sources ne sont pas d'accord (contradiction detection), respecte les budgets de tokens/appels/pages par run, et ne touche le système de fichiers qu'après l'approbation sélective de ce qu'on veut insérer.
Fonctionnalité Community (la pipeline tourne sur les mêmes infrastructures du chat orchestrator ; les limites de budget par run). Sources :docs/SERVICES.md(le domaine Synthesis,synthesisPageWriter.ts),README.md:33. Lignes de provenance :FACT-CENSUS.mdF-SYNTH-1.
Comment tourne la pipeline
La pipeline est orchestrée par runSynthesisPipeline (façade synthesisService.ts ; le corps dans synthesis/synthesisStages.ts — runPipelineStages, callSynthesisLLMStage, …) :
| Étape | Ce qu'elle fait |
|---|---|
| 1. Extraction d'entités | depuis le corpus sélectionné (synthesisStages.ts:569) |
| 2. Une page par archive | generatePageSummary par page (:282) |
| 3-4. Le fond et la décision | les blocs fins avec le system prompt (l'injection du bloc wiki : Pass 4 seulement sur le rôle SYSTEM, synthesisStages.ts:784-788) |
| Contradictions | synthesisContradictionService.ts : l'appariement des candidates via Jaccard (seuil 0.15) + le juge LLM par paire (judgePairContradiction) + les marqueurs de contradiction sur les pages |
| Orphelines et wikilinks cassés | synthesisOrphanService.ts (detectOrphanPages, detectBrokenWikilinks) |
| Écriture | synthesisPageWriter.ts : applyApprovedChanges persiste les modifications approuvées ; le frontmatter de source (buildSourceFrontmatter) cite les provenance |
Le suivi du budget
BudgetTracker (synthesisBudgetService.ts) borne tokens / appels LLM / pages par run (la configuration via loadBudgetConfig) : la pipeline s'arrête quand le budget épuise — la sortie déjà écrite reste valide. Le chien de garde du budget est à l'égal de celui du chat orchestrator.
L'approbation sélective
Les modifications proposées par la synthèse N'atterrissent pas automatiquement dans le wiki : elles passent par le flux d'approbation (applyApprovedChanges ne persiste que ce que l'approbateur a confirmé). L'aperçu déterministe (la même machine de wikiWriteService) précède toute écriture ; les pages proposées portent le frontmatter de source.
La détection de contradictions
Les paires candidates se forment par similarité (Jaccard, seuil 0.15) et les paires suspectes passent au juge LLM (judgePairContradiction) : le résultat = les marqueurs de contradiction sur les pages impliquées (buildContradictionMarker) + le résumé de l'affirmation (extractClaimSummary). La fidélité du processus est échantillonnée hebdomadairement (runFidelitySample, dimanche 03:00 — synthesisFidelityService.ts).
Déclencheurs et files de travail
- Post-OCR : la file
synthesisTriggerService(onOcrJobCompleted) met en file les runs de synthèse après le tour de l'OCR, avec un temps de refroidissement (isCooldownActive). - Reaper : le scheduler
synthesisReaperJob(toutes les 15 minutes) bascule les runsPROCESSINGorphelins enFAILED.
Ce guide couvre la surface opérationnelle du pipeline de synthèse; l'approfondissement technique vit dans la publication jumelle :
Provenance
| Section | Source |
|---|---|
| Façade / étapes / budget / contradictions | docs/SERVICES.md (§ Synthesis + les modules synthesis*) — F-SYNTH-1 |
| Déclencheurs / reaper | docs/SERVICES.md (§ Schedulers & jobs — synthesisTriggerService, synthesisReaperJob) |
| La ligne du README | README.md:33 (la ligne du synthesis) — F-SYNTH-1 |
| L'injection wiki / Pass 4 | docs/WIKI_SCHEMA_LAYER.md (§ Injection seams — synthesisStages.ts:784-788) |
---
Référence opérateur — Simmetric Chat v0.28.1 (docs actualisées le 2026-10-02, SHA du census `aca5b8ff`).