ИИ рисует диаграммы: генерация BPMN, UML и ER из текста требований
Спринт горит, через два дня демо, а у вас на руках — текстовое описание бизнес-процесса на пятнадцать шагов с тремя ролями. И заказчик просит схему. BPMN. «Чтобы наглядно». Рисовать вручную — час, не меньше, и то после пятой стрелки глаз задёргается. Шесть лет назад я бы вздохнул и открыл draw.io. Сейчас открываю Claude.
LLM неплохо генерирует diagram-as-code. Не идеально. Но для стартового наброска — быстрее человека в разы. Вы даёте текст требований, нейросеть выдаёт Mermaid-код, вы закидываете в редактор — и через пять минут у вас готовая диаграмма. Потом можно поправить пару связей вручную, но 80% работы уже сделано.
Как это работает: pipeline от текста к диаграмме
Механика простая. Вы подаёте на вход LLM текстовое описание предметной области, требований или сценария. Модель генерирует код на Mermaid (или PlantUML — об этом ниже). Код рендерится в визуальную диаграмму. Аналитик делает ревью и либо принимает, либо уточняет промпт.
На диаграмме — полный поток. Синий — исходный артефакт (требования). Жёлтые — решения аналитика (сформулировать промпт, провести ревью, оценить результат). Фиолетовые — зона ответственности LLM. Зелёные — готовые результаты. Серые — итерации и правки. Ключевое: цикл «LLM → ревью → уточнение промпта» — это норма, а не признак плохого промпта. С первого раза редко получается то, что нужно.
Модель, кстати, не обязательно должна быть платной. GPT-4o-mini, Claude Haiku и Gemini Flash генерят валидный Mermaid почти всегда. Для PlantUML надёжнее брать модели помощнее — синтаксис сложнее, опенсорсные модели на нём спотыкаются.
Генерация BPMN: от словесного описания к схеме процесса
BPMN — самая благодарная нотация для генерации. Процесс описывается линейно, связи между шагами очевидны, шлюзы распознаются по условным словам («если», «иначе», «в случае отказа»). LLM парсит текст и превращает его в узлы и стрелки с минимальным количеством ошибок.
Базовый промпт выглядит так:
Сгенерируй BPMN-диаграмму в Mermaid (graph TD) для процесса«Оплата заказа в интернет-магазине».
Участники: Клиент, Система, П платёжный шлюз.Шаги:1. Клиент выбирает товар и нажимает «Оплатить».2. Система создаёт заказ и выставляет счёт.3. Клиент вводит данные карты.4. Система передаёт платёж в платёжный шлюз.5. Если оплата успешна — Система меняет статус на «Оплачен» и запускает сборку.6. Если оплата отклонена — Система уведомляет клиента и предлагает повторить.7. Если платёж не получен за 24 часа — автоотмена заказа.
Используй разные формы узлов: скруглённые для событий,прямоугольники для действий, ромбы для шлюзов.Подписи — на русском. Цвета не нужны.На выходе — код. Я специально не прошу расцветку в промпте: стилизацию проще добавить руками или вторым промптом. Первый проход — только структура.
Вот реальный пример того, что выдаёт LLM по похожему промпту (процесс обработки заказа, чуть проще — без платёжного шлюза, для наглядности):
Синие прямоугольники — действия системы (проверка, резервирование, оплата, сборка). Жёлтые ромбы — шлюзы ветвления. Жёлтый прямоугольник «Уведомить клиента» — действие с особым статусом (клиентский контакт, а не системная операция). Зелёные — старт и успешный финиш. Серые — тупиковые ветки (отмена, автоотмена).
LLM сгенерировала эту структуру по описанию из пяти строк. Вы потратили минуту на промпт и три на раскраску. Ручное рисование того же самого — 20–30 минут.
Что важно проверять после генерации: не пропущены ли конечные события на альтернативных ветках, правильно ли расставлены шлюзы (XOR вместо AND — частая ошибка), не пересекает ли поток управления границы участников.
Если вы ещё не разобрались с нотациями, советую заглянуть в обзор UML, BPMN и ERD для новичка — там про то, когда какую нотацию брать.
UML: генерация диаграмм классов и sequence
UML чуть сложнее для генерации. Диаграмма классов требует строгой структуры: классы, атрибуты, методы, типы связей (наследование, агрегация, композиция). Sequence-диаграмма — порядка взаимодействия во времени с правильным синтаксисом стрелок (синхронные/асинхронные, возвраты).
Но промпт решает. Вот шаблон для диаграммы классов:
Сгенерируй UML-диаграмму классов в Mermaid для домена«Управление заказами в интернет-магазине».
Сущности:- Order: id, status, createdAt, totalAmount, customerId- OrderItem: productId, quantity, price- Customer: id, name, email- Product: id, name, price, stockQuantity
Связи:- Order 1 → * OrderItem (композиция)- Order * → 1 Customer- OrderItem * → 1 Product
Используй синтаксис classDiagram Mermaid.Покажи только атрибуты, без методов.Подписи на русском.Модель выдаст что-то вроде:
classDiagram class Order { +int id +String status +DateTime createdAt +Decimal totalAmount +int customerId } class OrderItem { +int productId +int quantity +Decimal price } ...Синтаксис валидный, связи корректные. Я проверял на GPT-4o, Claude Sonnet и Gemini Pro — все три справляются. С Haiku и Flash бывают промахи со стрелками наследования — путают направление, но это чинится за секунду.
С sequence-диаграммами та же история. Даёте список участников и шагов — получаете готовый код. Главная ловушка здесь — асинхронные вызовы. LLM склонна рисовать все стрелки синхронными (->>), игнорируя асинхронную природу событий. В промпт стоит явно добавить: «Асинхронные вызовы обозначай как --)». Без этой фразы получите синтаксически верную, но семантически неверную диаграмму.
Sequence-диаграммы — пожалуй, самый выигрышный кейс для генерации. Вручную расставлять 20 стрелок между 7 участниками — пытка. LLM делает это за 10 секунд. Я на проекте с микросервисной архитектурой генерировал sequence-диаграммы пачками по 5–7 штук за вечер. Ручное рисование заняло бы дня два.
Тем, кто только осваивает UML, пригодится базовый разбор диаграмм, которые реально используют — там про то, какие типы диаграмм закрывают какие вопросы.
ER-диаграммы: из списка сущностей к схеме БД
ER-диаграммы LLM щёлкает как семечки. Структура плоская, связи сводятся к one-to-many / many-to-many, никакой логики ветвления. Идеальный кандидат для автоматизации.
Промпт до безобразия прост:
Сгенерируй ER-диаграмму в Mermaid (erDiagram)для системы учёта заказов.
Таблицы:- customers (id, name, email, phone)- orders (id, customer_id, status, total, created_at)- order_items (id, order_id, product_id, quantity, price)- products (id, name, price, stock_qty)- payments (id, order_id, amount, method, paid_at)
Связи — сам определи по именам полей.LLM сама выводит связи по foreign key-соглашению (customer_id → связь с customers). Это работает настолько стабильно, что я перестал рисовать ER-диаграммы вручную вообще. Сценарий: взял описание домена из Confluence, скормил LLM, получил диаграмму, поправил пару названий. Готово.
Граница применимости — когда foreign key зовут не по соглашению. Если в таблице sales поле buyer ссылается на clients, а recipient — туда же, LLM не догадается. Но такие случаи редки, и проще поправить одну связь рукой, чем рисовать всё с нуля.
Mermaid vs PlantUML: что просить у LLM
Выбор формата для генерации сводится к простому правилу:
| Критерий | Mermaid | PlantUML |
|---|---|---|
| Сложность синтаксиса | Низкая. Близок к Markdown | Высокая. Свой DSL с кучей директив |
| Качество генерации LLM | Отличное. Устойчиво у всех моделей | Среднее. Бывают ошибки, требует правок |
| Визуальное качество «из коробки» | Среднее. Простые фигуры, скучная типографика | Высокое. Детальная прорисовка, swimlanes, иконки |
| Поддержка в Markdown (GitHub/GitLab) | Нативная. Рендерится прямо в README | Через плагины. Чаще требует Kroki или PlantUML Server |
| Для каких диаграмм лучше | Flowchart, последовательности, ER, классы, state | BPMN с дорожками, C4, сложные sequence, deployment |
| Количество диаграмм у LLM в обучающей выборке | Огромное. GitHub напичкан .md-файлами с Mermaid | Меньше. Специфичная экосистема |
Мой практический совет: начинайте всегда с Mermaid. Синтаксис проще — LLM ошибается реже. Если диаграмма выглядит бедно или не хватает выразительности (swimlanes, артефакты развёртывания) — вторым проходом просите перегнать в PlantUML.
Промпт для конвертации:
Сконвертируй эту Mermaid-диаграмму в PlantUML.Сохрани ту же структуру и подписи.Добавь swimlanes для участников.Работает в 8 из 10 случаев. В оставшихся двух PlantUML-код содержит мелкие синтаксические ошибки — пропущенные кавычки, неверный порядок директив. Они локализуются быстро, если открыть PlantUML-рендерер и посмотреть на сообщение об ошибке.
С опенсорсными моделями (Llama, Qwen, DeepSeek) PlantUML лучше не просить. Я пробовал — получасовой марафон исправлений. Mermaid у них идёт нормально, PlantUML ломается на ровном месте.
Когда ИИ лажает: типичные проблемы и как их лечить
Перечислю то, с чем сталкивался сам:
Пропущенные шлюзы слияния. LLM охотно рисует раздвоение через XOR-шлюз, но забывает слить потоки обратно. Диаграмма становится синтаксически корректной (Mermaid это не считает ошибкой), но семантически — висящей в воздухе. Лечится добавлением в промпт: «Для каждого раздвоения нарисуй слияние».
Путаница с типами стрелок в sequence. Как уже говорил — всё синхронное, если не указать явно. Добавляйте в промпт: «Асинхронные вызовы — --), синхронные — ->>, возвраты — -->>».
Направление связей в classDiagram. LLM иногда рисует стрелку от родителя к потомку, хотя в Mermaid наследование обозначается стрелкой от потомка к родителю. Проверяйте классы, от которых наследуются — стрелка должна идти от них к базовому.
Масштаб диаграммы. Если процесс из 25 шагов — LLM сгенерирует его в одной диаграмме, и это будет нечитаемая каша. Решение: дробите промпт. Генерируйте диаграмму верхнего уровня с подпроцессами (в Mermaid — subgraph), затем отдельные диаграммы для каждого подпроцесса. Это ровно то, что вы делали бы вручную.
Галлюцинации в названиях. Иногда LLM «додумывает» элемент, которого нет в требованиях. Особенно этим грешит GPT-4o — вставляет стандартный «Payment Service» куда ни попадя. Решение: в промпте явно написать «Не добавляй сущности, не упомянутые в требованиях». Работает не на 100%, но снижает частоту.
Синтаксис, сломанный переводами строк. Если промпт длинный и вы вставляете многострочный текст требований — LLM может сломать Mermaid-синтаксис экранированием кавычек или переносов строк внутри узлов. Не вставляйте требования «как есть» — переформулируйте кратко в теле промпта.
Отдельная боль — Mermaid в MDX. Угловые скобки <> интерпретируются парсером как JSX-теги, если не обёрнуты в бэктики. LLM про это не знает. Поэтому сгенерированный код надо прогонять через простую проверку: все ли <...> внутри строк Mermaid обёрнуты?
Чек-лист для аналитика
Пять шагов, которые превращают сырой текст требований в готовые диаграммы:
- Сформулируйте промпт структурно. Не «нарисуй процесс», а «Сгенерируй BPMN в Mermaid graph TD. Участники: [список]. Шаги: [нумерованный перечень]. Шлюзы: [список условий]». Чем точнее структура, тем выше шанс получить рабочий код с первого раза.
- Первый проход — только структура. Без стилизации, без цветов. Проверьте логику процесса на чёрно-белой схеме. Раскрашивать будете вторым проходом — когда убедитесь, что связи корректны.
- Валидируйте синтаксис. Скопируйте сгенерированный код в Mermaid Live Editor или Kroki. Если рендер упал — скормите ошибку LLM и попросите исправить. Обычно хватает одной итерации.
- Добавьте стилизацию. Когда структура готова, пройдитесь по узлам: залейте цветами (из палитры: синий для действий, жёлтый для шлюзов, зелёный для старта/финиша, серый для тупиковых веток). Это превращает схему из черновика в документ, который не стыдно показать заказчику.
- Проведите ревью вручную. Пропущенные стрелки, неверные типы связей, галлюцинированные сущности — LLM пропускает их регулярно. Пять минут ручной проверки экономят часы переделок потом.
Главное правило — не пытайтесь получить идеальную диаграмму за один промпт. Два-три прохода: структура → синтаксис → стилизация. Итерация здесь не баг, а фича подхода.
Я на текущем проекте генерирую BPMN и ER-диаграммы только через LLM. Ручное рисование оставил для случаев, когда процесс настолько нестандартный, что проще нарисовать с нуля, чем объяснить нейросети. Таких случаев — примерно один из пятнадцати.