← ラボに戻る

コードグラフが割に合う場面:大きなリポジトリと小さなモデル

benchmarkmcpcoding-agentsevals

前回のベンチマークの結論は、コードグラフを使ってもコーディングエージェントは安くならなかった、というものだった。ただ、それ以上のことを言うには規模が小さすぎた。質問は 24 問、グラフのノード数が 25k を超えるリポジトリはなく、Opus も使っていない。そこで、答えが変わりうる規模でもう一度実行することにし、先に計画を書き出した。仮説、リポジトリ、予算、分析方法は PLAN-v2.md にあり、どの実行よりも前にコミットしてある。

手短に言うと、グラフが割に合うのは、それがなければモデルが検索を続けてしまう場合だ。kubernetes と vscode での haiku がまさにそれに当たる。同じリポジトリで sonnet が節約できるのはわずかで、opus はまったく節約できない。そして小さなリポジトリでは、sonnet にとってグラフは素の grep より高くつく。

設定

エージェントには GitHub Copilot CLI 1.0.90 を使い、ヘッドレスで、一セッションにつき一問ずつ実行した。条件は次の二つ。

公開リポジトリは四つで、それぞれ特定のコミットに固定した。

リポジトリ言語グラフのノード数
full-stack-fastapi-templatePython、TypeScript1,601
dubTypeScript25,023
kubernetesGo146,421
vscodeTypeScript218,883

各リポジトリの質問は 16 問。八つは構造に関するもので、ある関数を誰が呼ぶか、その関数が何を呼ぶか、CLI コマンドや HTTP ハンドラから名前を挙げた関数までの呼び出し経路、そしてシグネチャを変えたらどの関数が壊れるか。残りの八つは正確さを問うもので、設定値、環境変数が読まれる場所、エラーが送出される行、型が定義されている行。正解はすべて、固定したコミットの時点で私が手作業で確認した。正解の各項目は単語全体として一致したときだけ数えるので、init のところで init_db と答えても通らない。

Haiku 4.5 は全 64 問に各条件で三回ずつ、sonnet 5 は二回ずつ答えた。Opus 5.5 は Copilot ではプロンプト一つにつきプレミアムリクエスト 15 回分かかるので、kubernetes と vscode の構造に関する質問のうち十二問に一回ずつ答えた。合計で実行は 664 回、プレミアムリクエストは約 744 回分になる。

コストは前回の記事と同じく tokenEquiv で測る。キャッシュされない入力、プラス 1.25 × キャッシュ書き込み、プラス 0.1 × キャッシュ読み込みを、実行ごとにすべてのモデル呼び出しについて合計したものだ。

結果

grep のコストに対するグラフのコストの比。質問ごとに、繰り返し全体でのグラフ条件の中央値を grep 条件の中央値で割り、さらに質問全体で中央値をとった。95% ブートストラップ区間を添えている。1 未満ならグラフのほうが安い。

モデルリポジトリの規模構造に関する質問正確さを問う質問
haiku 4.5小規模(1.6k ノード)0.88 (0.65–1.29)0.92 (0.72–1.15)
haiku 4.5中規模(25k)0.61 (0.11–1.50)0.96 (0.75–1.37)
haiku 4.5大規模(146k、219k)0.29 (0.11–0.70)1.01 (0.94–1.28)
sonnet 5小規模1.51 (1.45–1.70)1.42 (1.20–1.71)
sonnet 5中規模0.94 (0.57–2.00)1.14 (1.05–1.30)
sonnet 5大規模0.74 (0.62–0.92)1.13 (1.01–1.29)
opus 5.5大規模0.97 (0.72–1.10)–

構造に関する質問の正解数(グラフ対 grep)。

モデル小規模中規模大規模
haiku 4.513/24 対 19/2420/24 対 22/2438/47 対 33/48
sonnet 513/16 対 15/1616/16 対 16/1632/32 対 28/32
opus 5.5––12/12 対 12/12

コストと正確さを合わせて見た、構造に関する質問での正解一件あたりの tokenEquiv。

構造に関する質問での正解一件あたりのトークン数。コードグラフありと grep のみを、FastAPI テンプレートと kubernetes・vscode で比べたもの

揺るがない結果は次のとおり。

なぜ小さなモデルがいちばん得をするのか

モデル呼び出しの回数を数えてみる。grep では、haiku が構造に関する質問一問に答えるのに要した呼び出しは、中央値で kubernetes が 22 回、vscode が 20 回で、影響範囲を問う質問の一つでは 114 回かかった。グラフありでは 5 回と 4 回だった。呼び出しのたびに会話全体が送り直されるので、長い検索のコストは呼び出し回数から想像するよりはるかに大きい。grep での haiku の答えで最も高くついたものは 471k tokenEquiv に達した。

Sonnet の grep での検索はもっと短く、呼び出しは 8 回、グラフありでは 4 回だった。Opus はどちらの条件でも 4 回か 5 回だったので、グラフが削れるものはなく、わずかな節約も固定のオーバーヘッドに食われた。

これは直接は検証していない私の推測だが、グラフは検索のターンを置き換えるものなので、それがなければモデルが多くのターンを費やす場合、つまりより弱いモデルがより大きなリポジトリを扱う場合に割に合う。強いモデルは grep だけでもすでに効率よく検索するし、小さなリポジトリでは誰も多くのターンを必要としない。

Copilot はプレミアムリクエストを、呼び出し回数にかかわらずプロンプト単位で課金するので、Copilot の中ではグラフを使ってもお金は節約できない。節約できるのは時間だ。大きなリポジトリでの haiku の構造に関する質問への回答には、中央値でグラフありが 71 秒、grep では 157 秒かかった。小さなリポジトリでは、グラフ条件のほうが遅かった。

それぞれの条件がどこで間違えたか

前回の記事から変わったこと

前回の記事では、ノード数 25k までのリポジトリで Claude のモデルを使うなら、グラフによるトークン節約は期待しないこと、と書いた。その規模では、これは今も変わらない。見落としていたのは、それより大きな規模で何が起きるかだ。kubernetes と vscode では小さめのモデルが得をし、モデルが小さいほど得るものも大きい。

グラフをエージェントにつなごうとしているチームに伝えたいこと

限界

再現

すべて code-graph-vs-grep にある。実行前に書いた計画書、すべての正解の根拠を添えた質問、ドライバ、664 回の実行すべてとその答え、そして分析だ。

node bench/run-copilot.mjs --model claude-haiku-4.5 --reps 3 --out results/v2/claude-haiku-4.5.json
python3 bench/stats-v2.py results/v2/*.json