wilenPyxi Claude Fable 5 commited on
Commit
1a1f494
·
1 Parent(s): 7e35ea5

MCQ_SPEC v3 : integration du prompt systeme QCM affine

Browse files

Ancre sur les 33 exemples valides (font foi). Ajouts :
- Distracteurs : flip de signe JAMAIS sur entree nulle ; swap de colonnes sur
entrees SYMBOLIQUES (sur entieres = risque de collision -> flips distincts) ;
near-miss meme famille ; interdits (bloc fige, etiquette linear, artificiels).
- Formatage : jamais d exemple/parenthese/annotation sur la SEULE bonne reponse.
- Formulation directe : retire compute in two ways / show that / draw / justify.
- Matrices d option en \small (anti-scrollbar) ; bmatrix pleine en solution.
- Eclatement d une question en N cas avec solution PARTITIONNEE (concat==source).
Ecart assume vs prompt fourni : questionHint reste REMPLI (35/35 dans les
exemples valides), pas vide. Smoke 71/71.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

Files changed (1) hide show
  1. app/pipeline/prompts.py +45 -6
app/pipeline/prompts.py CHANGED
@@ -532,6 +532,12 @@ TRANSLATE_FORMAT_BOTH = (
532
  # l'app (fences 4, globals(), injections nues camelCase Aff, IDs contigus).
533
  # v1 → v2 (2026-07-02) : MCQ_SPEC + section « DISTRACTEURS EN MIROIR » (règle
534
  # enseignante : grille symétrique, bonne réponse jamais devinable par la forme).
 
 
 
 
 
 
535
  # ─────────────────────────────────────────────────────────────────────────────
536
 
537
  MCQ_SPEC = """\
@@ -547,7 +553,7 @@ FORMAT QCM (questionType MCQ) — NORMATIF :
547
  ::::
548
 
549
  ::::{questionHint}
550
- <indice peut rester vide ; VERBATIM si repris de la source>
551
  ::::
552
 
553
  ::::{mcqAnswer}
@@ -644,10 +650,16 @@ variante trivialement éliminable :
644
  singularité, bloc figé), reconstruis les distracteurs.
645
 
646
  DISTINCTION GARANTIE SUR TOUTES LES DÉCLINAISONS :
647
- • Construis chaque distracteur par une modification à DELTA NON NUL GARANTI
648
- (retournement de signe d'une entrée NON nulle ; transposée quand une entrée
649
- est fractionnaire et l'autre entière ; décalage ±1…) jamais de doublon
650
- quel que soit le tirage.
 
 
 
 
 
 
651
  • Vérifie en Python : sur ≥300 tirages, `assert` que les options sont deux à
652
  deux distinctes (chaînes rendues). Aucune collision tolérée.
653
 
@@ -671,7 +683,34 @@ questions. Les variables des paires suivantes s'ajoutent SANS aléa nouveau.
671
 
672
  FORMATAGE : STRICTEMENT IDENTIQUE entre bonne réponse et distracteurs (même
673
  style LaTeX, mêmes helpers, même nombre de décimales, même notation
674
- matricielle) — sinon la bonne réponse se devine.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
675
 
676
  L'ÉNONCÉ NE DONNE JAMAIS LA RÉPONSE (l'énoncé définit, la question interroge).
677
  """ # noqa: E501 — texte normatif verbatim (valeur injectée telle quelle, accolades SIMPLES)
 
532
  # l'app (fences 4, globals(), injections nues camelCase Aff, IDs contigus).
533
  # v1 → v2 (2026-07-02) : MCQ_SPEC + section « DISTRACTEURS EN MIROIR » (règle
534
  # enseignante : grille symétrique, bonne réponse jamais devinable par la forme).
535
+ # v2 → v3 (2026-07-06) : intégration du prompt système QCM affiné —
536
+ # distracteurs cohérents (erreur réelle, near-miss même famille, flip jamais sur
537
+ # entrée nulle, swap sûr en symbolique), formulation directe, matrices d'option
538
+ # en \small (anti-scrollbar), éclatement avec solution partitionnée. Écart
539
+ # assumé vs le prompt fourni : questionHint reste REMPLI (35/35 dans les 33
540
+ # exemples validés qui font foi), pas vide.
541
  # ─────────────────────────────────────────────────────────────────────────────
542
 
543
  MCQ_SPEC = """\
 
553
  ::::
554
 
555
  ::::{questionHint}
556
+ <indice de DÉMARRAGE qui ne révèle pas la réponse ; VERBATIM si repris de la source>
557
  ::::
558
 
559
  ::::{mcqAnswer}
 
650
  singularité, bloc figé), reconstruis les distracteurs.
651
 
652
  DISTINCTION GARANTIE SUR TOUTES LES DÉCLINAISONS :
653
+ • Construis chaque distracteur par une modification à DELTA NON NUL GARANTI,
654
+ chacun sur une ENTRÉE/POSITION DIFFÉRENTE. Techniques sûres :
655
+ Flip de signe d'une entrée : SEULEMENT sur une entrée GARANTIE ≠ 0
656
+ (flipper un 0 redonne l'original → collision). Tire ces entrées dans un
657
+ domaine excluant 0, ou choisis une position structurellement non nulle.
658
+ – Interversion de colonnes/variables (∂x↔∂y) : SÛRE sur entrées
659
+ SYMBOLIQUES (une colonne dépend de x, l'autre de y → jamais égales) ;
660
+ DANGEREUSE sur entrées entières (deux colonnes peuvent coïncider) → dans
661
+ ce cas, préférer 3 flips de signe sur des entrées distinctes non nulles.
662
+ – Décalage ±1 (bornes entières) ; multiple/omission (b oublié, −b, 2b).
663
  • Vérifie en Python : sur ≥300 tirages, `assert` que les options sont deux à
664
  deux distinctes (chaînes rendues). Aucune collision tolérée.
665
 
 
683
 
684
  FORMATAGE : STRICTEMENT IDENTIQUE entre bonne réponse et distracteurs (même
685
  style LaTeX, mêmes helpers, même nombre de décimales, même notation
686
+ matricielle, MÊME LONGUEUR) — sinon la bonne réponse se devine.
687
+ • JAMAIS d'exemple/parenthèse explicative sur la SEULE bonne réponse
688
+ (« … (e.g. A<B donne x) ») : soit tout le monde a l'ajout, soit personne.
689
+ • JAMAIS d'annotation d'erreur visible dans une option (« (signe oublié) »,
690
+ « (forgot +b) ») — ça vit UNIQUEMENT dans la solution détaillée.
691
+
692
+ FORMULATION DIRECTE (QCM) : on demande le RÉSULTAT à cocher. Retire les consignes
693
+ de méthode/rédaction qui n'ont de sens qu'en réponse libre — « calcule de deux
694
+ façons », « vos deux réponses doivent coïncider », « montre que… », « trace /
695
+ esquisse… », « justifie… ». Ex. : « Compute (f∘g)(x) in two ways… should
696
+ agree! » → « Compute (f∘g)(x). »
697
+
698
+ RENDU DES MATRICES DANS LES OPTIONS (anti-scrollbar) : une `bmatrix` pleine dans
699
+ une case d'option fait apparaître un ascenseur. Si une OPTION contient une
700
+ matrice, réduis-la : `{\\small \\begin{bmatrix}…\\end{bmatrix}}` (échelle si
701
+ besoin : smallmatrix < \\scriptsize < \\footnotesize < \\small ; défaut \\small).
702
+ Garde les `bmatrix` PLEINES dans la detailedSolution (fidélité + place).
703
+
704
+ ÉCLATEMENT (autorisé) : si UNE question porte sur N cas indépendants (par
705
+ ellipse, par sous-fonction…), tu peux l'éclater en N questions — le contexte
706
+ commun monte dans l'énoncé global, et la detailedSolution source est PARTITIONNÉE
707
+ par cas (**(i)**, **(ii)**…) puis rattachée à chaque question. Contrainte dure :
708
+ la CONCATÉNATION des morceaux doit être IDENTIQUE à la solution source. Par
709
+ défaut (pas de cas multiples), garde le MÊME nombre de questions que la source.
710
+
711
+ questionHint : indice de DÉMARRAGE qui ne révèle jamais la réponse (cf. exemples
712
+ validés — tous en fournissent un) ; VERBATIM si la source en a un ; vide
713
+ seulement si aucun indice pertinent.
714
 
715
  L'ÉNONCÉ NE DONNE JAMAIS LA RÉPONSE (l'énoncé définit, la question interroge).
716
  """ # noqa: E501 — texte normatif verbatim (valeur injectée telle quelle, accolades SIMPLES)