← Назад в лабу

Когда граф кода окупается: большие репозитории, маленькие модели

benchmarkmcpcoding-agentsevals

Мой прошлый бенчмарк показал, что граф кода не сделал моего агента дешевле. Сказать больше он не мог, слишком был мал: 24 вопроса, ничего крупнее 25 тыс. узлов графа, без Opus. Поэтому я прогнал его заново в таком масштабе, где ответ мог измениться, и сначала записал план. Гипотезы, репозитории, бюджет и анализ лежат в PLAN-v2.md, закоммиченном до первого запуска.

Коротко: граф окупается, когда без него модель продолжала бы искать. Haiku на kubernetes и vscode — как раз такой случай. Sonnet там немного экономит, opus ничего, а на маленьком репозитории граф обходится sonnet дороже простого grep.

Постановка

Агент — GitHub Copilot CLI 1.0.90 в headless-режиме, один вопрос на сессию, в двух вариантах:

Четыре открытых репозитория, каждый закреплён на коммите:

репозиторийязыкузлов графа
full-stack-fastapi-templatePython, TypeScript1 601
dubTypeScript25 023
kubernetesGo146 421
vscodeTypeScript218 883

На каждый репозиторий 16 вопросов. Восемь структурных: кто вызывает функцию, что она вызывает, путь вызовов от CLI-команды или HTTP-обработчика до заданной функции и какие функции сломаются, если поменять сигнатуру. Восемь точных: значение из конфига, где читается переменная окружения, строка, на которой бросается ошибка, строка, на которой определён тип. Каждый ключ ответа я вручную сверил с кодом на закреплённом коммите, и элемент засчитывается только целым словом, так что init_db не сойдёт за init.

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,6 тыс. узлов)0,88 (0,65–1,29)0,92 (0,72–1,15)
haiku 4.5средний (25 тыс.)0,61 (0,11–1,50)0,96 (0,75–1,37)
haiku 4.5большой (146 тыс., 219 тыс.)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 требовалось по медиане 22 вызова на структурный ответ на kubernetes и 20 на vscode, а один вопрос о последствиях смены сигнатуры занял 114. С графом — 5 и 4. Каждый вызов заново отправляет весь разговор, поэтому длинный поиск стоит гораздо больше, чем подсказывает число вызовов: самый дорогой ответ haiku с grep обошёлся в 471 тыс. tokenEquiv.

Поиски sonnet с grep были короче: 8 вызовов против 4 с графом. Opus в обоих вариантах уложился в 4 или 5 вызовов, так что графу нечего было сокращать, а постоянные накладные расходы съели то немногое, что он сэкономил.

Моё предположение, которое я напрямую не проверял: граф заменяет шаги поиска, поэтому окупается тогда, когда без него модель сделала бы их много, то есть у более слабой модели на более крупном репозитории. Сильная модель и так ищет через grep эффективно, а на маленьком репозитории много шагов не нужно никому.

Copilot списывает премиум-запросы за промпт, сколько бы вызовов ни было, так что внутри Copilot граф денег не экономит. Он экономит время: структурные ответы haiku на больших репозиториях заняли по медиане 71 секунду с графом и 157 секунд с grep. На маленьком репозитории вариант с графом был медленнее.

Где ошибался каждый вариант

Что изменилось с первой заметки

Первая заметка советовала не ждать экономии токенов от графа с моделями Claude на репозиториях до 25 тыс. узлов. На таких размерах это по-прежнему верно. Она упустила то, что происходит дальше: на 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