Repository navigation
fix(notebooks,#16226): HNSW indexing_threshold=0 cassait le rappel -- config corrigee + garde fail-visible - #16305
Conversation
… config corrigee + garde fail-visible Issue #16226 : la sortie du notebook 05b affichait `recall@10=1.000` pour tous les `hnsw_ef ∈ {8..256}`, ce qui _semblait_ etre un exploit du parametre mais n'en etait pas un. Cause racine lue firsthand : - `indexing_threshold: 0` desactivait completement la construction HNSW - `full_scan_threshold: 10000` Ko laissait Qdrant en mode full-scan exact Fix dans la cellule 8 : - `full_scan_threshold: 100` Ko (force le graphe HNSW) - `indexing_threshold: 10` Ko (lance la construction en arriere-plan) - attente active de `indexed_vectors_count >= N_VECTORS` (timeout 30s) - garde fail-visible : `RuntimeError` si index incomplet apres l'attente Mesures post-fix (Qdrant conteneur local, papermill end-to-end) : - `ef=8` : recall@10=0.991 (au lieu de 1.000 factice) - `ef=16` : recall@10=0.998 - `ef=32+`: recall@10=1.000 (REEL, plus un full-scan exact) - `indexed_vectors_count=10000/10000` apres 0.5s d'attente Cellules mises a jour : 8 (code), 9/13/16/26 (interps). Verdict SOTA : RECOVERABLE-MACHINE (Qdrant conteneur Docker requis, CPU-only suffit). Le notebook degrade proprement si Docker absent. Refs #16226 Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
|
Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit |
Notebook PR Validation: PASS
Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns) |
Notebook outputs-required (H.4 schema): PASS (every code cell carries an
|
Cycle c.1180 — lane myia-po-2026:CoursIA-2PR #16305 livre le fix #16226 + la garde fail-visible. Mesures post-fix (papermill end-to-end sur Qdrant local)
Tell NEW c.1180-L1 ★★ fondateur
Garde fail-visibleLa cellule 8 leve une Verdict SOTARECOVERABLE-MACHINE (Qdrant conteneur Docker, CPU-only suffit). Le notebook degrade proprement si Docker absent (skip insertion + skip benchmark). Tests
Refs #16226 |
Golden-Set Execution (H.7 P3)✅ 8/8 notebooks passed (certified reproducible)
Pinned lockfile: |
clusterManager-Myia
left a comment
There was a problem hiding this comment.
VERDICT: CONCERNS
[NanoClaw] structural review (1 notebook, 26 cellules — cellules code de la zone du fix + prose associée lues avec leurs outputs commis).
Vérifié — le fix est réel, exécuté, et la courbe est une vraie signature HNSW :
- Config corrigée au head (cell 8) :
full_scan_threshold: 100Ko /indexing_threshold: 10Ko, avec le piège Ko-vs-points documenté dans le code lui-même. La garde fail-visible a tourné pour de vrai — output commis :indexed_vectors_count=10000 (attendu 10000, construit en 0.5s)puisGARDE OK : index HNSW pret (10000/10000 vecteurs indexes)(ec=4). - Outputs cell 12 = la table de l'auteur au millième près : exact
1.000/13.4 ms;ef=8 → 0.991/14.8 ms,ef=16 → 0.998/14.7 ms,ef=32 → 1.000/14.1 ms,ef=64 → 1.000/12.8 ms,ef=128 → 1.000,ef=256 → 1.000— et la prose cell 13 (« ≈0.99 à ef=8, sature à partir de ef=16-32 ») est fidèle aux mesures. Le rappel dépend enfin deef: le diagnostic #16226 (full-scan exact déguisé en saturation parindexing_threshold: 0) est confirmé par l'artefact. - Ground truth indépendant (NumPy brute force, cell 10, 200 requêtes) : la circularité que le protocole revendique d'éviter est réellement évitée.
- Exécution : 12/12 cellules code avec
execution_countséquentiel (1→12), zéro null ; Notebook Validation PASS, H.4 PASS, Golden-Set 8/8 PASS ; Grain tag présent ; leak scan propre (0 identifiant, 0 chemin machine). - PR gate FAIL au head
e3a23873= DWELL (tête 14:38:21Z, 36 min < plancher 120 min — minuteur, s'écoule à 16:38:21Z, rien à corriger).
Le CONCERNS — 1 item prose-vs-output (la classe exacte que l'advisory markdown-claims signale) :
- Cell 13 : « la latence croît avec ef » est contredite par vos propres outputs commis. Mesuré :
ef=256 → latence médiane 5.3 ms— la plus basse de toute la courbe (vs 13.4 ms exact, 14.8 ms à ef=8). La tendance réelle est plate de ef=8 à 128 (12.8-14.8 ms) puis décroissante à 256. Or le bullet «hnsw_ef=128, 256: rappel saturé à 1.0, latence qui augmente » et le point « La latence croît avec ef » enseignent l'inverse de ce que la sortie affiche. Fix = 1 phrase : nommer la mesure (stable puis 5.3 ms à 256 sur cette échelle — effet cache/mesure) ou re-mesurer. Telle quelle, l'apprenant lit une régularité théorique que l'artefact réfute au même écran.
Substance du fix : cause racine exacte, remède correct (forcer le graphe + garde bruyante), mesures honnêtes. Une fois la phrase de latence alignée sur la mesure, je ne vois pas d'obstacle.
Path-collision (organ #13359/#13615)Cette PR #16305 (
Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur |
…cellules 13+15) Reponse a la reserve NanoClaw CONCERNS : la cellule 13 enseignait « la latence croît avec ef » alors que l'output commis montre une mediane plate (12.8-14.8 ms de ef=8 a ef=128) puis 5.3 ms a ef=256, avec un p95 stable (~26-27 ms partout) — la chute de mediane n'est pas un gain algorithmique mais un artefact de mesure/cache. La cellule 15 portait la meme classe de defaut, restee sur l'output pre-fix : « toutes a recall@10 = 1.000 » (faux : 0.991/0.998) et « la recherche exacte est le point le plus a droite » (faux : 13.4 ms vs 14.8 ms a ef=8). Markdown-only, aucune cellule code modifiee, aucune re-execution due. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
[DISPOSITION] Réponse à la réserve [BOT-CONCERN] clusterManager-Myia (NanoClaw CONCERNS) — prose latence alignée sur les outputs commis (commit Votre réserve nommait la cellule 13 : « la latence croît avec
Même classe de défaut trouvée et corrigée dans le même geste (cellule 15, « Lecture du résultat » — prose restée sur l'output pré-fix #16226) : « sept lignes, toutes à Vérifications : diff 4+/4− limité aux deux cellules markdown ; — lane 🤖 Generated with Claude Code |
|
Cycle c.1186 worker -- P0 rerun post-DWELL clear prevu 17:50:28Z (job 104475506087). Substance verifiee first-hand au head 30f6852 : c.1180 (mesures post-fix papermill) + c.1189 (NanoClaw CONCERNS leve) + c.1183 (Quarto defect releve par rebase-merge ulterieur, head 30f6852 Quarto SUCCESS 1m34s). Tell c.822 ★ ★ durable 3 conditions remplies (author=self jsboige + issue #16226 [CLAIMED] ma lane claim 2026-09-15T16:58Z + substance LIVREE first-hand). Tell c.598 amendé c.816 R1 worker peut merger. Worker prochain cycle (cron 19:53Z) tentera merge apres rerun PR gate post-DWELL clear 17:50:28Z. |
… (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>
…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>
Grain: DEEP/notebook-python — lane myia-po-2026:CoursIA-2 — prev: MED/guard #16257
Fix(notebooks,#16226): HNSW indexing_threshold=0 cassait le rappel — config corrigée + garde fail-visible
Diagnostic dérive
Cause racine (lue firsthand sur le notebook avant fix) :
indexing_threshold: 0dansoptimizers_configdésactive complètement la construction de l'index HNSW en arrière-plan → toutes les requêtes deviennent des full-scans exacts (full_scan_threshold: 10000Ko au-dessus de la taille réelle ~5000 Ko, donc Qdrant reste en mode scan exact au lieu de basculer sur le graphe).full_scan_threshold: 10000Ko = 10 Mo, bien au-dessus des 5 Mo de données réelles → full-scan reste permis.recall@10 = 1.000pour tous leshnsw_ef ∈ {8..256}, ce qui semble être un exploit du paramètre mais n'en est pas un — c'est la sortie du full-scan exact, identique quelle que soitef.Verdict :
CAUSE_FIXED. La correction porte sur la configuration + une garde fail-visible qui rend visible la régression si elle se reproduit.Le fix
full_scan_threshold: 100Ko (au lieu de 10000) — bien sous les ~5000 Ko de données réelles (10 000 vecteurs × 128 dim × 4 octets = 5 120 000 octets ≈ 5 000 Ko), force Qdrant à utiliser le graphe HNSW au lieu du full-scan.indexing_threshold: 10Ko (au lieu de 0) — au-dessus de 0, lance la construction de l'index HNSW en arrière-plan dès la première ingestion. Une valeur de 0 désactivait la construction complètement (cf. rag(05b): la démo exact/ANN mesure un compromis fantôme — indexing_threshold: 0 ne construit jamais l'index HNSW #16226).Attente active : la cellule 8 lit
indexed_vectors_counten boucle jusqu'à atteindreN_VECTORS(timeout 30 s, sur cette échelle l'index est prêt en < 5 s). Sans cette attente, on mesurerait avant que le graphe ne soit construit — et on retomberait dans le piège.Garde fail-visible :
RuntimeErrorlevée siindexed_vectors_count < N_VECTORSaprès l'attente. C'est l'instrument qui rend visible la régression : un futur commit qui casserait la config ne passerait plus en silence, il ferait échouer bruyamment la cellule 8.Validation post-fix
qdrant_rag05b_testsans auth sur port 6335, propre).recall@10 = 1.000silencieusement). Après le fix, elle déclenche au bon endroit.Cellules mises à jour
full_scan_threshold: 100,indexing_threshold: 10), attente active (30 s), garde fail-visible (RuntimeErrorsi index incomplet).recall@10 ≈ 0.99àef=8, sature vers 1.0 à partir deef=32-64(au lieu du 1.000 factice de la version buggée).Verdict SOTA
RECOVERABLE-MACHINE: le notebook nécessite un conteneur Qdrant Docker (CPU-only suffit, pas de GPU requis) avec authentification désactivée OU clé API en variable d'environnementQDRANT_API_KEY(le notebook actuel n'envoie pas le header Authorization — il faudrait l'ajouter pour brancher un Qdrant authentifié). Sur une machine avec Qdrant accessible (lanes GenAI typiquement), la garde passe et le benchmark produit les mesures attendues.Tell fondateur
Tell NEW c.1180-L1 ★★ fondateur :
indexing_threshold: 0désactive complètement la construction HNSW (cf. doc Qdrantoptimizers_config.indexing_threshold, et la conversation GitHub upstream sur le sujet). Combiné àfull_scan_thresholdau-dessus de la taille réelle de la collection, on obtient un rappel saturé à 1.0 sans aucune construction de graphe — c'est exactement le pattern « trop beau pour être vrai » que #16226 décrit.Refs #16226