# Pipeline Validator - Backend Core ## 📋 Description SystĂšme de validation qualitative pour Ă©valuer objectivement l'Ă©volution du contenu gĂ©nĂ©rĂ© Ă  travers les diffĂ©rentes Ă©tapes d'un pipeline via Ă©valuations LLM. ## 🎯 FonctionnalitĂ©s - **ExĂ©cution pipeline** avec sauvegarde automatique de toutes les versions (v1.0, v1.1, v1.2, v2.0) - **Échantillonnage intelligent** : sĂ©lection automatique des balises reprĂ©sentatives - Tous les titres (balises `T*`) - 4 contenus principaux (balises `MC*`, `L*`) - 4 FAQ (balises `FAQ*`) - **Évaluation LLM** selon 5 critĂšres universels : 1. **QualitĂ© globale** - Grammaire, syntaxe, cohĂ©rence 2. **VerbositĂ©** - Concision vs fluff 3. **SEO** - IntĂ©gration naturelle des mots-clĂ©s 4. **RĂ©pĂ©titions** - VariĂ©tĂ© lexicale 5. **NaturalitĂ© humaine** - DĂ©tection vs IA - **AgrĂ©gation scores** : moyennes par version et par critĂšre - **Rapport complet** : JSON structurĂ© avec tous les rĂ©sultats ## 📁 Architecture ``` lib/validation/ ├── ValidatorCore.js # Orchestrateur principal ├── SamplingEngine.js # Échantillonnage automatique ├── CriteriaEvaluator.js # Évaluations LLM multi-critĂšres ├── test-validator.js # Test Phase 1 (sans LLM) ├── test-validator-phase2.js # Test Phase 2 (avec LLM) └── README.md # Ce fichier validations/{uuid}/ # Dossier gĂ©nĂ©rĂ© par validation ├── config.json # Configuration utilisĂ©e ├── report.json # Rapport final ├── versions/ │ ├── v1.0.json # Contenu aprĂšs gĂ©nĂ©ration │ ├── v1.1.json # Contenu aprĂšs step 1 │ ├── v1.2.json # Contenu aprĂšs step 2 │ └── v2.0.json # Contenu final ├── samples/ │ ├── all-samples.json # Échantillons extraits │ └── summary.json # RĂ©sumĂ© Ă©chantillons └── results/ └── evaluations.json # Évaluations LLM complĂštes ``` ## 🚀 Utilisation ### Test Phase 1 (sans Ă©valuations LLM) ```bash node lib/validation/test-validator.js ``` **DurĂ©e** : ~2-3 minutes (gĂ©nĂ©ration + Ă©chantillonnage) **RĂ©sultat** : Validation avec pipeline exĂ©cutĂ© et Ă©chantillons extraits, SANS Ă©valuations LLM. ### Test Phase 2 (avec Ă©valuations LLM) ```bash node lib/validation/test-validator-phase2.js ``` **DurĂ©e** : ~3-5 minutes (gĂ©nĂ©ration + Ă©chantillonnage + Ă©valuations) **RĂ©sultat** : Validation COMPLÈTE avec scores LLM pour chaque Ă©chantillon et version. ### Phase 3 (API & WebSocket) - Utilisation REST API **DĂ©marrer une validation**: ```bash curl -X POST http://localhost:3000/api/validation/start \ -H "Content-Type: application/json" \ -d '{ "pipelineConfig": { "name": "Test Pipeline", "pipeline": [ { "step": 1, "module": "generation", "mode": "simple", "intensity": 1.0 } ] }, "rowNumber": 2 }' ``` **RĂ©cupĂ©rer le statut**: ```bash curl http://localhost:3000/api/validation/status/{validationId} ``` **Lister toutes les validations**: ```bash curl http://localhost:3000/api/validation/list ``` **RĂ©cupĂ©rer le rapport complet**: ```bash curl http://localhost:3000/api/validation/{validationId}/report ``` **RĂ©cupĂ©rer les Ă©valuations dĂ©taillĂ©es**: ```bash curl http://localhost:3000/api/validation/{validationId}/evaluations ``` ### WebSocket - Progression temps rĂ©el Connecter un client WebSocket sur `ws://localhost:8081`: ```javascript const ws = new WebSocket('ws://localhost:8081'); ws.onmessage = (event) => { const data = JSON.parse(event.data); if (data.type === 'validation_progress') { console.log(`[${data.progress.percentage}%] ${data.progress.phase}: ${data.progress.message}`); } }; ``` ### Utilisation programmatique ```javascript const { ValidatorCore } = require('./lib/validation/ValidatorCore'); const validator = new ValidatorCore(); const pipelineConfig = { name: 'Mon Pipeline', pipeline: [ { step: 1, module: 'generation', mode: 'simple', intensity: 1.0 }, { step: 2, module: 'selective', mode: 'lightEnhancement', intensity: 0.5 } ] }; const result = await validator.runValidation( {}, // config validation (optionnel) pipelineConfig, // config pipeline 2 // rowNumber Google Sheets ); if (result.success) { console.log('✅ Validation rĂ©ussie'); console.log(`Score global: ${result.report.evaluations.overallScore}/10`); console.log(`Dossier: ${result.validationDir}`); } ``` ## 📊 Format du rapport ### Rapport JSON (`report.json`) ```json { "validationId": "uuid", "timestamp": "2025-...", "status": "completed", "pipeline": { "name": "Pipeline name", "totalSteps": 2, "successfulSteps": 2, "totalDuration": 125000 }, "versions": { "count": 3, "paths": ["v1.0.json", "v1.1.json", "v2.0.json"] }, "samples": { "total": 9, "titles": 5, "content": 4, "faqs": 0 }, "evaluations": { "totalEvaluations": 135, "overallScore": 7.3, "byVersion": { "v1.0": { "avgScore": 6.5, "count": 45 }, "v1.1": { "avgScore": 7.2, "count": 45 }, "v2.0": { "avgScore": 7.8, "count": 45 } }, "byCriteria": { "qualite": { "avgScore": 8.1, "count": 27 }, "verbosite": { "avgScore": 7.5, "count": 27 }, "seo": { "avgScore": 7.8, "count": 27 }, "repetitions": { "avgScore": 7.2, "count": 27 }, "naturalite": { "avgScore": 6.0, "count": 27 } } } } ``` ### Évaluations dĂ©taillĂ©es (`results/evaluations.json`) ```json { "evaluations": { "|T0|": { "qualite": { "v1.0": { "score": 8.0, "reasoning": "Titre clair..." }, "v1.1": { "score": 8.5, "reasoning": "AmĂ©lioration..." } }, "naturalite": { "v1.0": { "score": 6.5, "reasoning": "LĂ©gĂšre..." }, "v1.1": { "score": 7.0, "reasoning": "Plus naturel..." } } } }, "aggregated": { "byVersion": {...}, "byCriteria": {...}, "overall": { "avgScore": 7.3, "totalEvaluations": 135 } } } ``` ## 🎯 CritĂšres d'Ă©valuation ### 1. QualitĂ© globale (0-10) - Grammaire, orthographe, syntaxe - CohĂ©rence et fluiditĂ© - Pertinence contextuelle ### 2. VerbositĂ© / Concision (0-10) - DensitĂ© informationnelle - Longueur appropriĂ©e - Absence de fluff ### 3. SEO et mots-clĂ©s (0-10) - IntĂ©gration naturelle mots-clĂ©s - DensitĂ© appropriĂ©e - Structure SEO-friendly ### 4. RĂ©pĂ©titions et variations (0-10) - Évite rĂ©pĂ©titions lexicales - Vocabulaire variĂ© - Usage synonymes ### 5. NaturalitĂ© humaine (0-10) - Semble Ă©crit par humain - Variations naturelles - Évite patterns IA ## ⚙ Configuration ### Limiter concurrence Ă©valuations LLM Par dĂ©faut : 3 Ă©valuations en parallĂšle. Modifier dans `ValidatorCore.js` : ```javascript const evaluations = await this.criteriaEvaluator.evaluateBatch(samples, context, 5); // ^^^ maxConcurrent ``` ### Changer LLM Ă©valuateur Par dĂ©faut : `claude-sonnet-4-5` Modifier dans `CriteriaEvaluator.js` : ```javascript this.defaultLLM = 'gpt-4o'; // Ou autre LLM ``` ### DĂ©sactiver retry logic Modifier dans `CriteriaEvaluator.js` : ```javascript this.maxRetries = 0; // Pas de retry ``` ## 💰 CoĂ»ts estimĂ©s ### Configuration standard - Pipeline : 4 steps → 4 versions - Échantillons : ~13 balises - CritĂšres : 5 critĂšres - **Total appels LLM** : 13 × 5 × 4 = **260 appels** - **CoĂ»t** : ~$1.00 par validation (Claude Sonnet 4.5) ### Configuration Ă©conomique - Pipeline : 2 steps → 2 versions - Échantillons : ~7 balises - CritĂšres : 3 critĂšres prioritaires - **Total appels LLM** : 7 × 3 × 2 = **42 appels** - **CoĂ»t** : ~$0.16 par validation ## 🐛 Debugging ### Logs dĂ©taillĂ©s Les logs incluent : - `[INFO]` Progression phases - `[DEBUG]` DĂ©tails Ă©chantillonnage et Ă©valuations - `[ERROR]` Erreurs avec stack trace ### VĂ©rifier contenu versions ```bash cat validations/{uuid}/versions/v1.0.json | jq ``` ### VĂ©rifier Ă©chantillons ```bash cat validations/{uuid}/samples/all-samples.json | jq ``` ### VĂ©rifier Ă©valuations ```bash cat validations/{uuid}/results/evaluations.json | jq '.aggregated' ``` ## 🔧 DĂ©veloppement ### Ajouter un nouveau critĂšre 1. Modifier `CRITERIA` dans `CriteriaEvaluator.js` 2. Ajouter prompt dĂ©tails dans `getCriteriaPromptDetails()` ### Modifier algorithme Ă©chantillonnage Modifier mĂ©thodes dans `SamplingEngine.js` : - `extractSamples()` - Logique principale - `extractVersionsForTag()` - Extraction versions ### Ajouter nouvelle phase validation Modifier `ValidatorCore.js` : - Ajouter mĂ©thode `runMyPhase()` - InsĂ©rer appel dans workflow `runValidation()` - Ajouter sauvegarde dans `generateReport()` ## 🌐 API Endpoints (Phase 3) ### POST /api/validation/start DĂ©marre une nouvelle validation en arriĂšre-plan. **Body**: ```json { "pipelineConfig": { "name": "Pipeline Name", "pipeline": [...] }, "rowNumber": 2, "config": {} } ``` **Response** (202 Accepted): ```json { "success": true, "data": { "validationId": "uuid-xxx", "status": "running", "message": "Validation dĂ©marrĂ©e en arriĂšre-plan" } } ``` ### GET /api/validation/status/:id RĂ©cupĂšre le statut et la progression d'une validation. **Response**: ```json { "success": true, "data": { "validationId": "uuid-xxx", "status": "running", "progress": { "phase": "evaluation", "message": "Évaluation LLM des Ă©chantillons...", "percentage": 65 }, "duration": 120000, "pipelineName": "Test Pipeline", "result": null } } ``` ### POST /api/validation/stop/:id ArrĂȘte une validation en cours (marque comme stopped, le processus continue en arriĂšre-plan). ### GET /api/validation/list Liste toutes les validations (actives + historique). **Query Params**: - `status`: Filtrer par statut (running, completed, error) - `limit`: Nombre max de rĂ©sultats (dĂ©faut: 50) ### GET /api/validation/:id/report RĂ©cupĂšre le rapport complet JSON d'une validation terminĂ©e. ### GET /api/validation/:id/evaluations RĂ©cupĂšre les Ă©valuations LLM dĂ©taillĂ©es avec scores par version et critĂšre. ## 📡 WebSocket Events (Phase 3) **Type: `validation_progress`** ```json { "type": "validation_progress", "validationId": "uuid-xxx", "status": "running", "progress": { "phase": "pipeline|sampling|evaluation|saving|report", "message": "Description de l'Ă©tape en cours", "percentage": 65 }, "timestamp": "2025-01-13T..." } ``` --- **Statut** : ✅ Phase 3 complĂšte et opĂ©rationnelle (API + WebSocket) **Version** : 1.1.0 **Date** : 2025-01-13