confluent/docs/PROMPT_CONTEXTUEL_INTELLIGENT.md
2025-12-04 20:12:10 +08:00

18 KiB

Plan d'Implémentation : Prompt Contextuel Intelligent

Situation Actuelle

Problème : Le système injecte tout le lexique (516 entrées ancien + 164 proto) dans le prompt système, ce qui :

  • Consomme énormément de tokens
  • Coûte cher
  • Est inefficace (99% du lexique est inutile pour une phrase donnée)

État actuel :

  • buildEnhancedPrompt() génère un résumé limité à 300 entrées
  • Mais c'est toujours massif et non-pertinent

Solution : Prompt Contextuel Dynamique

Stratégie

Au lieu d'envoyer tout le lexique, on va :

  1. Analyser le texte français → extraire les mots-clés
  2. Chercher dans le lexique → trouver uniquement les entrées pertinentes
  3. Générer un prompt minimal → inclure seulement le vocabulaire nécessaire
  4. Ajouter du contexte sémantique → inclure des termes liés (synonymes, domaines connexes)

Plan d'Implémentation Détaillé

Phase 1 : Extraction de Contexte

Fichier : ConfluentTranslator/contextAnalyzer.js (nouveau)

Fonctionnalités :

// 1. Tokenizer simple français
function tokenizeFrench(text)
   Extraire les mots (lowercase, sans ponctuation)

// 2. Recherche dans le lexique
function findRelevantEntries(words, lexique)
   Chercher correspondances exactes
   Chercher correspondances partielles (racines, lemmes)
   Score de pertinence

// 3. Expansion sémantique
function expandContext(foundEntries, lexique)
   Ajouter synonymes
   Ajouter mots du même domaine
   Limiter à N entrées max (ex: 50)

Exemple :

Input: "L'enfant voit l'eau"
→ Mots: ["enfant", "voit", "eau"]
→ Trouve: naki, mira, ura
→ Expand: + voir/regarder/observer, + rivière/source
→ Résultat: 8-10 entrées au lieu de 516

Phase 2 : Générateur de Prompt Contextuel

Fichier : ConfluentTranslator/promptBuilder.js (nouveau)

Fonctionnalités :

// 1. Template de base (rules + syntaxe)
function getBasePrompt(variant)
   Phonologie, syntaxe, liaisons sacrées
   SANS le lexique massif

// 2. Injection de vocabulaire ciblé
function injectRelevantVocabulary(basePrompt, entries)
   Format compact et organisé
   Regroupé par domaine

// 3. Génération finale
function buildContextualPrompt(text, variant, lexique)
   Analyse contexte
   Génère prompt minimal

Structure du prompt :

[RÈGLES DE BASE - fixe, ~200 tokens]

# VOCABULAIRE PERTINENT POUR CETTE TRADUCTION

## Racines nécessaires
- naki (enfant) [racine standard]
- mira (voir) [verbe]
- ura (eau) [racine sacrée]

## Termes liés
- aska (libre) [souvent utilisé avec]
- sili (regard) [domaine: vision]

[EXEMPLES - fixe, ~100 tokens]

Phase 3 : Intégration dans l'API

Fichier : ConfluentTranslator/server.js (modifier)

Modifications :

// Importer nouveaux modules
const { analyzeContext } = require('./contextAnalyzer');
const { buildContextualPrompt } = require('./promptBuilder');

// Modifier /translate endpoint
app.post('/translate', async (req, res) => {
  const { text, target, provider, model, useLexique = true } = req.body;

  const variant = target === 'proto' ? 'proto' : 'ancien';

  // NOUVEAU : Génération contextuelle
  const systemPrompt = useLexique
    ? buildContextualPrompt(text, variant, lexiques[variant])
    : getBasePrompt(variant);

  // Le reste identique...
});

Phase 4 : Optimisations Avancées

Cache intelligent :

// ConfluentTranslator/promptCache.js
class PromptCache {
  // Cache les prompts générés par hash du texte
  // Évite de régénérer pour phrases similaires
}

Scoring sémantique :

// Utiliser word embeddings ou TF-IDF
// Pour trouver termes vraiment pertinents
function semanticScore(word, lexiqueEntry) {
  // Retourne 0-1
}

Bénéfices Attendus

Métrique Avant Après Gain
Tokens prompt ~5000 ~800 84%
Coût par requête $0.005 $0.001 80%
Pertinence Faible Élevée ++
Latence Moyenne Basse +

Ordre d'Implémentation VALIDÉ

Phase 1 : Backend (Contexte & Prompt)

  1. Créer contextAnalyzer.js

    • Tokenizer français
    • Recherche avec scoring
    • Calcul dynamique max entrées (selon longueur)
    • Expansion niveau 1 (modulaire pour futur)
    • Fallback racines
  2. Créer promptBuilder.js

    • Templates de base (sans lexique massif)
    • Injection vocabulaire ciblé
    • Génération fallback racines
    • Formatage optimisé
  3. Modifier server.js

    • Intégrer contextAnalyzer
    • Intégrer promptBuilder
    • Générer métadonnées Layer 2
    • Parser réponse LLM pour Layer 3
    • Retourner structure 3 layers

Phase 2 : Frontend (UI 3 Layers)

  1. Refonte UI - Structure HTML

    • Container Layer 1 (toujours visible)
    • Container Layer 2 (collapsible)
    • Container Layer 3 (collapsible)
  2. JavaScript - Logique d'affichage

    • Toggle expand/collapse
    • Affichage formaté des métadonnées
    • Calcul tokens économisés
  3. CSS - Design responsive

    • Style des 3 layers
    • Animations collapse/expand
    • Indicateurs visuels

Phase 3 : Tests & Validation

  1. Tests unitaires

    • Tokenizer
    • Scoring
    • Calcul dynamique limites
  2. Tests d'intégration

    • Cas simples, complexes, longs
    • Fallback
    • Qualité traduction

Phase 4 : Optimisations (Optionnel - V2)

  1. Cache intelligent (si besoin de perf)
  2. Metrics & Analytics (tracking usage)
  3. Expansion niveau 2+ (pour Confluent classique)

Configuration VALIDÉE

Paramètres de base

  • Max entrées par requête : VARIABLE selon longueur du texte

    • Phrases courtes (< 20 mots) : ~30 entrées
    • Phrases moyennes (20-50 mots) : ~50 entrées
    • Textes longs (> 50 mots) : jusqu'à 100 entrées
  • Expansion sémantique : Niveau 1 (strict) - MODULAIRE

    • Pour Proto-Confluent et Ancien Confluent : synonymes directs uniquement
    • Architecture préparée pour expansion future (Confluent classique avec niveau 2-3)
  • Fallback : Envoyer TOUTES LES RACINES + instruction de composition

    • Si aucun terme trouvé dans le lexique
    • Inclure toutes les racines sacrées + racines standards
    • Instruction au LLM : "Composer à partir des racines disponibles"

Priorités de recherche

  1. Correspondance exacte (score: 1.0)
  2. Synonymes français directs (score: 0.9)
  3. [FUTUR - Niveau 2+] Même domaine sémantique (score: 0.7)
  4. [FUTUR - Niveau 2+] Racine partagée (score: 0.5)
  5. [FUTUR] Termes fréquents génériques (score: 0.3)

Architecture UI : 3 Layers VALIDÉE

L'interface affichera la traduction en 3 couches progressives :

LAYER 1 : TRADUCTION (Toujours visible)

Résultat principal, directement affiché.

┌─────────────────────────────────────────┐
│ TRADUCTION                              │
│ ─────────────────────────────────────── │
│ va naki vo ura miraku                   │
└─────────────────────────────────────────┘

LAYER 2 : CONTEXTE (Expandable - COT hors LLM)

Contexte extrait AVANT l'appel au LLM.

┌─────────────────────────────────────────┐
│ 📚 CONTEXTE LEXICAL (Cliquer pour voir) │
│ ─────────────────────────────────────── │
│ Mots trouvés dans le lexique:           │
│   • enfant → naki (racine standard)     │
│   • voir → mira (verbe)                 │
│   • eau → ura (racine sacrée)           │
│                                         │
│ 📊 Optimisation:                        │
│   • Tokens économisés: 4200 (-84%)     │
│   • Entrées utilisées: 8/516           │
│   • Entrées envoyées au LLM: 8         │
└─────────────────────────────────────────┘

LAYER 3 : COMMENTAIRES LLM (Expandable)

Explications générées par le LLM.

┌─────────────────────────────────────────┐
│ 💡 EXPLICATIONS (Cliquer pour voir)     │
│ ─────────────────────────────────────── │
│ 🔧 Décomposition:                       │
│   va naki = SUJET enfant                │
│   vo ura = OBJET eau                    │
│   miraku = voir (présent -u)            │
│                                         │
│ 🛠️ Mots créés/composés:                 │
│   (aucun pour cette phrase)             │
│                                         │
│ 📝 Notes linguistiques:                 │
│   Ordre SOV respecté, particules        │
│   correctes, conjugaison présent.       │
└─────────────────────────────────────────┘

Logique d'affichage

  • Layer 1 : Toujours affiché, focus principal
  • Layer 2 : Collapsed par défaut, clic pour expand
  • Layer 3 : Collapsed par défaut, clic pour expand
  • Les layers sont indépendants (on peut ouvrir 2, 3, les deux, ou aucun)

Cas d'Usage Typiques

Cas 1 : Phrase simple (< 20 mots)

Input : "L'enfant voit l'eau" Longueur : 4 mots → Limite: 30 entrées Contexte extrait : enfant (naki), voir (mira), eau (ura) Expansion : voir/regarder (synonymes directs uniquement - niveau 1) Total : ~8 entrées envoyées

Cas 2 : Phrase complexe avec castes (20-50 mots)

Input : "Les Enfants des Échos transmettent la mémoire sacrée aux jeunes générations dans les halls des serments" Longueur : 16 mots → Limite: 50 entrées Contexte extrait : Nakukeko, transmettre (kisu), mémoire (mori), sacré (asa), jeune, génération, halls (Talusavu) Expansion : écho (keko), enfant (naki), synonymes directs Total : ~20 entrées envoyées

Cas 3 : Texte narratif long (> 50 mots)

Input : Paragraphe de 100+ mots Longueur : 100 mots → Limite: 100 entrées Stratégie :

  • Extraire tous les mots-clés uniques
  • Chercher correspondances exactes + synonymes directs
  • Limiter à top 100 termes par pertinence (score) Total : 100 entrées max

Cas 4 : Mot inconnu (Fallback)

Input : "Le scientifique utilise un microscope" Longueur : 5 mots → Limite: 30 entrées Contexte trouvé : (aucun - mots modernes non dans le lexique) Fallback activé :

  • Envoyer TOUTES les racines sacrées (15)
  • Envoyer TOUTES les racines standards (52)
  • Total: 67 racines de base
  • Instruction LLM : "Compose à partir des racines disponibles" Total : 67 entrées (racines uniquement)

Architecture Technique (Mise à jour avec 3 Layers)

┌─────────────────┐
│  User Input     │
│  (français)     │
└────────┬────────┘
         │
         ▼
┌──────────────────────────────────────────┐
│  contextAnalyzer.js                      │
│  - tokenizeFrench()                      │
│  - calculateMaxEntries(wordCount)        │  ← NOUVEAU: calcul dynamique
│  - findRelevantEntries(expansionLevel=1) │  ← Niveau modulaire
│  - expandContext() [LEVEL 1 only]       │
└────────┬─────────────────────────────────┘
         │
         │ [context metadata for Layer 2]
         │ - words found
         │ - entries used
         │ - tokens saved
         ▼
┌──────────────────────────────────────────┐
│  promptBuilder.js                        │
│  - getBasePrompt(variant)                │
│  - getRootsFallback() [if needed]        │  ← NOUVEAU: fallback racines
│  - injectVocabulary(entries)             │
│  - buildContextualPrompt()               │
└────────┬─────────────────────────────────┘
         │
         │ [optimized prompt + metadata]
         ▼
┌──────────────────────────────────────────┐
│  server.js - /translate endpoint         │
│  - Call contextAnalyzer                  │
│  - Build prompt                          │
│  - Store Layer 2 data (COT)              │  ← NOUVEAU: métadonnées
│  - Call LLM API                          │
└────────┬─────────────────────────────────┘
         │
         │ [prompt with minimal context]
         ▼
┌──────────────────────────────────────────┐
│  LLM API (Claude/GPT)                    │
│  - Receive optimized prompt              │
│  - Generate translation                  │
│  - Generate explanations                 │
└────────┬─────────────────────────────────┘
         │
         │ [LLM response]
         ▼
┌──────────────────────────────────────────┐
│  Response Parser                         │
│  - Extract translation (Layer 1)         │
│  - Extract explanations (Layer 3)        │
│  - Combine with context metadata (L2)    │
└────────┬─────────────────────────────────┘
         │
         ▼
┌──────────────────────────────────────────┐
│  JSON Response to Frontend               │
│  {                                       │
│    layer1: { translation: "..." },      │
│    layer2: {                             │
│      wordsFound: [...],                  │
│      entriesUsed: 8,                     │
│      tokensSaved: 4200                   │
│    },                                    │
│    layer3: {                             │
│      decomposition: "...",               │
│      wordsCreated: [...],                │
│      notes: "..."                        │
│    }                                     │
│  }                                       │
└────────┬─────────────────────────────────┘
         │
         ▼
┌──────────────────────────────────────────┐
│  Frontend UI (3 Layers)                  │
│  ┌────────────────────────────────────┐  │
│  │ Layer 1: Translation (visible)     │  │
│  └────────────────────────────────────┘  │
│  ┌────────────────────────────────────┐  │
│  │ Layer 2: Context (collapsible)     │  │
│  └────────────────────────────────────┘  │
│  ┌────────────────────────────────────┐  │
│  │ Layer 3: Explanations (collapsible)│  │
│  └────────────────────────────────────┘  │
└──────────────────────────────────────────┘

Tests de Validation

Test 1 : Réduction de tokens

// Mesurer avant/après
const before = countTokens(oldPrompt);
const after = countTokens(newPrompt);
assert(after < before * 0.2); // Réduction de 80%

Test 2 : Qualité de traduction

// Comparer qualité avec plusieurs phrases
const testCases = [
  "L'enfant voit l'eau",
  "Les Passes-bien portent les biens",
  "Le faucon chasse dans le ciel"
];
// Valider que traductions restent correctes

Test 3 : Performance

// Mesurer temps de génération de prompt
const start = Date.now();
const prompt = buildContextualPrompt(text, 'ancien', lexique);
const duration = Date.now() - start;
assert(duration < 100); // < 100ms

Métriques de Succès

  • Réduction tokens : > 70%
  • Qualité traduction : identique ou meilleure
  • Temps génération prompt : < 100ms
  • Taux de cache hit : > 30% (si cache activé)
  • Satisfaction utilisateur : retours positifs

Prochaines Itérations (V2, V3...)

V2 : Intelligence contextuelle

  • Apprentissage des patterns fréquents
  • Suggestions de vocabulaire manquant
  • Détection automatique de nouveaux termes à ajouter au lexique

V3 : Optimisations ML

  • Embeddings sémantiques pour meilleure expansion
  • Prédiction de termes nécessaires avant recherche
  • Compression intelligente du prompt

V4 : Multi-langue

  • Support Proto-Confluent ↔ Ancien Confluent
  • Traduction bidirectionnelle Confluent → Français
  • Détection automatique de variante