タスクを分けるほど精度は上がるのか:エージェントの分割数を式で決める
はじめに
業務をひとつのプロンプトに丸ごと投げると品質が落ちるので、工程を分けて順番に処理させる、という設計はいまではほとんど反射的に選ばれます。一方で、段を増やすほど途中で情報が抜け落ちて全体が通らなくなる、という話も同じくらいよく聞きます。どちらも正しいので、設計の場では「では何段にするのか」が誰の直感でも決まらないまま、なんとなく3段や4段に落ち着きます。
段数の上限を決めているのは、スコープの狭さよりも、段と段のあいだで落ちる情報のほうです。合成データで確かめると、境界1つあたり2%の情報が落ちる設定では5段が上限で、そこから段を増やすと成功率は下がりはじめ、十数段まで増やすと丸ごと1回で解いた場合と大差ない水準に戻りました。しかも「分けたほうが得か」の向きは、スコープを狭めたときの効きの強さを表す1つの指数だけで決まります。この指数と情報損失を測れば、最適な段数は式で出せます。
対象読者:
- LLMを使った業務処理を、単段で作るか多段に分けるかで迷っている設計者
- 多段化したのに期待した精度が出ず、段数を増やすか減らすかで判断がつかない方
- 「スコープを絞れば精度が上がる」という経験則を、自分の現場の数字で検算したい方
記事のポイント:
- 1段あたりの成功率とスコープの関係、および受け渡しの情報損失を1本の式に載せ、最適な分割数を閉じた形(closed form)で導きます
- 分割が得になる条件は指数 が1を超えるかどうかに集約され、段数の上限は情報損失 が決めることを示します
- と を自分の評価データから推定する手順と、その推定に何件必要かを合成データで確かめます
分割数を式で表現してみる
まず何を仮定すれば議論になるのかを決めます。ひとつのタスクを 段に分け、各段を順番に通すことで最終出力を得るとします。
1段あたりの失敗率を と書きます。段数を増やせば1段が抱える範囲は狭くなるので、 は について減少します。減り方の形を決めないと先に進めないため、べき乗則(power law)を置きます。
は分割せず1段で丸ごと解いたときの失敗率、 はスコープを狭めたときにどれだけ効くかを表す指数です。 が大きいほど、範囲を狭めた見返りが大きいことになります。この形を選んだ理由はあとで要件単位のモデルから導きます。いまは「両対数で直線に乗る減り方」と読んでおけば十分です。
各段の成否が独立で、すべての段が成功したときだけ全体が成功するとすれば、通しの成功率は積になります。
指数の が誤差の累積を、 がスコープを狭めた見返りを表します。互いに逆を向いた2つが、この1本の式に同居しています。
def step_fail(n, q1, beta):
"""段数 n のときの 1 段あたり失敗率 q(n) = q1 n^{-beta}。"""
# n を float に落としてから累乗する。整数配列を整数の負べきで累乗すると
# numpy が ValueError を出すため(beta=1 のように整数で渡した場合に効く)
return q1 * np.power(np.asarray(n, dtype=float), -float(beta))
def success_prob(n, q1, beta, gamma):
"""段数 n のときの全体成功率 P(n)。n は実数でもよい(曲線を描くため)。"""
q = np.minimum(step_fail(n, q1, beta), 1.0)
return np.power(1.0 - q, n) * np.power(1.0 - gamma, n - 1.0)
引数の gamma は次の節までは0のままにしておきます。以降の数値はすべて合成で、実在の案件のものは使っていません。
分けて得か損かは、ひとつの指数が1を超えるかで決まる
が小さい範囲で と近似すると、対数成功率は次の形になります。
の指数が です。 なら を増やすほど右辺は0に近づくので成功率は上がり続け、 なら逆に下がり続けます。つまり最大値は の内側になく、分割の是非は が1のどちら側にあるかだけで決まります。
、つまり丸ごと解けば45%が失敗する難しさのタスクで、 を3通り置いた曲線を描きます。

では16段まで単調に上がり、 では単調に下がります。 の挙動が境目で、上がりはするものの で頭打ちになります。分割で稼げる幅は から までの8.8ポイントしかありません。
ここまでの結論には実務との食い違いがあります。狭めた見返りが小さければ分割は害になり、大きければいくらでも分けたほうがよくなります。段を無限に増やせば通るようになる業務は見たことがないので、この段階のモデルには何かが足りていません。
受け渡しで落ちる情報が段数の上限を作る
足りていないのは、段の境界そのものが持つコストです。前段の出力を後段の入力にするとき、前段が持っていた文脈のうち一部は渡されません。渡す形式を決めた時点で、そこに書けなかった情報は落ちます。この損失は段の中身の難しさとは無関係で、境界の数だけ発生します。
境界1つで情報が保たれる確率を とし、境界は 個あるとします。
と置いて対数をとると、
になります。第1項は のとき とともに改善しますが、第2項は に比例して悪化します。改善が飽和し、悪化が飽和しないので、両者が釣り合う点が内側に現れます。 で微分して0とすれば、
が得られます。 では右辺の分子が正にならないので 、すなわち分けないのが最善です。 では なので となり、情報損失を入れる前の結果と整合します。最適な段数を有限にしているのは、境界の数に比例して積み上がる情報損失です。
def n_star_closed(q1, beta, gamma):
"""線形化から得た最適段数の閉じた形。beta<=1 では 1(分けない)。"""
if beta <= 1.0:
return 1.0
lam = -np.log1p(-gamma) # lam = -ln(1-gamma)
if lam <= 0: # gamma=0 なら上限なし
return np.inf
return max(1.0, (q1 * (beta - 1.0) / lam) ** (1.0 / beta))
、 を固定して だけを動かします。

が0.5%なら12.6段、1%なら7.9段、2%なら5.0段、5%なら2.7段、10%なら1.7段です。境界の損失が数%動くだけで最適段数は数倍変わります。 の基本ケースでは、丸ごと1回の に対して5段で 、20ポイントの改善です。ただし8段では 、12段では まで戻ります。同じタスク・同じモデルでも、受け渡しの取り決めが下手なら3段が上限、うまければ8段まで伸ばせます。 段数だけを議論しても決まらないのは当然で、上限を決めているのは受け渡しの設計です。
同じ枠組みで のケースも見ておきます。 を入れると最大は3段の で、丸ごと解いた場合から4.0ポイントしか改善しません。損失なしで見た8.8ポイントの余地は、境界の損失に半分近く食われます。狭めた見返りが小さいタスクでは、多段化に投じた設計・監視・デバッグの手間に対して残るものがほとんどありません。
実務でこの種のパイプラインを見るときは、段ごとの成功率よりも先に境界で何が落ちているかを測ります。段ごとの数字を並べた資料はよく出てきますが、それを掛け合わせても通しの成功率に届かないことがほとんどです。差が境界にあると分かれば、直すべきは段数ではなく受け渡す形式のほうだと決まります。工程を分けて中間成果物を渡す設計は信用リスクのモデリングでも昔からあり、そこで精度を落としていた原因は、たいてい受け渡しの取り決めの側にありました。
各段に検証を挟むと最適段数は下がる
段の出力をその場で検証し、失敗を確率 で捕まえてやり直せるなら、実質の失敗率は から に下がります。この置き換えを閉じた形に入れると、最適段数は 倍になります。基本ケースでは で5.0段から3.9段、 で2.7段まで下がりました。
向きが直感と逆に見えるかもしれません。分割が効くのは失敗を減らすためで、検証がすでに失敗を減らしているなら、分割に残された仕事はそれだけ小さくなります。検証を入れたうえで段数も増やすのは、二重に払って一度分の効果を買う設計です。ここでは検証が誤って正しい出力を弾かないことを仮定していて、その仮定が崩れる場合はあとで触れます。
閉じた形はどこまで使えるか
閉じた形は の近似の上に立っています。近似なしの を整数 で総当たりした結果と比べておきます。 を1.0から2.2、 を0.4%から12%まで振って、両者の差を見ます。

差は中央値で0.37段、95パーセンタイルで1.77段でした。段数は整数で決めるものなので、この精度なら閉じた形をそのまま電卓代わりに使えます。基本ケースでも閉じた形の4.99に対し、整数の総当たりは5、実数で最大化すると5.24でした。
図から読めるのは、 を対数軸で取ったとき等高線がほぼ平行に並ぶことです。 は に対しておよそ で動くので、 なら を半分にすれば最適段数は約1.6倍になります。一方 の側は、1に近いところで急に反応します。 が1.0から1.2に上がるだけで、最適段数は1段から3段台へ跳びます。設計を大きく変えるのは が1をまたぐかどうかで、それより上では の管理のほうが段数を支配します。
べき乗則はどこから来るのか
ここまで を仮定してきました。この形と の意味を、もっと細かい単位から組み立て直します。
タスクを 個の要件の集まりと見ます。書類なら確認すべき項目、抽出なら取るべきフィールドです。 段に分ければ1段が抱える要件は 件になります。1件を取りこぼす確率が、同時に抱えている件数に応じて上がるとします。
は「1つのプロンプトに指示を詰め込むほど、1件あたりの取りこぼしも増える」度合いです。段が成功するのは担当した 件すべてを正しく処理したときなので、1段あたりの失敗率は
となります。先に置いたべき乗則と見比べると 、 です。ここで出てくる は、右側の近似式を まで伸ばしたときの値であって、実際に1段で解いたときの失敗率そのものではありません。近似の左辺は取りこぼしの重複を数えるぶんだけ小さくなるので、 は真の単段の失敗率より大きく出ます。分割が得になる条件 は、 と同じことです。 1件あたりの取りこぼし率がスコープの広さに依存しないなら はちょうど1で、分割で稼げる幅はすでに見たとおり狭く、境界の損失にすぐ消えます。
これは検証できる主張です。要件単位のベルヌーイ試行でパイプラインを模擬します。
def simulate_pipeline(n, trials, eps0, alpha, gamma, m, seed=0):
"""要件単位のベルヌーイ試行でパイプラインを模擬する。"""
r = np.random.default_rng(seed)
sizes = split_sizes(m, n) # m 件を n 段に均等配分
eps = eps0 * sizes.astype(float) ** alpha # 各段の1件あたり取りこぼし率
# 各段: 担当 k 件すべて正しく処理できたら成功
step_ok = np.column_stack([np.all(r.random((trials, k)) > e, axis=1)
for k, e in zip(sizes, eps)])
# 境界: n-1 個。各境界で確率 gamma で前段の要点が落ちる
handoff_ok = np.all(r.random((trials, n - 1)) > gamma, axis=1) if n > 1 \
else np.ones(trials, dtype=bool)
return np.mean(np.all(step_ok, axis=1) & handoff_ok), step_ok.mean()
要件、 で、 と の2通りを20万試行ずつ回します。

左のパネルで、測定した は両対数上でほぼ直線に乗りました。傾きは で0.93、 で1.43です。理論値の1.0と1.5をやや下回るのは、1段が多くの要件を抱えるときに取りこぼしが重複して、失敗率が線形の見込みより小さく出るためです。粒度の細かい側に測定点を寄せれば、この偏りは小さくなります。
右のパネルでは、回帰で得た を入れた集約式が、要件単位のモンテカルロを2段以上でよく再現しています。どちらも5段で最大になりました。1段のところだけ集約式が0.02ほど低く出るのは、いま述べた外挿の分です。実測の は0.365でしたが、回帰で得た は0.386で、そのぶん単段の成功率が悲観的に出ます。段数を決めるのに使うのは傾きの側なので、この差は答えを動かしません。 のほうは通しの成功率が の0.635から単調に下がり、12段では0.509でした。取りこぼしがスコープの広さに反応しないタスクでは、分割はどの段数でも損になります。
手元の評価データから測れるか
と が測れないなら、以上は紙の上の話にとどまります。どちらも通常の評価データから推定できます。
は、同じタスクを何通りかの粒度で組んで、段ごとの成功率を測れば出ます。粒度 での1段あたり失敗率 を並べ、 を最小二乗で当てはめます。粒度は2水準あれば傾きが出ますが、外れに気づけないので3水準以上を勧めます。
は、正しい入力を与えたときの段ごとの成功率と、実際に通したときの成功率の差から分離します。前段の出力の代わりに人が用意した正解を後段に入れて を測り、その積と通しの成功率 を比べます。
段ごとに正解の中間出力を用意する手間はかかりますが、これは評価データを作るときに一度やれば済みます。 が分かってはじめて、通しの失敗のうちどれだけが境界に由来するのかが言えます。
推定に何件必要かは合成データで確かめられます。真値 のタスクを粒度 で評価し、各粒度に割り当てる件数を変えて1500回繰り返しました。得られた の95%区間を、閉じた形を通して最適段数の幅に翻訳します。
| 1粒度あたりの件数 | の標準偏差 | の95%区間 | 対応する |
|---|---|---|---|
| 30件 | 0.26 | 1.00〜2.05 | 1.0〜4.6段 |
| 60件 | 0.18 | 1.10〜1.81 | 2.1〜4.9段 |
| 120件 | 0.12 | 1.20〜1.66 | 3.5〜5.0段 |
| 300件 | 0.08 | 1.27〜1.56 | 4.1〜5.0段 |
| 1000件 | 0.04 | 1.33〜1.49 | 4.5〜5.0段 |
30件では区間の下端が1.00に届いていて、「分けないほうがよい」から「5段」までが同じ区間に入ります。この段階の測定で段数を決めるのは、測っていないのと大きく変わりません。120件あれば3〜5段に絞れて、多段にすること自体は支持できます。1段の精度で当てたければ300件は要ります。 の側は同じ設定で60件のとき標準偏差0.013、300件で0.006、1000件で0.003でした。真値が0.02なので、60件では2%と5%の区別がつきません。境界の損失が段数を支配していることを踏まえると、こちらの精度は 以上に効きます。
推定値そのものにも偏りがあります。上の表で の平均は1.41から1.44で、真値の1.5を下回りました。粒度の粗い側で失敗率が線形の見込みより小さく出るためで、方向は分かっているので、測定点を細かい側に寄せるか、粗い側の1点を落として当てはめれば緩和できます。評価件数が足りないうちの数値をそのまま設計に持ち込まないためには、同じ評価を乱数を変えて何度か回し、ばらつきの幅を先に見ておくのが確実です。この作法はモデル比較のばらつきを扱った記事と同じ考え方です。
成功率が最大の段数と、要求品質を満たす最小の段数
ここまでは成功率だけを見てきました。段を増やせばトークンも増えます。段ごとにシステムプロンプトとツール定義を送り直し、共有する文脈を読み直すぶんは、段数に比例して積み上がります。要件処理の本体を6,000トークン、1段あたりの固定費を2,500トークンとして、基本ケースの成功率と並べます。

成功率が最大になるのは5段で0.751、1件あたり18,500トークンです。ここで要求品質を0.74と決めると、それを満たす最小の段数は4段で、成功率は0.747、トークンは16,000です。成功率を0.4ポイント譲るだけで、トークンは14%減ります。この差は毎件に効くので、日次で数万件を流す用途なら無視できません。0.4ポイントと14%のどちらを取るかは、失敗1件の後始末にいくらかかるかを入れれば決まります。精度と閾値を金額で並べた記事と同じ換算で、成功率の差を金額に直してからトークン単価と比べます。
そこで問題を、品質制約下のコスト最小化として立て直します。 は上に凸で は増加なので、答えは制約を満たす最小の になり、多くの場合 より小さくなります。「成功率が最大になる段数」を設計目標に据えると、要らない段を1つ抱え込みます。 要求品質を先に決めておけば、この間違いは起きません。逆に要求品質が0.76なら、この設定では満たせる段数が存在しないので、段数の議論をやめて を下げるか を上げる、つまり受け渡す形式を作り直すかスコープの切り方を変えるほうに手を移します。
段の中身が均一でない場合、つまり要件によって難しさや検証の手間が違う場合は、どの要件をどの段に割り当てるかまでが決定変数になります。そこまで行くと1次元の探索では済まず、割り当ての組み合わせを扱う混合整数計画法の問題になります。ただし と の推定精度が上の表の程度なら、割り当ての最適化に進む前に測定を厚くしたほうが得です。
この式が崩れるところ
いくつかの仮定を明示しておきます。どれも実際の系では緩みますが、緩んだ方向が分かれば結論の向きは判断できます。
段を直列に並べ、すべての段が成功したときだけ全体が成功する、という前提が最も強い仮定です。同じ入力を複数の段に並列に流して結果を突き合わせる構成では、失敗は積にならず、むしろ冗長性として働きます。分岐して一部の段だけを通す構成でも、実効的な段数は経路ごとに変わります。この式が当てはまるのは、前段の出力が後段の唯一の入力になっている直列の系です。
ただし並列の構成でも、測るものと組み立ての手順はそのまま使えます。本数を2〜3水準に振って1本あたりの失敗率がスコープにどう反応するかを見れば、 にあたる指数が出ます。突き合わせの前後で成功率を比べれば、集約の段で落ちる分を と同じ引き算で分離できます。作り直すのは成功率の式のほうです。 本のうち 本以上が正しければ通るなら二項型になり、境界の数は分岐と集約の2か所に固定されて本数には比例しません。並列で本数の上限を決めるのはトークンとレイテンシで、直列のように境界が積み上がって効いてくることはありません。
段の独立性も現実には成り立ちません。同じモデル、同じ指示の癖、同じ入力の曖昧さが複数の段に共通して効くので、失敗は相関します。相関があると通しの成功率は積より高く出るため、この式は成功率を悲観側に見積もります。段数の最適値そのものは、相関の入り方が段数に依らないかぎり大きくは動きません。並列に冗長化する構成では、この相関がそのまま見返りを削ります。多数決の効果を独立の仮定で見積もると過大になるので、同じ入力で複数の系列が同時に失敗する割合を先に数えておきます。
を境界によらず一定としましたが、実際には境界ごとに違います。構造化された短いデータを渡す境界の損失は小さく、自由文で要約を渡す境界は大きくなります。境界ごとに が違う場合、閉じた形の をその平均で置き換えれば近い答えが出ます。実務上ここが効くのは、損失の大きい境界を1つ潰すだけで最適段数が伸びる点です。
検証と再試行の扱いも単純化しています。検出率 を段数と無関係に与えましたが、実際には段のスコープが狭いほど検証しやすくなるので は とともに上がります。この依存を入れると最適段数は上に押し戻されます。逆に、検証が正しい出力を誤って弾く割合が高ければ、再試行のコストと品質の劣化が両方増えます。段に分ける本当の見返りが検証のしやすさにある現場では、 の最大化だけを見ていると分割を過小に評価します。
最後に、 がべき乗則に従うという仮定です。要件単位のモデルはひとつの導出にすぎず、要件どうしに依存関係があれば、狭めた見返りは途中で飽和します。両対数の当てはめが直線から外れていたら、そこが飽和の位置です。実測が3水準しかないと直線かどうかも判定できないので、粒度は多めに取っておくほうが安全です。
まとめ
分割の是非は、スコープを狭めたときの効きを表す指数が1を超えるかどうかで決まります。超えていなければ、段数をいくら調整しても丸ごと解くのに勝てません。超えていれば段数の上限は境界の情報損失が決め、その関係は という閉じた形で書けます。基本ケースでは境界1つの損失が2%で5段、1%なら8段、5%なら3段でした。整数で総当たりした答えとの差は中央値0.37段なので、この式はそのまま設計の判断に使えます。
いま多段のパイプラインを持っているなら、次にやることは段数を変えることではありません。段ごとの正解の中間出力を用意して、正しい入力を与えたときの成功率の積と、実際に通したときの成功率を比べてください。その差が境界に落ちている情報の量で、段数を増やしていいかどうかはその1つの数字で決まります。