Перейти к основному содержимому
CodeAlive 3.0: от context engine к агенту для исследования кода
CodeAlive

Ко всем статьям

GraphRAG по коду: когда граф вызовов действительно помогает агенту

Rodion Mostovoi

Rodion Mostovoi

https://www.linkedin.com/in/rodion-mostovoi/

Мы дали нашему исследовательскому агенту точный граф кода и измерили на RepoContextBench v2, что изменилось. На репозитории среднего размера почти ничего. На большом агент находил заметно больше нужного кода. А сложнее всего было добиться, чтобы модель вообще пользовалась графом.

Граф рядом с кодомAgent Framework, ~513 тыс. строкSapling, ~1,5 млн строк
Найдено нужных файлов81,2 → 84,478,3 → 82,4
Найдено фрагментов-доказательств60,3 → 61,064,2 → 69,6
Оценка ответа73,9 → 74,055,5 → 56,7

DeepSeek V4.1 Flash (reasoning effort max) ни разу не вызвал отдельный инструмент графа за 40 задач, как бы мы его ни подталкивали. GPT-5.6 Luna (xhigh) вызывал и получил около 4–5 пунктов. Замена всего агента дала гораздо больше, чем граф: на той же модели harness CodeAlive набрал на 18,7 пункта больше, чем OpenCode.

Как мерили

В RepoContextBench v2 40 вопросов по двум зафиксированным репозиториям, и каждый ответ нужно подтвердить кодом.

ТрекРепозиторийРазмерВопросов
LiteMicrosoft Agent Framework~513 тыс. строк на C# и Python20
HardSapling (система контроля версий от Meta)~1,5 млн строк на Rust, Python, C++ и TypeScript20

Во всех конфигурациях работал один и тот же исследовательский агент 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 с ним, в пределах шума.

Тогда мы стали подталкивать модель к графу:

Что пробовалиВызовов графа
Инструкция «сначала граф» в системном промпте0 из 20 задач
Подсказки следующего шага, новое описание, few-shot примеры или reasoning effort high по отдельности0 из 6 точек решения в каждом случае
Всё сразу1 из 6
Раздельные find_callers / find_callees3 из 4, только на прямых вопросах «кто вызывает X»

Почему так, видно из рассуждений модели в этих точках. Ей нужны литеральные факты: сигнатуры, имена свойств, ключевые слова. Поиск и чтение файлов дают ровно это. А реальные вопросы чаще звучат как «как работает X», а не «кто вызывает X», и до графа дело не доходит.

Всё зависит от модели

МодельReasoning effortВызовов графа, LiteВызовов графа, Hard
DeepSeek V4.1 Flashmax0–10–1
Qwen 3.8 27Bxhigh00
GPT-5.6 Lunaxhigh315

Более сильная модель сама пошла в граф, причём на большом репозитории в пять раз чаще. Для 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 пункта на той же модели.

БенчмаркиContext EngineeringАгенты для кода

Новые статьи

Следите за работой, а не за маркетинговой воронкой

Одно прямое письмо после публикации. Без отслеживания открытий и кликов, продаж и чаще одного раза в день.

Дайте агентам всю кодовую базу

Проиндексируйте первый репозиторий за минуты — или попробуйте демо без регистрации.