この記事は、連載「追わない技術」の第 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 人 | 90 | 32,466 | 1.00 倍 | 282,486 | 1.00 倍 |
| 2 人 | 16 | 60,998 | 1.88 倍 | 675,063 | 2.39 倍 |
| 3 人 | 13 | 78,870 | 2.43 倍 | 1,075,737 | 3.81 倍 |
| 4 人 | 44 | 93,860 | 2.89 倍 | 1,072,771 | 3.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 往復 | 17 | 64,238 | 21,577 |
| 4〜6 往復 | 118 | 173,638 | 32,740 |
| 7〜12 往復 | 110 | 295,110 | 35,550 |
| 13 往復以上 | 94 | 1,538,165 | 54,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 分(記録が手元にある場合)
手順
- 記録から、まとまりを人数ごとに分けます
- 人数ごとに、初めて読ませた量だけの中央値と、キャッシュから読んだ量を含めた合計の中央値の 2 つを出します。1 人のときを 1.00 として、それぞれ何倍かを出します
- 2 で出た 2 つの倍率と、人数そのものを比べます。片方の倍率だけを見て「人数を下回った」と読むのは間違いです
- 人数をいったん忘れて、サブエージェントを「1 人ぶんの往復」で階級分けします(2〜3 / 4〜6 / 7〜12 / 13 以上)。階級ごとに、読み直された履歴の合計と、それを往復で割った値を出します
合格条件(すべて満たすこと)
合格の条件は 2 つです。1 つ目は、手順 3 で、2 つの倍率が離れていることで、同じなら、キャッシュから読めた量を数えることができていません。2 つ目は、手順 4 で、往復が多い階級ほど「1 往復あたり」も大きいことです。同じなら、履歴の再送を数えることができていません。
合格しなかったとき
- 2 つの倍率が同じになる —— キャッシュから読めた量を別に数えていません。初めて読ませた量と、キャッシュから読めた量は、記録の別の欄にあります
- 往復が増えても「1 往復あたり」が変わらない —— 初めて読ませた量だけを見ています。キャッシュから読めた量まで含めて、読み直された履歴を数えてください
後始末
集計に使った中間ファイルを削除します。記録そのものは消さないでください。結果は日付つきで残します。記録は増え続け、同じスクリプトを明日走らせると数が変わるからです。
CC BY 4.0 はここまで
次回は「途中でレビューさせない技術」。私は、作業の途中で別のサブエージェントに見直させるのをやめました。 渡した先の 8 割以上は別のモデルで、こちらがすでに守れていたものを知らないからです。