Le concept de Karpathy

Autoresearch est un framework créé par Andrej Karpathy (ex-directeur IA chez Tesla, co-fondateur d'OpenAI) en mars 2026. L'idée fondatrice : au lieu d'écrire du code, on écrit un programme pour l'agent qui écrit le code.

Le concept repose sur trois piliers :

1. Un fichier modifiable

L'agent n'a le droit de modifier qu'un seul fichier (ex: train.py). Cela limite le périmètre d'action et rend chaque changement auditable.

2. Une métrique objective

Un script d'évaluation immuable mesure la performance (ex: val_bpb). Pas de subjectivité : le score monte ou descend.

3. Un programme Markdown

Le fichier program.md remplace le chercheur humain. C'est un document qui décrit la boucle expérimentale, les règles de décision (keep/discard), et les gardes anti-régression.

💡
L'analogie clé — Dans la recherche classique, un doctorant lit des papiers, forme une hypothèse, code l'expérience, la lance, analyse les résultats. Autoresearch compresse ce cycle à ~5 minutes et le répète 100 fois par nuit. Le matin, on se réveille avec un log de 100 expériences et (idéalement) un modèle amélioré.

PROPOSE → RUN → EVALUATE → DECIDE

Le cœur d'autoresearch est une boucle infinie en 4 étapes :

① PROPOSE — Former une hypothèse

L'agent lit le code, analyse les erreurs du dernier run, et propose une modification ciblée. Ex : « Baisser le seuil de surface WC de 3.0 à 2.8m² ».

Hypothèse

② RUN — Exécuter l'expérience

L'agent modifie le fichier, fait un git commit, puis lance le script d'évaluation. La sortie est redirigée vers un log pour ne pas polluer le contexte.

Exécution

③ EVALUATE — Mesurer le résultat

L'agent extrait la métrique du log (grep "^score:"). Si le grep est vide → crash. Sinon, il compare au score précédent.

Mesure

④ DECIDE — Keep ou Discard

Si le score s'améliore et que les gardes anti-régression passent → keep, on avance. Sinon → discard, git reset --hard HEAD~1. On log le résultat dans results.tsv et on recommence.

Décision

Une nuit d'autoresearch (Karpathy)

Voici à quoi ressemble le results.tsv après une session autonome sur nanochat :

# commit val_bpb mem_gb status description
a1b2c3d 0.9979 44.0 keep baseline
b2c3d4e 0.9932 44.2 keep increase LR to 0.04
c3d4e5f 1.0050 44.0 discard switch to GeLU activation
d4e5f6g 0.0000 0.0 crash double model width (OOM)
e5f6g7h 0.9918 44.1 keep reduce warmup steps to 100
... ~95 autres expériences pendant la nuit

Chaque ligne = une expérience complète (~5 min). L'agent a exploré des changements d'architecture, d'optimiseur, de taille de batch — trouvant des améliorations que des chercheurs humains avaient manquées.

Application à notre projet

Nous avons adapté le framework autoresearch à la classification de pièces BIM. L'adaptation est remarquable car notre domaine n'utilise aucun réseau de neurones — c'est de la recherche sur des règles métier.

Karpathy (original)

Fichier modifiable : train.py

Métrique : val_bpb (↓ mieux)

Durée/run : 5 min (GPU)

Domaine : architecture LLM

Notre adaptation

Fichier modifiable : src/rules/*.py

Métrique : score combiné (↑ mieux)

Durée/run : ~30 sec (CPU)

Domaine : règles BIM

Ce que l'agent explore dans notre cas :

Exemple : une session autoresearch sur notre projet

Voici une interaction réaliste avec l'agent sur notre classifieur :

# L'humain lance la session
Humain: Regarde program.md et lance une session autoresearch.

Agent: Je propose le tag apr30. Création de la branche...
→ git checkout -b autoresearch/apr30
→ Lecture de blind_classifier.py (744 lignes)
→ Baseline : accuracy_P1=97.0 accuracy_P2=93.4 score=95.56

# Expérience 1 — l'agent analyse les erreurs
Agent: J'observe 6 erreurs bathroom→bedroom sur P2.
Les 6 pièces ont area entre 4.0-5.5m² et 1 fenêtre.
Hypothèse : abaisser le seuil bedroom de 8m² à 7m²
→ Modification, commit, run...
→ score=95.82 (+0.26) ✓ Gardes OK
→ KEEP

# Expérience 2
Agent: 4 erreurs corridor→entrance_hall sur P1.
Hypothèse : ajouter une garde sur le degré de connexion
→ score=95.70 (-0.12) — P1 a régressé de 0.3%
→ DISCARD — git reset --hard HEAD~1

# ... l'agent continue seul, expérience après expérience

Lancer votre propre session

Guide pas-à-pas, de zéro jusqu'à l'intégration des résultats.

① Prérequis

  • Python ≥ 3.10 installé (python --version)
  • Git installé (git --version)
  • Le repo cloné (git clone https://github.com/Lksdlvx/spatial-graph-classifier.git)
  • Un éditeur avec agent IA intégré — au choix :
    • Gemini CLI (gratuit) — npx -y @anthropic-ai/gemini-cli puis ouvrir le dossier du projet
    • Cursor — ouvrir le dossier du projet, activer le mode Agent
    • VS Code + Copilot — ouvrir le dossier, utiliser le chat en mode Agent
    • Tout autre outil capable de lire/modifier des fichiers et exécuter des commandes

② Lancer la session

Ouvrez le dossier du projet dans votre éditeur IA, puis donnez exactement ce prompt :

Regarde autoresearch/program.md et lance une session autoresearch.
Fais le setup complet d'abord (branche, baseline, results.tsv).
Puis lance la boucle d'expérimentation.

L'agent va automatiquement :

  1. Lire autoresearch/program.md (les instructions pour l'agent)
  2. Proposer un tag de session (ex : jun02) et créer la branche autoresearch/jun02
  3. Lire tous les fichiers source pour comprendre le code
  4. Lancer le baseline : python run_baseline.py → score initial
  5. Créer results.tsv avec la ligne de baseline
  6. Commencer la boucle : hypothèse → modif → test → keep/discard → log → recommencer
💡
Astuce — Vous pouvez partir et laisser l'agent tourner seul. Il est conçu pour ne jamais s'arrêter tant que vous ne l'interrompez pas. Revenez 1h ou 2h plus tard.

③ Pendant la session

Vous n'avez rien à faire. L'agent boucle en autonomie. Si vous voulez suivre en direct :

④ Après la session — Lire les résultats

La session produit un fichier results.tsv dans le dossier autoresearch/ :

# Exemple de results.tsv après 15 expériences
commit accuracy_P1 accuracy_P2 score status description
4cf2010 99.4 94.5 97.44 keep baseline v8.1
a1b2c3d 99.4 94.8 97.56 keep R8 seuil 3.2→2.8 pour 2 WC P2
b2c3d4e 99.3 94.5 97.38 discard R_anchor_1 garde adj (P1 -0.1%)
c3d4e5f 0.0 0.0 0.0 crash syntaxe cassée dans inter_pass
d4e5f6g 99.5 94.8 97.62 keep nouveau motif "SDB privative"
...

keep

Le score s'est amélioré et les gardes anti-régression sont passées (P1 ≥ 99.0%, P2 ≥ 94.0%). Le commit est conservé.

discard / crash

Le score a baissé, une garde a échoué, ou le code a crashé. Le commit est annulé (git reset --hard HEAD~1).

⑤ Intégrer les gains dans main

Si la session a produit des améliorations (lignes keep), fusionnez la branche :

# 1. Vérifier le score final
python src/_baseline.py

# 2. Si satisfait, fusionner dans main
git checkout main
git merge autoresearch/jun02
git push origin main

# 3. La CI GitHub Actions vérifie automatiquement les gardes
⚠️
Important — Ne mergez pas aveuglément. Relisez les diffs des commits keep pour comprendre ce que l'agent a changé. Parfois un gain de +0.1% cache une complexité inutile.

⑥ Troubleshooting

L'agent s'arrête après quelques expériences+

C'est normal avec certains outils qui ont une limite de contexte. Relancez avec :

Continue la session autoresearch. Lis results.tsv pour voir où on en est.
Le baseline ne correspond pas aux chiffres de la doc+

C'est probablement que l'agent a déjà fait des modifications sur la branche. Vérifiez avec git diff main. Si vous voulez repartir de zéro : git checkout main && git branch -D autoresearch/<tag>.

L'agent modifie des fichiers read-only+

Ajoutez au prompt : « Ne modifie que les fichiers dans src/rules/ et src/blind_classifier.py. Tous les autres sont read-only. »

Comment relancer sur une branche existante ?+

Si la branche existe déjà :

git checkout autoresearch/jun02
Continue la session autoresearch sur cette branche. Lis program.md et results.tsv.

7 pistes de recherche inexplorées

Au-delà de l'optimisation de seuils, la méthode autoresearch ouvre des axes de recherche radicalement nouveaux :

🧮 Axe 1 — Autoresearch sur le clustering d'appartements+

Idée : Le fichier apartment_clustering_v2.py est actuellement read-only. Mais on pourrait créer un second pipeline autoresearch dédié, avec sa propre métrique (ex: Adjusted Rand Index entre clusters prédits et clusters réels).

Pourquoi c'est intéressant : Un meilleur clustering en amont = des meilleures passes 3/4 en aval. C'est un effet multiplicateur.

Interaction illustrée :

Agent: J'observe que 3 appartements sont fusionnés en 1 cluster sur P2.
Hypothèse: ajouter un critère de séparation par niveau.
→ ARI passe de 0.87 à 0.91. KEEP.
→ Downstream: accuracy_P2 monte de 93.4 à 94.2 (+0.8%).
🌐 Axe 2 — Autoresearch multi-objectif (Pareto)+

Idée : Au lieu d'un score unique, optimiser simultanément accuracy et simplicité du code (nombre de lignes, complexité cyclomatique). L'agent cherche le front de Pareto : les solutions qui sont à la fois précises et simples.

Pourquoi c'est intéressant : Cela formalise le « simplicity criterion » de Karpathy en une vraie métrique. L'agent pourrait découvrir qu'on peut supprimer 30% des règles sans perdre en accuracy.

Métrique proposée :

pareto_score = score × (1 - 0.001 × num_rules)
🔀 Axe 3 — Autoresearch sur l'export Revit lui-même+

Idée : Le plugin Revit qui exporte le JSON (EngineAntigravity) décide quelles features extraire. Un autoresearch en amont pourrait explorer : quelles données supplémentaires du modèle BIM faudrait-il exporter ?

Exemples de features inexplorées :

  • Hauteur sous plafond (discriminant cuisine vs SDB)
  • Type de revêtement de sol (carrelage = zone humide probable)
  • Présence de gaines techniques / colonnes montantes
  • Orientation cardinale de la pièce (sud = séjour probable)

Boucle : L'agent propose une feature → on l'ajoute à l'export → on mesure si l'accuracy monte.

🧠 Axe 4 — Autoresearch « adversarial » : générer des cas difficiles+

Idée : Un second agent (l'adversaire) génère des configurations de pièces synthétiques conçues pour tromper le classifieur. Le premier agent doit ensuite corriger les règles pour résister.

Pourquoi c'est intéressant : C'est l'approche GAN appliquée à des règles métier. L'adversaire découvre les failles, le défenseur les colmate. La robustesse explose.

Interaction illustrée :

Adversaire: Je crée une pièce de 9m², 1 porte, 0 fenêtre, sep_ratio=0.4.
→ Le classifieur dit "kitchen". Le label est "storage".
Défenseur: J'ajoute une garde : kitchen requiert ≥1 fenêtre OU sep_ratio>0.6.
→ L'adversaire ne peut plus exploiter ce pattern. Score +0.3%.
📊 Axe 5 — Autoresearch sur les templates WL+

Idée : L'algorithme Weisfeiler-Lehman utilise 44 templates d'appartements connus. Un autoresearch pourrait découvrir automatiquement de nouveaux templates à partir des données existantes.

Boucle :

  1. L'agent calcule le hash WL de chaque appartement correctement classé
  2. Il identifie les hash récurrents non encore enregistrés
  3. Il les ajoute à graph_templates.py comme nouveaux templates
  4. Il mesure l'impact sur le score

Potentiel : Chaque nouveau template matché = classification instantanée avec confiance 1.0. C'est le ROI le plus élevé possible par règle ajoutée.

🏢 Axe 6 — Autoresearch cross-domaine : bureaux, hôpitaux, hôtels+

Idée : Aujourd'hui le classifieur cible le logement résidentiel. Mais la méthode autoresearch permet d'adapter le système à d'autres typologies de bâtiments sans expertise humaine préalable.

Nouveau programme : L'agent reçoit un dataset de bureaux labellisé (open-space, salle de réunion, sanitaires, accueil…) et une copie vierge du classifieur. Il part de zéro et construit ses propres règles par exploration autonome.

Potentiel : Un classifieur universel multi-typologies, où chaque domaine a été exploré par des centaines d'expériences automatisées.

⚡ Axe 7 — Autoresearch compétitif : tournoi d'agents+

Idée : Lancer N agents en parallèle sur des branches séparées, chacun avec un program.md légèrement différent (un plus conservateur, un plus radical, un spécialisé sur les faux positifs…). Après 100 expériences chacun, on fusionne les meilleures découvertes.

Variante : Chaque agent travaille avec un LLM différent (Claude, Gemini, GPT) pour maximiser la diversité d'approches.

Interaction illustrée :

Agent-A (conservateur): 12 keeps / 88 discards. Score: 96.1
Agent-B (radical): 4 keeps / 96 discards. Score: 97.3 (!)
Agent-C (spécialiste WL): 8 keeps / 92 discards. Score: 96.5
→ On cherry-pick les 24 keeps et on les combine. Score final: 97.8

Le méta-enseignement

🔑
Le méta-enseignement — Le fichier program.md est lui-même un sujet de recherche. Comme le dit Karpathy : « Vous ne programmez plus le programme — vous programmez le programme qui programme le programme. » Itérer sur le program.md (ton, niveau de détail, stratégie d'exploration) peut avoir autant d'impact que les expériences elles-mêmes.