BLOG.HIRO UENO.ART
← INDEX

方法を疑う時は、道具が動いたかも見る

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が使えなかった」とだけ書いてあって、そういう制限なのだと読めてしまう。本当は許可してあったコマンドが断られていた、というのは、ワーカーが実際に何を打って何を断られたかの記録を見て、初めて分かった。