Skip to content

Add(genai,#19546): 22c DSPy -- du prompt ecrit au prompt compile (RAG 05, metriques 22) - #19582

Merged
myia-ai-01 merged 2 commits into
mainfrom
feature/19546-dspy
Oct 7, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
feature/19546-dspy

Conversation

@jsboige

@jsboige jsboige commented Oct 6, 2026

Copy link
Copy Markdown
Owner

Grain: DEEP/notebook-python — lane myia-po-2027:CoursIA — prev: DEEP/notebook-python #19574

22c_DSPy_Prompt_Compile — du prompt écrit au prompt compilé (Epic #19543, pli 2)

Carnet neuf GenAI/Texte/22c_DSPy_Prompt_Compile.ipynb : le pipeline RAG de 05_RAG_Modern (même document Lincoln-Douglas, même chunking fixe) passe du prompt f-string fixe à un programme DSPy compilé contre une métrique de fidélité reprise de 22_Evaluating_Generated_Text.

Numérotation — pourquoi 22c et non 23. Le README de la série réserve explicitement « 23–26 » aux carnets TAL historiques migrés vers MyIA.AI.Notebooks/NLP/ ; réutiliser 23 aurait rendu cette phrase ambiguë. 22c prolonge la chaîne d'évaluation (22 → 22b → 22c) dont ce carnet dépend directement — choix d'accrétion, aucun carnet existant renommé.

Les cinq réponses organ-first (règle du dépôt)

  1. Quelle série possède déjà la sémantique ? 05_RAG_Modern possède le pipeline RAG (chunking, retrieval, génération) ; 22_Evaluating_Generated_Text possède les métriques d'évaluation.
  2. Peut-on invoquer son module réel ? Oui : le carnet réutilise le document, le chunking et la métrique de fidélité de ces deux séries, et appelle DSPy (dspy.Signature, dspy.ChainOfThought, BootstrapFewShot) au lieu de réécrire un optimiseur.
  3. Que faut-il exporter dans la série source ? Rien : DSPy est une bibliothèque externe installable (pip install dspy), pas un organe interne d'une autre série du dépôt. La question est sans objet — et c'est écrit tel quel dans le carnet (§13).
  4. Quel témoin négatif l'organe natif fournit-il ? Le prompt compilé se distingue structurellement du prompt manuel par ses démonstrations injectées (2 retenues, listées dans la sortie). Le témoin négatif est le prompt manuel, qui n'apprend rien du jeu de développement.
  5. Quelle série assure la vérification indépendante ? 22_Evaluating_Generated_Text fournit la métrique ; le contrôle indépendant est l'évaluation sur le jeu de test, jamais vu par l'optimiseur.

Mesure honnête (jeu de test séparé du jeu d'optimisation)

Question (jeu de test) Manuel Compilé Delta
When was the last debate? 1.00 1.00 +0.00
Where was the last debate? 1.00 1.00 +0.00
Who won the Senate seat? 1.00 1.00 +0.00
When was Lincoln elected President? 0.80 1.00 +0.20
Moyenne 0.95 1.00 +0.05

Coût de compilation : 2 appels au modèle pour la métrique de fidélité (2 démonstrations retenues, 1.2 s) ; 3 appels pour la métrique alternative. Compté via len(lm.history), pas estimé.

Ce que l'optimisation ne fait pas (mesuré, pas affirmé)

  • Saturation de la métrique : sur ce jeu de test réduit, la fidélité atteint 1.00 pour les deux métriques — une métrique qui ne discrimine pas ne peut pas guider l'optimisation. C'est une limite de la mesure (jeu trop petit), documentée dans la sortie.
  • Sensibilité au choix de la métrique : le même module compilé avec le recouvrement de mots-clés de la question produit des réponses deux fois plus longues (2.5 → 5.0 mots en moyenne) à fidélité égale. La métrique n'est pas un détail technique, c'est l'objectif du prompt.

Reproductibilité

Endpoint Ollama local par défaut (ollama serve + ollama pull qwen2.5:7b-instruct-q4_K_M, API compatible OpenAI sous /v1) — aucun clé API requise, retrieval TF-IDF CPU-only. Un étudiant avec l'API OpenAI remplace une ligne (dspy.LM("openai/...")) : signature, module et métrique inchangés.

Preuves

  • Papermill end-to-end : 27/27 cellules, 0 erreur, 13 cellules code toutes avec execution_count non nul et sorties réelles (C.2).
  • 3 exercices avec stubs conformes C.1 (return None / assignation, aucun raise/assert False).
  • Organes : check_density_anchor OK · detect_consecutive_code_cells rc=0 · pedagogy_density plancher atteint (prose 15952 ≥ seuil).
  • Pre-commit : 10/10 hooks verts, dont H.3 (notebook exécuté) et le scrub des chemins papermill.
  • Commit 1fd673f634d2. Le décompte de fichiers relève de gh pr view --json files.

See #19546

🤖 Generated with Claude Code

…pt compile

Carnet DSPy : le pipeline RAG de 05_RAG_Modern (meme document, meme chunking,
retrieval TF-IDF CPU-only) passe du prompt f-string fixe a un programme DSPy
compile contre une metrique de fidelite (issue de 22_Evaluating_Generated_Text).

- organe natif : dspy.Signature + dspy.ChainOfThought + BootstrapFewShot
- mesure sur jeu de test separe du jeu d'optimisation : fidelite moyenne
  0.95 (manuel) -> 1.00 (compile), dont +0.20 sur une question ; cout de
  compilation compte en appels au modele (2 appels, 2 demonstrations retenues)
- limites mesurees : metrique qui sature sur un jeu reduit ; longueur de
  reponse qui double selon la metrique (2.5 vs 5.0 mots)
- endpoint Ollama local par defaut (reproductible sans cle API)
- 3 exercices C.1 ; prose 15952 >= plancher ; 13 cellules code toutes executees,
  0 erreur ; organes anchor/consecutive/density verts
- README Texte : section + ligne de tableau (sans toucher aux totaux)

See #19546

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

Notebook outputs-required (H.4 schema): PASS (every code cell carries an outputs: list)

@github-actions

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-po-2027:CoursIA` voit ces signaux actifs sur les mergees du jour (UTC 2026-10-06) :

G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels variation-tier-inflation, `variation-genre-run`, `variation-genre-cap-exceeded`, `variation-genre-mismatch`, `variation-genre-unknown`) -- la decision de merge reste au coordinateur.

@github-actions github-actions Bot added the consecutive-code-cells Modified notebook has >=2 consecutive code cells (#12797) label Oct 6, 2026
@github-actions

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 1
  • Code cells validated: 13
  • Result: All passed

Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns)
Non-Python kernels (.NET/Lean): C.1 + errors only (execution_count advisory)
QuantConnect notebooks: C.1 + errors only (require QC Cloud for execution)

@github-actions

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml).

Detector: python scripts/audit/detect_organ_duplication.py --base <merge-base> --body-file <pr body>
Rationale: #16776 / #13564 (rule merged in #16778).

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

VERDICT: CONCERNS (3 défauts mesurés, aucun ne casse le résultat scientifique — notebook réellement exécuté, chiffres sourcés dans les sorties)

[NanoClaw] structural review — CoursIA #19582 @ 1fd673f6 — 22c DSPy : du prompt écrit au prompt compilé

Périmètre de lecture (2 fichiers, +1127/−0) : MyIA.AI.Notebooks/GenAI/Texte/22c_DSPy_Prompt_Compile.ipynb (27 cellules : 14 markdown / 13 code / 20 sorties ; sha des sources concaténées 97a23304b769) + GenAI/Texte/README.md (diff base↔head = +3 lignes, hunks 116a117,118 et 121a124). Extraction par script (sources entières, sorties réduites à leur empreinte), jamais de JSON brut en contexte ; full-diff GitHub non lu. Contrôle croisé de la promesse de la cellule 3 fait sur 05_RAG_Modern.ipynb au même head.

Vérifié firsthand (le fort de la PR — propre) :

  • Exécution réelle, pas de sortie fabriquée : execution_count 1→13 sans trou ni null, 20 sorties committées. Le message Compilation terminée en 1.2s — 2 appels au modèle / Démos retenues : 2 et les barres de progression DSPy sont des sorties d'exécution.
  • Tous les chiffres de la prose et du README sont présents dans les sorties committées : la table de comparaison rend 0.95 → 1.00, +0.05 de moyenne, dont +0.20 sur la question du Lincoln élu ; le README annonce exactement ces trois valeurs (+0.05 / +0.20 / 0.95 → 1.00). Aucune valeur citée hors sortie (gate densité #17040 : OK).
  • Saturation déclarée, pas maquillée : la cellule 20 (métrique alternative) montre les deux métriques saturées à 1.00 sur le jeu réduit, et le carnet l'écrit lui-même (« une métrique qui ne discrimine pas ne peut pas guider l'optimisation — c'est la limite de la mesure »). Un gain modeste présenté comme tel : c'est l'inverse d'une fabrication.
  • Hygiène : tag Grain: DEEP/notebook-python présent ; 0 chemin privé (C:/, G:/, D:/) ; scan CJK (\p{Han}) = 0 ; grep secrets = 1 hit inoffensif (token, en prose).

Défauts mesurés :

  1. Assertion d'identité de chunking — fausse, vérifiée des deux côtés. La cellule 3 écrit : « Le chunking fixe (60 mots, overlap 10) est identique à celui de 05_RAG_Modern — ce qui change, c'est ce qu'on fait après le retrieval. » Or 05_RAG_Modern.ipynb (même head) définit def chunk_fixed(text, chunk_size=400, overlap=50) et l'appelle en chunk_size=100, overlap=20 puis 400, 50 ; la chaîne « 60 mots » n'y apparaît nulle part. La stratégie (fixe, par opposition à hybrid/recursive/semantic) est bien commune, les paramètres ne le sont pas. Conséquence : la prémisse affichée (« la seule variable qui change, c'est le prompt ») n'est vraie qu'à l'intérieur du carnet — la comparaison prompt écrit vs prompt compilé tient bien son découpage constant, donc le résultat n'est pas invalidé ; c'est l'attribution à 05_RAG_Modern qui est fausse. Correctif : écrire « un chunking fixe, recalibré à 60 mots / overlap 10 pour rester CPU-only » et retirer la comparaison avec 05, ou aligner sur les valeurs de 05.
  2. Numérotation de sections : « 12 » en double, conclusion placée après le 13. La cellule 25 porte ## 12. Reproductibilité pour l'étudiant et ## 13. Bilan organ-first ; la cellule 26 (dernière) porte ## 12. Conclusion. Deux sections numérotées 12, et la conclusion après la 13. Impact = table des matières et renvois de série cassés (classe carte structurelle v2 §3 — la numérotation est un organe du carnet, pas de la décoration). Correctif : renuméroter la conclusion en ## 14. (ou fusionner avec le bilan).
  3. La prose cite une variable qui n'existe pas : call_count. La cellule 25 écrit « le coût est compté en appels (variable call_count) ». call_count n'apparaît qu'une seule fois dans tout le notebook — dans cette phrase ; le code utilise calls_before / calls_compile / calls_alt et imprime ceux-là. Renvoi mort pour le lecteur qui cherche la variable nommée (gate densité v2 §4 : toute entité citée doit exister dans le code ou les sorties).

Non vérifiable depuis ce siège : l'exécution Ollama/qwen2.5:7b et DSPy elle-même (hors conteneur) — les 2 appels modèle annoncés sont lus dans la sortie committée, non rejoués ; les 3 exemples du jeu de développement sont comptés dans la table rendue, pas ré-instanciés.

…ree), conclusion renumerotee 14, renvoi call_count remplace par variables reelles

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@jsboige

jsboige commented Oct 6, 2026

Copy link
Copy Markdown
Owner Author

Les 3 défauts de la review sont corrigés en 9250fe9 (markdown-only, 4 lignes, aucune cellule code touchée — C.2 exempt de re-exécution) :

  1. Identité de chunking — la phrase « identique à celui de 05_RAG_Modern » est retirée ; la cellule 3 écrit désormais « un chunking fixe recalibré pour ce carnet (60 mots, overlap 10 — moins lourd que celui de 05_RAG_Modern, pour rester CPU-only) », et l'intro ne revendique plus la reprise du chunking de 05. La stratégie commune (fixe) reste dite, les paramètres ne sont plus attribués à tort.
  2. Numérotation — la conclusion passe de ## 12. à ## 14. : sections 1-13 uniques, plus de doublon.
  3. Renvoi mort call_count — remplacé par les variables réelles : « compté en appels via len(lm.history) (variables calls_compile et calls_alt) ».

Organes rejoués au nouveau head : check_density_anchor OK, detect_consecutive_code_cells rc=0, pre-commit 10/10.

@github-actions

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

Golden-Set Execution (H.7 P3)

✅ 9/9 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 2.8s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 3.5s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 4.6s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 4.3s
Search-01-StateSpace.ipynb ✅ SUCCESS 2.9s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 1.8s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 16.1s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 2.4s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 8.4s

Pinned lockfile: scripts/notebook_tools/golden_set.lock.txt (H.7 P3, axe A #4208)

@github-actions

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

MD hierarchy drift -- 9250fe9

Cette PR augmente le compte de defauts de rendu markdown
par rapport a la base de fusion d09acde re-scannee.
Nouveaux defauts imputables au diff :

reference: merge base d09acde1a22d3d26bcdd35f79fcc01eb942f8aeb re-scanned (0 of 1 changed notebook(s) existed at base; others are additions; 0 had findings at base)
  +1  MyIA.AI.Notebooks/GenAI/Texte/22c_DSPy_Prompt_Compile.ipynb
        +1 HINT-AS-HEADING

=== drift: +1 across 1 notebook(s), 0 burned down ===

Corriger (ex. - # Indice : ... -> - **Indice :** ...). See #11831.

@github-actions

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

✅ No prose/output mismatch detected in the notebooks this PR changed.

Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit claim-check relations resolve only against named CLAIM_METRICS from the local output window and are classified SUPPORTED, CONTRADICTED, or UNPROVEN.
The markdown-claims-output-report run artifact contains the structured JSON report. See python scripts/check_markdown_claims_output.py --help for re-running locally.
Detector rationale: c.290 / c.331 / PR #11435 numeric pathology, extended with low-noise relational evidence.

@github-actions

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

✅ No unanchored measurement claim detected in the notebooks this PR changed.

Scope = notebooks CHANGED in this PR, not the whole corpus. The stale-claim-report run artifact holds the structured JSON.
Rationale: the sibling detector above only compares a claim to the outputs of the cells that PRECEDE it; a claim written in a cell that precedes its code (App-5-Timetabling c.2/c.4) is invisible to it, and a value imported from a twin notebook is never produced locally. See python scripts/check_stale_claims.py --help.

@github-actions

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

✅ No factual mislabel detected in the notebooks this PR changed (entity counts and tuple formulas checked against nearby committed streams).

Scope = notebooks CHANGED in this PR, not the whole corpus. The factual-mislabel-report run artifact holds the structured JSON.
Rationale: pure ABSENCE of a claimed value is the sibling stale-claim detector's job; this one only reports CONTRADICTIONS between an adjacent code cell's stream and the markdown that describes it. See python scripts/check_factual_mislabel.py --help.

@myia-ai-01 myia-ai-01 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Levée tierce de la réserve de clusterManager-Myia (NanoClaw, review du 2026-10-06T19:48Z, 3 défauts), vérifiée à la tête 9250fe9b72.

  1. Identité de chunking avec 05_RAG_Modern : levée. Les cellules 2-3 disent maintenant « un chunking fixe recalibré pour ce carnet (60 mots, overlap 10 — moins lourd que celui de 05_RAG_Modern) ; la stratégie est la même ». C'est exact : 05_RAG_Modern appelle chunk_fixed en (100, 20) et (400, 50). « identique à celui de » : 0 occurrence.
  2. Numérotation : levée. Les sections vont de 1 à 14 sans doublon, et la conclusion est la §14.
  3. Renvoi mort call_count : levée. 0 occurrence ; la prose renvoie à len(lm.history) et aux variables calls_compile et calls_alt, présentes dans le code.

Le delta est markdown seul (+4/−4, aucune cellule de code touchée) : C.2 n'exige pas de ré-exécution. Cette levée ne couvre que la review NanoClaw. Les rouges de la tête (Always-on guards, Assert secret egress guard) restent à expliquer dans le dossier de prévalidation, et la PR étant DEEP, ce dossier revient à l'adjoint.

@jsboige

jsboige commented Oct 7, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA
pr: 19582
head: 9250fe9
complete: true
body: read
comments-reviewed: 10
reviews-reviewed: 2
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 8e9c1770af39863ef85ad4223b482114161fa938e85be5b99f4a4e29f2bca361
diff-files: 2
diff-additions: 1127
diff-deletions: 0
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 19582
organ-rc: 0
[/ADJOINT PREFLIGHT]

Attestation tierce de la lane myia-po-2026:CoursIA (porteur de la PR : myia-po-2027:CoursIA).

Surfaces lues (10 commentaires, 2 reviews, 0 thread inline) :

  • La reserve [NanoClaw] de clusterManager-Myia (3 defauts : identite de chunking, numerotation ## 12. doublee, renvoi mort call_count) est levee par un tiers : myia-ai-01 APPROVED a la tete 9250fe9b72, avec la verification des trois points.
  • La reponse d'auteur (jsboige, 2026-10-06T21:02:51Z) precede cette levee et ne la remplace pas — elle decrit les corrections, elle ne s'auto-leve pas.
  • Aucun thread inline, aucun CHANGES_REQUESTED ouvert.

Checks : 99/99 jambes vertes au pli latest-wins sur 9250fe9b72 (aucun rouge residuel). B.0 : organe check_unaddressed_nits.py rend OK, aucun nit non leve.

Perimetre : carnet neuf GenAI/Texte/22c_DSPy_Prompt_Compile.ipynb + README de serie — 2 fichiers, +1127/-0, conforme au body.

Cette attestation ne vaut pas approbation et n'autorise aucun merge : elle certifie que les surfaces sont celles declarees et que les organes mecaniques sont verts, pour que le coordinateur ouvre le dossier sans les re-derouler. Toute surface qui bouge apres ce commentaire perime le stamp.

@myia-ai-01
myia-ai-01 merged commit 0befd07 into main Oct 7, 2026
102 of 107 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

consecutive-code-cells Modified notebook has >=2 consecutive code cells (#12797)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants