AIに論文を書かす法

AIに論文を書かせたら「問題と回答はあるがそれ以外の味付けが薄すぎて面白いプログラムの一部であることが見えてこねえ」と言われ,実際に問題を解いただけの論文がdesk rejectされたので,いまここで「論文を書かす法」とは「結果的に論文を出力する面白研究進捗を生成する法」と言い換えることとする

いままでのdocリポジトリ

何をしていたかというと,論文の単位で論文を管理していた.解くべき問題があり,それを/writing/<slug>/proof.texのように1つ持ち,それが完結したら終わりで,それを論文としてarticle.tex/.pdfのように生成すればよし,としていたが,これには大きな問題がある.

面白くない

これに尽きる.同僚からは「エンジニアリングとしての面白さしかない」と言われたし実際そうだと思う.その時は「じゃあエンジニアリングゲームとして楽しめばよい」と思ったが,これには重大な問題があって,本人が面白くないと思っているんだから実際に出力される結果も淡々としすぎている.

対話がまともにできない

数学の研究とは数学との対話であり,「もっとわかりやすくならねえのかよ」「もっと広いことが言えないのかよ」という広がりを見せるが,論文として執筆することを決めてしまうとゴールが見えやすくなる代わりに対話ではなく進捗になってしまう.

(あって然るべき)先行研究やopen problemがない

これは設計ミスで,論文が何を引用するかは考えていたが,「どういう位置づけで引用するか」「先人の研究としてどう捉えるか」「失礼のないように網羅しているか」などがかなり欠けており,最後に関してはマジで毎回叱られては直していた.思えばこれも心とかどうでもいいので失礼のないようにシステム化すべき.

とはいえAIのたたき台がそもそも胡乱な文章なのは由々しき事態

いままでのシステムの何が悪かったかは十分にお話しできたが,docリポジトリは重要な役割を果たしていて,

みたいな状態を消してくれていた.実際にCodexが出してきた色々を直そうとするときにこいつが居ると非常にうざいので,なんとかしたいなあという思いがあったりした.

懲りない

研究の深掘りが足りないし,興味を持っていれば当然解きたくなる問題も解かれていないと言われるなら,じゃあそこもAIで自動化して面白い問題を拾ってきてもらおうという話になる.正直「興味はあるけど調べる体力がない」「シンプルに問題が解けた状態をさっさとだしたい」という気持ちがあったので,それをAIに「もっと発展させられるだろうが」「まだまだおもしろいだろうが」と発破をかけてもらうあたりに自動化の極意がある.

作った

https://github.com/momota1029/labo-skills

こいつは普通に私が普段遣いしつつ,他人も使えるラインを考えたもので,.agentsをこいつでsubmodule化すると使えるようになる.自分でskillを追加してもいいけどforkしてねという感じ.こっちのほうがきれいに済む.

何をするやつなのか

そもそも基本単位を論文にするのを辞めた.研究をこそ管理すべきであって,論文はただの出力であるというのを忘れていた.これを忘れるとなんか問題集とその答えをまとめたものが出力される.

そして何より研究計画の管理,論文の査読,論文や本を読む,スライドを作るといった作業を,目的ごとに別のskillへ振り分けられるのが一番でかい.Lean専用skillはまだないが,研究の数学的な核をLeanで固める方針と,形式化を置くディレクトリは用意してある.あと旧版ではindex.mdというのをいちいち生成してcommitに含めることですぐ読めるようにしていたが,別にpythonでいちいち作って読めばよくないか,ということにした.多分並列作業がそれなりに簡単になるはずだと思う.

「お前機械に全部やらせて発展性を潰してるだろ」に対して「じゃあ機械で発展させるもん」というキモい解決法を採用したわけだが,おそらくスライドスキルや解説スキルなどがどんどん上がっていくにつれてAI出力結果の内面化がある程度できるようになると期待している(ならなかったら普通にAIを使う人間の限界ということでAI引退する).

使うには,まず公開リポジトリを自分のアカウントか組織にforkして,研究用Gitリポジトリのルートで自分のforkを.agentsとしてsubmoduleにする..agentsがすでにあるなら,先に中身を保全してから入れ替えること.

git submodule add https://github.com/YOUR_ACCOUNT/labo-skills.git .agents

YOUR_ACCOUNTは自分のforkの所有者に置き換える.すでに設定済みの研究リポジトリをcloneした場合は,記録されているsubmoduleを初期化する.

git submodule update --init --recursive -- .agents

実行環境はPython 3.11以上,Git,PyYAML 6系.PyYAMLがなければ,利用するPython環境に入れておく.

python3 -m pip install 'PyYAML>=6,<7'

あとはエージェントに「研究室を初期化して」とか「inboxのこれで研究したい」と頼めば,skillに沿って作業を始められる.もちろん,ランチャーを直接呼んでもいい.研究リポジトリのルートからなら,たとえばこんな感じ.

Codexなら.agents/skillsをそのまま読む.ほかのエージェント環境では,その環境の方法でskillを登録する必要がある.

python3 .agents/scripts/labo.py layout init
python3 .agents/scripts/labo.py research check
python3 .agents/scripts/labo.py research list --format json
python3 .agents/scripts/labo.py paper map --paper <slug>
python3 .agents/scripts/labo.py build --paper <slug> --dry-run

<slug>は論文ディレクトリ名に置き換える.paper mapは論文全体を読むものではなく,章の導入部分を拾う道具で,どのコマンドも数学的な正しさまでは保証しない.--dry-runを外したビルドにはTeX環境とlatexmkが要る.

私が基本スキルにpushとかを行って,それをsyncして使いながら自分のforkのskillや道具を直していくのが通常運転で,そのうち他の人にも効きそうな変更があれば,必要なぶんだけupstreamへPRを出す.

結局

AIに論文なんか任せるもんじゃないが,研究のうちの雑務を全部人間にやらせるのもバカバカしいので,「書かせるが任せない」塩梅を探しつつ,「俺も使いたいんだけど」という他人の我儘に対応するためウロウロしている.助けてくれ.