Обновить

CodeGraph: граф кода для Claude Code вместо grep по файлам. Разбираю архитектуру и проверяю бенчмарки

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели8.2K
Всего голосов 10: ↑9 и ↓1+9
Комментарии9

Комментарии 9

Миллениалы придумали MCP для LSP-сервера? В студии такой из коробки есть уже N лет, да и свободные реализации тоже существуют.

У меня было в планах написать именно такой инструмент. Опередили.

Я делаю похожее приложение, но с нормальной семантикой, полным графом и стат анализом. А так же бесконечное undo любых изменений, линтинг, анализ разного рода, граф по документации в связке с кодом, автодокументирование кода. Первые версии на пользователях протестил, понял что нужна максимальная автоматизация установки и использования (установка докера, запуск конфигуратора - оказывается неподёмная задача для обычного пользователя). Через пару недель доведу до нормального вида и поделюсь.

Так вот, у меня на предварительной версии сейчас такие цифры по swift-репо (на ноутбучной RTX5060):

  • Парсинг 4 393 файла с кодом в 143 101 сущности с 458 201 связями (в 5 раз больше структурных данных чем в CodeGraph/Socrati) – 2,2 сек

  • Индексация с предобучением и записью в БД – 2.8 сек

  • Генерация 170 332 вектора ембеддингов – 38 сек. (4 376 emb/s) С учётом всех доп-процессов (prolly, trigram, etc) на все процессы от старта до завершения = 60 сек (инкрементные изменения 50-100мс).

4 минуты на базовые связи - это очень долго. Если запустить CodeGraph/Socrati на проекты типа postgesql, chromium, dawn, aspnet (3M LOC), то оно мне кажется помрёт в конвульсиях…

Всё гораздо сложнее в разработке таких приложений, чем просто взять доступный парсер и векторную бд.

Поддерживаю, если уж делать граф, то до конца. У вас закрытая разработка или будете выкладывать как опенсурс?

TS-версия открытая. Zig-версия закрытая, рассматриваю её для корп рынка где репо 50M+ LOC

Для IDE семейства IDEA давно существует "pycharm-index" и его близнецы. Решает ту же задачу, но через встроенные инструменты IDE. Найти всех наследников, объявления или использования класса\метода - моментально. Плюс умеет в умное переименование и перемещение, а также забирает результаты диагностики IDE, подхватывая ошибки синтаксиса, дублирование и прочее.

На монорепо в 200к строк TypeScript пробовали разные подходы, сейчас смотрим в сторону статического анализа как раз. Интересно что у CodeGraph нет эмбеддингов, то есть поиск только структурный, по символам и связям. Это хорошо для "кто вызывает эту функцию", но как оно справляется с семантическим поиском типа "где у нас обрабатывается авторизация", когда сам код называется не auth а permission_check или middleware_guard? Это та граница где vector-подход выигрывает, интересно как авторы видят это ограничение.

Такие случаи в CodeGraph/Socrati нормально не обрабатываются. Для корректной работы таких запросов нужен и связанный многогранный граф и семантическое соответствие и дополнительные алгоритмы поиска “часто используется рядом с…” с предразбивкой всего составного в коде на токены и потом прогон по новым найденным дополнительным графам в связке с семантикой и второй круг - совмещение всех графов в один с реранкингом. Если делать это “прямолинейно” на 200к строк, то потребует 30Гб RAM и один запрос будет 10 мин колбасить (слишком много прогонов по всему дереву с перебором). Конкретно когда я решал проблему, то было много “шаманства” на каждом этапе (их примерно десяток в этом запросе), но получилось до 50-100мс сократить.

А что насчёт совмещения подходов? Первый запрос в вектор, а оттуда, найдя конкретные определения/имена - уже расширять контекст через lsp

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации