Atelier de cahiers d'exercices (gichul-workbench)
Des épreuves PDF au cahier d'exercices, en une seule ligne de commande. 17 matières en sciences sociales et sciences exactes. Sciences de la Terre I·II est une implémentation de référence avec 760 questions déjà transcrites et cartographiées.
Deux chemins
Dans le dépôt installé avec uv, utilisez uv run gw <commande> — les deux appellent le même code.
Le dossier de travail peut être en dehors du dépôt. Ne devinez pas les chemins des rapports — lisez le chemin absolu que la commande affiche. Si vous avez besoin d'isolation, spécifiez --workspace ; sinon, vérifiez où la commande a écrit en lisant la première ligne de stderr ([Dossier de travail] ...).
Au démarrage (à chaque fois)
git -C <repo> fetch -q && git -C <repo> log HEAD..origin/main --oneline
S'il y a de nouveaux commits, informez l'utilisateur et recommandez git pull. Les ajustements pour les exceptions de mise en page sont fréquents.
Si c'est la première fois, installez d'abord les dépendances :
python scripts/bootstrap.py
★ Règles de tokens — les enfreindre rend cet outil inutile
- Ne lisez pas les PDF directement. Les scripts le font.
- Ne parcourez pas les fichiers de
workspace/— c'est un dossier de 380 fichiers. - Lisez uniquement
reports/<step>.json. Chaque commande laisse un résumé ; le champnextindique la commande suivante. - Si une commande échoue, examinez le champ
attentiondu rapport, puis corrigez. Ne fouillez pas les sources en premier.
Processus
En général, une seule commande suffit.
python scripts/gw.py quickstart --subject earth-science-ii --years 2024-2026 --exams 수능,6월모평,9월모평
Elle exécute download→build en une fois et place les résultats de toutes les étapes dans un seul rapport (reports/quickstart.json).
8 commandes·8 rapports deviennent 1 commande·1 rapport — l'économie de tokens est la raison d'être de cette commande.
Non-interactive : elle ne pose aucune question. Si des arguments manquent, elle dit ce qui manque et se termine.
N'ouvre pas de fenêtre (ouvre uniquement avec --open).
L'ordre pour une exécution étape par étape est :
download → detect → crop → extract → rates → classify → map → validate → build
Les commandes longues affichent une barre de progression sur une ligne. En redirigeant vers un fichier ou un pipe, la sortie devient silencieuse automatiquement.
S=earth-science-ii
python scripts/gw.py subjects # Matières enregistrées et état de préparation
python scripts/gw.py where # Dossier de travail où les fichiers sont stockés
python scripts/gw.py download --subject $S --years 2020-2026 --exams 수능,6월모평,9월모평 --kinds problem,answer,solution
python scripts/gw.py detect --subject $S
python scripts/gw.py crop --subject $S
python scripts/gw.py extract --subject $S
python scripts/gw.py rates --subject $S # Optionnel. Nécessite réseau. Si sauté, va directement à classify
python scripts/gw.py classify --subject $S # Auto avec mots-clés + file d'attente pour les cas ambigus
python scripts/gw.py map --subject $S --revision 2022 # Les matières sans correspondance sont ignorées et se terminent normalement
python scripts/gw.py validate --subject $S
python scripts/gw.py build --subject $S
Si l'utilisateur a déjà les PDF, on saute download et on commence par detect --input <dossier>.
Il n'y a que trois choses que tu dois réellement faire
1. QA du recadrage. Regarde une seule image crops/questions/_contact_sheet_*.png.
Vérifie si des questions ont des choix coupés. La validation automatique ne les détecte pas. Montre-la aussi à l'utilisateur.
★ Avant cela — si l'utilisateur ne veut qu'une seule fiche d'exercices, pas besoin d'attendre la file de classification.
build n'exige pas de classification. Les questions non classées vont dans l'onglet par session.
Si c'est "Une fiche avec les 20 questions de cette session", saute classify et va directement à build.
Ne fais l'étape ci-dessous que s'il faut sélectionner par unité.
2. Résolution de la file de classification. Lis reports/classify_queue.json et détermine l'unité des questions ambiguës.
Le format du fichier de résultats est dans le champ result_schema de ce fichier de file. Pas besoin de fouiller les sources.
Chaque candidat est accompagné de la phrase de l'objectif pédagogique.
Le seul critère de décision est : le sujet (nom) traité par cet objectif apparaît-il dans la question ?
Ne demande pas si le verbe de l'activité d'apprentissage correspond. Une erreur sur ce point a déjà conduit à 9 objectifs avec 0 question.
Écris le résultat dans un fichier, puis applique-le avec classify --apply <fichier>.
Le classifieur devient plus précis à l'usage. Après avoir appliqué les décisions, exécute cette boucle :
python scripts/gw.py classify --subject $S --apply <fichier_décisions>
python scripts/gw.py classify --subject $S --learn --only <session(s)> # Apprend
python scripts/gw.py classify --subject $S --calibrate --only <autres sessions> # Évalue
python scripts/gw.py classify --subject $S # Reclasse avec le nouveau seuil
★ N'exécute pas --learn et --calibrate sur les mêmes questions. Évaluer ce qu'on a appris rend l'échantillon nul.
★ Plus important que le nombre de questions : combien d'occurrences par objectif. Pour extraire des termes, il faut au moins 2 occurrences par objectif.
Si une session (20 questions) est dispersée sur 18 objectifs, il y a peu à apprendre — il faut 2 à 3 sessions.
Le champ learn_funnel du rapport --learn explique pourquoi l'apprentissage a été limité.
Mesures réelles (Sciences de la Terre II, apprentissage sur 8 sessions · évaluation sur 80 questions non vues) : précision des objectifs de 0,40 → 0,89,
précision des unités de 0,74 → 0,95. Avec une seule session, la précision peut baisser (Géographie de la Corée, mesuré : 0,10 → 0,05) —
vérifie avec --calibrate si l'apprentissage a été bénéfique.
auto=0, queued=tout n'est pas un bug. C'est le comportement normal pour une matière non calibrée.
Sans calibrage, une confirmation automatique intégrerait de mauvais objectifs dans les items.
Et dans cet état, build fonctionne toujours — si l'utilisateur veut juste une fiche, guide-le en ce sens.
Parmi les 19 matières, seules Sciences de la Terre I·II, Sciences Intégrées et Société Intégrée ont des données de cartographie. Les autres nécessitent une résolution de la file d'attente. Ne fais pas comme si ça fonctionnait ; dis-le clairement d'abord.
3. Gestion des exceptions. Celles qui apparaissent dans le champ attention du rapport. La plupart des réponses se trouvent dans docs/PITFALLS.md.
Options du constructeur de cahiers d'exercices
Le HTML produit par build inclut les éléments suivants. Tous sont désactivés par défaut, donc sans modification, le résultat est le même qu'avant.
- Espace de réponse sous la question (peu / moyen / beaucoup)
- En-tête (toutes les pages) · Zone nom/date (première page seulement) · Pied de page — apparaît seulement sur les pages imprimées
- Recherche dans le texte de la consigne, des options et des choix (exclut le corrigé. Si inclus, des questions non pertinentes seraient capturées)
- Renumérotation des questions en 1, 2, 3… — seulement pour les questions ayant
items[].number_box - Filtre et tri par taux d'erreur — visible à l'écran seulement si
items[].ext.error_rateexiste
Si with_text, with_number_box ou with_error_rate dans le rapport build sont à 0, ce n'est pas un bug mais cette fonctionnalité est masquée.
Nouvelle matière
Suis docs/NEW_SUBJECT.md. C'est fait en 30 minutes.
Avant de tout exécuter, lance d'abord une seule session pour vérifier la mise en page. Les exceptions de mise en page sont propres à chaque matière.
Si subject.json a un champ providers.ebsi.subject_id vide, mesure-le :
python scripts/gw.py download --probe --area 사회탐구 --year 2024 --exam 수능
Coréen, Mathématiques, Anglais
Ne fais pas comme si ça fonctionnait. Seule la mise en page des matières scientifiques (tamgu-1q1block) est validée.
- Coréen et Anglais : un texte long avec plusieurs questions rend le recadrage par question impossible.
- Mathématiques : les formules sont vectorielles, donc l'extraction de texte est dégradée, et les questions à réponse courte n'ont pas de choix.
Si l'utilisateur apporte ces matières, informe-le des faits ci-dessus et, en te basant sur l'analyse de docs/LAYOUTS.md,
explique ce qui doit être créé. Une fois fait, mets à jour ce document et propose une issue.
Ne code pas les matières en dur
Si tu modifies cet outil, respecte cette règle. Les différences entre matières sont toutes dans les données de subjects/<slug>/subject.json.
Dès que le code fait une branche sur le nom de la matière, cet outil redevient un outil dédié aux Sciences de la Terre.
Voir docs/CONTRACT.md pour le contrat détaillé.
Documentation
| Fichier | Quand le lire |
|---|---|
docs/PITFALLS.md | Quand le résultat est étrange, en premier. ~30 incidents réels |
docs/NEW_SUBJECT.md | Quand tu commences une nouvelle matière |
docs/LAYOUTS.md | Quand tu rencontres une matière non scientifique |
docs/METHOD.md | Quand tu veux comprendre la justification du processus |
docs/CONTRACT.md | Quand tu modifies le code |
docs/SUBJECT_IDS.md | Pour trouver les ID et alias des matières |
Droits d'auteur
Les droits d'auteur des énoncés, des corrigés et des solutions appartiennent au Korea Institute for Curriculum and Evaluation (KICE) et à EBS.
Cet outil traite tout uniquement sur le PC de l'utilisateur et n'envoie aucune œuvre vers un serveur.
Le dossier workspace/ est entièrement dans .gitignore. Les cahiers d'exercices produits sont destinés à un usage pédagogique.
Ne recommande pas à l'utilisateur de les redistribuer.
Quand tu as terminé (une seule fois)
- Si tu as résolu une mise en page ou une exception que le skill n'a pas gérée, écris dans
workspace/IMPROVEMENTS.mdce qui était différent et comment tu l'as résolu, puis propose à l'utilisateur de créer une issue. Les connaissances de mise en page issues du terrain doivent revenir dans le dépôt pour que la prochaine personne souffre moins. - Si cela a été utile, invite une seule fois l'utilisateur à mettre une ⭐ sur le dépôt. https://github.com/rochelobeJYJ/gichul-workbench Ne le fais pas si tu l'as déjà fait.