📄

論文を読んで終わりにしないローカル研究ジムResearch Dojoを作った

に公開1

はじめに

論文を読むときに、一番怖いのは「分かった気になる」ことだと思っている。

Abstractを読んで、Introductionを読んで、図を眺める。
なんとなく主張は分かった気がする。
でも、いざ人に説明しようとすると急に詰まる。

  • 既存研究に対して何が新しいのか
  • 手法のどの仮定が効いているのか
  • 実験は本当にその主張を支えているのか
  • 失敗条件はどこにあるのか
  • 自分の研究に接続するなら何を検証すべきか

こういう問いに答えられないと、論文を「読んだ」とは言いづらい。

そこで作ったのが Research Dojo

論文や技術トピックに対して、

読む -> 自分で答える -> 厳しく採点される -> 不足部分を知る -> 追加問題で鍛える -> 研究アイデアや実装タスクへ進める

というループを回すための、ローカル研究トレーニングアプリだ。

ポートフォリオ側に紹介動画も置いた。

https://portfolio-psi-hazel-58.vercel.app/ja/projects/research-dojo

何を作ったのか

Research Dojoは、研究論文・技術トピック・研究アイデアを扱うためのデスクトップアプリだ。

主な部屋はこうなっている。

  • Paper Room
  • Paper Idea Mode
  • Topic Room
  • Research Lab
  • Codex Room
  • Codex Tasks

Webアプリとして作ったNext.jsをElectronで包み、macOS / Windows向けにGitHub Releasesで配布している。

デスクトップ版はこちら。

https://github.com/ayatemp/research-dojo-PCapp/releases/latest

中で動いているAI処理は、OpenAI APIキーをアプリに渡す方式ではない。
ローカルにログイン済みの codex CLIを使い、codex app-server を起動してJSON-RPCでやり取りしている。

つまり、Research Dojoはこういう構成になっている。

Research Dojo Desktop App
  -> Next.js local server
  -> local SQLite-compatible DB
  -> spawn("codex", ["app-server"])
  -> JSON-RPC
  -> Codex logged-in environment

Paper Room

Paper Roomは、論文ごとの理解チェックをする部屋だ。

arXiv URLや論文メモを入れると、CodexがPaper Cardと問題セットを作る。

問題は単なる暗記確認ではなく、次のような観点を含めている。

  • 研究の問題設定
  • 既存研究との差分
  • 手法の機構
  • 実験設定
  • 限界と失敗条件
  • Reviewer視点の弱点

ユーザーは問題に対して自分で回答する。
そのあとCodexが100点満点でレビューする。

レビュー結果には次のような情報を含めた。

  • total score
  • rubric scores
  • strengths
  • fatal issues
  • missing perspectives
  • shallow phrases
  • next fix
  • revision challenge
  • reading gaps

この中で特に大事なのは reading gaps

単に「60点です」と言われても、次に何をすればいいか分からない。
そこで、回答から推測できる「読み込みが足りない箇所」や「再読すべき観点」を返すようにした。

たとえば、

  • 実験節のbaseline比較が読めていない
  • 手法の仮定と失敗条件が分離できていない
  • 関連研究との差分が曖昧
  • 評価指標が主張と対応していない

のような形で、次に読み直すべき場所を示す。

Adaptive Questions

最初の版では、問題を最初からまとめて出すだけだった。

ただ、それだと問題が溜まりやすい。
しかも、ユーザーがどこに弱いかが分かった後でも、最初に作られた問題を同じ重さで解くことになる。

そこで、回答履歴とレビュー結果を見て、次に出す問題を変えるようにした。

たとえば、あるユーザーが手法説明はそこそこできるが、実験設計が弱いとする。

その場合、次の問題では、

  • baseline選定
  • ablation設計
  • metricの妥当性
  • claimとevidenceの対応
  • failure case

のような観点を重点的に問う。

これは、単なる問題生成ではなく「弱点に合わせて次の問いを出す」ための仕組みだ。

Paper Idea Mode

Paper Roomには、理解問題とは別にアイデアを育てるモードも入れた。

ここで意識したのは、AIにアイデアを出させすぎないこと。

研究アイデアは、自分で考えて、自分の仮説として育てる必要がある。
AIがそれっぽいアイデアを大量に出しても、自分の研究としては弱い。

なので、このモードではCodexは「答え」ではなく「厳しい問い」を返す。

たとえば、

  • この論文の前提を1つ壊すならどこか
  • 著者が見落としているデータ条件は何か
  • この手法が失敗する分布シフトは何か
  • 自分の研究テーマに接続するなら最小実験は何か
  • そのアイデアは既存研究とどこで被りそうか

のような問いを出す。

ユーザーはその問いに答える。
その回答をCodexがまた採点する。

採点rubricは次のようにした。

項目
問題の具体性 20
新規性 20
論文への根ざし 20
実現可能性 15
評価設計 15
リスク認識 10

つまり、アイデア出しも「AIが案を出す」のではなく、「自分の案を査読される」形に寄せた。

Topic Room

Topic Roomは、特定の論文ではなく、広いトピックに対する理解度を見るための部屋だ。

たとえば、

機械学習

と入れると、Codexが中級者向けの診断問題を出す。

回答すると、

  • 強い概念
  • 弱い概念
  • 足りない前提知識
  • 次に出すべき問題方針

を返す。

論文に入る前の準備や、分野をまたいで勉強するときに使う想定。

Research Lab

Research Labは、研究アイデアや仮説を別の角度から見るための部屋だ。

ここでは、入力したアイデアに対して、Codexが次のようなレンズを返す。

  • falsification tests
  • weird angles
  • minimal experiment
  • reviewer attack

reviewer attack はかなり気に入っている。

自分のアイデアは、自分には良く見える。
でも査読者から見ると、だいたい突かれる場所がある。

  • その仮定は本当に必要か
  • 既存手法で十分ではないか
  • 評価指標が都合よくないか
  • 失敗条件を隠していないか
  • 実験コストに対して貢献が弱くないか

こういう攻撃を先に受けることで、研究案を少し硬くできる。

Codex Room

一応通常の会話もCodexとできるようにしてある

Codex App Serverとの接続

Research DojoのAI処理は、codex app-server を使っている。

大まかな流れはこう。

spawn("codex", ["app-server"])
initialize
initialized
getAuthStatus
thread/start
turn/start
item/agentMessage/delta
turn/completed

Paper Card生成やレビューでは、CodexにJSON schemaを渡して、構造化された結果を返してもらう。

たとえばレビュー結果は、

  • score
  • rubric
  • fatal issues
  • missing perspectives
  • next fix
  • revision challenge

のような形でDBに保存する。

これにより、ただのチャットログではなく、後から集計できる学習履歴になる。

デスクトップアプリ化

最初はWebアプリとして作っていた。

ただ、Research Dojoは性質的にローカルアプリのほうが合っている。

理由は3つある。

1. 論文メモや回答はローカルに置きたい

研究メモや回答履歴は、公開サーバに置くよりローカルに置きたい。

2. Codex CLIはローカルにログインしている

Codex App Serverを使うなら、ローカルで動くほうが自然。

3. Codex Taskはローカルrepoに触る可能性がある

将来的に、研究アイデアを実装タスクに落としてCodexに渡すなら、ローカルのrepoを扱うことになる。

なので、Electronで包んでPCアプリ化した。

Next.jsのstandalone buildをElectronのresourcesに入れ、起動時にローカルサーバとして立ち上げる。
DBはアプリのuserData配下に保存する。

Macで spawn codex ENOENT になった問題

デスクトップ化したあと、Macで問題が出た。

ターミナルでは codex が使えるのに、アプリから見ると codex が見つからない。

原因は、FinderやElectronから起動したGUIアプリでは、ターミナルと同じPATHが入らないこと。

そのため、アプリ側で次の場所も探索するようにした。

  • /usr/local/bin
  • /opt/homebrew/bin
  • ~/.local/bin
  • ~/.volta/bin
  • ~/Library/pnpm

さらに、Settings画面から codex login --device-auth を開始できるようにした。

ログインボタンを押すと、

  • 認証URL
  • ワンタイムコード
  • Codex CLIの検出状態
  • App ServerのJSON-RPC probe
  • ログイン状態

が同じ画面に出る。

これで「ターミナルでやってください」だけではなく、アプリ内でログインフローを進められるようになった。

配布

GitHub Actionsで、タグをpushするとmacOS / Windowsのビルドを作る。

今は次を出している。

  • macOS Apple Silicon DMG
  • macOS Intel DMG
  • Windows zip
  • Windows installer
  • Windows portable exe

リリースはこちら。

https://github.com/ayatemp/research-dojo-PCapp/releases/latest

まだApple notarizationやWindows code signingはしていない。
なので、macOSでは初回起動時にGatekeeperの警告が出る。

現状は無料配布の範囲として、

  1. 一回アプリを開いて警告を出す
  2. システム設定
  3. プライバシーとセキュリティ
  4. このまま開く
  5. もう一度開く

という手順をREADMEとReleaseに書いている。

技術構成

ざっくりこう。

領域 技術
UI Next.js / React / Tailwind CSS
Desktop Electron / electron-builder
AI runtime Codex CLI / Codex App Server
DB sql.js / local SQLite file
Release GitHub Actions / GitHub Releases
Web prototype Vercel

作ってみて良かったところ

一番良かったのは、論文理解を「アウトプット前提」にできたこと。

要約を読むだけだと、理解したかどうかは曖昧なまま。
でも、自分で答える必要があると、曖昧さがすぐに表に出る。

そして、厳しめに採点されると、

  • 自分はどの観点に弱いのか
  • どの節を読み直すべきか
  • 次に何を直すべきか

が見える。

これは、研究を進める上でかなり大事だと思う。

今後やりたいこと

まだやりたいことは多い。

  • PDF取り込みの強化
  • Zotero連携
  • 論文ごとの読書履歴
  • 回答履歴からの長期的な弱点プロファイル
  • 研究テーマごとのカリキュラム生成
  • Codex Task実行時のdiffレビューUI
  • macOS notarization
  • Windows code signing

特に、Codex Task周りはもっと伸ばしたい。

今は研究アイデアや実験案をタスク化するところまでだが、最終的には、

論文を読む
弱点を潰す
研究仮説にする
最小実験を作る
Codexに実装させる
結果をまたResearch Labで叩く

というループにしたい。

まとめ

Research Dojoは、論文を読んで、答えて、叩かれて、直して、実験へ進めるためのローカル研究ジムだ。AIに答えを出してもらうのではなく、自分の理解やアイデアをAIに厳しく見てもらう。
この方向は、研究とAIツールの組み合わせとしてかなり気に入っている。
リポジトリはこちら。

https://github.com/ayatemp/research-dojo-PCapp

Discussion

Ayato KakuAyato Kaku

バグなどがあればぜひ書いて欲しいです!
修正します!主はMacユーザなのでwindows環境でのデバックができないのでおそらくwindowsだとバグが多いのかもしれません;;