expria-backend/docs/Prompt_exercices_long_terme.md
2026-04-26 03:09:13 +03:00

176 lines
7.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

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.

# Prompt Exercices Long Terme — Analyse patterns TCF Canada
> **Source :** `src/lib/deepseek.ts` → fonction `generatePatternExercices(patterns)`
> **Modèle :** DeepSeek Chat (`deepseek-chat`) · `temperature: 0.4` · `response_format: json_object` · `AbortSignal.timeout(20_000)`
> **Introduit :** Sprint 3.6c (2026-04-22) — commit `c48ae8d`
---
## Contexte & Variables dynamiques
Ce prompt est déclenché par `GET /users/patterns` (Premium uniquement) quand l'analyse des 5 dernières productions révèle un ou plusieurs **patterns confirmés** (même code d'erreur présent dans ≥ 3 productions sur 5).
Les exercices produits sont **distincts** des exercices individuels générés par correction (prompt dans `Prompt_maître.md`) : ils ciblent des faiblesses *structurelles récurrentes* plutôt qu'une production spécifique.
| Variable | Description | Exemple |
|---|---|---|
| `patterns` | Liste des patterns confirmés issus de `aggregatePatterns` | Voir structure ci-dessous |
### Structure d'un pattern en entrée
```typescript
interface PatternInput {
code: string // Code taxonomie (cf. TAXONOMIE_ERREURS.md)
critere: Critere // 'adequation_tache' | 'coherence_cohesion' |
// 'competence_lexicale' | 'competence_grammaticale'
frequency: number // 3, 4 ou 5 (seuil d'agrégation)
description: string | null // non-null uniquement pour code === 'autre'
}
```
Exemple d'entrée (3 patterns) :
```
- accord_sujet_verbe (competence_grammaticale) — apparu 4/5 fois
- connecteurs_repetes (coherence_cohesion) — apparu 3/5 fois
- repetition_lexicale (competence_lexicale) — apparu 3/5 fois
```
---
## Prompt système envoyé au modèle
```
Tu es un coach spécialisé dans la préparation au TCF Canada (Test de connaissance du français).
Un candidat commet systématiquement les mêmes erreurs sur ses 5 dernières productions écrites. Tu dois produire UN exercice ciblé par pattern d'erreur récurrent identifié.
CONTEXTE :
- Ces exercices sont des exercices LONG TERME destinés à corriger des faiblesses structurelles récurrentes.
- Ils sont DISTINCTS des exercices individuels générés après chaque correction (qui ciblent une production spécifique).
- Tu n'as PAS accès au texte du candidat. Tes exemples doivent être génériques et représentatifs de l'erreur.
RÈGLES :
1. Un exercice par pattern en entrée, dans le même ordre.
2. Le diagnostic explique en 1-2 phrases POURQUOI cette erreur est problématique pour le TCF Canada.
3. La consigne demande au candidat de corriger ou reformuler une phrase.
4. L'exemple est une phrase incorrecte illustrant le pattern (inventée, pas tirée du candidat).
5. La correction est la version correcte de l'exemple.
6. L'astuce est un procédé mnémotechnique, une règle pratique ou un réflexe de relecture que le candidat doit appliquer APRÈS avoir rédigé son texte pour détecter et corriger cette erreur lui-même. Formulée comme un conseil direct et actionnable.
Exemples d'astuces :
- Subjonctif : "Après 'bien que', 'pourvu que', 'avant que' → le verbe qui suit est TOUJOURS au subjonctif. Relisez votre texte en cherchant ces expressions."
- Accords : "Relisez chaque phrase en pointant du doigt le sujet et son verbe. S'ils sont éloignés, vérifiez l'accord."
- Connecteurs : "Après rédaction, surlignez tous vos connecteurs. Si le même revient plus de 2 fois, remplacez-en un."
7. Niveau de langue : NCLC 7-9 (ni trop simple, ni trop littéraire).
8. Les exemples doivent être en contexte TCF Canada : courriels, lettres formelles, essais argumentatifs, situations professionnelles canadiennes.
FORMAT DE SORTIE — JSON strict, aucun texte avant ni après :
{
"exercises": [
{
"code": "<code_taxonomie>",
"critere": "<critere>",
"diagnostic": "<1-2 phrases>",
"exercice": {
"consigne": "<instruction au candidat>",
"exemple": "<phrase incorrecte>",
"correction": "<phrase corrigée>",
"astuce": "<procédé mnémotechnique ou réflexe de relecture>"
}
}
]
}
```
---
## Prompt utilisateur — template dynamique
Construit par `buildPatternExercicesUserPrompt(patterns)` dans `src/lib/deepseek.ts` :
```
Voici les patterns d'erreurs récurrents détectés sur les 5 dernières productions du candidat :
- <code> (<critere>) — apparu <frequency>/5 fois[ — « <description> »]
- ...
Produis un exercice ciblé par pattern. JSON strict uniquement.
```
Le fragment `— « <description> »` n'apparaît que lorsque le code est `autre` (description textuelle obligatoire selon la taxonomie — cf. `TAXONOMIE_ERREURS.md` §Règles d'utilisation).
---
## Structure de la réponse JSON attendue
```json
{
"exercises": [
{
"code": "accord_sujet_verbe",
"critere": "competence_grammaticale",
"diagnostic": "<1-2 phrases expliquant pourquoi cette erreur coûte des points au TCF>",
"exercice": {
"consigne": "<instruction claire au candidat>",
"exemple": "<phrase incorrecte générique, contexte TCF Canada>",
"correction": "<version correcte>",
"astuce": "<procédé mnémotechnique ou réflexe de relecture actionnable>"
}
}
]
}
```
---
## Champs expliqués
| Champ | Rôle |
|---|---|
| `code` | Code taxonomie propagé depuis l'entrée — permet au frontend de rattacher l'exercice à son pattern |
| `critere` | Critère TCF parmi les 4 officiels — validé en runtime via `isValidCritere` |
| `diagnostic` | Explication pédagogique courte : pourquoi cette erreur pénalise au TCF |
| `exercice.consigne` | Instruction explicite au candidat (« Corrigez », « Reformulez », « Complétez ») |
| `exercice.exemple` | Phrase **incorrecte** illustrant l'erreur — inventée par le modèle, en contexte TCF Canada (courriel formel, lettre, essai, cadre professionnel) |
| `exercice.correction` | Version correcte de l'exemple |
| `exercice.astuce` | **Conseil de relecture actionnable** — procédé mnémotechnique ou règle pratique que le candidat applique lors de la phase de relecture pour détecter ses propres erreurs |
---
## Post-traitement côté serveur
Après réception de la réponse DeepSeek, `generatePatternExercices` valide chaque item :
1. **Présence stricte** des champs `code`, `critere`, `diagnostic`, `exercice.consigne`, `exercice.exemple`, `exercice.correction`, `exercice.astuce` — tous doivent être des chaînes non vides.
2. **Validation du critère** via `isValidCritere` (cf. `src/lib/taxonomieErreurs.ts`) — tout critère hors taxonomie est **filtré**.
3. **Les items invalides sont silencieusement ignorés** — pas de throw. La liste retournée peut donc être plus courte que la liste de patterns en entrée.
La réponse persistée dans `pattern_analyses.exercises` (JSONB) est la liste filtrée.
---
## Dégradation gracieuse
Si l'appel DeepSeek échoue (timeout, API error, JSON invalide) :
- `patternsController.list` capture l'erreur, logue `[patternsController.list] generatePatternExercices failed`.
- L'analyse est persistée avec `exercises: []` — patterns et indice de préparation restent disponibles.
- Le frontend affiche la liste des patterns sans section exercices (cf. `ProgressionPremium`).
- Un refetch ultérieur (après `staleTime` ou nouvelle correction) retentera la génération.
---
## Contraintes opérationnelles
| Paramètre | Valeur | Justification |
|---|---|---|
| Modèle | `deepseek-chat` | Cohérent avec les autres prompts (correction, modèle, idées) |
| Température | `0.4` | Légèrement plus élevée que la correction (`0.2`) pour favoriser la variété des exemples |
| Format | `json_object` | Strict, pas de markdown parasite |
| Timeout | 20 000 ms | Plus long que `generateIdees` (15 s) car la réponse peut contenir jusqu'à ~10 exercices (4 critères × patterns) |
---
## Historique de ce document
| Version | Date | Changements |
|---|---|---|
| 1.0 | 2026-04-23 | Création — documentation du prompt validé par Hermann lors du Sprint 3.6c (2026-04-22) |