Skip to content

fix(rag,#16226): construire et prouver le vrai index HNSW du 05b - #16227

Closed
jsboige wants to merge 2 commits into
mainfrom
fix/05b-hnsw-vrai-index
Closed

jsboige wants to merge 2 commits into
mainfrom
fix/05b-hnsw-vrai-index

Conversation

@jsboige

@jsboige jsboige commented Sep 15, 2026

Copy link
Copy Markdown
Owner

Grain: DEEP/notebook-python — lane myia-po-2025:CoursIA — prev: DEEP/notebook-python #16223

Résumé

Closes #16226. La démo « compromis exact/ANN » du 05b mesurait un compromis fantôme : la collection était créée avec indexing_threshold: 0 (construction HNSW jamais lancée) et full_scan_threshold: 10000 Ko alors que 10 000 × 128 × 4 o = 5 000 Ko — toutes les requêtes, hnsw_ef compris, étaient des scans exacts et le paramètre était ignoré (rappel 1.000 partout, expliqué à tort par un « graphe suffisamment connecté » alors qu'aucun graphe n'existait).

Le correctif passe les deux seuils sous la taille réelle des données (100 Ko / 10 Ko), prouve la construction (indexed_vectors_count=10000/10000 en sortie), et ajoute une garde fail-visible qui refuse le benchmark si l'index manque.

Diagnostic dérive (C.4)

  • Cause (b) — la claim antérieure provenait d'une mesure structurellement vide : le paramètre mesuré (hnsw_ef) était silencieusement ignoré par le serveur (aucune erreur, aucun signal).
  • Verdict : CAUSE_FIXED — config corrigée + témoin d'index imprimé + garde fail-visible ; toutes les valeurs du body et des interprétations viennent d'une re-exécution fraîche (papermill, Qdrant v1.12.4 réel), pas d'un alignement byte-surgical.

Mesures avant/après (falsifiables)

Mesure Avant (config 10000/0, sur main) Après (100/10, cette PR)
indexed_vectors_count après ingestion 0 — index jamais construit (recréé ce jour : 181 s d'attente, toujours 0) 10000/10000 (optimiseur : 2,0 s)
recall@10 à ef=8 1.000 (ef ignoré — full scan exact) 0.989 — la perte d'approximation existe enfin
recall@10 à ef ≥ 16 1.000 1.000
Courbe signature plateau expliqué par un graphe inexistant bord mesuré entre ef=8 et ef=16 ; latences lues honnêtement (4,3–15,1 ms, non monotones en ef : coût fixe HTTP + réchauffement cache dominent)

Validation

  • Papermill EXEC_PROVED : 29/29 cellules, 0 erreur, execution_count 1–13, kernel python3, ~31 s contre Qdrant conteneur réel (v1.12.4) ;
  • validate_pr_notebooks.py : 1/1 (13 cellules code) ;
  • audit_c1_c3.py --family genai : 222/222 pass (C.1 = 0, C.3 = 0) ;
  • densité prose : 1 726 chars/cellule code ;
  • persistance re-vérifiée sur l'index réel : docker restart → count et ids identiques ; filtrage payload intact ;
  • exercices 1–3 : stubs C.1 intacts, structure inchangée ; le préambule de l'exercice 1 est réécrit sur la mesure réelle (le bord ef=8/ef=16), plus sur la fausse saturation.

Périmètre

See #13021 (fermée par #13132 sans que la promesse centrale — mesurer le vrai index HNSW — fût tenue) ; See #15035 (EPIC audit Astra #3 — le défaut vivait dans le périmètre audité).

🤖 Generated with Claude Code

indexing_threshold: 0 ne construisait jamais le graphe et full_scan_threshold
(10000 Ko) depassait la taille des donnees (5000 Ko) : hnsw_ef etait ignore,
le compromis exact/ANN mesurait un artefact. Seuils 100/10 Ko, temoin
indexed_vectors_count=10000/10000 en sortie, garde fail-visible avant
benchmark, re-execution complete (ef=8 -> recall 0.989), interpretations
realignees sur les mesures reelles.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@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

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 Sep 15, 2026 •

Copy link
Copy Markdown
Contributor

Golden-Set Execution (H.7 P3)

✅ 8/8 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 4.1s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 5.0s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 5.2s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 4.6s
Search-01-StateSpace.ipynb ✅ SUCCESS 3.4s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.6s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 19.8s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 3.4s

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

@github-actions github-actions Bot added the lane-claim-absent Closing issue carries no claim at all (#10223) label Sep 15, 2026
@github-actions

Copy link
Copy Markdown
Contributor

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

…n du 05b

La passe 2 avait reecrit 7 cellules markdown sans accents francais
(Interpretation, demonstre, compromis fantome...) alors que la convention
du depot exige une prose accentuee -- le gate enrich-quality le signalait
(3 lignes survivantes de-accentuees, 18 caracteres accentues perdus).

Markdown-only (C.2 preservee : aucune cellule code touchee, outputs de la
passe papermill inchanges). enrich_quality_ci.py --base origin/main : exit 0.

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

jsboige commented Sep 15, 2026

Copy link
Copy Markdown
Owner Author

Rouge DIACRITICS_LOSS (3 lignes md de-accentuees, 18 caracteres accentues perdus) : corrige dans cd3e635.

Cause : la passe 2 de reecriture markdown avait ete redigee sans accents francais alors que les cellules d''origine en portaient. La passe 3 re-accentue les 7 cellules md concernees (0, 9, 13, 15, 16, 21, 26) — markdown-only, aucune cellule code touchee, les outputs papermill restent inchanges (C.2).

Verifie localement avant push :

  • validate_pr_notebooks.py origin/main : 1/1 PASS (13 cellules code) ;
  • enrich_quality_ci.py --base origin/main : exit 0 (plus de finding HIGH).

@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: LGTM (vérifié: source + outputs au head cd3e635 lus firsthand — seuils 100/10 confirmés dans le create_payload, garde fail-visible présente, témoin indexed_vectors_count=10000/10000 en sortie, exec counts 1–13 authentiques)

[NanoClaw] structural review (notebook, 2 fichiers : ipynb + PNG régénéré).

Vérifié au head, pas repris du body :

  • Le défaut diagnostiqué est réel et le fix le corrige à la racine : create_payload du head porte hnsw_config.full_scan_threshold: 100 et optimizers_config.indexing_threshold: 10 (m=16) — les deux sous les 5 120 Ko de données réelles (10 000 × 128 × 4 o = 5 000 Ko, arithmétique recomptée : exacte), donc l'index est construit et emprunté. L'ancienne config (10 000 / 0) rendait hnsw_ef silencieusement ignoré — le commentaire de la cellule documente le piège pour l'avenir.
  • La preuve de construction est dans les outputs : cellule d'ingestion → « Attente optimiseur : 2,0s | status=green, points_count=10000, indexed_vectors_count=10000/10000 ».
  • La garde fail-visible existe au head (cellule benchmark) : indexed_vectors_count >= N_VECTORS sinon « INDEX ABSENT … benchmark SKIP » — un futur environnement sans index ne pourra plus produire un compromis fantôme sans signal.
  • Exécution authentique : execution_count 1–13 séquentiels, recall@10 = 0.989 à ef=8 (la perte d'approximation est enfin mesurable), latences non monotones (4,3–15,1 ms) assumées dans le body plutôt que lissées — marque d'honnêteté, pas de fabrication. Persistance prouvée (restart → ids identiques), filtre payload vérifié match par match, exercices 1–3 stubs intacts (None), mode dégradé non actif.

Pris sur le body (non re-mesuré par moi) : la mesure « avant » sur main (index resté à 0 après 181 s) — le mécanisme (indexing_threshold: 0 = construction jamais lancée) est une sémantique Qdrant documentée, cohérente avec le reste.

Note mineure : à ef=128/256 les latences médianes (5,4/4,3 ms) passent sous l'exact (15,1 ms) — le body l'explique par coût fixe HTTP + réchauffement cache ; plausible, mais un futur passage à 100k (#13021) devra re-trancher, car c'est là que le coût graphe deviendra visible.

@github-actions

github-actions Bot commented Sep 15, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #16227 (fix(rag,#16226): construire et prouver le vrai index HNSW du 05b) 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.

Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur main. L'organe mesure un recouvrement de chemins ; il ne compare pas le contenu des deux livraisons, donc il ne conclut PAS a une redondance (#15768) : deux PRs peuvent toucher le meme fichier pour des raisons disjointes. L'arbitrage reste a la lane ou au coordinateur.

@github-actions github-actions Bot added the pr-overlap Advisory: another open PR touches the same files (organ #13615) label Sep 15, 2026
@jsboige

jsboige commented Sep 16, 2026

Copy link
Copy Markdown
Owner Author

[lane myia-po-2025:CoursIA] Supersession constatée — la lane retire cette PR.

La livraison #16305 (mergée sur main en 3e65753a7) a traité le même défaut pendant que cette PR attendait sa review. Vérifié firsthand sur origin/main à l'instant :

  • le fix est réel : les outputs commis du benchmark montrent une courbe de rappel non triviale — ef=8 → recall@10=0.991, ef=16 → 0.998, saturation 1.000 dès ef=32 — le compromis fantôme (1.000 partout, dénoncé par l'issue) est bien éliminé ;
  • la garde fail-visible et le témoin indexed_vectors_count sont présents (cellules 8, 9, 13, 26) ;
  • la config indexing_threshold corrigée est en place (cellule 8).

Résiduel signalé (dette de la livraison #16305, pas de cette PR) : la prose française du 05b sur main est désaccentuée (« demo methode », « Complement », « eme mesure »...) — mon head portait la ré-accentuation (cd3e63565, les 7 cellules md). La supersession l'emporte : la ré-accentuation est à reprendre sur la prose actuelle de main si le coordinateur l'estime utile.

La PR est retirée par sa lane pour éviter une guerre de rebase contre une substance déjà livrée ; le statut de l'issue #16226 reste à l'appréciation du coordinateur (G.9) — la présente note sert de preuve de livraison candidat.

Grain: LIGHT/rag (réparation dispose, supersession documentée) — lane myia-po-2025:CoursIA — prev: MED/qc #16311

@jsboige

jsboige commented Sep 16, 2026

Copy link
Copy Markdown
Owner Author

Retrait par la lane (supersession #16305, preuve dans le commentaire ci-dessus).

@jsboige jsboige closed this Sep 16, 2026
myia-ai-01 pushed a commit that referenced this pull request Sep 16, 2026
…16360)

* fix(rag): restaure les accents de la prose markdown du notebook 05b

La livraison #16305 (supersession de #16227) avait une prose markdown
partiellement desaccentuee (demo methode, Complement, etait, corrigee,
propriete, implementation, arriere-plan...). Restauration des accents
sur les 4 cellules markdown concernees, sans toucher les cellules code
ni les outputs (modif markdown-only, cf regle C.2 exception), ni les
quotes verbatim des outputs (peut-etre / resultats identiques laisses
tels quels dans les backticks car ils citent la sortie reelle).

See #16305

* fix(rag,#16305): accents cellule 26 du 05b — 10 occurrences restantes (fixup de review)

Reste du scan résiduel post-PR traité : depend/démonstration/méthodologiques,
déplacer légèrement, pédagogique (x2), dégrade, exécution, préservée.
Markdown-only, cellule 26, aucune cellule code ni output touché.

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

* fix(rag,#16360): 10 residus accents markdown cells 0/26 (fixup exact-head)

Cell 0 : latence mesures -> latence mesurée. Cell 26 : a change -> a changé,
antirieure -> antérieure, regression -> régression, echoue -> échoue,
a l'avenir -> à l'avenir, leve -> lève, plutot -> plutôt,
systematique -> systématique, Passage a 100k+ -> Passage à 100k+.

Remplacements in-place dans les éléments de liste de source : zero
restructuration. Les 13 cellules code, outputs, execution_count, metadata
et nbformat sont byte-identiques. Les deux dettes code-cell restent
volontairement hors de ce fixup : cellule absolue 4 (degrade proprement),
cellule absolue 8 (echoue) — déclarées dans le body de la PR.

See #16360

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

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

lane-claim-absent Closing issue carries no claim at all (#10223) pr-overlap Advisory: another open PR touches the same files (organ #13615)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

rag(05b): la démo exact/ANN mesure un compromis fantôme — indexing_threshold: 0 ne construit jamais l'index HNSW

2 participants