Средний

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

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

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

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

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

Как Graphify превращает код в граф знаний

Как Graphify превращает код в граф знаний

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

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

Принцип работы на основе AST

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

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

  1. Парсинг: Graphify обходит файлы и строит дерево синтаксических конструкций. Для каждого языка (Python, TypeScript, Go и др.) используются соответствующие парсеры.
  2. Извлечение сущностей: Инструмент находит не просто слова, а конкретные узлы: классы, методы, переменные, декораторы и даже зависимости между ними.
  3. Связывание: На этом этапе происходит магия. Если метод в файле auth.py вызывает функцию из utils.py, Graphify создает направленный ребро в графе.

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

Для начала работы с инструментом достаточно указать путь к проекту. Например, если мы хотим проанализировать локальную директорию:

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

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

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

Обычно архитектуры для работы с AI включают в себя векторную БД (вроде Chroma или Pinecone). Graphify намеренно уходит от этой модели в пользу чистого графового представления. И вот почему это важно для предсказуемости системы.

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

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

Сравните два подхода:

  • Векторный поиск: «Найди мне что-то похожее на обработку ошибок в этом файле».
  • Графовый поиск: «Найди все функции, которые вызываются внутри блока try-except в классе DatabaseConnector».

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

Для интеграции графа в ваш рабочий процесс можно использовать конфигурационный файл graphify.config.yaml, чтобы исключить лишние директории (например, node_modules или venv) и сфокусироваться только на важном:

yaml
# Пример конфигурации Graphify
include:
  - "src/**/*.ts"
  - "docs/*.md"
  - "sql/*.sql"
exclude:
  - "**/tests/**"
  - "**/dist/**"

parser_options:
  depth: 5 # Глубина анализа связей
  include_comments: true # Важно для понимания намерений разработчика

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

Возможности анализа документации и схем

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

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

Graphify решает эту проблему, анализируя DDL-скрипты (Data Definition Language). Инструмент парсит SQL-схемы и строит связи FOREIGN KEY прямо в графе. Это позволяет модели не просто «видеть» таблицу, а понимать контекст: например, что запись в таблице orders неразрывно связана с пользователем из users.

С практической точки зрения, это превращает разрозненные SQL-файлы в семантическую карту данных. Если вы используете набор инструментов Claude Code, наличие такой карты в контексте значительно повышает точность генерации миграций.

Для анализа конфигурационных файлов, например, Nginx или Docker Compose, Graphify использует подход, схожий с анализом AST (Abstract Syntax Tree). Он извлекает зависимости: какие порты проброшены, какие тома (volumes) подключены и как сервисы взаимодействуют друг с другом.

Пример того, как можно подготовить SQL-дамм для индексации в Graphify через CLI:

bash
# Извлекаем только структуру (без данных) для чистоты графа
pg_dump -s my_database > schema.sql

# Запускаем индексацию схемы через Graphify
graphify index --type sql --input ./schema.sql --output ./knowledge_graph/db_schema

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

Интеграция PDF и текстовой документации

Код — это лишь половина правды. Часто бизнес-логика, правила валидации или описание API запрятаны в PDF-файлах, Markdown-документации или даже в старых README.md. Без интеграции этих текстов агент будет знать, как работает функция, но не поймет, почему она должна работать именно так.

Graphify использует механизмы парсинга документов для извлечения сущностей и связей. Если в документации сказано: «Объект User должен иметь статус active для совершения покупок», инструмент пытается сопоставить это утверждение с кодом, где проверяется этот статус.

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

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

Пример конфигурации graphify.yaml для включения текстовых ресурсов:

yaml
indexing:
  sources:
    - path: "./docs"
      type: "markdown"
      priority: 1
    - path: "./specs/api_spec.pdf"
      type: "pdf"
      priority: 2
  exclude:
    - "**/vendor/**"
    - "**/node_modules/**"
  # Настройка глубины связей между текстовыми сущностями и кодом
  semantic_linkage:
    enabled: true
    threshold: 0.85

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

Интеграция с инструментами разработки

Интеграция с инструментами разработки

Graphify не обязательно использовать как изолированный процесс. С практической точки зрения гораздо эффективнее встроить генерацию графа в привычный рабочий цикл (workflow). Это позволяет AI-агентам не просто «читать файлы», а понимать топологию проекта: как изменения в одной функции затронут схему базы данных или логику API.

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

Современные AI-редакторы и CLI-агенты, такие как Claude Code, работают значительно лучше, когда у них есть контекст, выходящий за рамки одного открытого файла. Без графа знаний агент часто галлюцинирует, пытаясь угадать зависимости, которые не описаны в текущем буфере.

В Cursor интеграция происходит через добавление сгенерированного графа в индекс проекта. Если вы используете набор инструментов Claude Code, Graphify может выступать в роли поставщика контекста.

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

bash
# Генерируем граф знаний и сохраняем его в директорию .graph/
# Это позволит Claude Code или Cursor подтянуть связи при индексации
graphify build --output .graph/ --format json

После этого в настройках Cursor (в разделе Context) или через .claudecode.json можно указать путь к этим данным. Это превращает обычный поиск по тексту в семантический поиск по связям. Предсказуемость ответов агента растёт, потому что он видит не просто код, а дерево зависимостей.

Работа через CLI для Gemini и Codex

Если ваша задача — автоматизировать анализ больших репозиториев (например, при реверс-инжиниринге с помощью ИИ-агентов), лучше использовать CLI-интерфейс. Это позволяет встроить Graphify в CI/CD или использовать в связке с моделями через API (Gemini или Codex).

Для работы с внешними моделями через командную строку удобно использовать конвейер (pipeline). Мы можем извлечь структуру проекта и передать её в виде компактного графа, чтобы не перегружать контекстное окно модели лишним «мусором» из комментариев или неиспользуемого кода.

Пример команды для подготовки данных под Gemini:

bash
# Извлекаем только AST-структуру и SQL-схемы, минимизируя объем токенов
graphify extract --type ast,sql --depth 3 > context_graph.json

# Передаем полученный граф в скрипт, который формирует промпт для Gemini
cat context_graph.json | python3 analyze_with_gemini.py

В этом сценарии Graphify выполняет роль фильтра. Вместо того чтобы скармливать модели 10 000 строк кода, вы передаёте структурированное описание связей. Это критически важно, когда вы работаете над сложными архитектурными решениями, подобно тому, как это описывается в DESIGN.md для генерации UI.

Для системного инженера такой подход — это способ обеспечить чистоту данных. Мы не надеемся на то, что модель «сама разберётся» в коде; мы даём ей готовую карту местности.

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

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

Когда мы работаем с современными инструментами вроде Claude Code, основной проблемой становится «галлюцинация» из-за нехватки контекста. LLM (Large Language Models) отлично пишут код, но они не знают архитектурных нюансов вашего проекта: как конкретный метод в одном модуле влияет на состояние базы данных в другом.

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

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

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

yaml
# Конфигурация индексации проекта
indexing:
  include:
    - "src/**/*.ts"      # Исходный код на TypeScript
    - "schema/*.sql"     # Схемы базы данных для связи с кодом
    - "docs/**/*.md"     # Документация для контекста
  exclude:
    - "**/node_modules/**"
    - "**/dist/**"
  extractors:
    - ast                # Извлечение структуры через AST
    - sql_parser         # Анализ зависимостей в БД

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

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

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

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

bash
# Поиск всех зависимостей, связанных с таблицей users
graphify query --target "sql:table:users" --depth 3 --format json

Результат такого запроса даст вам не просто список файлов, а цепочку: SQL Table (users) -> Repository Method (getUser) -> Service Layer (AuthService) -> API Endpoint (/api/v1/login).

Такая предсказуемость связей — именно то, чего не хватает при обычном поиске по тексту (grep). Если вы настраиваете сложную инфраструктуру, например, изучая архитектуру плагинов DeepSeek Harness, граф поможет быстро понять, как новые компоненты встраиваются в существующую экосистему, не нарушая установленные контракты.

Для системного инженера это означает переход от «исправления симптомов» к пониманию корневой причины (root cause) через анализ графа взаимодействий. Это база для построения надежных систем, где каждый компонент предсказуем.

Заключение

Итоговая оценка инструмента

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

Инструмент показывает себя лучше всего в проектах с четкой структурой, где зависимости между модулями, схемами БД и документацией можно явно проследить через AST (Abstract Syntax Tree). Предсказуемость результата здесь напрямую зависит от чистоты исходного кода.

Когда стоит внедрять

Я рекомендую внедрять построение графов знаний в следующих сценариях:

  1. Onboarding новых разработчиков. Вместо многочасовых лекций можно предоставить агенту, обученному на графе, который ответит на вопросы: «Где инициализируется сессия пользователя?» или «Как связаны таблицы orders и payments?».
  2. Поддержка legacy-кода. Если проект перестал расти и превратился в «черный ящик», Graphify поможет визуализировать связи, которые давно потеряли актуальность в документации. Это полезно, если вы планируете реверс-инжиниринг с помощью ИИ-агентов.
  3. Автоматизация Code Review. Интеграция графа в пайплайн позволяет агентам проверять не только синтаксис, но и нарушение архитектурных границ (например, когда слой представления напрямую обращается к низкоуровневому драйву БД).

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

Не стоит забывать о нескольких важных нюансах:

  • Ресурсоёмкость. Построение графа на огромных монолитах требует значительных объёмов оперативной памяти, так как парсинг AST и построение связей — процесс не из дешёвых.
  • Актуальность данных. Граф — это слепок состояния кода на момент запуска. Если вы не настроили автоматическое обновление графа при каждом мерже в main, ваш AI-агент будет галлюцинировать, опираясь на устаревшие связи.
  • Безопасность. Передача структуры всего проекта (включая схемы БД) в контекст LLM требует соблюдения политик безопасности. Если вы работаете с чувствительными данными, убедитесь, что процесс генерации графа происходит в изолированном контуре.

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

FAQ

FAQ

Как Graphify понимает связи в коде?

Инструмент не просто сканирует текст, а строит абстрактное синтаксическое дерево (AST). Это позволяет ему понимать не только то, что написано, но и то, как элементы взаимодействуют друг с другом. Например, если одна функция вызывает другую или класс наследует свойства другого, Graphify фиксирует это как направленное ребро в графе.

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

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

С точки зрения архитектуры, это напоминает работу статических анализаторов, которые используют в реверс-инжиниринге с помощью ИИ-агентов, чтобы восстановить логику работы закрытого ПО.

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

Для базового анализа и работы в режиме «здесь и сейчас» Graphify может обходиться без внешней БД, используя временное хранилище в памяти. Однако, если ваша цель — создать долгоживущий граф знаний для сложных AI-агентов, использование векторной базы данных становится обязательным. Это обеспечивает предсказуемость при поиске по семантическим связям.

Если вы планируете интегрировать полученные данные в пайплайн, где задействован Claude Code, лучше сразу настроить экспорт в векторное хранилище (например, Chroma или Qdrant). Пример конфигурации для интеграции через файл настроек:

yaml
# config.yaml
storage:
  type: vector_db
  provider: qdrant
  endpoint: "http://localhost:6333"
  collection_name: "codebase_knowledge_graph"
indexing:
  refresh_interval: 3600 # обновлять индекс каждый час

Какие типы файлов поддерживает инструмент?

На текущий момент Graphify ориентирован на языки с развитой структурой, которую можно эффективно разобрать через AST. Основной упор сделан на:

  • Программирование: Python, TypeScript, JavaScript, Go, Rust.
  • Данные: SQL-схемы (PostgreSQL, MySQL), JSON, YAML.
  • Документация: Markdown (для связки описания с реализацией).

Поддержка Markdown критически важна, так как это позволяет сопоставлять высокоуровневые требования из документации с конкретными участками кода. Такой подход полезен, когда вы используете DESIGN.md для генерации UI через AI, превращая текстовое описание в структурированную модель.

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

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

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

bash
docker run -v $(pwd)/src:/app/src graphify/core:latest --analyze /app/src --output ./graph_data

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

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

Чем подход с графом знаний отличается от обычного RAG?

В классическом RAG код разбивается на текстовые фрагменты (chunks), которые превращаются в векторы. Это работает для поиска похожих кусков текста, но агент теряет контекст связей: он не понимает, что метод в одном файле напрямую зависит от класса в другом. Graphify же строит семантическую карту на основе AST, поэтому ИИ-агент видит не просто набор строк, а структуру проекта с четкими связями между сущностями.

Какие языки программирования поддерживает Graphify?

Инструмент использует специализированные парсеры для разных языков, что позволяет ему корректно строить абстрактные синтаксические деревья. На текущий момент стабильно работают Python, TypeScript и Go, так как для них существуют зрелые библиотеки парсинга. Если вам нужно добавить поддержку нового языка, потребуется написать соответствующий парсер, который сможет извлекать сущности и связи в понятном для Graphify формате.

Можно ли использовать Graphify для анализа SQL-схем?

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

Как Graphify помогает при рефакторинге кода?

При рефакторинге важно понимать область влияния (blast radius) изменений. Поскольку Graphify строит граф зависимостей, вы можете спросить агента, какие компоненты системы сломаются, если изменить сигнатуру конкретного метода. Вместо того чтобы вручную искать все упоминания в проекте, вы получаете предсказуемый список связанных узлов — от контроллеров до глубоких слоев бизнес-логики.

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

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