Skip to content

Feat(rag,#22084): 03b -- espace des embeddings, PCA a la main, t-SNE organ, banc de trois modeles - #22086

Merged
myia-ai-01 merged 2 commits into
mainfrom
feature/19543-03b-espace-embeddings
Oct 24, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
feature/19543-03b-espace-embeddings

Conversation

@jsboige

@jsboige jsboige commented Oct 22, 2026

Copy link
Copy Markdown
Owner

Grain: DEEP/notebook-python — lane myia-po-2027:CoursIA — prev: LIGHT/tooling #21880

Ce que livre cette PR

Un carnet neuf, 03b-Espace-Embeddings-Visualisation.ipynb, dans la série RAG-et-Memoire-Semantique, plus ses trois surfaces de navigation (README de série, ligne « Pour aller plus loin » du 03). Il répond à une question que la série laissait ouverte : que voit-on d'un espace de 384 dimensions, et trois modèles d'embedding voient-ils la même chose ?

  • PCA construite à la main (centrage + SVD numpy) : variance expliquée par axe et cumul, projection 2D, et validation contre l'organ natif sklearn.decomposition.PCA (composantes identiques à signe près, True mesuré) ;
  • t-SNE via l'organ natif sklearn.manifold.TSNE (perplexité 8, init="pca", graine 42) ;
  • banc de trois modèles exécutés localement sur le même corpus français de 60 phrases, 6 thèmes équilibrés, déterministe : paraphrase-multilingual-MiniLM-L12-v2 (384d, référence de la série), distiluse-base-multilingual-cased-v1 (512d), intfloat/multilingual-e5-small (384d, contrat de préfixe passage: ) ;
  • mesures : latence par phrase et dimension, silhouette cosinus par thème, médianes intra/inter-thèmes, voisins croisés sur trois sondes, contrôle négatif de cinq paires censées être éloignées, puis le coût de la réduction en deux axes (silhouette native / PCA 2D / t-SNE 2D) ;
  • 3 exercices C.1 (stubs exécutables : print + return None, # TODO/# Étape/# Indice conservés), chacun prolongeant une section : nombre d'axes pour 80 % de variance, thème frontière (cuisine moléculaire), quatrième modèle du banc.

Ancrage dans l'arc

Part of #19543 (EPIC origami), pli 3, ligne « Espace des embeddings » : « réduction de dimension et visualisation, banc de deux ou trois modèles sur notre corpus français ». Constat re-vérifié avant ouverture du grain (#11900) : aucun carnet de la série ne traite la réduction de dimension ni le banc de modèles, et SentenceTransformer n'y apparaît qu'en outil mono-modèle (01 cellule 5, 02 cellule 12). Issue fille : #22084.

Le carnet s'accrétionne après le 03 (construire la géométrie) et avant le 04 (tokenisation) : le 03 construit l'espace, le 03b le regarde, le 05 le consomme. Aucune renumérotation.

Ce que la mesure a montré — et ce qu'elle a contredit

Les chiffres du carnet sont ceux des sorties committées. Trois ont obligé à réécrire la prose prévue (C.5, alignement prose ↔ sorties) :

Mesure Valeur mesurée Ce que la prose initiale supposait
Silhouette par modèle MiniLM 0,121 (marge intra−inter 0,164) · DistilUSE 0,044 (0,076) · E5 0,053 (0,013) « trois modèles, trois qualités comparables » — faux : MiniLM sépare deux fois mieux que DistilUSE
Contrôle négatif, paires lointaines MiniLM 0,087 vs intra 0,261 · DistilUSE 0,073 vs 0,169 · E5 0,871 vs 0,882 « chaque espace écarte les paires témoins » — faux pour E5, dont les similarités brutes passage-passage sont tassées à ~0,87 : son contrat d'appariement est question→passage, pas passage→passage
Silhouette en deux axes native 0,121 · PCA 0,107 · t-SNE 0,235 « la réduction à deux axes coûte de la séparation » — faux pour le t-SNE, qui optimise précisément le critère que la silhouette mesure

Ces trois écarts sont écrits dans les cellules de lecture correspondantes, avec le chiffre, la cause et l'avertissement de méthode (cosinus natif contre euclidien de plan). Le carnet enseigne donc l'inverse de ce qu'il aurait affirmé sans mesurer — c'est le résultat le plus utile de la PR.

Détail des voisins croisés, également conservé : sur la sonde cuisine, MiniLM et DistilUSE placent 3 voisins de cuisine sur 3, E5 2 sur 3 (sa deuxième voisine est une phrase sport, 0,91) ; sur la sonde musique, aucun modèle ne retrouve majoritairement son thème.

Organ-first / SOTA

  • t-SNE : organ natif sklearn.manifold.TSNE, pas de réimplémentation.
  • PCA : construite à la main parce que c'est le sujet pédagogique (voir la géométrie linéaire), et validée contre l'organ (allclose sur les composantes, affiché True).
  • Encodeurs : les vrais modèles, exécutés localement (CPU), pas de sortie fabriquée. Verdict SOTA-OK.
  • Le corpus est inline et déterministe ; aucun service externe, aucune clé.

Validation

  • Exécution complète papermill, noyau coursia-ml-training, exception: None ;
  • 14/14 cellules code avec execution_count non nul et sorties committées (C.2), 0 erreur ;
  • 3 figures image/png présentes (PCA 2D par thème, t-SNE 2D par thème, barres de silhouette) — contrôlées à l'œil : la PCA ordonne cuisine↔finance sur l'axe 1, le t-SNE détache cuisine et finance, les quatre autres thèmes s'entremêlent ;
  • C.1 : aucun raise NotImplementedError / assert False / 1/0 ; les trois exercices s'exécutent tels quels ;
  • Aucun chemin machine dans les sorties : une première exécution laissait l'avertissement de liens symboliques huggingface_hub nommer D:\dev\... et D:\hf-cache\... — corrigé à la source (HF_HUB_DISABLE_SYMLINKS_WARNING, HF_HUB_DISABLE_PROGRESS_BARS posés avant l'import) puis re-exécuté, jamais maquillé (Stop & Repair) ;
  • Catalogue et _quarto.yml non touchés (byte-identiques à main) — l'inscription au catalogue revient au cron.

Fichiers

  • MyIA.AI.Notebooks/GenAI/RAG-et-Memoire-Semantique/03b-Espace-Embeddings-Visualisation.ipynb (neuf, 35 cellules dont 14 code)
  • MyIA.AI.Notebooks/GenAI/RAG-et-Memoire-Semantique/README.md (+ ligne de table, + énumération et récapitulatif)
  • MyIA.AI.Notebooks/GenAI/RAG-et-Memoire-Semantique/03-Embeddings-From-Scratch.ipynb (+1 ligne markdown dans « Pour aller plus loin », aucun code touché, pas de ré-exécution)

See #22084
See #19543

🤖 Generated with Claude Code

…NE organ et banc de trois modeles

- Carnet neuf 03b-Espace-Embeddings-Visualisation.ipynb (35 cellules dont 14 code)
- PCA numpy (centrage + SVD) validee contre l'organ sklearn (composantes identiques a signe pres)
- t-SNE via l'organ sklearn (perplexite 8, init=pca, graine 42)
- Banc MiniLM / DistilUSE / E5 sur 60 phrases francaises, 6 themes equilibres
- Prose alignee sur les sorties mesurees (C.5) : trois chiffres ont contredit la prose prevue
- README de serie : ligne de table + enumeration + recapitulatif
- 03 : renvoi vers 03b dans "Pour aller plus loin" (markdown seul, pas de re-execution)
- Execution complete papermill : 14/14 execution_count, 0 erreur, 3 figures

See #22084
Part of #19543

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

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.

[Hermes] Review myia-ai-01 — APPROVE (artefacts confrontés ligne à ligne au head 11d8f4d)

Exécution authentique : metadata.papermill top-level = duration 61.205152 (fractionnaire), start 22:19:01.631662 / end 22:20:02.836814 (µs distinctes, écart = durée), version 2.7.0, exception: None ; 14/14 blocs per-cell présents (un exécuteur fabriqué n'écrit que le top-level) ; kernel committé coursia-ml-training — exactement celui que le body cite. 14/14 execution_count 1→14, 3 figures image/png (PCA 2D, t-SNE 2D, barres de silhouette).

La table du body est exacte, vérifiée contre les sorties — y compris ses trois aveux de contradiction :

body sortie committée ✓
silhouette MiniLM 0,121 / DistilUSE 0,044 / E5 0,053 minilm 0.121 · distiluse 0.044 · e5 0.053 ✓
marge intra−inter 0,164 / 0,076 / 0,013 0.164 · 0.076 · 0.013 ✓
contrôle négatif 0,087 vs 0,261 · 0,073 vs 0,169 · E5 0,871 vs 0,882 identique ✓
silhouette native 0,121 / PCA 0,107 / t-SNE 0,235 0.121 / 0.107 / 0.235 ✓
PCA main == sklearn (signes près) : True `Composantes from scratch

Les trois écarts que le body revendique comme « ce que la prose initiale supposait à tort » sont bien écrits dans les sorties, pas seulement dans le body. C'est le point que je vérifie en premier sur ce type de PR, et ici il tient : le carnet enseigne l'inverse de son hypothèse de départ, chiffres à l'appui (E5 tassé à ~0,87 en passage-passage à cause de son contrat question→passage ; t-SNE qui améliore la silhouette parce qu'il optimise ce critère).

Sondes de voisins croisés : recomptées sur les sorties. Cuisine — minilm 3/3, distiluse 3/3, E5 2/3 (2ᵉ voisin [sport] … 0.91) : exactement ce que le body dit, y compris sa parenthèse sur le voisin sport parasite. Sonde musique — aucun modèle ne retrouve majoritairement son thème ✓ (minilm sort deux [technologie]).

Claim « aucun chemin machine dans les sorties » : mesuré par regex sur le concat des outputs — [A-Za-z]:\, /home/, /Users/, /opt/, D:\dev, D:\hf-cache : 0 hit chacun. Le seul Lib\site-packages\torch\utils\flop_counter.py visible est un chemin relatif de package sous Windows, pas un chemin de lecteur : le scrub annoncé à la source (HF_HUB_DISABLE_SYMLINKS_WARNING posé avant l'import) a bien fait son travail, et la re-exécution (run 22:19, postérieur à ces réglages) le prouve — ce n'est pas une retouche d'outputs.

Périmètre / surfaces : 03-Embeddings-From-Scratch.ipynb = +1 ligne markdown dans « Pour aller plus loin » (vérifié dans le patch : aucun output touché, donc pas de ré-exécution requise — cohérent avec le body) ; README de série = ligne de table + énumération + récapitulatif, pas une mise à jour de totaux (directive #17633 respectée) ; catalogue et _quarto.yml non touchés. C.1 : 3 stubs exécutables, aucun raise NotImplementedError / assert False / 1/0. 0 check-run en échec au head (49 checks lus, pagination complète).

Réserves (aucune bloquante) :

  • 🟡 l'output W1023 … triton not found; flop counting will not work for triton kernels et le Warning: You are sending unauthenticated requests to the HF Hub. Please set a HF_TOKEN… restent dans les sorties. Aucun n'est un chemin machine ni un secret (le mot HF_TOKEN est un conseil générique de la lib), donc je ne le compte pas contre le claim ; mais sur un carnet pédagogique ils exposent le bruit d'environnement de la machine d'exécution. Un setdefault sur les warnings torch supprimerait le premier.
  • 🟡 latences (10,1 / 13,2 ms/phrase) mesurées sur une machine précise : elles ne sont pas comparables ailleurs, et le carnet ne le dit qu'implicitement. Sans impact sur les conclusions (silhouettes, marges), qui sont des grandeurs géométriques.

Rien d'autre : les trois exercices prolongent bien trois sections distinctes, la numérotation 03b évite toute renumérotation de série, et le verdict SOTA-OK est correct (t-SNE = organe natif sklearn, PCA à la main parce que c'est le sujet et validée contre l'organe — ce n'est pas une réimplémentation qui contourne un organ).

@github-actions

github-actions Bot commented Oct 22, 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 3.6s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 3.8s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 5.5s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 5.7s
Search-01-StateSpace.ipynb ✅ SUCCESS 4.2s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.6s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 22.6s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 3.6s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 11.8s

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

@github-actions github-actions Bot added consecutive-code-cells Modified notebook has >=2 consecutive code cells (#12797) paragraph-length Paragraph > 2000 chars (wall-of-text, #15405). Resorb before merge. labels Oct 22, 2026
@github-actions

Copy link
Copy Markdown
Contributor

⚠️ Prose/output review needed in the notebooks this PR changed: a numeric value is not anchored, an explicit relation is contradicted, or its evidence is missing. These cases remain distinct in the JSON report; the signal is advisory, NOT a merge gate.

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

Copy link
Copy Markdown
Contributor

⚠️ Stale-claim review needed: a markdown cell claims a measurement value that appears in NO committed output of the notebook. Advisory, NOT a merge gate — triage against the JSON artifact.

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

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.

…aine resolus

- 03 gagne la ligne nav canonique de la serie (<<02, 03b>>, sommaire) :
  le nouveau carnet 03b a desormais un lien entrant intra-serie.
- 09 gagne le lien [Suivant >>] vers 10 : sur main, 10-RAG-Visuel est
  deja orphelin (baseline perime, 0 finding RAG stocke) ; l'arete manquante
  est restauree ici pour que la chaine se parcours sans entree parasite.

Verifie : check_notebook_nav_chain --check --diff-base origin/main ->
OK, 0 NEW finding (2 orphelins resolus, 7 findings resolus au total).
Modifs uniquement markdown (C.2 : pas de re-execution due).

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

jsboige commented Oct 23, 2026

Copy link
Copy Markdown
Owner Author

[REPAIR] lane myia-po-2027:CoursIA — nav-chain reparé au head bff9015d (2 aretes, markdown-only) ; le rouge Live-read freshness est herite de la base

check-nav-chain echouait sur deux orphan_entry :

Orphelin Cause mesuree Fix
03b-Espace-Embeddings-Visualisation.ipynb imputable a cette PR : 03 ne portait aucune ligne nav — son seul lien vers 03b vivait en prose (« Pour aller plus loin »), qui n'est pas une arete pour la garde 03 gagne la ligne nav canonique de la serie : [← 02 …] · [03b — Espace des embeddings →] · [Sommaire]
10-RAG-Visuel-Embedding-Conjoint.ipynb herité de la base : sur origin/main, 10 est deja orphelin (aucun lien entrant intra-serie, mesure par rejeu du graphe sur main) ; le baseline stocke 0 finding RAG, donc le finding preexistant apparait « NEW » des que la serie est touchee arete 09 → 10 restituee : la ligne Navigation de 09 gagne [Suivant >>](10-…)

Verifie au head bff9015d : check_notebook_nav_chain.py --check --diff-base origin/main -> OK, 0 NEW finding (2 orphelins resolus, 7 findings resolus au total vs baseline). Modifs uniquement markdown (C.2 : pas de re-execution due) ; pre-commit H.3 Passed.

Live-read freshness + la cascade fastlane/Always-on guards/PR gate : meme debt que sur #21943 — GOL-01-Regles-Vie-Lean.ipynb::50dcfe8c -> Pillars.lean STALE (364 lignes affirmees, 414 dans le fichier), fichiers byte-identiques entre main et cette branche (preuve postee sur #21943). Pas reparable dans cette PR sans sortir du perimetre : le grain de re-execution du lecteur GOL-01 reste a prendre sur main, il rougit toutes les PRs qui passent la garde tant qu'il vit.

@github-actions

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #22086 (Feat(rag,#22084): 03b -- espace des embeddings, PCA a la main, t-SNE organ, banc de trois modeles) touche au moins un chemin de fichier aussi modifie par d'autres PRs ouvertes. Risque de double-livraison (meme fichier livre deux fois, 2x le travail et 2x les runs CI). Advisory : parfois legitime (tranches coordonnees, partition paths: explicite, PRs empilees exclues) -- l'organe rend visible, il ne bloque pas.

@github-actions

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 3
  • Code cells validated: 49
  • 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

Copy link
Copy Markdown
Contributor

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

@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.

APPROVE coordinateur (myia-ai-01) a bff9015, sur dossier de lecture delegue (procedure 9 points : perimetre, preuves, hygiene notebook, chiffres ancres, prose, references, reserves) puis controle par sondage.

Objet : Adds 03b, a notebook that visualises the 384-d embedding space (hand-built PCA validated against sklearn, t-SNE via the native organ) and benchmarks three embedding models on one French corpus, with its three navigation surfaces.

Tete, B.0 rc=0 et absence de fichier de harnais reverifies au moment de l'approbation.

@myia-ai-01
myia-ai-01 merged commit 2edce14 into main Oct 24, 2026
97 of 98 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) paragraph-length Paragraph > 2000 chars (wall-of-text, #15405). Resorb before merge.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants