この記事は、連載「追わない技術」の第 5 回です。うまくいかない症状と、その対処を一つずつ並べています。各回はファイルやスクリプトを一つ置けば完結します。その仕組みがなぜ要るのかは、置いたあとに解説を読めば分かります。連載の全体像と各回の一覧は序論にあります。

今回は、エージェントチームの話です。エージェントチームは、1 つの仕事をいくつかに分けて何人ものAIに渡し、渡した相手どうしに互いにメッセージを送り合わせながら進める形です。前回は、いまの会話のAIが仕事を自分でやるか、サブエージェント 1 人に渡すかの話でした。仕事を分けて渡したときにAIが読み直す量は、人数 × 1 人ぶんの会話の長さで増えます。Claude Code は、AI が応答するたびに、それまでの会話をまるごと送り直し、そのうち前回と同じ部分は、プロンプトキャッシュ(prompt caching)によって前回の処理の結果から読まれ、安い価格で数えられます。

先に、題を否定しておくと、使用量の上限に余裕があるなら、エージェントチームを使ってもかまいません。

エージェントチームを、私は本格的に使ったことがありません。この回で出す実測は、どれもサブエージェントに仕事を渡した記録から数えたもので、エージェントチームについては公式のページに書かれた仕様で書きます。

エージェントチームを使ったことがあるなら、そのときのことを思い出してみてください。

使用量は、同じくらいの仕事を 1 つのセッションで進めたときより、早く上限に近づいていませんでしたか。

CC BY 4.0

1 人に渡す / n 人に分けて渡す / 話し合わせる —— 3 つの形で増えるもの

増えるもの
1 人に渡す会話が 1 本増える
n 人に分けて渡す会話が n 本増える
話し合わせる上に加えて、互いの発言が互いの会話に入る

ここで大事なのは、3 つの形のどれでも会話が増えることです。増えた会話は、往復のたびに、AI がそこまでの中身ごと読み直します。

4 人に分けて渡すと、キャッシュから読んだ量を含めた合計は 1 人のときのほぼ 4 倍になります

私は新しい実験を回さず、手元に残っていたサブエージェントの記録を、まとまりごとに数え直しました。ここでいう「まとまり」は、起動した側のAIが、1 回の発言でいっぺんに起動したサブエージェントのかたまりのことです。1 往復(1 手)は、サブエージェントが 1 回応答するぶん、つまり Claude Code が送る 1 回のリクエストです。私が数えた記録には、46 セッションぶんで、164 のまとまり / 342 人ありました。

1 回のリクエストの入力は、初めて読ませる部分と、前の往復からキャッシュで読める部分に分かれ、キャッシュで読める部分も、安いとはいえ、値段は付きます。

いっぺんに出した人数まとまりの数初めて読ませた量1 人だけのとき比キャッシュから読んだ量を含めた合計1 人だけのとき比
1 人9032,4661.00 倍282,4861.00 倍
2 人1660,9981.88 倍675,0632.39 倍
3 人1378,8702.43 倍1,075,7373.81 倍
4 人4493,8602.89 倍1,072,7713.80 倍

「初めて読ませた量」の列だけを見ると、4 人に分けても 2.89 倍に見えます。「キャッシュから読んだ量を含めた合計」の列では 3.80 倍で、ほぼ人数どおりでした。

表には、引っかかるところが 1 つあります。3 人(3.81 倍)と 4 人(3.80 倍)がほぼ同じです。人数が 1 人増えても、キャッシュから読んだ量を含めた合計は同じままです。

掛け算のもう片方 —— 1 人ぶんの会話の長さ

今度は、私が同じ 342 人を、1 人ぶんの会話が何往復あったかで並べ直します。表に並ぶのは 339 人です(1 往復で終わった 3 人は、1 往復あたりの値を出すことができないので外しました)。

1 人ぶんの往復人数読み直された履歴の合計(中央値)1 往復あたり(中央値)
2〜3 往復1764,23821,577
4〜6 往復118173,63832,740
7〜12 往復110295,11035,550
13 往復以上941,538,16554,243

読み直された履歴の合計は、2〜3 往復の人と 13 往復以上の人とで、24 倍違います。往復の数の違いは 5 倍ほどです。

理由は「1 往復あたり」の列にあります。往復が増えると、1 往復あたりに読み直す量も一緒に増えています(21,577 → 54,243)。会話が伸びると、サブエージェントは毎回そこまでの全部を読み直すからです。だから合計は、往復の数と、1 往復あたりに読み直す量の掛け算で増えます。

さっきの表で 3 人と 4 人がほぼ同じだった理由は、これです。人数を 1 人増やしても、その 1 人が短く終われば、量はほぼ同じままです。逆に、人数が同じでも、1 人の会話が長くなれば、量は増えます。

4 人のエージェントチームで、使用量が早く上限に近づいたとき

試しに、調べものを 4 つに分けて、4 人のエージェントチームに任せたとします。4 人は、見つけたことを互いにメッセージで伝え合いながら進めました。使用量は、同じくらいの調べものを 1 つのセッションで進めたときより早く、上限に近づきました。次に同じような調べものを頼むとき、あなたなら次のどちらにしますか。

  • エージェントチームを使って進める
  • エージェントチームを使わずに進める

答えは、エージェントチームを使わずに進めるほうです。分けて渡したときにAIが読み直す量は、人数 × 1 人ぶんの会話の長さで増えます。サブエージェントへ分けて渡しただけでも、4 人のまとまりで、キャッシュから読んだ量を含めた合計は 1 人のときの 3.80 倍でした。エージェントチームでは、その 4 本の会話に、互いのメッセージが足され、そのあとの往復のたびに読み直されます。人数はそのままで、伸びるのは 1 人ぶんの会話のほうです。使用量が上限に近づいているときにエージェントチームで続ければ、伸びたぶんだけ、上限には早く届きます。

理解したことは一文にできます。

仕事を分けて渡すと、AI が読み直す量は人数 × 1 人ぶんの会話の長さで増える。エージェントチームにすると、互いのメッセージが互いの会話を伸ばすので、読み直す量はさらに増える。だから、使用量の上限に余裕が無いなら、エージェントチームは使わない。

なぜ、分けて渡すと読み直す量が増え、エージェントチームではさらに増えるのか

Claude Code の prompt caching のページによると、モデルが読むのは、そのリクエストで送られてきたものだけです。Claude Code は毎回、それまでの全部を、新しいメッセージと一緒に送り直します。送り直すのは、system prompt と、プロジェクトの文脈と、それまでのメッセージとツールの結果です。同じページによると、サブエージェントは、起動した側とは別の system prompt とツールの組で、自分の会話を始めます。例外は、起動した側の会話を引き継いで始めるフォーク(fork)で、最初のリクエストから起動した側のキャッシュを読みます。この回の記録の 342 人に、フォークはありません。4 人に分けて渡せば、送り直される会話が 4 本できます。

API は、リクエストの先頭を、最近処理したもの(キャッシュ)と突き合わせ、一致した部分を処理し直さずに読み出します。同じページによると、キャッシュから読み直した分の課金は、キャッシュの価格です。Anthropic の料金のページでは、その価格は、基本の入力の価格より低く、0 より高く書かれています。上の表の「初めて読ませた量」の列に入っていないのは、このキャッシュから読んだぶんです。

prompt caching のページによると、新しい内容は末尾に足され、それまでの全部はそのまま次のリクエストに載ります。だから 1 往復ごとに、そこまでの往復の全部がリクエストに載ります。1 往復あたりに読み直した量は、2〜3 往復の人で 21,577、13 往復以上の人で 54,243 でした。

エージェントチームにも、同じ仕様が当たります。Claude Code のエージェントチームのページによると、チームの一人ひとり(teammate)は、別々の Claude のインスタンスで、持つコンテキストもそれぞれ別です。同じページは、トークンの使用量は動いている teammate の数に比例して増え、エージェントチームは 1 つのセッションよりトークンを大幅に多く使う、と書いています。teammate どうしのメッセージは、受け取る側に自動で届き、受け取った側の会話のメッセージの 1 つになります。prompt caching のページのとおり、Claude Code はそれまでのメッセージの全部を毎回送り直すので、届いたメッセージも、そのあとのリクエストのたびに送り直される対象です。

検証手順: 人数の側と会話の長さの側を、記録から別々に数える

前提

サブエージェントをいっぺんに複数起動する手段と、その記録(初めて読ませた量・キャッシュから読めた量・往復・時刻)が要ります。記録が残っていないなら、この手順を使うことはできません。「まとまり」は、同じ 1 回の発言でいっぺんに出したかどうかで束ねてください。起動を頼んだ時刻で束ねると、いっぺんに出したものが記録上ばらけて、全部 1 人扱いになります。倍率は、同じ人数のまとまりを、複数回ぶんまとめて見て決めます。

所要時間: 30 分(記録が手元にある場合)

手順

  1. 記録から、まとまりを人数ごとに分けます
  2. 人数ごとに、初めて読ませた量だけの中央値と、キャッシュから読んだ量を含めた合計の中央値の 2 つを出します。1 人のときを 1.00 として、それぞれ何倍かを出します
  3. 2 で出た 2 つの倍率と、人数そのものを比べます。片方の倍率だけを見て「人数を下回った」と読むのは間違いです
  4. 人数をいったん忘れて、サブエージェントを「1 人ぶんの往復」で階級分けします(2〜3 / 4〜6 / 7〜12 / 13 以上)。階級ごとに、読み直された履歴の合計と、それを往復で割った値を出します

合格条件(すべて満たすこと)

合格の条件は 2 つです。1 つ目は、手順 3 で、2 つの倍率が離れていることで、同じなら、キャッシュから読めた量を数えることができていません。2 つ目は、手順 4 で、往復が多い階級ほど「1 往復あたり」も大きいことです。同じなら、履歴の再送を数えることができていません。

合格しなかったとき

  • 2 つの倍率が同じになる —— キャッシュから読めた量を別に数えていません。初めて読ませた量と、キャッシュから読めた量は、記録の別の欄にあります
  • 往復が増えても「1 往復あたり」が変わらない —— 初めて読ませた量だけを見ています。キャッシュから読めた量まで含めて、読み直された履歴を数えてください

後始末

集計に使った中間ファイルを削除します。記録そのものは消さないでください。結果は日付つきで残します。記録は増え続け、同じスクリプトを明日走らせると数が変わるからです。


CC BY 4.0 はここまで

次回は「途中でレビューさせない技術」。私は、作業の途中で別のサブエージェントに見直させるのをやめました。 渡した先の 8 割以上は別のモデルで、こちらがすでに守れていたものを知らないからです。