Средний

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

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

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

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

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

Как Graphify структурирует информацию

Анализ через AST вместо векторных хранилищ

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

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

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

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

bash
# Запуск анализа текущей директории для построения графа
graphify analyze ./src --output-format json --out graph.json

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

Связи между кодом, SQL и документацией

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

Graphify решает эту задачу через создание единого графа знаний. Он сопоставляет сущности из разных источников:

  1. Код (AST): Определяет функции, классы и их взаимодействия.
  2. SQL-схемы: Извлекает структуру таблиц, индексы и связи (foreign keys).
  3. Документация (Markdown/Text): Парсит описания, связывая текстовые термины с конкретными объектами в коде.

Предсказуемость работы AI-агента повышается в разы, когда он может проследить путь от текстового описания фичи в документации до конкретного SQL-запроса и функции в Python-коде. Это позволяет минимизировать галлюцинации, так как агент опирается на жесткие связи, а не на вероятностные совпадения.

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

Пример конфигурации graphify.config.yaml для объединения разных типов данных:

yaml
# Конфигурация источников для построения графа
sources:
  - type: source_code
    path: "./src"
    languages: ["python", "typescript"]
  
  - type: sql_schema
    path: "./migrations"
    dialect: "postgresql"

  - type: documentation
    path: "./docs"
    format: "markdown"

# Параметры связывания (mapping)
mapping:
  # Связываем названия таблиц из SQL с именами классов в коде
  sql_to_code:
    strategy: "naming_convention"
    pattern: "^[a-z_]+$"

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

Интеграция в рабочий процесс разработчика

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

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

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

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

bash
#!/bin/bash
# Обновляем граф знаний перед началом работы с Claude Code

echo "Starting Graphify analysis..."
# Генерируем граф из текущей директории
graphify build --source ./src --output ./docs/knowledge-graph.json

if [ $? -eq 0 ]; then
    echo "Graph updated successfully."
    # Запускаем Claude Code с указанием на обновленный контекст
    claude
else
    echo "Error: Graph generation failed."
    exit 1
fi

В Cursor интеграция происходит на уровне использования внешних данных. Хотя Cursor активно развивает собственные функции индексации, использование Graphify позволяет добавить в контекст специфические знания, которые стандартный RAG (Retrieval-Augmented Generation) может упустить — например, сложные зависимости в SQL-схемах или логику взаимодействия микросервисов, описанную в документации. Вы можете просто прикрепить файл графа к чату или использовать его как часть системного промпта.

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

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

Для Gemini CLI наиболее эффективным подходом будет использование Graphify для создания компактного представления архитектуры в формате JSON или Markdown, которое затем передаётся в качестве системной инструкции. Это помогает агенту понимать, «где он находится» в структуре проекта.

Пример конфигурации для передачи контекста через конвейер (pipe) в CLI-инструмент:

bash
# Извлекаем ключевые узлы графа и передаем их в Gemini CLI
graphify export --format markdown --depth 2 | gemini-cli "Проанализируй архитектуру проекта и предложи план рефакторинга модуля auth"

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

Для обеспечения стабильности процесса рекомендую использовать оптимизацию работы AI-агентов, чтобы избежать избыточного потребления токенов при передаче графа. Вместо передачи всего JSON-файла, лучше настроить фильтрацию узлов:

json
// Пример фрагмента настроек graphify.config.json для фильтрации шума
{
  "include": ["src/**/*.ts", "schema/*.sql"],
  "exclude": ["**/node_modules/**", "**/dist/**", "**/*.test.ts"],
  "ast_depth": 3,
  "output_format": "compact_json"
}

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

Практическое применение графа знаний

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

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

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

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

Пример типичного сценария: вам нужно найти все места, где используется специфический тип данных в микросервисе на Go. С помощью Graphify вы можете сформировать запрос к графу, который выделит не только прямые импорты, но и косвенные зависимости через интерфейсы.

yaml
# Пример конфигурации Graphify для глубокого анализа связей в Go-проекте
project:
  name: "payment-service"
  language: "go"
  analysis_depth: 3 # Глубина рекурсивного обхода зависимостей
  exclude:
    - "**/vendor/**"
    - "**/*_test.go"
output:
  format: "json-graph"
  destination: "./build/knowledge-graph.json"

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

Автоматизация анализа конфигураций и схем

Второй сценарий, где граф знаний проявляет себя лучше всего, — это работа с инфраструктурным кодом и схемами баз данных. Часто бывает так: разработчик меняет структуру таблицы в PostgreSQL, но забывает, что этот столбец используется в скрипте миграции или в конфигурации Nginx для специфического проксирования.

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

Допустим, у нас есть схема базы данных и конфигурация приложения. Мы можем построить граф, который свяжет поле user_id в таблице orders с переменной окружения в Docker Compose или параметром в коде.

sql
-- Пример схемы, которую Graphify превратит в узел графа
CREATE TABLE orders (
    id UUID PRIMARY KEY,
    user_id UUID REFERENCES users(id),
    amount DECIMAL(10, 2) NOT NULL
);

И сопутствующий конфиг:

yaml
# docker-compose.yml
services:
  api:
    image: my-app:latest
    environment:
      - DB_SCHEMA_VERSION=20231012
      - DB_USER=admin

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

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

Ограничения и особенности инструмента

Детерминизм парсинга и точность связей

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

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

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

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

yaml
# Пример части конфигурации graphify.yaml
scan_rules:
  include:
    - "src/**/*.py"
    - "schema/*.sql"
  exclude:
    - "**/tests/*"
    - "**/migrations/*" # Миграции часто создают избыточные связи
    - "venv/*"

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

Когда графа может быть недостаточно

Несмотря на всю мощь структурного анализа, граф — это лишь скелет. Он отлично показывает, что связано с чем, но часто упускает контекст — почему это сделано именно так.

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

  1. Бизнес-логика и семантика. Граф может показать, что функция process_order() вызывает метод update_inventory(), но он не объяснит, что это происходит только после успешной транзакции в платежном шлюзе. Для понимания таких нюансов агенту всё равно потребуются текстовые описания или хорошо структурированная документация.
  2. Скрытые зависимости среды. Граф не видит переменных окружения, конфигураций в Kubernetes или параметров в systemd. Если поведение вашего приложения меняется в зависимости от DATABASE_URL, для графа это останется «черным ящиком».
  3. Динамические связи. Как я упоминал выше, паттерны вроде Dependency Injection, которые разрешаются только при запуске приложения, часто остаются вне поля зрения статического анализатора.

Если ваша цель — создать полноценную среду для автономного разработчика, одного Graphify будет мало. Вам потребуется комбинированный подход: граф для навигации по структуре и качественные контекстные файлы (вроде тех, что описываются в руководстве по CLAUDE.md) для передачи смысловой нагрузки.

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

В конечном счете, Graphify — это отличный способ разгрузить память AI-агента, предоставив ему карту местности вместо того, чтобы заставлять его изучать каждый куст вручную. Но помните: даже самая точная карта не заменит понимания того, куда именно вы собираетесь идти.

Заключение

Когда Graphify оправдывает себя

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

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

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

Не стоит ожидать стопроцентной предсказуемости. Любой инструмент, работающий на базе AST (Abstract Syntax Tree), имеет свои пределы.

  1. Динамический код. Если проект сильно полагается на метапрограммирование или сложные динамические импорты, Graphify может не увидеть часть связей. Граф будет выглядеть неполным, а значит, AI-агент может принять неверное решение.
  2. Стоимость контекста. Граф знаний — это структурированные данные, но их передача в LLM всё равно занимает токены. Если скармливать агенту слишком разветвлённый граф без фильтрации, вы быстро упрётесь в лимиты контекстного окна.
  3. Актуальность данных. Граф — это слепок системы в определённый момент времени. Если вы изменили схему БД, но не перестроили граф, агент будет оперировать устаревшими связями.

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

Итоговая схема использования

Для эффективной работы с AI-агентами я выстроил следующий рабочий процесс:

  1. Генерация графа через Graphify.
  2. Использование полученных данных в связке с инструментами управления контекстом, такими как Ponytail.
  3. Настройка инструкций для агента через CLAUDE.md, чтобы он знал, как интерпретировать узлы графа.

Если вы планируете использовать агентов в терминале, Graphify станет отличным дополнением к таким инструментам, как Corgi. Это превращает работу из «угадывания по логам» в системный анализ структуры.

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

FAQ

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

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

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

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

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

  • Исходный код: файлы Python, TypeScript, Go и Rust. Анализ строится на базе AST, что позволяет выстраивать зависимости не просто по тексту, а по логике выполнения.
  • Схемы данных: SQL-дампы и файлы миграций. Это критически важно для того, чтобы AI-агент понимал структуру таблиц и внешние ключи.
  • Документация: Markdown-файлы, которые описывают высокоуровневую архитектуру.

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

yaml
# .graphify.yaml
include:
  - "src/**/*.ts"
  - "schema/*.sql"
exclude:
  - "**/tests/**"
  - "**/dist/**"

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

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

Вместо того чтобы вручную просматривать сотни файлов, вы получаете визуализированную или структурированную карту зависимостей. Это позволяет:

  1. Найти точки входа: быстро понять, какие функции вызываются при изменении конкретной таблицы в БД.
  2. Оценить область влияния (blast radius): если вы планируете рефакторинг, граф покажет, какие модули «сломаются» первыми.
  3. Обучить агента: передав граф в контекст, вы даете AI-агенту не просто куски кода, а понимание архитектуры. Это значительно повышает эффективность, если вы используете набор навыков для работы с AI-агентами.

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

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

Чем Graphify отличается от обычного RAG с векторным поиском?

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

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

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

В каком формате можно получить результат анализа?

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

Насколько глубоко инструмент анализирует зависимости?

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

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

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