seo-generator-server/PIPELINE_VALIDATOR_SPEC.md
StillHammer 0244521f5c feat(selective-smart-touch): Add intelligent analysis-driven enhancement system + validation spec
## SelectiveSmartTouch (NEW)
- Architecture révolutionnaire: Analyse intelligente → Améliorations ciblées précises
- 5 modules: SmartAnalysisLayer, SmartTechnicalLayer, SmartStyleLayer, SmartReadabilityLayer, SmartTouchCore
- Système 10% segments: amélioration uniquement des segments les plus faibles (intensity-based)
- Détection contexte globale pour prompts adaptatifs multi-secteurs
- Intégration complète dans PipelineExecutor et PipelineDefinition

## Pipeline Validator Spec (NEW)
- Spécification complète système validation qualité par LLM
- 5 critères universels: Qualité, Verbosité, SEO, Répétitions, Naturalité
- Échantillonnage intelligent par filtrage balises (pas XML)
- Évaluation multi-versions avec justifications détaillées
- Coût estimé: ~$1/validation (260 appels LLM)

## Optimizations
- Réduction intensités fullEnhancement (technical 1.0→0.7, style 0.8→0.5)
- Ajout gardes-fous anti-familiarité excessive dans StyleLayer
- Sauvegarde étapes intermédiaires activée par défaut (pipeline-runner)

## Fixes
- Fix typo critique SmartTouchCore.js:110 (determineLayers ToApply → determineLayersToApply)
- Prompts généralisés multi-secteurs (e-commerce, SaaS, services, informatif)

🚀 Generated with Claude Code (https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-13 15:01:02 +08:00

878 lines
30 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 📋 PIPELINE VALIDATOR - Spécification Technique
## 🎯 OBJECTIF GÉNÉRAL
Créer une interface dédiée de validation qualitative permettant d'évaluer l'évolution du contenu à travers les différentes étapes d'un pipeline, en utilisant des critères LLM objectifs avec notation et justification détaillée.
---
## 🧠 COMPRÉHENSION DU BESOIN
### Workflow utilisateur
1. **Chargement** : Sélectionner une config de pipeline + une personnalité Google Sheets
2. **Exécution** : Run le pipeline complet (identique à pipeline-runner)
3. **Échantillonnage intelligent** : Extraire automatiquement 3 types d'éléments du contenu généré
4. **Évaluation multi-critères** : Chaque critère = 1 appel LLM → note/10 + justification
5. **Visualisation comparative** : Voir l'évolution d'un échantillon à travers toutes les étapes
### Valeur ajoutée
- **Traçabilité** : Comprendre l'impact réel de chaque layer du pipeline
- **Objectivité** : Évaluation quantitative via LLM (pas de subjectivité humaine)
- **Debugging** : Identifier quelle étape dégrade/améliore la qualité
- **Optimisation** : Comparer différentes configs de pipeline scientifiquement
---
## 🏗️ ARCHITECTURE SYSTÈME
### 1. FICHIERS À CRÉER
#### Frontend
- **`public/pipeline-validator.html`** - Interface principale
- Section chargement (config + personnalité)
- Zone de contrôle (run, status, progress)
- Panneau d'échantillonnage (liste des 3 types)
- Tableau de scores (critères × étapes)
- Vue détaillée comparative (sélection d'échantillon)
- **`public/pipeline-validator.js`** - Logique frontend
- Gestion UI (sélections, boutons, modals)
- Communication WebSocket pour progression temps réel
- Rendering des scores et graphiques
- Navigation entre échantillons
- **`public/css/pipeline-validator.css`** - Styles dédiés
- Layout responsive (sidebar + main content)
- Cartes de scores avec couleurs (vert>7, orange 5-7, rouge<5)
- Vue comparative side-by-side ou verticale
#### Backend
- **`lib/validation/ValidatorCore.js`** - Orchestrateur principal
- Exécution pipeline avec sauvegarde toutes versions
- Échantillonnage intelligent post-génération
- Orchestration évaluations LLM par critère
- Agrégation résultats + génération rapport
- **`lib/validation/SamplingEngine.js`** - Moteur d'échantillonnage
- Extraction titres (H1, H2, H3, title tags)
- Sélection paragraphes (longueur moyenne, représentatifs)
- Extraction FAQ (paires question/réponse)
- Parsing XML/HTML intelligent
- **`lib/validation/CriteriaEvaluator.js`** - Évaluateur multi-critères
- Définition des critères d'évaluation (voir section dédiée)
- Appels LLM avec prompts structurés
- Parsing réponses LLM (score + justification)
- Retry logic + gestion erreurs
- **`lib/validation/ValidationAPI.js`** - Endpoints API
- POST `/api/validation/run` - Lancer validation complète
- GET `/api/validation/status/:id` - Status temps réel
- GET `/api/validation/results/:id` - Récupérer résultats
- GET `/api/validation/sample/:id/:type/:index` - Détail échantillon
#### Modifications à faire
- **`lib/APIController.js`** - Ajouter routes validation
- **`lib/pipeline/PipelineExecutor.js`** - Ajouter flag `saveAllVersions: true` pour forcer sauvegarde toutes étapes intermédiaires
- **`server.js`** - Exposer endpoints validation
---
## 📊 ÉCHANTILLONNAGE INTELLIGENT
### Source des données : Objet `content` (pas de XML)
Après chaque étape du pipeline, on a un simple objet JavaScript :
```javascript
content = {
"|MC0|": "Texte du mot-clé principal...",
"|T0|": "Titre principal",
"|T-1|": "Sous-titre 1",
"|L-1|": "Texte liste 1...",
"|FAQ_Q1|": "Question FAQ ?",
"|FAQ_A1|": "Réponse FAQ...",
...
}
```
**Versions sauvegardées** : Chaque step sauvegarde son objet `content` en JSON
- `v1.0.json` (génération initiale)
- `v1.1.json` (après step 1)
- `v1.2.json` (après step 2)
- `v2.0.json` (final)
### Catégories d'échantillons
#### 1. **Titres** (TOUS)
**Sélection** : Toutes les balises contenant `T` dans leur nom
- `|T0|`, `|T-1|`, `|T+1|`, etc.
**Pourquoi tous** : Les titres sont critiques pour SEO et structure, peu nombreux
#### 2. **Contenus principaux** (4 échantillons)
**Sélection** : Balises de contenu long (`MC*`, `L*`)
- Prendre les 4 premières : `|MC0|`, `|MC+1|`, `|L-1|`, `|L+1|`
**Objectif** : Évaluer la qualité rédactionnelle sur échantillon représentatif
#### 3. **FAQ** (4 balises = 2 paires)
**Sélection** : Balises contenant `FAQ`
- 2 paires Q/A = 4 balises : `|FAQ_Q1|`, `|FAQ_A1|`, `|FAQ_Q2|`, `|FAQ_A2|`
- Si <2 paires disponibles, prendre ce qui existe
**Objectif** : Évaluer naturalité question/réponse
### Algorithme d'échantillonnage
```javascript
// Charger version finale
const finalContent = JSON.parse(fs.readFileSync('v2.0.json'));
const allTags = Object.keys(finalContent);
// Catégoriser automatiquement
const samples = {
titles: allTags.filter(tag => tag.includes('T')), // Tous
content: allTags.filter(tag => tag.includes('MC') || tag.includes('L')).slice(0, 4),
faqs: allTags.filter(tag => tag.includes('FAQ')).slice(0, 4)
};
// Pour chaque échantillon, extraire versions à travers toutes étapes
for (const tag of [...samples.titles, ...samples.content, ...samples.faqs]) {
const versions = {};
for (const versionPath of ['v1.0.json', 'v1.1.json', 'v1.2.json', 'v2.0.json']) {
const versionContent = JSON.parse(fs.readFileSync(versionPath));
versions[versionPath] = versionContent[tag] || "[Non disponible à cette étape]";
}
samplesData[tag] = {
tag,
type: tag.includes('T') ? 'title' : tag.includes('FAQ') ? 'faq' : 'content',
versions
};
}
```
---
## 🎯 CRITÈRES D'ÉVALUATION LLM
### Principe général
- **1 critère = 1 appel LLM** (parallélisation possible)
- **5 critères universels** applicables à tous types de contenu (titres, paragraphes, FAQ)
- **Prompt structuré** : contexte + critère + échelle notation + demande justification
- **Output attendu** : JSON `{ score: 8, reasoning: "Justification détaillée..." }`
- **LLM utilisé** : Claude Sonnet (objectivité optimale)
- **Temperature** : 0.3 (cohérence entre évaluations)
---
### 1. **Qualité globale** (0-10)
**Évalue** :
- Grammaire, orthographe, syntaxe impeccables
- Cohérence et fluidité du texte
- Pertinence par rapport au contexte (MC0, personnalité)
**Prompt template** :
```
Tu es un évaluateur objectif de contenu SEO.
CONTEXTE:
- Mot-clé principal: {MC0}
- Thématique: {T0}
- Personnalité: {personality.nom}
- Type de contenu: {type} (titre/contenu/faq)
ÉLÉMENT À ÉVALUER:
"{text}"
CRITÈRE: Qualité globale
Évalue la qualité rédactionnelle globale :
- Grammaire et syntaxe impeccables ?
- Texte fluide et cohérent ?
- Pertinent par rapport au mot-clé "{MC0}" ?
ÉCHELLE:
10 = Qualité exceptionnelle, aucune faute
7-9 = Bonne qualité, légères imperfections
4-6 = Qualité moyenne, plusieurs problèmes
1-3 = Faible qualité, nombreuses erreurs
0 = Inutilisable
Réponds en JSON strict:
{
"score": 7.5,
"reasoning": "Justification en 2-3 phrases concrètes..."
}
```
---
### 2. **Verbosité / Concision** (0-10)
**Évalue** :
- Densité informationnelle (info utile vs fluff)
- Longueur appropriée au type de contenu
- Évite délayage et remplissage inutile
**Prompt template** :
```
CRITÈRE: Verbosité et concision
Évalue la concision du texte :
- Densité informationnelle élevée (info utile / longueur totale) ?
- Longueur appropriée pour un {type} (ni trop court, ni verbeux) ?
- Absence de fluff et remplissage inutile ?
ÉCHELLE:
10 = Parfaitement concis, chaque mot compte
7-9 = Plutôt concis, peu de superflu
4-6 = Moyennement verbeux, du remplissage
1-3 = Très verbeux, beaucoup de fluff
0 = Délayage excessif
Réponds en JSON strict:
{
"score": 8.0,
"reasoning": "..."
}
```
---
### 3. **SEO et mots-clés** (0-10)
**Évalue** :
- Intégration naturelle des mots-clés pertinents
- Structure optimisée (densité, placement)
- Évite sur-optimisation (keyword stuffing)
**Prompt template** :
```
CRITÈRE: SEO et mots-clés
Évalue l'optimisation SEO :
- Mots-clés (notamment "{MC0}") intégrés naturellement ?
- Densité appropriée (ni trop faible, ni keyword stuffing) ?
- Structure SEO-friendly ?
ÉCHELLE:
10 = SEO optimal et naturel
7-9 = Bon SEO, quelques améliorations possibles
4-6 = SEO moyen, manque d'optimisation ou sur-optimisé
1-3 = SEO faible ou contre-productif
0 = Aucune considération SEO
Réponds en JSON strict:
{
"score": 7.0,
"reasoning": "..."
}
```
---
### 4. **Répétitions et variations** (0-10)
**Évalue** :
- Évite répétitions lexicales excessives
- Variété du vocabulaire et des formulations
- Usage de synonymes et paraphrases
**Prompt template** :
```
CRITÈRE: Répétitions et variations lexicales
Évalue la variété lexicale :
- Répétitions de mots/expressions évitées ?
- Vocabulaire varié et riche ?
- Paraphrases et synonymes utilisés intelligemment ?
ÉCHELLE:
10 = Très varié, aucune répétition notable
7-9 = Plutôt varié, quelques répétitions mineures
4-6 = Variété moyenne, répétitions visibles
1-3 = Très répétitif, vocabulaire pauvre
0 = Répétitions excessives
Réponds en JSON strict:
{
"score": 8.5,
"reasoning": "..."
}
```
---
### 5. **Naturalité humaine** (0-10)
**Évalue** :
- Le texte semble-t-il écrit par un humain (vs IA détectable)
- Variations de style, imperfections réalistes
- Évite patterns LLM typiques
**Prompt template** :
```
CRITÈRE: Naturalité humaine
Évalue si le texte semble écrit par un humain :
- Semble-t-il rédigé par un humain authentique ?
- Présence de variations naturelles et imperfections réalistes ?
- Absence de patterns IA typiques (phrases trop parfaites, formules creuses, superlatifs excessifs) ?
ÉCHELLE:
10 = 100% indétectable, parfaitement humain
7-9 = Très naturel, légères traces IA
4-6 = Moyennement naturel, patterns IA visibles
1-3 = Clairement IA, très artificiel
0 = Robotique et détectable immédiatement
Réponds en JSON strict:
{
"score": 6.5,
"reasoning": "..."
}
```
---
### Résumé des 5 critères
| Critère | Objectif | Score 10 = | Score 0 = |
|---------|----------|------------|-----------|
| **Qualité globale** | Vérifier la qualité rédactionnelle | Impeccable | Inutilisable |
| **Verbosité** | Évaluer la concision | Très concis | Délayage excessif |
| **SEO** | Mesurer l'optimisation | Optimal naturel | Aucun SEO |
| **Répétitions** | Vérifier la variété lexicale | Très varié | Très répétitif |
| **Naturalité** | Détecter l'origine humaine vs IA | 100% humain | Robotique |
---
## 🔄 WORKFLOW D'EXÉCUTION
### Phase 1 : INITIALISATION (Frontend)
1. Utilisateur charge config de pipeline (dropdown ou upload JSON)
2. Utilisateur sélectionne personnalité (dropdown depuis Google Sheets)
3. Affichage preview : pipeline steps + personnalité info
4. Bouton "Lancer Validation" POST `/api/validation/run`
### Phase 2 : EXÉCUTION PIPELINE (Backend - ValidatorCore)
1. Créer UUID unique pour cette validation
2. Appeler PipelineExecutor avec `saveAllVersions: true`
- Force sauvegarde objet `content` après chaque step
- Génère versions JSON : v1.0.json (init) v1.1.json (step1) v1.2.json (step2) v2.0.json (final)
3. Stocker toutes versions dans structure :
```
validations/
{uuid}/
config.json # Config pipeline utilisée
personality.json # Personnalité sélectionnée
versions/
v1.0.json # { "|MC0|": "...", "|T0|": "...", ... }
v1.1.json
v1.2.json
v2.0.json
samples/
all-samples.json # (à créer après échantillonnage)
results/
evaluations.json # (à créer après évaluations)
```
4. WebSocket broadcast progression : "Génération étape 1/4...", "Génération étape 2/4..."
### Phase 3 : ÉCHANTILLONNAGE (Backend - SamplingEngine)
1. Charger `v2.0.json` (version finale)
2. Extraire échantillons par filtrage automatique des balises :
- Tous titres (balises contenant `T`) liste `samples.titles`
- 4 contenus (balises `MC*`, `L*`) liste `samples.content`
- 4 FAQ (balises `FAQ*`) liste `samples.faqs`
3. Pour chaque échantillon, extraire versions à travers toutes étapes :
```javascript
// Exemple pour "|MC0|"
for (const versionFile of ['v1.0.json', 'v1.1.json', 'v1.2.json', 'v2.0.json']) {
const versionContent = JSON.parse(fs.readFileSync(versionFile));
samplesData["|MC0|"].versions[versionFile] = versionContent["|MC0|"];
}
// Résultat
{
"tag": "|MC0|",
"type": "content",
"versions": {
"v1.0.json": "Texte initial...",
"v1.1.json": "Texte après step1...",
"v1.2.json": "Texte après step2...",
"v2.0.json": "Texte final..."
}
}
```
4. Sauvegarder `samples/all-samples.json`
5. WebSocket broadcast : "Échantillonnage terminé : X titres, Y contenus, Z FAQ"
### Phase 4 : ÉVALUATION LLM (Backend - CriteriaEvaluator)
1. Pour chaque ÉCHANTILLON (tous types confondus : titres + contenus + FAQ)
2. Pour chaque CRITÈRE (5 critères universels)
3. Pour chaque VERSION (v1.0.json, v1.1.json, v1.2.json, v2.0.json)
4. Faire appel LLM :
```
Prompt structure:
---
Tu es un évaluateur objectif de contenu SEO.
CONTEXTE:
- Mot-clé principal: {MC0}
- Thématique: {T0}
- Personnalité: {personality.nom}
ÉLÉMENT À ÉVALUER:
Type: {type} (titre/paragraphe/FAQ)
Contenu: "{content}"
CRITÈRE: {criteriaName}
Description: {criteriaDescription}
TÂCHE:
Évalue cet élément selon le critère ci-dessus.
Donne une note de 0 à 10 (précision: 0.5).
Justifie ta notation en 2-3 phrases concrètes.
RÉPONSE ATTENDUE (JSON strict):
{
"score": 7.5,
"reasoning": "Justification détaillée..."
}
---
```
5. Parser réponse LLM, valider JSON, stocker dans :
```
results/
{sampleId}/
{criteriaId}/
v1.0.json
v1.1.json
...
```
6. WebSocket broadcast progression : "Évaluation P1 - Critère 1/5 - Étape 2/4"
**Optimisation** : Paralléliser appels LLM (max 5 simultanés pour éviter rate limits)
### Phase 5 : AGRÉGATION (Backend - ValidatorCore)
1. Calculer scores moyens par :
- Échantillon × Critère × Version score moyen + justifications combinées
- Critère × Version score moyen global
- Version globale score moyen tous critères
2. Générer rapport JSON :
```json
{
"uuid": "...",
"timestamp": "...",
"config": {...},
"personality": {...},
"samples": {
"titles": [...],
"paragraphs": [...],
"faqs": [...]
},
"evaluations": {
"P1": {
"qualite_redactionnelle": {
"v1.0": { "score": 6.5, "reasoning": "..." },
"v1.1": { "score": 7.0, "reasoning": "..." }
}
}
},
"aggregated": {
"byVersion": {
"v1.0": { "avgScore": 6.2, "breakdown": {...} },
"v1.1": { "avgScore": 6.8, "breakdown": {...} }
},
"byCriteria": {...},
"overall": { "avgScore": 7.3 }
}
}
```
3. Sauvegarder : `validations/{uuid}/report.json`
4. WebSocket broadcast : "✅ Validation terminée ! Score global : 7.3/10"
---
## 🎨 INTERFACE UTILISATEUR
### Layout général
```
+---------------------------------------------------------------+
| PIPELINE VALIDATOR [Config]|
+---------------------------------------------------------------+
| [Config: default.json ▼] [Personnalité: Sophie ▼] [🚀 RUN] |
+---------------------------------------------------------------+
| Progress: ████████████████░░░░ 80% - Évaluation P2... |
+---------------------------------------------------------------+
| ÉCHANTILLONS | VUE DÉTAILLÉE |
| | |
| 📋 Titres (5) | Échantillon sélectionné: P2 |
| ☑ T1: Comment... | ----------------------------------- |
| ☐ T2: Les avantages | 📊 SCORES PAR ÉTAPE |
| ☐ T3: Guide... | v1.0 → v1.1 → v1.2 → v2.0 |
| | 6.5 7.2 7.8 8.1 (Qualité)|
| 📝 Paragraphes (4) | 7.0 7.3 6.8 7.5 (Natural)|
| ☐ P1: Introduction | ... |
| ☑ P2: Description | ----------------------------------- |
| ☐ P3: Technique | 📝 CONTENU PAR ÉTAPE |
| ☐ P4: Conclusion | [v1.0] [v1.1] [v1.2] [v2.0] |
| | (onglets ou slider) |
| ❓ FAQ (2) | |
| ☐ F1: Comment...? | Contenu de P2 à l'étape v1.1: |
| ☐ F2: Pourquoi...? | "Lorem ipsum dolor sit amet..." |
| | |
| | ----------------------------------- |
| | 💬 JUSTIFICATIONS CRITÈRE |
| | Qualité rédactionnelle (v1.1): 7.2 |
| | "La syntaxe est fluide mais..." |
+---------------------------------------------------------------+
```
### Interactions clés
1. **Sélection échantillon** (sidebar gauche)
- Click sur échantillon charge vue détaillée
- Highlight actif (bordure bleue)
- Badge avec score moyen global (couleur selon score)
2. **Vue détaillée - Onglet Scores**
- Graphique ligne : évolution score par critère à travers versions
- Tableau scores : critères (lignes) × versions (colonnes)
- Code couleur : 🟢 >7, 🟠 5-7, 🔴 <5
- Hover sur score tooltip avec justification courte
3. **Vue détaillée - Onglet Comparaison**
- Slider ou onglets pour naviguer entre versions
- Diff highlighting : vert (améliorations), rouge (dégradations) si possible
- Métadonnées : durée step, module appliqué, LLM utilisé
4. **Vue détaillée - Onglet Justifications**
- Accordéon : 1 section par critère
- Pour chaque critère : timeline versions avec score + reasoning
5. **Export rapport**
- Bouton "📥 Exporter rapport" télécharge JSON complet
- Bouton "📊 Exporter CSV scores" tableau scores pour analyse externe
---
## 🔧 MODIFICATIONS NÉCESSAIRES
### Fichiers existants à modifier
#### 1. `lib/pipeline/PipelineExecutor.js`
**Modifications** :
- Ajouter paramètre config : `saveAllVersions: boolean`
- Si `true` : après chaque step, sauvegarder version intermédiaire
- Nommer versions : v1.0, v1.1, v1.2, etc.
- Stocker dans dossier spécifié : `outputDir`
- Retourner array de paths : `versionPaths: ['v1.0.xml', 'v1.1.xml', ...]`
**Pseudo-code** :
```javascript
SI saveAllVersions === true :
versionPaths = []
version = 1.0
sauvegarder(content, `${outputDir}/v${version}.xml`)
versionPaths.push(...)
POUR CHAQUE step du pipeline :
appliquer step
version += 0.1
sauvegarder(content, `${outputDir}/v${version}.xml`)
versionPaths.push(...)
version = 2.0
sauvegarder(finalContent, `${outputDir}/v${version}.xml`)
retourner { content, versionPaths, stats }
```
#### 2. `lib/APIController.js`
**Modifications** :
- Importer ValidatorCore, ValidationAPI
- Ajouter routes :
```
POST /api/validation/run
GET /api/validation/status/:id
GET /api/validation/results/:id
GET /api/validation/samples/:id
DELETE /api/validation/:id
```
- Déléguer logique à ValidationAPI
#### 3. `server.js`
**Modifications** :
- Exposer routes validation via APIController
- Assurer WebSocket écoute events validation pour broadcast temps réel
#### 4. `lib/Main.js` (optionnel)
**Modifications** :
- Si ValidatorCore appelle handleFullWorkflow, s'assurer compatibilité avec flag saveAllVersions
- OU créer méthode dédiée `handleValidationWorkflow()`
---
## 📦 DÉPENDANCES
### NPM packages (déjà présents)
- `express` - API REST
- `ws` - WebSocket temps réel
- Tous les LLM clients (Anthropic, OpenAI, etc.)
- `uuid` - Génération IDs validation
- `fs` - Lecture/écriture fichiers JSON
### Packages potentiels à ajouter
- `diff` - Highlighting différences entre versions (optionnel, pour UI comparaison)
- Aucune autre dépendance nécessaire (sélection balises = filtrage JavaScript natif)
---
## 🧪 TESTING STRATEGY
### Tests unitaires
1. **SamplingEngine** :
- Test filtrage titres (object avec balises T*, sans balises T)
- Test sélection contenus (MC*, L*) avec slice
- Test extraction FAQ (balises FAQ*, cas <2 paires disponibles)
2. **CriteriaEvaluator** :
- Mock appels LLM test parsing réponses
- Test gestion erreurs (LLM timeout, JSON invalide)
- Test retry logic
3. **ValidatorCore** :
- Test orchestration complète (mock PipelineExecutor + SamplingEngine + Evaluator)
- Test agrégation scores
### Tests d'intégration
1. Validation end-to-end :
- Config pipeline simple (2 steps) + personnalité test
- Vérifier génération toutes versions
- Vérifier échantillonnage correct
- Vérifier appels LLM réels (1 critère seulement pour rapidité)
- Vérifier rapport final cohérent
### Tests UI
1. Chargement configs et personnalités
2. Affichage progression temps réel
3. Navigation entre échantillons
4. Affichage scores et graphiques
5. Export rapport
---
## 📈 MÉTRIQUES DE SUCCÈS
### Fonctionnel
- Exécution pipeline complète avec sauvegarde toutes versions
- Échantillonnage intelligent (diversité respectée)
- Évaluation LLM tous critères (100% réussite parsing)
- Rapport JSON complet et cohérent
- UI responsive et intuitive
### Performance
- Durée totale validation < 5min (pipeline 4 steps, 9 échantillons, 5 critères = ~180 appels LLM)
- Affichage progression temps réel < 500ms latence
- 💾 Stockage validation < 10MB (JSON + XMLs)
### UX
- 👁 Clarté visualisation scores (code couleur intuitif)
- 🔍 Facilité navigation entre échantillons
- 📊 Pertinence justifications LLM (human-readable)
---
## 🚀 PHASES DE DÉVELOPPEMENT
### Phase 1 : Backend Core (Priorité 1)
1. Créer `ValidatorCore.js` - orchestration basique
2. Modifier `PipelineExecutor.js` - flag saveAllVersions (sauvegarde JSON après chaque step)
3. Créer `SamplingEngine.js` - filtrage balises simple (T*, MC*, L*, FAQ*)
4. Tester workflow complet sans évaluation LLM
### Phase 2 : Évaluation LLM (Priorité 1)
1. Créer `CriteriaEvaluator.js` - 2 critères seulement (qualité + naturalité)
2. Définir prompts LLM structurés
3. Implémenter parsing + retry logic
4. Tester sur 1 échantillon × 2 critères × 3 versions
### Phase 3 : API & WebSocket (Priorité 2)
1. Créer `ValidationAPI.js` - endpoints CRUD
2. Intégrer dans `APIController.js`
3. WebSocket broadcast progression
4. Tester via Postman/curl
### Phase 4 : Frontend Basique (Priorité 2)
1. Créer `pipeline-validator.html` - layout structure
2. Créer `pipeline-validator.js` - logique UI basique
3. Formulaire run + affichage progression
4. Affichage liste échantillons (sans vue détaillée)
### Phase 5 : Frontend Avancé (Priorité 3)
1. Vue détaillée échantillon (onglets scores/comparaison/justifications)
2. Graphiques évolution scores (Chart.js ou similaire)
3. Diff highlighting versions
4. Export rapport (JSON/CSV)
### Phase 6 : Critères Complets (Priorité 3)
1. Implémenter tous critères (5 par type)
2. Affiner prompts LLM selon résultats tests
3. Ajouter échantillonnage FAQ
### Phase 7 : Polish & Optimisation (Priorité 4)
1. Parallélisation appels LLM (pool workers)
2. Cache résultats évaluations (si re-run même config)
3. UI animations et micro-interactions
4. Documentation utilisateur
---
## ⚠️ POINTS D'ATTENTION
### Challenges techniques
1. **Volume appels LLM** :
- Exemple : 4 steps × 9 échantillons × 5 critères = 180 appels
- Solution : Parallélisation + gestion rate limits
- Alternative : Évaluer seulement versions clés (v1.0, milieu, v2.0)
2. **Sélection balises robuste** :
- Structures de balises variées selon templates
- Solution : Filtrage simple par `.includes()` avec fallbacks, gestion balises manquantes
3. **Cohérence évaluations LLM** :
- Variabilité réponses LLM même prompt
- Solution : Temperature basse (0.3), prompts très structurés, moyenne sur 2-3 runs ?
4. **Storage validations** :
- Accumulation fichiers si beaucoup de validations
- Solution : Cleanup automatique après 7 jours, ou limit stockage 50 validations
### UX considérations
1. **Durée exécution longue** (3-5min)
- User peut quitter page validation continue en background
- Notification email/webhook quand terminé ?
- OU : Polling API status si user revient
2. **Complexité interface** :
- Beaucoup d'informations (scores, justifications, versions)
- Solution : Progressive disclosure (accordéons, onglets), filtres
3. **Interprétation scores** :
- User peut ne pas comprendre critères
- Solution : Tooltips explicatifs, guide méthodologie
---
## 🎓 ÉVOLUTIONS FUTURES
### V2 Features
1. **Comparaison multi-validations** :
- Comparer 2 configs de pipeline côte à côte
- Graphique : évolution scores Config A vs Config B
2. **Critères personnalisés** :
- User peut définir ses propres critères d'évaluation
- Upload JSON ou formulaire UI
3. **Benchmarking automatique** :
- Base de données scores moyens par secteur/type contenu
- Afficher percentile (votre score vs moyenne)
4. **Export rapport PDF** :
- Rapport visuel professionnel (graphiques, tableaux)
- Pour présentation clients/stakeholders
5. **A/B Testing intégré** :
- Définir 2+ variants pipeline
- Run validation sur tous, afficher gagnant selon critères pondérés
---
## ✅ CHECKLIST PRÉ-DÉVELOPPEMENT
Avant de commencer à coder, valider :
- [ ] Comprendre parfaitement workflow utilisateur (run test manuel similaire)
- [ ] Valider structure données échantillons (JSON schema)
- [ ] Tester 1 prompt LLM évaluation manuellement (Claude playground)
- [ ] Vérifier `PipelineExecutor` actuel peut sauvegarder versions intermédiaires
- [ ] Confirmer structure dossiers validations (`validations/{uuid}/...`)
- [ ] Designer mockup UI (Figma/papier) pour valider UX
- [ ] Estimer coût LLM par validation (180 appels × prix Claude)
---
## 💰 ESTIMATION COÛTS LLM
### Hypothèses
- Pipeline : 4 steps 4 versions (v1.0, v1.1, v1.2, v2.0)
- Échantillons : ~5 titres + 4 contenus + 4 FAQ = **13 balises**
- Critères : **5 critères universels** (applicables à tous)
- Total appels : 13 échantillons × 5 critères × 4 versions = **260 appels**
### Coût par appel (Claude Sonnet)
- Input : ~500 tokens (contexte + prompt + échantillon)
- Output : ~150 tokens (JSON score + reasoning)
- Prix Claude Sonnet 4.5 : $3/M input + $15/M output
- Coût par appel : (500 × $3/1M) + (150 × $15/1M) = $0.0015 + $0.00225 = **~$0.00375**
### Coût total par validation
- 260 appels × $0.00375 = **~$0.98 par validation** (≈ $1)
### Optimisations possibles
1. **Réduire versions évaluées** (seulement v1.0, v1.2, v2.0) 3 versions au lieu de 4 = **-25% = $0.73**
2. **Critères prioritaires** (3 au lieu de 5 : Qualité, SEO, Naturalité) **-40% = $0.59**
3. **Échantillonnage réduit** (3 titres, 2 contenus, 2 FAQ = 7 balises) **-46% = $0.53**
4. **Combiner toutes optimisations** **~$0.25-$0.35 par validation**
### Recommandation
**Configuration standard** : 260 appels, $1/validation Bon compromis exhaustivité/coût
**Configuration économique** : 3 critères + 3 versions + 7 balises = 63 appels **$0.24/validation**
---
## 📝 RÉSUMÉ EXÉCUTIF
### Ce qui sera créé
1. **Interface web complète** : `pipeline-validator.html/.js/.css`
2. **Backend validation** : 4 nouveaux modules (`ValidatorCore`, `SamplingEngine`, `CriteriaEvaluator`, `ValidationAPI`)
3. **Modifications légères** : `PipelineExecutor` (flag saveAllVersions), `APIController` (routes)
4. **Système d'évaluation** : **5 critères universels** LLM (Qualité, Verbosité, SEO, Répétitions, Naturalité), notation 0-10 + justifications
5. **Visualisation avancée** : Scores évolution, comparaison versions, justifications détaillées
### Format de données
- **Entrée** : Objet JavaScript `content = { "|MC0|": "texte", "|T0|": "titre", ... }`
- **Versions sauvegardées** : JSON (`v1.0.json`, `v1.1.json`, `v1.2.json`, `v2.0.json`)
- **Échantillonnage** : Sélection automatique par filtrage de balises (pas de parsing XML)
- **Output** : Rapport JSON complet avec scores et justifications
### Code réutilisé
- 70% logique `pipeline-runner.html/.js` (UI run, progression, WebSocket)
- 100% `PipelineExecutor.js` (juste ajout flag `saveAllVersions`)
- 100% `LLMManager.js` (appels LLM pour évaluations)
- Structure dossiers `configs/`, `personalities` (Google Sheets)
### Complexité
- **Backend** : Moyenne (orchestration simple, sélection balises, appels LLM)
- **Frontend** : Moyenne-Haute (visualisation scores, comparaison versions)
- **Durée développement estimée** : 3-4 jours (phases 1-5)
### Coût opérationnel
- **~$1 par validation** (260 appels LLM Claude Sonnet)
- **Mode économique** : $0.24/validation (63 appels)
### Valeur business
- **Objectivité** : Validation qualité quantitative (vs jugement subjectif)
- **Traçabilité** : Impact mesurable de chaque layer pipeline
- **Optimisation** : Comparaison scientifique de configs (data-driven)
- **Reporting** : Scores quantitatifs présentables aux clients
- **Debugging** : Identification précise des étapes qui dégradent/améliorent
---
**DOCUMENT PRÊT POUR VALIDATION AVANT DÉVELOPPEMENT** 🚀