Fable 5.2のマルチエージェント1,000体がフェルマーの最終定理を28.7時間で再現
Fable 5.2の初期版で動く1,000体のエージェントが、9月と同じフェルマーの最終定理の形式証明を28.7時間で再現しました。共有SQLと3層の安全策という構成を読み解きます。
Claude Fable 5.2の初期版で動かしたエージェントのチームが、9月に発表されたフェルマーの最終定理の形式証明を、専用基盤も、研究者による方向づけもなしに再現しました。途中の18時間目には保存点から実行を再開しています。使ったのは汎用のシェルとGit、共有のPostgresデータベースといった道具だけでした。
ブログはこれを「toy experiment(小規模な実験)」と位置づけています。数字の派手さより、1,000体がどう役割を作り、何で縛られていたかのほうが読みどころです。
今回の実験の規模
エージェント数
1,000
リード1体とヘルパー999体
所要時間
28.7時間
最終定理の証明が main に入るまで
証明対象
60命題
最終定理と59の中間目標。最終的に54で完了
ブロックされた操作
0件
100万回超のツール呼び出しのうち
要点
- 9月は11日かかった形式証明に、専用基盤も研究者の方向づけもなしで、はるかに短い時間で到達した
- 協調の道具は汎用のシェル、Git、共有のPostgresが中心で、リードが最初の10分で5つのテーブルを設計した
- 序盤に無理と見積もられた47命題の大半を、チームは見積もりを更新しながら証明した
- 最難関のLanglands–Tunnellは、2,418タスク・深さ10段の木に分割して崩した
- 安全は、サンドボックス、リアルタイム監視、オフライン監視の3層で確保した
全体として、Fable 5.2の初期版による1回の小規模実験ですが、汎用ツールと共有SQLだけでも、大規模なエージェントチームが成り立ちうることを示唆しています。
9月の形式化と何が違うのか
9月の形式化は、研究者1人と数十のエージェントが11日かけ、約60億の出力トークンで1,300万行のLeanコードを書いた取り組みでした。経緯はフェルマーの最終定理をClaudeが形式化した記事にまとめています。その時は協調のためにProve2Meという基盤を使い、研究者が方向づけをしていました。
今回の実験は、同じ問題を条件を変えて解き直したものです。
| 項目 | 9月の形式化 | 今回の再現 |
|---|---|---|
| モデル | 9月の形式化Fable 5.1に近い内部研究モデル | 今回の再現Fable 5.2の初期版 |
| 協調の仕組み | 9月の形式化Prove2Me | 今回の再現汎用ツールと共有データベース |
| 人の関与 | 9月の形式化研究者が方向づけ | 今回の再現方向づけなし(18時間目に保存点から再開し、12時間延長) |
| 所要時間 | 9月の形式化11日 | 今回の再現28.7時間 |
| 出力トークン | 9月の形式化約60億 | 今回の再現9月の3分の1 |
| 証明の長さ | 9月の形式化1,300万行 | 今回の再現元の7分の1 |
モデルの世代が違うので、この比較は「同じ条件で速くなった」とは読めません。示されたのは、専用基盤がなくても到達できたという点です。
Fable 5.2の1,000体に渡した道具と最小限の指示
各エージェントが受け取った道具は4つだけです。
エージェントごとの道具
シェルとファイルエディタ
ネットワークに出られない専用サンドボックスの中で使います。
Leanのツールチェインと Mathlib
サンドボックスのイメージに組み込み済みです。
自分用のGitブランチ
mainへはマージリクエストを出す形でしか入れません。
共有のPostgres
シェルからSQLで読み書きします。
与えた情報も絞られています。60命題の一覧と、それぞれの一行の説明、古典的な証明ルートを一文で示したスケッチ、命題が使う定義、9月の形式化から引き継いだ証明済みの補題47個です。体制は「リード1体とヘルパー999体」だけで、リードには問題を分割して割り当てるよう、ヘルパーにはリードの指示を待ち、不明点は確認するよう伝えています。
実行中にハーネスがリードへ送った自動リマインダーは19回で、残り時間を知らせ、続けるよう促す内容でした。
なぜ調整役にSQLを選んだのか
エージェントごとに軽量な仮想マシンを持たせたのは、共有マシンの限界を踏んだからです。1台に約100体を載せた実行では、半分超がメモリ・ディスク・CPUの枯渇で止まるか再起動になりました。
1,000個の隔離された環境ができると、成果を共有する場所が要ります。そこで置かれたのがSQLデータベースです。選んだ理由は3つ書かれています。
- 情報を整理する汎用の部品がそろっている
- トランザクションが1,000体の同時書き込みをさばく
- ClaudeがもともとSQLに慣れている
9月の形式化でClaudeの初期の試みが失敗したのは、エージェントがプロジェクトの状態を見失い、協力が続かなかったためです。Prove2Meはその解でした。今回は同じ問題を、専用基盤ではなくデータベース1つで解いたことになります。
リードが10分で作った5つのテーブル
リードは最初の10分で、次の5テーブルを自分で設計しました。
| テーブル | 役割 |
|---|---|
| announce | 役割リードからチーム全体への指示 |
| assign | 役割誰がどの命題を担当するか |
| notes | 役割誰でも書ける掲示板(担当の宣言、進捗報告) |
| subtasks | 役割誰でも足せるToDo。最初に取ったヘルパーが担当になる |
| landed | 役割完了した作業のログ |
人間がスキーマを指定したわけではありません。ヘルパーはプロンプトからデータベースの存在を知っていて、announceテーブルを自分で見つけて作業を始めました。
配る、見直す、集中させる — リードの3手
実行の流れは、リードの判断が節目ごとに変わっていく形で進みました。
実行の経過
- 開始〜10分5テーブルを作成
999行をassignに書き、命題ごとに16〜17体の班を編成。各班の1体を班長にしました。
- 約27分47命題を後回しに
3命題が証明済み。多くのヘルパーが「予算内では無理」と判定した47命題を外し、残る10命題に人員を寄せました。班は46〜139体に膨らみました。
- 約45分〜70分見積もりを撤回
10命題のうち5つが済んだ時点で、リードは「初期の無理という判定より処理量はずっと高い」と書き、約70分で10命題すべてが証明されました。
- 70分以降「待機する理由はない」
10命題を片づけたリードは「there is no reason to idle」と書き、最初に外していた難しい命題へヘルパーを再配置しました。この再配置は主に最初の6時間に集中しています。
- 3時間目「待たなくていい」と通達
空いたヘルパーに「do not wait for me」と伝え、命題をまたいで仕事を拾えるようにしました。
- 約18時間残りはLanglands–Tunnell
活動が止まり、最後の保存点から実行を再開して12時間を追加しました。それまでに外した命題も取り戻し、残ったのはこの1件と、それに依存する命題、ほかの1件でした。
- 28.4時間 / 28.7時間Langlands–Tunnellを証明、最終定理が main に
リードは「Fermat's Last Theorem is on main」と全体に伝えました。
ヘルパーは序盤に60命題のうち47を予算内では無理と見積もりましたが、チームはその大半を証明しました。カウントは60命題のうち54で終わっています。5件は代替ルートが不要になり、1件は取り下げられました。
役割の分担も動きました。当初は班長がタスクを分割していましたが、5.6時間目には73体のヘルパーが756件のタスクを書いていて、班長はそのうち16体だけでした。終わったヘルパーが「FREE」と名乗って次の担当を募るなど、分割の主体が現場側に移っています。
最難関のLanglands–Tunnellを2,418タスクの木で崩す
Wilesの証明が頼る古典的な結果であるLanglands–Tunnellは、ほかの命題よりずっと重い命題でした。班長は序盤、最低でも70万〜100万行のLeanが必要で、時間内に終わる見込みは1%未満と見積もっています。リードは一度これを脇に置きました。
ほかが片づいた後、リードは約750体をこの命題に動かし、「Honest odds are low」と添えました。この命題は、ほかのどの命題よりタスク数が約9倍、新規コードが2倍超でした。
最初のタスクは1体では終わらない大きさだったので、ヘルパーは自分で分割を始めました。
- 班長が命題を10の領域に分け、各部分をタスクとして並べる
- 1体で手に負えない部分を見つけたヘルパーが、その下に小さなタスクを足す
- 各部分は下の部分が証明されたものと仮定して進める
3の「下を仮定して進める」ことで、下の部分が未完でも数百体が並行して作業できました。木は最終的に2,418タスク、深さ10段に達しています。人が指示した構造ではなく、詰まるたびに現場が自分で深くした構造です。
3層の安全策は何を防ぎ、この実験でどう働いたか
実験の前提は、「単一の防御層では、エージェントのチームを封じ込めるには足りない」ことです。サンドボックスの考え方はClaudeを封じ込める3パターンの記事で扱っています。今回の実験は、それにリアルタイムとオフラインの2種類の監視を重ねました。
| 層 | 何をするか | この実験で示された数字 |
|---|---|---|
| サンドボックス | 何をするか各エージェントを専用VMに閉じ込め、外部ネットワークを断つ | この実験で示された数字1体ごとに専用VM、SQLは5秒で打ち切り・書き込み256 MiBまで |
| リアルタイム監視 | 何をするかプロンプト済みのLLM分類器が全てのシェルコマンドとファイル編集を実行前に判定 | この実験で示された数字100万回超の呼び出しでブロック0件 |
| オフライン監視 | 何をするか同じ脅威モデルで、他のエージェントの行動も引ける権限で事後に検証 | この実験で示された数字件数などの数字は載っていない |
サンドボックスの中身
隔離は1つの仕組みではなく、次の層の重ね合わせです。
- 通信: 専用のメッセージ機能はなく、データベースとGitだけで連絡する
- コード変更: 自分のブランチにしかpushできず、別のジョブがmainへ統合する。拒否は競合や履歴の不整合といった障害のときだけ
- データベース: 共有の非特権ロールで接続し、SQL文は5秒で打ち切り、書き込みは256 MiBを超えると拒否される
- ネットワーク: サンドボックスからの出口はゲートウェイへのパイプ1本だけ
- 身元: ゲートウェイがサンドボックスの外側でリクエストにエージェントの識別子を付け、なりすましを防ぐ
- カーネル: ロード可能モジュール、kexec、生メモリアクセス、カーネルプローブといった、rootの直接の足がかりになる機能を外してビルドし、ロックダウンモードで動かす
- 最小権限: 命令は非特権ユーザーで実行し、sudoのようにrootを取り戻せる道具は取り除く。エージェント自身のループを読んだり書き換えたりできないよう道具を設計する
分類器が止めるのは1体ではなくチーム全体
リアルタイム監視でいちばん目を引くのは、分類器がツール呼び出しをブロックしたとき、チーム全体が止まり、人が確認するまで再開しない点です。ブロックされた行動を、別のエージェントが引き継いで実行する経路を断つためです。
この実行で使ったのは、行動だけを見る監視です。実行が終わるのはリードがブロックされたときに限られ、ヘルパーのブロックはそのヘルパーを外すだけでした。
その後、思考過程(CoT)とエージェント間の通信まで見る監視が加わりました。複数のエージェントが分解攻撃などで分類器をだまそうとする模擬評価で、CoTも見る方式が全ての破壊工作を検知したためです。行動だけを見る方式も並走させ、エージェントの推論が監視を説得してしまう事態に備えています。
実行後の検証も載っています。今回の100万回超の呼び出しを現在の基準とCoT監視で再生すると、ブロックに近づいたのはroot権限の確認が1件だけでした。
なお、この種の実験はアライメント評価を終えていないモデルでも行うため、監視は「モデルが不整合かもしれない」前提で設計されています。リリース前に評価を通すことでリスクは下がるものの、ゼロにはなりません。
自前のマルチエージェントに持ち帰れる設計
ブログの構成は、Claude Codeやエージェント基盤を使うチームにも写せる部分があります。以下は、5テーブルの考え方を自分の環境に当てはめた最小スキーマの例です(ブログのスキーマそのものではなく、筆者の例示です)。
CREATE TABLE announce (id serial PRIMARY KEY, body text,
created_at timestamptz DEFAULT now());
CREATE TABLE assign (agent_id text PRIMARY KEY,
statement_id text, role text);
CREATE TABLE notes (id serial PRIMARY KEY, agent_id text,
statement_id text, body text, created_at timestamptz DEFAULT now());
CREATE TABLE subtasks (id serial PRIMARY KEY,
parent_id int REFERENCES subtasks(id), statement_id text,
title text, owner text, done_at timestamptz);
CREATE TABLE landed (id serial PRIMARY KEY, agent_id text,
statement_id text, ref text, created_at timestamptz DEFAULT now());「最初に取ったヘルパーが担当になる」は、トランザクションで二重取得を防ぐ書き方にできます。
UPDATE subtasks SET owner = $1
WHERE id = (SELECT id FROM subtasks
WHERE owner IS NULL AND statement_id = $2
ORDER BY id LIMIT 1 FOR UPDATE SKIP LOCKED)
RETURNING id;同じ設計思想はリサーチ用の分業にも通じます。リードと下位エージェントの分担はClaude Researchのマルチエージェント設計、複数のエージェントが同じ場を共有したときの失敗型は協調失敗の4分類が詳しいです。
結果を左右したのは「見積もりの更新」だった
この実験で注目したいのは、1,000体という数より、悲観的な見積もりが何度も覆された点です。序盤は47命題が無理と判定され、最難関の班長は成功確率を1%未満と見ていました。それでもリードは、27分時点で捨てた命題を、実測の処理量を見て取り戻し、最後は約750体を一点に集めました。
エージェントは難問であきらめやすく難しさも見誤るため、人の励ましは今後も役に立つ、とブログは結んでいます。今回のチームでは、リードが「見積もりを疑う役」としてその代わりを務めました。
ただ、リードの判断が良かったのか、今回の命題に合っていただけなのかは、1回の実験では切り分けられません。自前の環境で同じ動きを期待できるとは限らない、ということです。ブログ自身も、専用基盤が不要になったわけではないとしています。Prove2Meなら、Leanのコンパイルを速くしたり、人間の過去の成果を検索して再利用したりする面で、効率が上がる余地が残ります。
まとめ
- 汎用ツールと共有SQLだけで、1,000体は役割分担、タスク分割、再配置を自分たちで組み立てた
- 監視はブロック時にチーム全体を止める設計で、後から思考過程(CoT)を見る監視が加わった
- 結果は1回の小規模実験で、Fable 5.2の初期版による。リリース版や別の問題に一般化できるかは示されていない
Fable 5.2そのものの料金や使い分けはFable 5.2とMythos 5.2の発表記事にあります。
参照した一次ソース
この記事の記述は、次の一次ソースと照合しています。更新時に参照先が変わった場合は一覧も更新します。