Средний

Graphify: построение графа знаний из кода

Алексей Кузнецов
Алексей Кузнецов
Системный администратор12 ноября 2026 г.14 мин чтения

Разбираем Graphify — инструмент для создания графа знаний из исходного кода, документации и схем SQL с помощью детерминированного AST-парсинга.

Graphify: построение графа знаний из кода

Разбираем Graphify — инструмент для создания графа знаний из исходного кода, документации и схем SQL с помощью детерминированного AST-парсинга.

Как Graphify превращает код в знания

Как Graphify превращает код в знания

Когда мы говорим об анализе больших кодовых баз, большинство современных решений сразу предлагают использовать векторный поиск и эмбеддинги. Это работает, когда нужно найти «что-то похожее на функцию обработки платежей». Но если задача стоит в том, чтобы понять, как именно изменение в схеме базы данных повлияет на конкретный метод в контроллере, векторные представления начинают давать сбои. Они работают с вероятностями, а в архитектуре кода нам нужна точность.

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

Принцип работы детерминированного AST-парсинга

В основе Graphify лежит детерминированный парсинг абстрактного синтаксического дерева (AST). Если говорить проще, инструмент не «читает» код как текст, он разбирает его на составляющие компоненты, которые понимает компилятор: объявления классов, импорты, вызовы функций, определения переменных и типы данных.

Процесс выглядит следующим образом:

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

С практической точки зрения это означает, что Graphify понимает контекст. Если в коде есть вызов user.save(), инструмент не просто найдет слово save, он точно определит, что это метод объекта типа User, и проследит связь до определения этого метода в другом файле или даже в сторонней библиотеке.

Для запуска анализа проекта достаточно указать путь к исходникам. Например, если вы используете локальные ИИ-агенты и инструменты для автоматизации рефакторинга, Graphify может выступать в роли поставщика точных данных о структуре проекта.

Пример типичного процесса обработки через CLI:

bash
# Запуск индексации проекта для создания графа знаний
graphify index ./src --language typescript --output ./knowledge-graph.json

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

Почему отсутствие векторного хранилища — это плюс

В индустрии сейчас принято считать, что без векторной базы данных (Vector DB) невозможно построить качественную систему для работы с LLM. Однако в контексте глубокого анализа кода это утверждение не совсем верно.

Использование векторных хранилищ часто приводит к проблеме «галлюцинаций связей». Векторный поиск находит компоненты, которые семантически близки, но технически не связаны. Для разработчика или ИИ-агента, который занимается автономной разработкой на Rust с помощью Claw-Code, такая неточность может стать критической.

Graphify сознательно отказывается от векторного подхода в пользу графового по нескольким причинам:

  1. Точность навигации. В графе путь от вызова функции до её определения — это прямое ребро. В векторной базе это лишь «высокая степень сходства».
  2. Сложные запросы. Графы позволяют выполнять запросы типа «найди все функции, которые зависят от этого типа данных через цепочку из трёх вызовов». Векторный поиск для таких задач практически бесполезен.
  3. Предсказуемость и воспроизводимость. Результат парсинга AST всегда одинаков для одного и того же кода. Векторные эмбеддинги могут незначительно меняться при обновлении моделей, что вносит элемент неопределенности.

Если вы настраиваете CLAUDE.md для улучшения работы Claude Code, наличие точного графа знаний позволит модели не гадать, как устроена ваша система, а опираться на жесткую структуру. Это превращает ИИ из «собеседника, который что-то подсказал» в полноценного инженера, который понимает топологию вашего приложения.

Для эффективной работы с такими данными важно правильно организовать подачу контекста. Это часть общей стратегии, такой как оптимизация ИИ-агентов с помощью системы ECC, где точность входных данных напрямую определяет качество ответа.

Интеграция с AI-инструментами

Использование в Claude Code и Cursor

Когда мы говорим об интеграции графа знаний в современные IDE и CLI-агенты, главная цель — снизить уровень «галлюцинаций» модели. Если Claude Code или Cursor пытаются угадать структуру проекта, опираясь только на текстовый поиск, они неизбежно ошибаются в сложных связях. Graphify решает эту проблему, предоставляя агенту не просто куски кода, а топологию проекта.

В Claude Code это работает через передачу контекста в виде структурированного файла. Вместо того чтобы заставлять агента сканировать сотни файлов, мы отдаём ему уже готовый слепок зависимостей. Для эффективной работы рекомендую сначала создать CLAUDE.md, где пропишите путь к экспортированному графу.

Чтобы подготовить данные для Claude Code, выполните экспорт в формате JSON:

bash
# Генерируем граф и сохраняем его в файл для контекста агента
graphify export --format json --output ./docs/project-graph.json

После этого в вашем CLAUDE.md добавьте инструкцию: «При анализе архитектуры всегда обращайся к ./docs/project-graph.json. Используй связи между компонентами из этого файла для верификации путей импорта».

С Cursor ситуация похожая, но здесь удобнее использовать .cursorrules. Вы можете добавить описание графа в системный промпт, чтобы IDE понимала, как функции в одном модуле влияют на состояние в другом. Это превращает Cursor из продвинутого автодополнения в инструмент, который действительно понимает архитектуру. Подробнее о том, как работают подобные локальные ИИ-агенты и инструменты, читайте в нашем обзоре.

Подключение к Gemini CLI и Codex

Для работы с более низкоуровневыми инструментами, такими как Gemini CLI или Codex, Graphify выступает в роли «препроцессора знаний». Вместо того чтобы скармливать модели сырой исходный код, который быстро съедает контекстное окно, мы подаём ей сжатую семантическую модель.

С практической точки зрения, это позволяет экономить токены. Вместо передачи всего файла database.sql и сопутствующих Python-модулей, вы передаёте только описание связей, полученное через AST-парсинг.

Для интеграции с Gemini CLI можно использовать пайплайн, где вывод Graphify передаётся напрямую в запрос. Например, если вам нужно проанализировать влияние изменения схемы БД на бизнес-логику:

bash
# Собираем схему SQL и связи в коде, затем передаём в Gemini
graphify analyze --type sql --output schema-graph.txt && \
gemini ask "На основе предоставленного графа связей: $(cat schema-graph.txt), какие функции в модуле auth.py пострадают при удалении колонки user_id?"

При работе с Codex (через API) предсказуемость результата возрастает в разы. Если вы строите автономную разработку на Rust с помощью Claw-Code, наличие графа знаний становится критическим условием. Без него агент может бесконечно пытаться исправить ошибку компиляции, не понимая, что проблема лежит в неявной зависимости, описанной в другом модуле.

Для автоматизации этого процесса в рамках CI/CD можно настроить генерацию графа при каждом коммите. Это обеспечит актуальность знаний для всех автономных ИИ-агентов, которые работают с вашим репозиторием.

Что именно попадает в граф

Что именно попадает в граф

Чтобы граф знаний не превратился в свалку разрозненных токенов, Graphify использует детерминированный подход. Вместо того чтобы просто «скармливать» текст языковой модели, инструмент анализирует структуру данных. Это обеспечивает предсказуемость: мы точно знаем, что связь между таблицей users и индексом idx_email — это не галлюцинация нейросети, а результат парсинга синтаксического дерева.

Анализ SQL-схем и конфигурационных файлов

Одной из самых сильных сторон Graphify является работа со структурированными данными. Когда мы говорим о больших проектах, понимание связей в базе данных важнее, чем знание названия конкретной функции в коде. Инструмент парсит DDL-запросы (Data Definition Language), извлекая не только названия таблиц и столбцов, но и внешние ключи (Foreign Keys), ограничения (Constraints) и типы данных.

С практической точки зрения это позволяет построить карту зависимостей, которую можно использовать для обучения локальных ИИ-агентов. Если агент понимает, что изменение в схеме orders затронет таблицу order_items, он сможет предложить корректную миграцию.

Пример конфигурации для Graphify, чтобы он сфокусировался на анализе SQL-схем и конфигураций Nginx:

yaml
# config.yaml
parser:
  include_extensions:
    - .sql
    - .conf
    - .yaml
  rules:
    sql:
      extract_relations: true  # извлекать связи через FOREIGN KEY
      extract_indexes: true    # учитывать индексы для графа связей
    nginx:
      extract_server_blocks: true
      extract_locations: true

Аналогичный подход применяется и к конфигурационным файлам. Если вы настраиваете инфраструктуру, Graphify свяжет директиву proxy_pass в конфиге Nginx с конкретным адресом сервиса, который описан в Docker Compose или Kubernetes-манифесте. Это превращает разрозненные файлы в единую карту сетевых взаимодействий.

Обработка документации и PDF-файлов

Документация часто существует отдельно от кода, что создает разрыв в контексте. Graphify пытается преодолеть этот барьер, превращая неструктурированный текст в элементы графа. Здесь используется комбинация AST-парсинга (для Markdown и кода) и семантического анализа для PDF.

Когда инструмент встречает PDF-файл с описанием архитектуры, он не просто индексирует слова. Он ищет сущности: названия компонентов, протоколы, версии и зависимости. Если в PDF написано: «Сервис аутентификации использует Redis для кэширования сессий», Graphify создаст узел Auth Service и ребро uses к узлу Redis.

Для эффективной работы с документацией важно, чтобы она была подготовлена правильно. Например, если вы используете Claude Code для разработки, наличие структурированного графа, построенного на базе ваших документальных файлов, значительно повысит точность ответов агента.

Процесс обработки обычно выглядит так:

  1. Извлечение текста и структуры (заголовки, списки, таблицы).
  2. Идентификация сущностей (Entity Recognition).
  3. Сопоставление сущностей из текста с уже существующими узлами из кода (например, сопоставление термина «User Table» с реальной таблицей users в SQL-схеме).

Такой подход позволяет избежать ситуации, когда ИИ-агент знает, как работает функция, но не понимает бизнес-логику, описанную в проектной документации. Это критически важно при автономной разработке, где контекст — это всё.

Практическое применение для инженера

Практическое применение для инженера

Когда мы говорим о Graphify, важно понимать: это не просто визуализатор зависимостей, который рисует красивые схемы. С практической точки зрения — это способ превратить разрозненные файлы в структурированную базу знаний, которую можно «скормить» автоматизированным системам. В моей практике часто возникают ситуации, когда проект разрастается до таких масштабов, что даже опытный разработчик начинает терять нить связей между модулями.

Улучшение контекста для AI-агентов

Главная проблема современных локальных ИИ-агентов — это ограниченное окно контекста. Если вы просто скопируете содержимое десяти файлов в чат, модель быстро запутается или начнет галлюцинировать, теряя детали реализации.

Graphify решает эту проблему, создавая детерминированный граф на основе AST (Abstract Syntax Tree). Вместо того чтобы передавать агенту «простыню» текста, мы передаём ему топологию проекта. Это позволяет агенту понимать, что функция calculate_tax в файле billing.py напрямую зависит от схемы таблицы invoices в базе данных, даже если они находятся в разных директориях.

Для эффективной работы с такими инструментами, как Claude Code, крайне важно подготовить контекст. Вы можете использовать экспорт графа из Graphify для генерации вспомогательных файлов. Например, создадим конфигурацию для парсинга, которая фокусируется на ключевых связях между бизнес-логикой и схемой БД:

yaml
# graphify-config.yaml
parser:
  languages:
    - python
    - sql
  include_patterns:
    - "src/services/**/*.py"
    - "migrations/*.sql"
  extract_entities:
    - function
    - class
    - table
    - foreign_key

Используя такой подход, вы обеспечиваете предсказуемость работы агента. Он не просто «угадывает» структуру, а опирается на жесткие связи, извлеченные из кода. Это особенно критично при автономной разработке, где цена ошибки в архитектуре слишком высока.

Поиск связей в сложных репозиториях

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

С помощью Graphify можно провести глубокий аудит связей. Вместо того чтобы вручную просматривать grep-ом все упоминания таблицы, вы строите граф и анализируете пути (paths) между узлами. Если мы посмотрим на процесс анализа, он будет выглядеть примерно так:

  1. Сбор данных: Graphify сканирует репозиторий и строит AST для каждого файла.
  2. Связывание (Linking): Инструмент сопоставляет вызовы функций, определения классов и SQL-запросы к конкретным сущностям.
  3. Экспорт: Получаем JSON или GraphML файл, который можно загрузить в специализированные инструменты визуализации или использовать для автоматизированного поиска.

Чтобы проверить, как изменения затронут систему, можно использовать CLI-интерфейс для фильтрации узлов. Например, если нужно найти все зависимости, связанные с конкретной таблицей users:

bash
# Поиск всех узлов, которые связаны с таблицей users через AST-анализ
graphify analyze --path ./my-project --filter "entity:table:users" --output relations.json

Это позволяет не просто «гасить пожары» при падении сервиса, а системно подходить к анализу влияния (Impact Analysis). Если вы планируете внедрять сложные системы управления кодом, рекомендую также изучить оптимизацию ИИ-агентов с помощью системы ECC, так как структурированный граф — это фундамент для любой качественной системы управления контекстом.

Граф знаний, построенный на детерминированном парсинге, превращает код из набора текстовых файлов в живую, проверяемую структуру. Это делает работу с крупными проектами более прозрачной как для человека, так и для автоматизированных систем.

Заключение

Когда Graphify оправдан

С практической точки зрения, Graphify — это не «магическая кнопка» для понимания любого репозитория, а инструмент для структурирования хаоса. Если вы работаете с монолитом, где зависимости между модулями запутаны, или пытаетесь разобраться в сложной схеме БД, детерминированный парсинг AST (Abstract Syntax Tree) даст вам ту самую предсказуемость, которой не хватает обычным LLM-агентам.

Инструмент показывает себя лучше всего в следующих сценариях:

  1. Аудит архитектуры: когда нужно визуализировать реальные связи между классами и функциями, а не то, что написано в документации.
  2. Подготовка контекста для ИИ: вместо того чтобы скармливать агенту сотни файлов, вы передаёте компактный граф знаний. Это критически важно, если вы используете локальные ИИ-агенты и инструменты, где размер контекстного окна ограничен.
  3. Reverse engineering: разбор legacy-кода, где документация устарела ещё до того, как первый коммит попал в мастер.

Ограничения и нюансы

Не стоит ждать, что Graphify заменит глубокое погружение в код. У подхода есть свои границы. Во-первых, точность графа напрямую зависит от качества парсера для конкретного языка. Если вы используете экзотический диалект или специфические макросы, AST может построиться некорректно.

Во-вторых, инструмент не понимает бизнес-логику. Он видит, что функция A вызывает функцию B, но он не знает, почему это происходит с точки зрения продукта. Для решения задач, требующих понимания намерений разработчика, лучше комбинировать графы с правильной настройкой окружения, например, через создание CLAUDE.md.

Если вы планируете внедрять подобные инструменты в автоматизированные пайплайны, учитывайте нагрузку на CPU при парсинге больших проектов. Для предварительной проверки конфигурации можно использовать тестовый запуск на небольшом подмножестве файлов:

bash
# Пример запуска Graphify для анализа конкретной директории
graphify analyze ./src --output-format dot --target-lang python

Итоговый вектор развития

Graphify — это важный шаг в сторону создания систем, где ИИ не просто «угадывает» следующий токен, а опирается на жесткую структуру данных. В связке с методами оптимизации ИИ-агентов через систему ECC, такие графы позволяют минимизировать галлюцинации.

В ближайшем будущем мы увидим более тесную интеграцию подобных инструментов в IDE и системы CI/CD. Это превратит анализ кода из разовой задачи в непрерывный процесс мониторинга архитектурной чистоты. Если вы строите сложные системы, использование графов знаний станет таким же стандартом, как использование систем контроля версий или контейнеризации.

FAQ

FAQ

Как Graphify понимает связи между файлами?

Инструмент не просто ищет совпадения строк, а анализирует структуру кода через абстрактное синтаксическое дерево (AST). Когда парсер встречает импорт или вызов функции, он сопоставляет идентификатор с определённым узлом в дереве другого файла.

С практической точки зрения это работает так: если в auth.py есть функция validate_token, а в api.py происходит её вызов, Graphify создаёт ребро связи CALLS между этими узлами. Это позволяет строить точные графы зависимостей, которые не ломаются от переименования переменных или изменения форматирования, в отличие от простых regex-скриптов. Такой подход критически важен, когда вы используете локальные ИИ-агенты и инструменты, которым нужна точная карта проекта для корректной работы.

Нужно ли разворачивать отдельную базу данных?

По умолчанию Graphify может работать в режиме экспорта в статические форматы, например, JSON или GraphML, что удобно для разового анализа. Однако для полноценного интерактивного исследования графа и работы с масштабными проектами лучше использовать графовую БД, такую как Neo4j.

Если вы планируете интегрировать результаты в свой рабочий процесс, я рекомендую сразу настроить контейнер с базой. Вот пример конфигурации для docker-compose.yml, чтобы развернуть окружение для хранения графа:

yaml
services:
  neo4j:
    image: neo4j:5.12
    container_name: graphify-db
    ports:
      - "7474:7474" # HTTP интерфейс
      - "7687:7687" # Bolt протокол
    environment:
      - NEO4J_AUTH=neo4j/your_secure_password
    volumes:
      - ./neo4j/data:/data

После запуска вы сможете загружать полученные из Graphify данные напрямую в базу через Cypher-запросы.

Поддерживает ли инструмент языки программирования, кроме Python?

На текущий момент ядро Graphify заточено под Python, так как это позволяет использовать мощные библиотеки для парсинга и быстро прототипировать логику извлечения сущностей. Однако архитектура инструмента позволяет добавлять новые грамматики.

Если ваша задача — глубокий анализ системного кода, стоит обратить внимание на автономную разработку на Rust с помощью Claw-Code. Для расширения возможностей Graphify под другие языки (например, TypeScript или Go) потребуется написать кастомный парсер, который будет преобразовывать синтаксис языка в единый формат узлов и ребер, понятный движку Graphify.

В чем преимущество AST перед обычным поиском по тексту?

Обычный поиск (grep) работает на уровне символов. Он не понимает контекста и часто даёт ложноположительные результаты. Например, если вы ищете использование переменной user, поиск выдаст и комментарии, и названия других переменных вроде superuser.

AST-парсинг обеспечивает предсказуемость. Он понимает разницу между:

  1. Объявлением функции.
  2. Вызовом этой функции.
  3. Упоминанием имени функции в строковом литерале или комментарии.

Для сложных задач, таких как оптимизация ИИ-агентов с помощью системы ECC, точность связей имеет решающее значение. Если агент получит неверную карту зависимостей, он начнёт предлагать правки, которые нарушат логику работы всей системы. AST исключает этот риск, предоставляя только реальные структурные связи.

Поделиться:TelegramX / TwitterVK

Читайте также