К содержанию
Новости

Графовый подход к резюмированию репозиториев снижает «галлюцинации» LLM

Большие языковые модели часто дают неточные описания кода, если попросить их «кратко объяснить репозиторий». В ответах могут появляться несуществующие тесты, придуманные API‑эндпоинты, сделанные по названиям папок, или описания «потоков данных», которые на деле никто не анализировал. Причина проста: LLM работают как системы статистического дополнения шаблонов. Получив набор файлов в контекстном окне, модель делает выводы по именам и вероятностным паттернам из множества других проектов, а не по реальному разбору конкретной кодовой базы.

В материале Towards AI описан другой подход, реализованный в небольшом Python‑проекте code-graph-ai-summarizer. Его ключевая идея проста: модели вообще не показывают исходный код. Сначала инструмент выполняет статический анализ репозитория и собирает точный структурированный набор фактов. Уже после этого LLM получает подготовленный «fact‑sheet» и на его основе пишет текстовое резюме. В такой схеме модель не пытается самостоятельно понять код, она лишь формулирует уже проверенные данные.

В основе метода лежит представление проекта в виде графа. Для этого используется open-source платформа статического анализа Joern, которая преобразует исходный код в Code Property Graph (CPG). Такой граф объединяет несколько представлений: Abstract Syntax Tree, Control Flow Graph, Data Dependence Graph, а также связи call graph edges. После импорта репозитория эти структуры можно запрашивать через CPGQL, язык запросов на базе Scala. Он позволяет рассматривать всю кодовую базу как единый большой граф.

В проекте работа с Joern реализована через модуль joern/client.py и класс JoernRunner. Это обёртка вокруг cpgqls_client, который подключается к локальному серверу Joern, например запущенному командой joern --server и по умолчанию доступному на localhost:8080. После импорта репозитория к графу выполняются запросы, описанные в joern/queries.py. Среди них извлечение списка файлов (files), функций и методов с сигнатурами (methods), объявленных типов (types), а также связей вызовов между методами (call_edges). Полученные структурированные данные и становятся основой для итогового резюме, которое затем формулирует LLM.

Ключевые факты

  • Проект code-graph-ai-summarizer, небольшой проект на Python, который сначала строит структурированный набор фактов о репозитории через статический анализ, а затем передает этот «fact-sheet» LLM для генерации описания.

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

  • Для анализа кода применяется Joern, open-source платформа статического анализа, которая преобразует репозиторий в Code Property Graph (CPG), объединяющий AST, Control Flow Graph, Data Dependence Graph и call graph.

  • В репозитории определены шесть CPGQL-запросов (в joern/queries.py), которые извлекают структуру проекта: файлы, функции/методы с сигнатурами и строками, объявленные типы и связи вызовов между методами.