Pull to refresh

Comments 16

Миллениалы придумали 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мс сократить.

Понял, то есть ограничение архитектурное а не просто «не допилили». Для нашего кейса, часто нужно именно «что обычно идёт рядом с этим модулем», чистый CodeGraph не закроет. Буду смотреть в сторону гибрида, LSP для структуры и отдельный слой для семантики.

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

Я иногда бегаю по репе во времени, вы не знаете, как в этом случае будет вести себя Claude? Можно ли этим инструментом иметь несколько графов?

С подключением.

Не хочу вас разочаровывать, но строить ast дерево все попробовали ещё в 2024 и бросили, так как это не работает.

Если без шуток, AST был лучше банального grep где то во времена chatgpt4.

Для себя когда-то выделял такие пункты обоснования для НЕ развития AST подхода:

1) AST описывает синтаксис, а агенту нужны смысл и намерение - структура вызовов не объясняет, зачем код существует и что сломается при изменении.

2) Гранулярность не совпадает с задачей: уровень выражений слишком мелкий, уровень функций слишком крупный, а смысловой кусок в дерево не ложится.

3) LLM сами хорошо парсят сырой код. Прогон через AST и обратную сериализацию только теряет сигнал (комментарии, форматирование, идиоматику).

4) Релевантный контекст обычно не лежит в соседних узлах - нужна семантическая близость, а не синтаксическая.

5) Важная часть контекста вообще вне кода: коммиты, тикеты, доки, логи, рантайм-поведение, тесты.

6) AST требует валидного кода, тогда как агенты постоянно работают со сломанным и недописанным состоянием.

7) Полезные вещи (резолв символов, типы, поток данных) - не AST, а семантический анализ поверх, и фактически означают написание language server'а.

8) На практике выигрывает гибрид: эмбеддинги для поиска по смыслу + LSP/индексы для точечных запросов + git/доки как отдельные источники + сырой код напрямую в модель с хитрым RAG и пояснением кода за счёт мульт модальности. Но стоит это слишком дорого.

Есть еще codealive.ai
У меня успешно работает на проекте 44.4 MB

Скрытый текст

Крутая идея и схема работы. Я нашел CodeGraph самостоятельно, запустил, проверил и только потом увидел ваш пост. В любом случае Большое Спасибо и Удачи! p.s. Да, вектора пригодятся и особенно для работы со сложными фреймворками, пакетами, библиотеками. Вызовы всех функций будет долго проверять логическим путем. Вообще проект немного напоминаем знаменитый дизассемблер IDA  Ильфака Гильфанова. С ним идут мощным базы данных всех системных вызовов всех ОС и компиляторов. Скорее всего нечто подобное скоро должно появиться и с CodeGraph.

я всё прочитал

Ллм, а не ты, ровно как и статью написала слоп машина

Sign up to leave a comment.

Articles