「AIエージェント」と聞くと、自律的に考えて、道具を使いこなして、仕事をやり遂げてくれそうです。なんだか強そうですし、月額も高そうです。ところが自分で書いてみたら、中身は Python で175行に収まりました。そのうち、エージェントの心臓にあたる部分は40行もありません。
中身は、ただのループでした
- 指示と、使える道具の説明をモデルに渡す
- モデルが「この道具を、この引数で使いたいです」と言ってくる
- こちらがその道具を実際に動かし、結果をモデルに返す
- モデルが道具を呼ばなくなるまで、2と3を繰り返す
これだけです。「自律的に考える」の正体は while文でした。私のコードは回数に上限を付けたので、正確には for 文です。ちょっとがっかりしますよね。
大事なのは2番と3番のあいだです。モデルは「使いたいです」と言っているだけで、道具を動かしているのはこちらのプログラムです。モデルにあるのは口で、手足はループの側についているんです。何をさせられるかは、モデルの賢さより先に、どんな手足を持たせたかで決まります。
このループと道具と指示の組み立てをまとめて、ハーネスと呼びます。馬につける馬具のことです。モデルという暴れ馬に馬具をつけて、仕事の方向に走ってもらうわけですね。Claude Code のような製品も、根っこはこの形をしていて、違うのは馬具の作り込みです。
馬具は、だいたい小言でできています
私が組んだのは、手元のモデルにクラウドの画像生成を道具として使わせるだけの、小さなものです。考えるのは手元で、描くのはクラウドです。ループ以外の行に何を書いたかというと、道具の説明と、口うるさい注意書きでした。
「文章だけ返すのは禁止」。モデルへの指示に、必ず最初に道具を呼ぶこと、画像を作らずに文章だけ返すのは禁止、と書きました。頼んでいるのは画像で、感想ではありません、とも念を押しています。人間相手なら角が立つ貼り紙ですが、モデルは気にしません。給湯室に貼ったら、たぶん犯人探しが始まります。
崩れたら、やり直す。モデルが吐く道具の呼び出しは、形式が崩れることがあって、崩れるとサーバーがエラーを返します。そこで、3回まで同じ問い合わせをやり直すようにしました。モデルが賢くなったわけではなくて、転んだら起こす係を馬具に付けただけです。
6回で止める。画像生成は呼ぶたびにお金がかかるので、止まらないループはそのまま請求書になります。
説明文は、研修資料のつもりで書く。道具の使い方についてモデルが読めるのは、こちらが書いた説明文だけです。被写体・構図・画風・照明を具体的に、縦横比は5択から、と書いておきます。モデルに腹が立ったら、まず研修資料を読み返したほうがいいです。
馬が悪いのか、馬具が悪いのか
業務でそのまま使うなら、既製のエージェントのほうが早い場面も多いと思います。それでも一度は自分で組んでみることをおすすめしたいです。ループを自分で書くと、モデルが何を呼んで、どこで崩れたかが、そのまま画面に流れてきます。失敗の瞬間を特等席で見られるわけです。
すると、失敗を2つに分けて考えられるようになります。モデルが賢くないのか、渡した道具と説明が悪いのか。崩れた呼び出しはモデルの失敗ですが、それで仕事が止まるかどうかは馬具の問題です。ここが分かれていないと、うまくいかないたびに「もっと賢いモデルを」という話になります。高い馬に買い替えても、鞍がずれていれば落ちるんですけどね。
業務に載せると、馬具は業務の形になっていきます
実際の仕事に載せようとすると、決めることが急に増えます。どの道具を渡すのか(新人にいきなり工具箱ごとは渡しませんよね)。読むのは自由にして、書き込みは人が「よし」と言ってからにするのか。同じ引き出しを開け続けていたら、どこで止めて人に返すのか。
どれも、モデルのカタログには載っていません。間違った書き込みがいくらの損になるのか、誰の「よし」なら通るのかは、その業務にいる人がもう知っています。馬は毎年のように速いものが出ますし、競合も同じ馬を買えます。
モデルの賢さはお金で買えますが、いい馬具は、自分の業務を知っている人にしか作れないと思っています。
吉村 尚悟