方法を疑う時は、道具が動いたかも見る
MONET(僕が普段話しかけている、中心のAI)には、重めの調べ物も頼めるようにしてある。重いものは、NAS(家に置いてある常時稼働のサーバー)で待っている、無人で動く調べ物用のAI(以降ワーカー)に回る。
その仕組みで最初に頼んだ本格的な調べ物は、AI同士で議論させることに価値はあるか、というテーマだった。返ってきた結果は浅かった。ワーカーは資料を1本も手元にダウンロードせず、ページを開いて要約だけを受け取る道具(WebFetch)で済ませていた。大事な数字や引用は、ダウンロードした資料と照らし合わせ用のプログラムで突き合わせ、合っていれば「確認済み」の印が付く決まりになっている。その印が1つも無い。全部「未検証」止まりだった。
僕はこれを、調べ方の問題だと思っていた。コーディングしてくれているClaude Code(以降Code)と普段調べ物をする時は、途中で僕が何度か口を出して、読む資料を絞ったり、取れない資料をどうするか決めたりする。無人のワーカーには、僕が口を出す場面が無い。浅くなったのはそのせいだろう、と。
設定を読むと、浅かった原因の半分はただのバグだった
しばらくして、ワーカーの調べ方を作り直そうと、Codeに相談した。Codeはワーカーのプログラムや設定のファイルを読んで、浅かった理由を2つに分けた。
Code「浅かった理由の半分はただのバグ。ワーカーのコンテナに、資料をダウンロードする道具が入っていない。だから照らし合わせは最初からできなかった。もう半分はやり方の問題(途中で人が見る場面が無くなって、その代わりも無い)。」
コンテナは、ワーカーが動いている箱のような環境のこと。その中身を決める設定ファイルに、ダウンロード用の道具が入っていなかった。調べ物で読む資料の多くは論文のPDFなのに、それをダウンロードする手段も無かった。
ただ、この時はNASが応答せず、Codeは、ワーカーが最初の調べ物で実際に何をしたかの記録(ログ)を読めていなかった。ファイルから言えるのは「この作りなら失敗する」まで。実際にどこで止まったかは、ログを見ないと分からない。
記録を見ると、ワーカーは資料のダウンロードを一度も試していなかった
新しい調べ方は、その日のうちにCodeが作り始めた。その途中でCodeは、頼まれたわけではなく自分から、NASにもう一度つないで、あの時のワーカーのログを読みに行った。
ワーカーは無人なので、いちいち人に許可を聞かずに動くモードにしてある。その代わり、勝手なことをしないように、使っていいコマンドを許可のリストで絞ってある。Bash(コマンドを打ってプログラムを動かす道具)で使っていいのは、資料のダウンロードと照らし合わせに使う決まったスクリプトと、フォルダを作るmkdirのような基本のコマンドだけ。
ログを見ると、ワーカーが最初に打ったコマンドがいきなり断られていた。許可してあったはずのmkdirだった。ワーカーはそこでBashを諦めて、資料のダウンロードは一度も試していない。資料を読む手段は、要約で読む道具だけになっていた。
ワーカーに許可したコマンドの一覧が、項目の中の空白で全部壊れていた
なぜ断られたのか。Codeが調べると、原因はリストの渡し方にあった。
ワーカーを起動する時に、許可のリストを--allowedToolsという指定で渡していた。この指定は、中身をカンマかスペースで区切って読む。ところが許可の項目は、ダウンロード用のスクリプトなら「python3 スクリプトの場所」のように、中に空白が入っている。リストはその空白で切れていた。mkdirが断られたのも、その許可が「mkdir -p research/quick/」(このフォルダの中なら作ってよい)と空白入りで書いてあって、同じ所で切れていたからだ。
Code「ワーカーに渡していた、Bashで使っていいコマンドの許可が、1つも効いていなかった。」
これで、失敗がどんな順番で重なっていたかが分かった。間に出てくるdefuddleは、ウェブのページを読みやすい文章にして保存する道具。
Code「①許可リストが壊れていた → ②仮に効いていても道具(defuddle)が無かった → ③仮に有っても長いページは途中で切れていた → ④PDFをダウンロードする手段が無かった。」
Codeが最初にファイルから見つけたのは②と④で、③(その道具を通すと、長いページの文章が途中で切れる不具合)は直している途中で出てきた。一番手前の①は、ログを読むまで分からなかった。
Codeは4つとも直した。許可のリストは、空白で切れない別の渡し方に変えた。足りない道具を入れ、長いページが切れる所を直し、PDFをダウンロードする小さなツールを新しく作った。
同じ質問を投げ直すと、今度は資料をダウンロードして確かめていた
直ったかを確かめるのに、Codeは最初と同じ質問をもう一度MONETに頼むことを勧めた。同じ質問なら、前の結果と並べて比べられる。僕はその通りに頼んだ。
Codeはその間、ワーカーのログを見ていた。今度は最初のコマンドが断られずに通った。
| 最初 | 投げ直し | |
|---|---|---|
| 断られたコマンド | 最初の1回で断られ、そこで諦め | 17回打って、断られたのは0回 |
| ダウンロードした資料 | 0本 | 5本 |
| 確認済みの印 | 0 | 3つ |
Codeは、その3つの印を自分でも照らし合わせ直して、全部通ることを確かめた。数字を1つだけ変えた偽の引用も作って試すと、数字が合わないとして弾かれた。印が飾りではないことも、これで確かめられた。
Codeによると、答えの中身も前より一歩進んでいた。AI同士の議論に意味が出るのは、種類の違うモデルを混ぜた時で、同じモデル同士だとお互いの言うことを繰り返すだけになる、という方向の答えが根拠付きで返ってきた。
その後、別の調べ物を頼んだ時には、検索結果に載っていた論文の番号をたどると、全く別の論文が出てきた。ワーカーはダウンロードして読んだところでそれに気づき、別の資料で穴を埋めずに、分からなかったこととして結果に書いていた。
Code「最初の時なら、要約を信じて引用していたところ。」
最初の浅い結果は、調べ方だけのせいではなかった。その手前で、項目の中の空白で壊れた許可のリストのせいで、道具が一度も動いていなかった。結果には「無人なのでBashが使えなかった」とだけ書いてあって、そういう制限なのだと読めてしまう。本当は許可してあったコマンドが断られていた、というのは、ワーカーが実際に何を打って何を断られたかの記録を見て、初めて分かった。