§0 このプロジェクトは何をしているか
研究の現場では、人間がやっている作業の大半は実は手続き的な作業です。論文を読んで実装を真似する、ハイパラを変えて再実験する、関連論文を探す、結果が論文と一致するか検証する — こうした作業を AI が自動でできるようになれば、人間は「何を研究すべきか」という創造的な判断に集中できます。
このプロジェクトでは、研究のサイクル全体を 4 つの独立した CLI ツールに分解しました。それぞれが単独でも価値を生み、組み合わせると end-to-end の研究エージェントになります。
4 つの道具と、それぞれが担当する研究ステップ
| ① Literature Scout | 「気になるトピックの最近の論文を集めてくる」(pull 型の文献調査) |
|---|---|
| ② Reproduce Pipeline | 「arXiv URL を入れたら論文を再現してくれる」(5 ステージの自動再現) |
| ③ PaperBench Iter | 「再現コードのスコアが低いとき、AI が分析して改善版を出す」(反復改善ループ) |
| ④ Self-Improving Agent | 「弱いモデルを与えると、AI が勝手に train.py を書き換えて精度を上げる」(24/365 自己改善) |
以降、それぞれの道具のタスク(何を解こうとしているか)と手法(どう設計したか)を、必要な前提技術を含めて説明します。
§0.5 前提となる技術・用語
本ページに何度も出てくる用語の最小限の説明です。すでにご存知なら飛ばして §1 へ。
Claude Code はその CLI 版で、ファイル読み書き・シェル実行・スキル呼び出しなどを通じて複雑なタスクを実行する。本プロジェクトのエージェント基盤。arXiv:2310.03725proceed / caution / avoid を返す。Karpathy 本家・autoresearch-lite・miolini macOS 版の 3 つのフォークに統合済み。venv はプロジェクトごとに Python 環境を分ける軽量な手段。Docker はもっと包括的で OS レベルから隔離するが、論文 arXiv:2601.12811 によれば Docker でも完全な再現性は保証できない。本プロジェクトでは venv ベースで進めている。§1 PaperBench Iteration — 再現コードを反復改善する
その code を PaperBench rubric(58 ノードの評価ツリー)で採点する。
低スコアのノードを分析して改善版コードを Claude に再生成させる。これを反復してスコアが伸びるか検証する。
提案手法 — generate-then-iterate
多くの再現エージェント(DeepCode、IterativeAgent 等)は「1 回コードを生成 → 評価」で止まります。我々は 「生成 → 評価 → 失敗分析 → 改善コード生成」を反復する ことでスコアを引き上げます。背景の問題意識:
- 業界の再現エージェントは 1-shot 生成が主流で、PaperBench Code-Dev で 43-75% に頭打ち
- 人間の研究者は「初稿 → 動かして直す → また直す」と反復して仕上げる
- AI も同じことをすればスコアは伸びるはず(仮説)
1 反復のステップ
- 初期コードを生成: Reproduce Pipeline の Stage 2(Code Finding)で Claude が論文記述だけからコードを書く(v0 = baseline)
- PaperBench で採点: SimpleJudge(claude-sonnet-4)が 58 ノードの rubric を 0〜100 で採点。
0-25 / 26-50 / 51-75 / 76-100の 4 段階で集計 - 低スコアノードを抽出: スコアが低かった項目とその reasoning(「なぜ低かったか」の説明)を集める
- 改善コードを生成: 論文 + 既存コード + 低スコアの分析結果を Claude に渡し、改善版を作らせる(v1, v2)
- 再採点: 同じ rubric で新コードを採点。スコア推移を記録
実処理の流れ — どこで Claude が呼ばれ、何が起きているか
論文記述から実装を一から生成"] C --> D["v0 code"] D --> E["PaperBench SimpleJudge
Claude #40;sonnet-4#41; が 58 ノードを採点"] E --> F["v0 = 43.2%
各ノードに score + reasoning"] F --> G["低スコアノード抽出"] G --> H["Claude
論文 + v0 code + 失敗分析を入力
→ 改善版コードを生成"] H --> I["v1 code"] I --> J["再採点"] J --> K["v1 = 67.5%"] K --> L["同じ反復"] L --> M["v2 = 94.5%"] style C fill:#fff8e1,stroke:#f9a825 style E fill:#fff8e1,stroke:#f9a825 style H fill:#fff8e1,stroke:#f9a825 style M fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px
各反復で具体的に変えたこと(Stochastic Interpolants の例)
| 反復 | 主な変更点(人間が見ても分かるレベルで) |
|---|---|
| v0 → v1 | ImageNet データを HuggingFace から取得するように変更 / 64-tile マスク戦略の実装 / step ベース訓練(200,000 ステップ)に変更 / クラス条件付けを追加 |
| v1 → v2 | 論文指定の Dopri5 ODE ソルバ(torchdiffeq)に切替 / FID 評価コード追加 / Uncoupled モデルの分離 / ODE 関数のラッピング修正 |
結果が示すこと
- v0 = 43.2%: 1 回生成だけで IterativeAgent o1-high の 20 本平均(43.4%)とほぼ同等。「初期生成は SOTA レベル」
- v2 = 94.5%: 2 回反復で同じ論文に対し SOTA を超える
- 反復改善ループは効くことの単一論文での実証 ✓
§2 Self-Improving Agent — モデルを自動で改善し続ける
train.py(訓練スクリプト)を自動で書き換えて再訓練し、精度を改善し続ける自己改善ループ。Karpathy の autoresearch を発展させ、失敗履歴の管理(NRR)と退行時の自動ロールバックを追加した最小実装。
人手の介入なしに
train.py を自動で書き換えて、85%+ に伸ばすことを目指す。「止まらない研究エージェント」の最小プロトタイプ。提案手法 — autoresearch + NRR + rollback
Karpathy の autoresearch(edit → execute → measure → evaluate のループ)は「動く」が、長く回すと同じ失敗方向を繰り返す傾向があります(LLM の弱点)。本コンポーネントは 3 つの拡張で対処:
- NRR 統合: 失敗実験を構造化保存。新提案に対して
proceed / caution / avoidを返し、avoidなら別方向を強制 - 自動ロールバック: 精度が best から大きく退行したら、自動で best チェックポイントに戻す
- 提案カテゴリの強制多様化: scheduler / regularization / architecture / optimizer / augmentation / other の 6 種類から偏らずに選ばせる
1 サイクルの流れ
- 現在の
train.pyで訓練(CPU で 1-3 分)→ CIFAR-10 テスト精度・損失を測定 - Claude が失敗分析: なぜこの精度なのか、どこを変えれば改善できそうか
- Claude が改善案を提案(カテゴリ + 具体的な diff)
- NRR が過去の類似失敗を照合:
proceed/caution/avoidを返す。avoidなら別方向を Claude に再提案させる train.pyを自動修正して再訓練- 精度が best から大きく退行したら自動ロールバック。そうでなければ次サイクルへ
- 結果(精度・損失・提案内容・diff)を
cycle-NNNN.jsonに記録
実処理の流れ — 1 サイクルで何が呼ばれるか
CIFAR-10 でテスト精度測定"] B --> C{"精度 vs best"} C -->|"退行 #40;Δ大きく負#41;"| RB["best チェックポイントへ自動ロールバック"] C -->|"通常"| D["Claude
失敗分析 + 改善案生成
#40;6 カテゴリから1つ#41;"] D --> E["NRR check_proposal#40;#41;
過去の類似失敗を照合"] E --> F{"判定"} F -->|"avoid"| G["Claude に別方向を再提案させる"] G --> E F -->|"proceed / caution"| H["train.py を自動修正
#40;diff を適用#41;"] H --> I["再訓練"] I --> J["cycle-NNNN.json に記録
#40;精度・損失・diff・カテゴリ・信頼度#41;"] J --> A RB --> A style D fill:#fff8e1,stroke:#f9a825 style G fill:#fff8e1,stroke:#f9a825 style E fill:#f0f4ff,stroke:#0066cc
avoid を返したら強制的に別方向を提案させる仕組みが、LLM の偏りを抑える鍵。実際に走った 5 サイクル(結果ページの数字に対応)
| サイクル | 提案 | 結果 |
|---|---|---|
| 1 | StepLR スケジューラ追加 | 精度 0.6782(baseline) |
| 2 | FC 層に dropout 追加 | 0.6861(+0.008) |
| 3 | 3 つ目の畳み込み層 + BatchNorm 追加 | 0.6224(退行、より深く=より弱い) |
| 4 | BatchNorm を GroupNorm に置換 | 0.6957(best) |
| 5 | 4 つ目の畳み込み層追加 | 0.6416(退行、容量増やしすぎ) |
結果が示すこと(工学的知見)
- 毎サイクル改善するわけではない: 5 回中 2 回は退行。LLM が常に賢い提案をするわけではない
- LLM の提案には偏りがある: 何度も同じ方向(深くする・容量増やす)を提案しがち。NRR が無いと延々と同方向で失敗を続ける
- ロールバックが死活的: 退行を放置すると best が失われる。自動ロールバックがあれば「悪い試行は無害化」できる
§3 Reproduce Pipeline — arXiv URL から再現結果まで
https://arxiv.org/abs/2310.03725)出力: 再現コード + 実行結果 + 「論文の数値と一致したか」の検証レポート。
人間の介入なしに完走することを目指す。
背景の問題意識
研究自動化の最大ボトルネックは 環境構築(成功率 < 7% / EnvBench)と 実行検証(end-to-end 数値一致 0% / PRBench)です。コード生成自体(PaperBench Code-Dev で 75% 程度)はかなり commoditize していますが、実際に動かして論文の数値が出るところは未解決の領域です。本コンポーネントはこのパイプライン全体を観測可能にし、どこで何が起きているかを分解します。
5 ステージの設計
- Paper Fetching(論文取得・解析) 〜15 秒
arXiv API で PDF 取得 → Claude が方法論・claims(主張する数値)・hyperparameters を構造化抽出。なぜ Claude か: 構造化抽出は LLM が得意、ヒューリスティックパーサーより堅牢。 - Code Finding(コード取得・生成) 〜90 秒
論文に公式 GitHub があればクローン、なければ Claude が論文記述から実装を生成。なぜ生成 fallback: 論文の 60-70% は公開コード無し or 部分的のため、生成パスが必要。 - Environment Building(環境構築) 〜0.3 秒
Python venv 作成 + 依存解決。なぜ Docker 不採用: arXiv:2601.12811 が「Docker でも完全な再現性は保証されない」と示している。まず軽量な venv で進める。 - Experiment Execution(実験実行) 〜56 秒
訓練スクリプトを実行、GPU/CPU 自動判定、stdout/stderr を構造化キャプチャ - Result Verification(数値検証) <1 秒
Claude が論文の Table/Figure から数値を抽出 → 実行結果の metrics と±5%許容で比較。一致しなければ理由を記録
実処理の流れ — 5 ステージそれぞれで何が起きるか
論文から claims/hyperparams を構造化抽出"] S1b --> S2["Stage 2: Code Finding #40;~90s#41;"] S2 --> S2a{"公式 GitHub あり?"} S2a -->|"yes"| S2b["clone"] S2a -->|"no"| S2c["Claude
論文記述から一から生成"] S2b --> S3["Stage 3: Env Building #40;~0.3s#41;"] S2c --> S3 S3 --> S3a["venv 作成 + 依存解決"] S3a --> S4["Stage 4: Execution #40;~56s#41;"] S4 --> S4a["訓練/推論実行 + stdout/stderr キャプチャ"] S4a --> S5["Stage 5: Verification #40;<1s#41;"] S5 --> S5a["Claude
論文 Table から数値抽出 → 実行結果と ±5% 比較"] S5a --> R["再現スコア + claim 検証結果"] style S1b fill:#fff8e1,stroke:#f9a825 style S2c fill:#fff8e1,stroke:#f9a825 style S5a fill:#fff8e1,stroke:#f9a825
Stochastic Interpolants での実走 — 161 秒で完走
5 ステージ全て成功で、合計 161 秒。人手なら数時間の作業がエージェント単独で完了。ただし再現スコアは 0.5(後述)。
Code Finding が時間の 56% を占める理由
Stochastic Interpolants には公式 GitHub があるが、Claude による生成 fallback を選択したため、論文を読んで一からコードを書く時間(90 秒)が長くなった。公式コードをクローンする選択肢なら数秒で済む。これは設計上のトレードオフ(生成精度 vs 速度)。
結果が示すこと
- 5 ステージ全て成功・合計 161 秒で完走 ✓
- 再現スコア 0.5: 3 つの数値主張のうち
untested(実行出力に該当 metric が無かった)が多かった - つまり 「動かすところまでは行った」が「数値完全一致は未達」。これは EnvBench / PRBench で示された業界全体のギャップと一致
- 残課題: Stage 2(コード生成精度)は §1 PaperBench Iter で +51.3pp 改善できることを実証済み。Stage 5(数値抽出)は強化が必要
§4 Literature Scout — 関連論文の自動発見
"self-improving ML agents" --context "Building a system that autonomously improves model performance"出力: 関連度(0.0〜1.0)+ 判断理由付きの論文カード(5〜10 件)
所要時間: 30〜60 秒
背景: push 型 vs pull 型の文献調査
本プロジェクトには既に Intel というpush 型の自動収集システムがあり、5 つのコレクターが日次で 200+ 件の論文・ブログを収集しています。これは「毎日勝手に入ってくる」ストリーム型。
一方 Literature Scout は pull 型: 「いま、この瞬間に、このトピックを深掘りたい」というオンデマンドの問いに応える道具。両者を使い分けます。
動作の流れ
- ユーザーが自然言語クエリ + 任意の
--context(進行中研究の説明)を入力 - arXiv API と Semantic Scholar API を並列呼出(同じクエリでも取れる論文集合が大きく異なるため、両方叩く)
- 各論文の title + abstract を Claude に渡す
- Claude が
--contextに対する関連度(0.0〜1.0)+ 判断理由を出力 - 関連度でソート、上位 N 件を CLI 出力
実処理の流れ — クエリから論文カードまで
クエリ + --context"] --> P1["arXiv API
キーワード検索"] Q --> P2["Semantic Scholar API
意味検索"] P1 --> M["重複除去 + マージ"] P2 --> M M --> CL["Claude
各論文の title+abstract を読み
--context に対する関連度+理由を出力"] CL --> R["関連度ソート"] R --> O["上位 N 件の論文カード
#40;関連度 + 判断理由 + arxiv_id#41;"] style CL fill:#fff8e1,stroke:#f9a825 style P1 fill:#f0f4ff,stroke:#0066cc style P2 fill:#f0f4ff,stroke:#0066cc
なぜ 2 ソース並列か
arXiv は preprint(査読前)中心で機械学習の最新動向に強い。Semantic Scholar は引用ネットワークと意味検索が強く、「同じトピックで似た論文」を取りやすい。同じクエリで取れる論文集合が大きく異なるので、両方叩いて重複除去するのが取りこぼしを最小化する設計です。
Claude による関連度判定が効く理由
title + abstract のキーワードマッチだけでは「関連あり」と「真に役立つ」の区別が難しい。--context として「ML 実験を自律実行して精度改善するシステムを作っている」のような文脈を Claude に渡すと、「この研究文脈で読む価値があるか」を判定してくれます。判断理由(reasoning)も同時に出るので、なぜ関連と判定したかが透明です。
結果が示すこと
- 30〜60 秒で関連論文リストが返る(API 呼び出し + Claude 分析の合計)
- Intel(push)と Scout(pull)の使い分けで「毎日勝手に入ってくる」+「気になった瞬間に深掘れる」が両立
- 残課題: 関連度判定の精度評価、autoresearch の
program.md(次に試すべき手法リスト)への自動追記との連携
§5 4 コンポーネントの関係 — 個別と統合
4 つはそれぞれ単独で動く独立した CLI ツールですが、組み合わせると研究の end-to-end ループになります。
シナリオ別の使い分け
| やりたいこと | 使うコンポーネント |
|---|---|
| 新トピックの論文を探したい | ① Literature Scout |
| 気になる論文を再現したい | ② Reproduce Pipeline |
| 再現コードを SOTA レベルに引き上げたい | ③ PaperBench Iter |
| 新しいモデル / ハイパラを自動で探させたい | ④ Self-Improving Agent |
| 上記を全部つなげて止まらない研究エージェントにしたい | 4 つを統合運用(最終形) |
統合運用 — 4 コンポーネントが end-to-end でどう繋がるか
例: self-improving ML agents"] --> LS["① Literature Scout
関連論文リスト #40;5-10件#41;"] LS --> SEL["人間 or Claude が 1 本選ぶ"] SEL --> RP["② Reproduce Pipeline
arXiv URL → 5 ステージ #40;~3分#41;"] RP --> RPout["再現コード v0 + 実行結果
+ 再現スコア"] RPout --> CHECK{"スコア許容?"} CHECK -->|"低い"| PB["③ PaperBench Iter
反復改善ループ"] PB --> PBout["改善コード v1, v2..
#40;43% → 67% → 94%#41;"] PBout --> SI CHECK -->|"OK"| SI["④ Self-Improving Agent
ハイパラ/アーキテクチャ自動探索
#40;NRR + rollback#41;"] SI --> NEW["新しい知見
#40;改善された train.py +
失敗パターン蓄積#41;"] NEW --> KNOW["知見ストア #40;NRR + claims#41;"] KNOW -.->|"次の探索を方向づける"| LS style LS fill:#e3f2fd,stroke:#1976d2 style RP fill:#e3f2fd,stroke:#1976d2 style PB fill:#e3f2fd,stroke:#1976d2 style SI fill:#e3f2fd,stroke:#1976d2 style KNOW fill:#fff8e1,stroke:#f9a825
同じことを別の見方で(時間軸)
- 朝 Literature Scout が「今日の関連論文 5 本」を返す(30 秒)
- 選択 1 本を選ぶ(人間 or 自動)
- 3 分後 Reproduce Pipeline が再現完了。Stage 2 のコードと再現スコアが出る
- 15 分後 PaperBench Iter で 2 反復まわす。スコアが 43% → 67% → 94% と上がる
- 1 時間後 Self-Improving Agent が改善された
train.pyを走らせ、ハイパラ自動探索を開始 - 翌朝 新しい知見(改善版モデル + 失敗パターン)が NRR に蓄積される。次の Literature Scout がこれを参考に次の論文探索を方向づける
残された大きな課題(AutoRes グループとして取り組みたい領域)
- 環境構築の堅牢化: 業界全体で 7% 未満の成功率。最大のボトルネック。Docker や仮想化を超えた解が必要
- 数値結果の検証強化: PRBench end-to-end は 0%。論文の Table/Figure から正確に数値を取り出し、実行出力と比較する仕組みが弱い
- 暗黙知の補完: 論文に書かれない関係的・身体的・集団的知識(コード作者と話さないと分からない細部)
- 長時間運用の安定性: 24/365 ループのメモリ管理、コスト管理、ドリフト検出
これらは AutoRes グループとして次の 12〜18 ヶ月で取り組むべき領域です。各コンポーネントを個別に磨きつつ、統合運用への橋渡しを進めていきたいと考えています。
§6 並行実験のセットアップ — agent に同じ問題を解かせる
何をするセクションか
§3 Reproduce Pipeline の続編 (Deep Dive) で、 「Reproduce Pipeline を強くする」というタスクを 人間 + Claude の手作業 と 自律研究エージェント (ARA) 2 系列に並列で投げ、結果を比較しました。 このセクションでは、その実験をどう setup したかを説明します。 方法論として「agent に研究タスクを並行で投げる」フローを再利用可能にするのが目的です。
登場する 3 つのリポジトリ
| autonomous-research-agent (ARA) | 自律研究エージェント本体。scripts/sustainer.sh が Researcher → Evaluator → Reviewer → Improver の 4 phase を 1 cycle として回す。
charter (research-charter.md) で「AI 研究自動化の自動化」を明示しているので、メタな自己改善タスクに向く。 |
|---|---|
| research-prime | ARA + AI-Research-SKILLs (Orchestra) を融合したスキル集約リポ。Phase α で autonomous runner はまだ無いが、
skills/ 以下に 123 件の SKILL.md を持つ (ARA 16 + Orchestra 95 + 新規 12)。
本実験では「skills だけ拝借して ARA harness で回す」という使い方をした。 |
| autores/reproduce | 本日のタスク対象。§3 で説明した 5 stage の Reproduce Pipeline。
ARA からは 読み取りのみ、改善案は ARA project 内 experiments/ に閉じる。 |
セットアップフロー (Mermaid)
PaperBench Code-Dev で
hierarchical_score を上げる"] Q --> SCAFFOLD["scripts/new-research.sh
(ARA 標準の scaffold)"] SCAFFOLD --> A_DIR["runs/2026-04-30-reproduce-automation-ara/
.claude/skills = 15 (ARA 同梱)"] SCAFFOLD --> P_DIR["runs/2026-04-30-reproduce-automation-prime/
.claude/skills = ?"] P_DIR -->|"rsync research-prime/skills/"| P_DIR2[".claude/skills = 123
(ARA 16 + Orchestra 95 + new 12)"] A_DIR --> A_RUN["sustainer.sh --loop 2
tmux ara-reproduce-a"] P_DIR2 --> P_WRAP["sustainer-no-infra-update.sh
(skills を rsync --delete で
wipe しないため sed wrapper)"] P_WRAP --> P_RUN["sustainer.sh --loop 2
tmux ara-reproduce-p"] A_RUN --> A_OUT["claims, ledger,
experiments, reports"] P_RUN --> P_OUT["claims, ledger,
experiments, reports"] classDef question fill:#fff8e1,stroke:#f9a825,stroke-width:2px; classDef scaffold fill:#f0f4ff,stroke:#0066cc; classDef run fill:#f0fff4,stroke:#0066cc; classDef out fill:#e3f2fd,stroke:#1976d2; class Q question class SCAFFOLD,A_DIR,P_DIR,P_DIR2,P_WRAP scaffold class A_RUN,P_RUN run class A_OUT,P_OUT out
「ペッコ (project copy isolation)」 — 元 repo を汚さない
ARA の scripts/new-research.sh は、研究テーマごとに
runs/<name>/ という独立 dir を作り、.claude/ (skills, hooks, agents, settings)、
research-workspace/、pyproject.toml、独立 git を完全コピーします。元の ARA repo は変更されません。
これによって複数の研究プロジェクトを並列で動かしても、互いの skill 検証や ledger を汚染し合わない仕組みになっています。
4 phase ループ (sustainer)
- Researcher — research-question.md と前 session の current-focus.md を読み、 文献調査・仮説生成・実装・検証の 1 ターンを回す。Belief Store に Claim を起票し、Ledger に試行記録を残す。
- Evaluator — Researcher の Claim と Ledger を読み直し、誇張・未検証・mock を flag。 findings-registry.md を更新。これが「agent が自分の主張を盛らない」内蔵ガード。
- Reviewer — Evaluator の findings に基づき、次 session の優先タスクを current-focus.md に固定。
- Improver — systematic な問題があれば ARA 自体のコード/skill を修正提案。 改善 PR は git stash + commit で記録、cohesion 検証後に採択。
--loop 2 指定で 2 cycle 連続実行 = 8 phase。
主体 B は完走、主体 C は cycle 1 の Reviewer に進む前で harness 早期 exit (set -e 周辺の未調査バグ)。
これは ARA harness 自体の改善ネタ (= 主体 C が cycle 2 で取り組むはずだった項目)。