Мы дали нашему исследовательскому агенту точный граф кода и измерили на RepoContextBench v2, что изменилось. На репозитории среднего размера почти ничего. На большом агент находил заметно больше нужного кода. А сложнее всего было добиться, чтобы модель вообще пользовалась графом.
DeepSeek V4.1 Flash (reasoning effort max) ни разу не вызвал отдельный инструмент графа за 40 задач, как бы мы его ни подталкивали. GPT-5.6 Luna (xhigh) вызывал и получил около 4–5 пунктов. Замена всего агента дала гораздо больше, чем граф: на той же модели harness CodeAlive набрал на 18,7 пункта больше, чем OpenCode.
Как мерили
В RepoContextBench v2 40 вопросов по двум зафиксированным репозиториям, и каждый ответ нужно подтвердить кодом.
Во всех конфигурациях работал один и тот же исследовательский агент CodeAlive на одном индексе, оценивал один и тот же LLM-судья (Muse Spark 1.3 с reasoning effort medium, два голоса на задачу). Менялось только то, как граф попадал к модели. В большинстве прогонов отвечал DeepSeek V4.1 Flash с reasoning effort max. Шкала от 0 до 100.
Сам граф точный: около 0,98 precision по сравнению с компилятором (сравнение с открытыми индексаторами).
Sapling отличается от Agent Framework не только размером: вопросы там сложнее, языки другие. Поэтому корректно говорить «на большой и более сложной кодовой базе граф помогает сильнее», а не «прирост дал именно размер». Повтор одного и того же прогона сдвигал оценку примерно на ±2 пункта, всё, что меньше, мы считаем шумом.
Инструмент графа агент так и не вызвал
Сначала граф был отдельным инструментом, get_artifact_relationships. Он возвращает вызывающих и вызываемых, реализации и ссылки для символа.
У DeepSeek V4.1 Flash инструмент был во всех 40 задачах, и модель не вызвала его ни разу. Когда мы его убрали, оценка не упала: 62,2 без него против 59,4 с ним, в пределах шума.
Тогда мы стали подталкивать модель к графу:
Почему так, видно из рассуждений модели в этих точках. Ей нужны литеральные факты: сигнатуры, имена свойств, ключевые слова. Поиск и чтение файлов дают ровно это. А реальные вопросы чаще звучат как «как работает X», а не «кто вызывает X», и до графа дело не доходит.
Всё зависит от модели
Более сильная модель сама пошла в граф, причём на большом репозитории в пять раз чаще. Для Luna инструмент графа дал около 4–5 пунктов на обоих треках. Это примерно два уровня шума, и по одному прогону на конфигурацию.
Кладём граф туда, где агент и так читает
Код модель стабильно читает через fetch_artifacts, поэтому мы встроили граф вызовов прямо в этот ответ. Рядом с кодом функции агент теперь видит, кто её вызывает и что вызывает она. Это и есть таблица в начале статьи.
На Agent Framework разница в пределах шума. На Sapling агент нашёл на 4–5 пунктов больше нужных файлов и доказательств. Итоговый ответ вырос на 1,2 пункта, это ниже нашего порога шума.
Лишний контекст мешает
Ещё мы добавили к графу точную позицию каждого вызова, чтобы агент мог сразу перейти к нужной строке. Стало хуже: минус 6,2 пункта на Sapling и минус 3,5 на всех 40 задачах. Агенту показали 2 276 позиций вызовов, и он не процитировал ни одной.
Что мы из этого вынесли
Прежде чем сравнивать оценки, посчитайте вызовы графа в трассах. Инструмент, который модель не вызывает, помочь не может, а по списку инструментов этого не видно.
Если модель не просит граф, отдавайте его в том ответе, который она и так читает, и не перегружайте этот ответ. Вызывающие и вызываемые рядом с кодом помогли на большом репозитории, позиции вызовов в том же месте навредили.
На репозитории среднего размера поиск и так находит почти всё, что добавил бы граф. Чтобы честно измерить пользу графа на больших кодовых базах, в бенчмарке нужно больше вопросов о вызывающих и о последствиях изменений, чем в нашем текущем наборе.
Агент вокруг инструментов повлиял на результат гораздо сильнее, чем граф: Harness CodeAlive против OpenCode: плюс 18,7 пункта на той же модели.