## 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>
878 lines
30 KiB
Markdown
878 lines
30 KiB
Markdown
# 📋 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** 🚀
|