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

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

Насколько точны открытые индексаторы графа кода

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

Летом мы измерили это для своего индексатора и для открытых инструментов, которые смогли запустить на том же коде.

Как мы мерили

Для каждого корпуса мы строили эталонный граф компиляторными средствами: для TypeScript через TypeScript Compiler API, для C# через индекс на основе компилятора. В эталон попадают связи, которые разрешает компилятор: вызовы, ссылки на типы, наследование, реализации интерфейсов и переопределения.

Каждая связь определяется строго: точное место вызова в исходнике плюс точное объявление, к которому он разрешается. Если метод трижды вызывает validate(), это три факта. Если индексатор привязал вызов не к той перегрузке, это ошибка, даже когда имя совпадает.

Precision — доля найденных индексатором связей, которые подтверждает компилятор. Recall — доля связей из эталона, которые индексатор нашёл.

Результаты

КорпусCodeAlive, все связиCodeAlive, только вызовыБлижайший открытый инструмент, вызовы
Playwright (TypeScript, 1 340 файлов, 318 тыс. строк)P 0,976 · R 0,851P 0,987 · R 0,824codebase-memory-mcp: P 0,652 · R 0,508
Zod (TypeScript, 286 файлов)P 0,979 · R 0,944P 0,989 · R 0,891codebase-memory-mcp: P 0,515 · R 0,404
FluentValidation (C#, 216 файлов, 26 тыс. строк)P 0,987 · R 0,932P 0,985 · R 0,911codebase-memory-mcp: P 0,414 · R 0,417

На всех трёх корпусах точность CodeAlive держалась в пределах 0,976–0,987. Полнота разбросана сильнее: от 0,85 на Playwright до 0,94 на Zod.

В правой колонке указан DeusData/codebase-memory-mcp, самый сильный инструмент из тех, что мы смогли оценить целиком. Он хранит связи не так, как компилятор, поэтому его вызовы мы сопоставляли по более мягкому ключу: строка вызова и строка цели. То есть сравнение в его пользу. И всё равно он нашёл только 40–50% вызовов, а 35–59% найденных им вызовов с компилятором не совпали.

Остальные инструменты

colbymchenry/codegraph на Playwright нашёл много вызовов (recall 0,72), но большая часть из них с компилятором не совпала (precision 0,12). Иерархию классов он строит гораздо лучше: extends P 0,86 · R 0,96, implements P 1,00 · R 0,95. Его мы запускали на чуть меньшем наборе файлов Playwright (1 307), потому что остальные его парсер не обработал чисто.

vitali87/code-graph-rag публикует собственные замеры, их полезно почитать: Django P 0,977 · R 0,938, Zod v4 P 1,00 · R 0,75. Но ключ там грубее нашего. Вызов засчитывается, если совпали вызывающий файл и имя вызываемой функции, поэтому перегрузки и повторные вызовы схлопываются в один факт. В одну колонку с таблицей выше эти числа ставить нельзя. На FluentValidation мы запустили его сами: реализации интерфейсов получили P 0,95 · R 0,62, а у вызовов нет места вызова, так что строго оценить их не получилось.

GitNexus стабильно строил графы для Zod и FluentValidation: повторные запуски дали одинаковый граф, для Zod около 26 тысяч рёбер. Но место вызова в его связях не хранится, два вызова между одной парой функций превращаются в одно ребро, и строгую оценку посчитать нельзя.

Где CodeAlive пока слабее

Полнота по вызовам на Playwright 0,82, а реализации интерфейсов там получили только P 0,71. Оба места мы отслеживаем по тем же компиляторным эталонам, и сейчас работаем именно над ними.

По скорости мы примерно наравне, а не впереди. На FluentValidation codebase-memory-mcp проиндексировал код за 1,5 секунды, CodeAlive — за 2,8. На Playwright CodeAlive потратил 22 секунды на индексацию вместе с оценкой, codebase-memory-mcp — 31 секунду только на индексацию.

Ограничения

Замеры сделаны с 30 июля по 10 августа 2026 года на зафиксированных коммитах каждого корпуса и каждого инструмента. Три корпуса на двух языках не дают общего рейтинга. Ключи для других инструментов приближают наш, как описано выше. Честнее было бы прогнать все инструменты на одном замороженном списке файлов с единым форматом связей, и это следующий шаг.

Помогает ли точный граф агенту?

Не автоматически. Когда мы отдали этот граф нашему исследовательскому агенту, на большом репозитории он помог, на среднем почти ничего не изменил, а некоторые модели им вообще не пользовались. Этот эксперимент описан в статье GraphRAG по коду. Обвязка вокруг инструментов повлияла сильнее, чем сам граф: Одна модель, разные harness.

БенчмаркиContext Engineering

Новые статьи

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

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

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

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