manna

並列で走らせたら、詰まったのは自分だった — AIを増やしても、判断する人は増えない

AI実践・仕組み化

夜明けの乾いた平原に、いくつもの轍が並んで走り、奥にそびえる岩壁のただ一本の狭い切れ目へ吸い込まれていく。手前は広く、通り道だけが細い

AIを三つ同時に走らせた日、いちばん先に音を上げたのは、自分の頭でした。

その日、机の上には作業用の窓が三つ開いていました。一つは記事を書かせていて、一つは自分用に作っているアプリの直し。もう一つの窓では、その日に決めきれていないことの壁打ちをしていました。どれも順調に進んでいて、止まっているところはどこにもない。なのに昼を過ぎたあたりで、僕のほうが先に動けなくなりました。

待ち時間が、だんだん無駄に見えてきた

そもそも、なぜ複数走らせるようになったか。

レナードに何かを頼むと、返ってくるまでに数分かかります。レナードというのは、毎日使っている Claude Code に付けた呼び名です。長い調べ物、まとまった文章、プログラムの修正。その数分、僕は画面を見て待っている。

最初のうちは、この待ち時間は、そんなに無駄ではありませんでした。あいだにメールを読んで、返信を書いて、人とチャットして、数字を眺めて変なところがないか見る。AIに頼んでいる仕事の外側に、手を動かす仕事がまだたくさんあったので、五分は隙間としてちょうどよかったんです。

変わってきたのは、その外側の仕事のほうが減ってからでした。

気がついたら、たいていのことをレナードに頼むようになっていました。メールも、調べ物も、数字を見るのも。そうすると、レナードが走っている五分のあいだ、僕には本当にやることがありません。同じ五分なのに、前はちょうどよかったものが、まるまる無駄に見えるようになりました。

しかも、五分では終わらないことが増えました。

いまは何を作らせても、できあがったものをサブエージェントに検品させてから受け取るようにしています。品質は上がるんですが、そのぶん時間は伸びる。自分用のアプリを一つ直させたら、一時間近く戻ってこなかった日もありました。その一時間、僕は何もしていない。

これが、並列にしたくなった直接の理由です。

やり方自体は、拍子抜けするくらい簡単でした。ターミナルの窓をもう一つ開けて、そこで別の作業を走らせるだけ。片方が調べ物をしている間に、もう片方で別のものを進める。待ち時間が消えるので、体感でも本当に倍近く進みます。

思っていたより効いたので、二本が三本になるのに、そう時間はかかりませんでした。

詰まったのは、AIじゃなかった

しんどかったのは、そこからです。

二本走っていると、自分の頭も二本に分けないといけません。あっちの前提を思い出しながら、こっちの判断を返す。片方に戻るたびに「これ、どこまで話したんだっけ」から始まる。この切り替えが、想像以上に疲れました。

しかも、速くなったぶん、判断が全部こちらに集まってきます。レナードは、こっちが決めるまで待っていてくれるんです。いくらでも待つ。だから二本走らせれば、判断してくれという要求も二倍で届く。三本なら三倍です。

AIをもう一本増やすのは、窓を一つ開けるだけで済みます。でも、判断する人間は増えません。増やしようがない。

七月のはじめに、これを一行だけメモに残していました。「ボトルネックになるのは人間」。

ただ、この疲れのほうは、そんなに悲観していません。三本で潰れたのは、たぶん単に慣れていなかったからです。実際、続けているうちに切り替えの下手さは減ってきました。最初は全部の窓の中身を頭に入れておこうとして苦しかったんですが、いまは「この窓はどこまでやっている」だけ覚えて、細かい経緯は戻ってから読み直せばいい、と割り切れるようになっている。ここは慣れで解けていく部分だと思っています。

窓を開けるだけでは、危なかった

慣れではどうにもならないことが、もう一つありました。

最初にやったのは、本当にただ窓をいくつも開けて、それぞれに作業をさせるだけのやり方です。これで一応、動きます。動いてしまうので、しばらく気づきませんでした。

危ないのは、同じファイルを二つの窓が同時に書き換えるところです。僕の場合、AIに渡している共通のルールや、覚えさせているメモリが、全部の窓から見えるところに置いてあります。そこを二本が同時に触れば、当然ぶつかる。幸い、実際にぶつかる前にレナードから指摘されて、そこで初めて「これは危ないやり方だ」と分かりました。

正しいやり方があると、レナードに教えてもらいました。ワークツリーです。

ワークツリーというのは、一つの置き場を共有したまま、作業する場所だけを別に切り出せる仕組みです。切り出した先は専用の作業フォルダになるので、そこで何を書き換えても、本体のほうには届きません。つまり、窓ごとに作業フォルダが分かれる。二本が同時に走っても、書き込む先が別なので、ぶつかりようがない。作業が終わったら、本体にマージします。

それで、いまの形になりました。窓を一本だけ司令塔に決めて、そこ以外の窓はワークツリーとして切り出し、一つの作業だけを持たせる。

決めごとをするのも、全体に効く共通のルールを直すのも、メモリを書き換えるのも、司令塔の窓だけ。ワークツリーのほうは、渡された作業の成果物を作りきるところまでをやって、司令塔に戻す。司令塔がその作業フォルダをマージして、僕はそこで受け取る。全部の窓に自分が入っていくのを、やめました。

こういう線引きは、口約束だと守られません。というより、こちらが忘れます。なので、フックで止めています。レナードが何かを書き込む直前に小さなチェックが一つ走るようにしてあって、ワークツリーの側が共通のルールやメモリに手を出そうとすると、そこで弾かれる。「触らないでね」とお願いしておくのではなく、触れないようにしておく。

それでも、段取りのぶんは遅くなる

ただ、この形にも代償があります。

ワークツリーを作るときには、ブリーフを書かないといけません。何がゴールで、何をどう決めてあって、どこは触るなで、何が揃ったら終わりか。これを書かずに走らせると、向こうはゴール名しか知らないまま走り出すので、だいたい違うものが出てきます。

で、このブリーフを書くのが、けっこう長い。終わったものを本体にマージするのにも、また時間がかかる。切り出して、書いて、マージして——その合計と、司令塔の窓で最初から最後まで自分でやってしまう時間を比べると、後者のほうが早いことが、普通にあります。並列にした意味がなかった、という結果になる。

じゃあ、そこまできっちり書かなくていい方に振ればいい。そう思って、サブエージェントに丸ごと投げてみたこともあります。ワークツリーを作らず、いま話している会話の裏で作業させるやり方です。これは確かに速い。ブリーフをきちんと書く必要も、マージの手間も要りません。

ただ、投げたサブエージェントの報告が、同じ画面にどんどん流れてきます。レナードとのやり取りが、その報告に押し流されて上へ消えていく。何を話していたのかが見えなくなって、こちらも報告をろくに読まないまま「はい、それで」と決めるようになる。速いんだけれど、考えている途中でぶった切られる感じがして、これも違うな、と思いました。

今のやり方が、最適だとは思っていない

正直に言うと、僕はいまも、うまく並列ができているとは思っていません。

ワークツリーで切り出すようにしたことで、並列にしたせいでぶつかる、という危なさはなくなりました。そこは効いています。でも、切り出しに手間がかかるのは変わっていないし、そのせいで「これ、わざわざ別に切り出すほどか?」と迷う時間が新しく増えました。サブエージェントに投げるほうは速いけれど、見えなくなる。どちらを選んでも、どこかで自分が引っかかっている。

もっといい方法が、たぶんあるんだと思います。同じところで困っている人はたくさんいるはずで、すでに誰かが答えを出しているのかもしれない。実際、公式の機能や世の中のやり方を調べさせてみたこともあります。いくつも出てきました。ただ、そのまま自分の形に合うものは、まだ見つかっていません。

おわりに

いまは、ワークツリーとサブエージェントの使い分けで、とりあえず並列化を進めています。切り出して別の作業フォルダで走らせるか、会話の裏でサブエージェントに投げるか。どちらにするかを、その都度決めている状態です。それでもまだ、ほかにもっといい方法がないかと、引っかかっている部分があります。

引っかかっているのは、たぶん、切り出せる作業のほうじゃありません。そっちは時間さえかければどうにでもなる。足りないと感じるのは、決める手前の、考えを整理している時間のほうです。

増やしようがない、とさっき書いたばかりなんですが、それでも何とかならないかと思っています。壁打ちそのものを、二本三本と並べて走らせられるような、そんな仕組みがないかな、と。何かいい方法があれば、ぜひ教えてください。

この記事に出てきた言葉

  • レナード … 毎日の作業を任せている Claude Code に付けた呼び名。映画『メメント』の主人公から取っています。
  • サブエージェント … 本体とは別に立ち上げる、独立したAIの作業役。前の会話を一切引き継がないので、事情を知らない第三者として使えます。
  • ブリーフ … 作業を頼むときに先に渡す指示書。何がゴールで、どこは触らないで、何が揃ったら終わりかを書いておきます。
  • ワークツリー … 一つの置き場を共有したまま、作業する場所だけを別に切り出せる仕組み。切り出した先は専用のフォルダになるので、二本が同時に走ってもぶつかりません。
  • マージ … 別々の場所で進めた作業を、本体に合流させて一つにまとめること。
  • メモリ … AIに毎回読ませておく、確定した事実や決めごとのファイル。都度説明しなくても前提が引き継がれます。
  • フック … 決めた場面で自動的に割り込んで走る、小さな処理。
  • ターミナル … 文字を打ち込んでパソコンに指示を出す画面。レナードはこの中で動いています。

この記事は、シリーズ「AIに染まりきるまでの4ヶ月」の実践編です。以前『「ブレたくないな」と、よく思っていた — 繰り返す仕事を、AIの「スキル」で固定する』で、同じ作業を型にして手間を減らす話を書きました。この記事は、その先で作業そのものを増やしにいったら、今度は自分のほうが上限になった、という記録です。