Средний

Создание графа знаний из кода с помощью Graphify

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

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

Создание графа знаний из кода с помощью Graphify

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

Как Graphify работает с кодом

Анализ через AST вместо векторного поиска

Когда мы говорим об использовании AI в анализе кода, первая мысль обычно уводит в сторону RAG (Retrieval-Augmented Generation) и векторных баз данных. Идея понятна: нарезать код на куски, превратить их в эмбеддинги и искать похожие фрагменты. Но у этого подхода есть фундаментальная проблема — потеря контекста. Векторный поиск хорош, когда нужно найти «что-то похожее на функцию авторизации», но он бесполезен, если нужно точно понять, какая именно переменная передаётся в третий аргумент конкретного метода в другом файле.

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

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

Для начала работы с инструментом достаточно инициализировать процесс анализа в корне вашего проекта. Например, если вы работаете с Python-проектом, команда будет выглядеть так:

bash
# Запуск анализа кодовой базы для построения графа
graphify analyze --language python --path ./src

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

Детерминированный подход к связям

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

Если функция calculate_total вызывает метод get_price у объекта класса Product, в графе будет проложена прямая связь. Это не предположение нейросети, а факт, извлечённый из синтаксического разбора. Такой подход позволяет строить глубокие цепочки вызовов, которые не разваливаются при масштабировании кодовой базы.

Для управления тем, какие именно типы связей мы хотим извлечь, можно использовать конфигурационный файл. Это позволяет отсечь лишний шум и сосредоточиться на архитектурно важных узлах. Создайте файл graphify.config.yaml в корне проекта:

yaml
# Конфигурация извлечения связей
extraction:
  include_types:
    - class_definition
    - function_call
    - variable_assignment
  exclude_patterns:
    - "**/tests/*"      # Игнорируем тесты, чтобы не замусоривать граф
    - "**/migrations/*" # Игнорируем SQL-миграции
  depth: 5              # Глубина анализа зависимостей

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

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

Возможности инструмента для инженера

Возможности инструмента для инженера

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

С практической точки зрения, инструмент позволяет превратить разрозненные файлы в единую карту зависимостей. Это дает ту самую предсказуемость, которой так не хватает при использовании стандартных RAG-систем (Retrieval-Augmented Generation).

Поддержка документации и SQL-схем

Обычно анализ кода ограничивается только AST (Abstract Syntax Tree). Но код не существует в вакууме: он опирается на структуру данных в БД и описания в документации. Graphify умеет «подтягивать» эти слои в общий граф.

Если у вас есть набор .sql файлов с описанием таблиц и связей, инструмент проанализирует их и создаст узлы, которые будут связаны с соответствующими сущностями в коде. Это позволяет AI-агенту понять, что метод update_user_profile в Python-сервисе напрямую манипулирует колонкой last_login в таблице users.

Для интеграции документации (например, Markdown-файлов в папке /docs) используется процесс парсинга связей. Если в документации упоминается конкретный модуль или API-эндпоинт, Graphify попытается связать этот текстовый узел с реальным объектом в коде.

Пример конфигурации для обработки специфических директорий с документацией и SQL-миграциями в graphify.config.json:

json
{
  "include": [
    "src/**/*.py",
    "migrations/*.sql",
    "docs/**/*.md"
  ],
  "parsers": {
    "sql": {
      "enabled": true,
      "format": "postgresql"
    },
    "markdown": {
      "enabled": true,
      "extract_links": true
    }
  }
}

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

Интеграция с Claude Code и Cursor

Самое интересное начинается, когда этот граф становится «мозгом» для инструментов разработки. Инструменты вроде Claude Code или Cursor работают в режиме постоянного сканирования контекста. Однако без структурированного графа они полагаются на поиск по файлам, что часто приводит к галлюцинациям.

При использовании Claude Code, предварительно созданный граф позволяет инструменту не просто «читать файлы», а перемещаться по связям. Вместо того чтобы пытаться угадать, где лежит описание интерфейса, агент запрашивает у графа связанные узлы.

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

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

  1. Глубина анализа: при запросе «покажи цепочку вызовов от API до БД» Cursor не просто ищет похожие строки, а проходит по ребрам графа.
  2. Точность рефакторинга: инструмент видит не только текущий файл, но и все места, где используются затронутые типы данных или функции.

Если вы хотите систематизировать процесс использования таких инструментов, полезно изучить набор навыков для инженеров: обзор репозитория skills, где описаны подходы к работе с современным AI-стеком.

Для базового запуска анализа через CLI, чтобы быстро проверить, как Graphify видит ваш проект, используйте команду:

bash
# Анализ текущей директории с генерацией графа в формате JSON
graphify analyze . --output ./graph_output.json --format json

После этого полученный файл можно использовать как источник истины для любого AI-инструмента, работающего с кодом.

Практическое применение в разработке

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

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

Graphify решает эту задачу иначе, чем классические RAG-системы (Retrieval-Augmented Generation), которые полагаются на векторный поиск по кускам текста. Вместо того чтобы искать «похожие по смыслу» куски кода, Graphify предоставляет агенту топологическую карту проекта. Если агент хочет изменить метод в классе OrderService, он не просто получает текст этого класса, а понимает, какие интерфейсы он реализует и какие зависимости внедряет.

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

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

bash
# Генерация графа на основе AST (Abstract Syntax Tree)
graphify analyze ./src --output ./knowledge-graph.json

Полученный JSON-файл содержит не просто текст, а связи. Если мы скормим этот граф агенту, его способность давать предсказуемые ответы вырастет в разы, так как он будет оперировать не фрагментами, а связями. Это критически важно при управлении доступом для AI-агентов, когда нужно ограничить область видимости агента только определёнными узлами графа.

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

В больших монолитах или разросшихся микросервисных репозиториях поиск причин падения системы часто превращается в детективное расследование. Вы меняете тип поля в SQL-схеме и внезапно обнаруживаете, что упал сервис, который, казалось бы, вообще не связан с этой базой данных.

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

Представьте, что у вас есть сложная схема миграций. Чтобы понять, как изменение в users повлияет на систему, вы можете использовать экспорт графа для анализа зависимостей. Вот пример того, как может выглядеть конфигурация для глубокого анализа связей между кодом и схемой БД:

json
{
  "project_name": "core-api",
  "analysis_depth": 3,
  "include_sql": true,
  "extract_ast": {
    "languages": ["typescript", "python"],
    "include_imports": true
  }
}

Применение этого подхода дает несколько преимуществ:

  1. Предсказуемость рефакторинга. Вы видите все точки входа в метод до того, как измените его сигнатуру.
  2. Анализ влияния (Impact Analysis). Можно точно определить, какие части системы затронет изменение в конфигурации или схеме данных.
  3. Документирование «на лету». Граф становится живой документацией, которая не устаревает, в отличие от Wiki-страниц, потому что он строится напрямую из исходного кода.

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

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

Ограничения и особенности использования

Ограничения и особенности использования

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

Когда графа знаний будет недостаточно

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

Во-первых, Graphify не видит динамику. Если ваше приложение использует рефлексию, глубокую инъекцию зависимостей (Dependency Injection) через конфигурационные файлы или загрузку модулей во время выполнения, граф не сможет восстановить эти связи. Для системы это будет выглядеть как разрыв в цепочке вызовов.

Во-вторых, инструменту сложно даётся семантика «зачем». Граф понимает, что функция_А вызывает функцию_Б, но он не понимает бизнес-логику. Если вам нужно, чтобы AI-агент понимал, почему конкретный алгоритм выбран для обработки платежей, одного графа связей будет мало. Здесь потребуется комбинация графового подхода с векторным поиском по документации.

В-третьих, масштаб имеет значение. При попытке скормить инструменту монолит на несколько миллионов строк кода, вы столкнётесь с проблемой вычислительной сложности. Построение и обход такого графа требует огромного объёма оперативной памяти. В таких случаях лучше использовать управление доступом для AI-агентов с помощью Alter, чтобы ограничивать контекст агента только необходимыми модулями.

Требования к локальному окружению

Поскольку Graphify работает с AST и требует значительных ресурсов для парсинга и построения связей, к вашей домашней лаборатории или рабочей станции предъявляются определённые требования.

С точки зрения железа, я рекомендую ориентироваться на следующие параметры:

  • Оперативная память: Минимум 16 ГБ. Если проект крупный, лучше иметь 32 ГБ и выше. Процесс построения графа — это не линейная задача, потребление памяти может расти экспоненциально при обработке сложных вложенностей.
  • Процессор: Высокая многопоточность. Парсинг файлов — задача, которую легко распараллелить.
  • Дисковая подсистема: Только NVMe. Скорость чтения тысяч мелких файлов исходного кода напрямую влияет на время подготовки данных.

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

Пример базового docker-compose.yml для развёртывания Graphify в вашей инфраструктуре:

yaml
services:
  graphify:
    image: graphify/core:latest
    volumes:
      # Монтируем кодовую базу и папку для вывода графа
      - /home/user/projects/my-app:/src:ro
      - ./output:/data
    environment:
      # Указываем уровень детализации анализа
      - ANALYSIS_DEPTH=full
      # Лимит памяти для процесса (важно для стабильности)
      - MEMORY_LIMIT=8g
    deploy:
      resources:
        limits:
          memory: 12G

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

Если вы только начинаете осваивать работу с инструментами анализа кода, рекомендую сначала изучить обзор репозитория skills, чтобы понимать, какие компетенции необходимы для работы с подобными графами.

Заключение

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

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

Инструмент хорошо работает в следующих сценариях:

  • Анализ legacy-кода: когда документации нет, а нужно быстро восстановить связи между модулями.
  • Подготовка контекста для Claude Code: вместо того чтобы скармливать агенту сотни файлов, вы передаёте компактную структуру связей.
  • Проектирование архитектуры: визуализация того, как изменения в одном компоненте могут затронуть другие части системы.

Однако, если вы планируете использовать граф для поиска по смыслу (например, «найди функции, которые работают с пользователями»), векторный поиск всё равно останется эффективнее. Graphify даёт топологию, а не семантику.

Ограничения и риски

Не стоит ожидать, что инструмент решит все проблемы с контекстом. Основная сложность здесь — масштаб. При работе с огромными монолитами граф может стать слишком плотным, что затруднит его обработку даже продвинутыми моделями вроде Claude 3.5 Sonnet.

Во-первых, Graphify опирается на синтаксический анализ. Если в коде много динамических вызовов, которые определяются только во время выполнения (runtime), граф их не увидит. Это создаёт ложное ощущение полноты картины.

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

Итоговый чеклист внедрения

Чтобы внедрение Graphify принесло пользу, а не превратилось в бесконечную отладку графа, я рекомендую придерживаться следующего алгоритма:

  1. Определите границы: не пытайтесь построить граф всего репозитория сразу. Начните с конкретного микросервиса или модуля.
  2. Настройте фильтрацию: исключите сторонние библиотеки и автосгенерированный код (например, Protobuf или файлы миграций, если они не несут архитектурной ценности).
  3. Проверьте интеграцию: если вы используете инструмент в связке с Claude Code, убедитесь, что формат вывода графа соответствует ожиданиям агента.

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

bash
# Пример запуска Graphify для конкретной директории с фильтрацией
graphify ./src --output ./docs/knowledge-graph --exclude "**/vendor/*,**/tests/*"

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

FAQ

FAQ

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

Нет, в этом и заключается ключевое отличие Graphify от классических RAG-систем (Retrieval-Augmented Generation). Инструмент не использует векторные хранилища и не требует процесса эмбеддинга данных. Вместо поиска по сходству векторов, Graphify строит явные связи между объектами на основе абстрактного синтаксического дерева (AST).

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

Какие типы файлов поддерживает Graphify?

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

  • Исходный код (Python, TypeScript, Go, Rust);
  • SQL-схемы (описания таблиц и связей);
  • Документацию в форматах Markdown и JSON.

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

Как инструмент помогает при работе с LLM?

Graphify решает проблему «галлюцинаций» и ограниченного контекстного окна. Когда вы передаёте LLM (например, Claude Code) сырой код, модель пытается угадать зависимости. Граф знаний предоставляет модели четкую карту: какие компоненты связаны между собой на самом деле.

Это позволяет AI-агентам:

  1. Точнее понимать область видимости переменных и функций.
  2. Избегать ошибок при рефакторинге, видя все точки входа и зависимости.
  3. Эффективнее использовать контекст, получая только релевантные узлы графа, а не весь репозиторий целиком.

Для более глубокой интеграции агентов в рабочий процесс рекомендую изучить тему управления доступом для AI-агентов.

Можно ли использовать Graphify локально?

Да, Graphify спроектирован так, чтобы работать в вашей локальной среде или внутри вашей инфраструктуры. Это критически важно для безопасности, если вы работаете с проприетарным кодом, который нельзя отправлять на сторонние сервисы.

Для запуска в изолированном окружении проще всего использовать Docker. Пример базового запуска:

dockerfile
# Пример запуска через Docker для анализа локальной директории
docker run --rm \
  -v $(pwd)/my-project:/src \
  graphify/cli:latest \
  analyze /src --output ./graph-data

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

Часто задаваемые вопросы

Чем подход Graphify отличается от классического RAG?

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

Можно ли использовать Graphify для анализа больших монолитов?

Инструмент подходит для работы с крупными проектами, так как он строит граф на основе синтаксического разбора, а не хранит тяжелые векторные индексы. Однако при анализе огромных кодовых баз стоит учитывать нагрузку на память, так как построение AST для миллионов строк кода требует ресурсов. Если проект слишком велик, я рекомендую запускать анализ по отдельным модулям или поддиректориям, чтобы контролировать потребление ресурсов.

Требуется ли наличие векторной базы данных для работы инструмента?

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

Насколько точно Graphify понимает связи между разными языками программирования?

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

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

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