Перейти к основному содержимому

GenAI Workflows

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

Questions

  • Что не является агентом (в нашем, инженерном мире)?
  • Что такое Направленный ациклический граф (DAG)?
  • Какие подвиды workflows существуют?

Steps

Инженерное определение

По складывающемуся сейчас в коммьюнити (X, Anthropic, OpenAI) мнениею, агенты - это системы, которые циклично работают до тех пор, пока сами не решают остановиться. Благодаря LLM Агент может сам оценивать, наскольо он хорошо выполнил задачу, и преостанавливать выполенение (например, через вызов ToolCall: ReturnFinalAnswer).

Большинство продвинутых агентов сейчас, кроме оценки выполнения задачи - еще и самостоятельно планируют подшаги для достижения цели, и зацикливаются на каждом шаге - пока его не выполнят - и только потом переходят к следущим шагам.

Поэтому всё, что является DAG - directed acyclic graph - направленным ациклическим графом - не является агентом.

Кратко про DAG

or

Исключение

Если зацикленность провоцируется строгой логикой - принято считать это workflow, а не агентом.

Ниже вы увидете workflow "Суммаризация бесконечного текста", который рекурсивно суммирует текст до тех пор, пока не достигнет текста опредлеленной короткой длины. Это не агент, а workflow, хотя и имеет зацикленность.

1. Read this Anthropic article

2. Real-life примеры LLM workflows

подсказка

Изучите примеры ниже. Это важно для архитектурной насмотренности.

Попробуйте "прокомпилировать" некторые пайплайны в голове.

Мы старались писать примеры запросов/промптов - читайте их, если что-то непонятно.

Коммуникация и поддержка
Email классификатор
Примеры входных запросов
Email 1:
От: client@example.com
Тема: Проблема с оплатой
Сообщение: "Здравствуйте, я оплатил заказ несколько дней назад, но статус не изменился. Помогите, пожалуйста."

Email 2:
От: user2@example.com
Тема: Вопрос о продукте
Сообщение: "Добрый день, расскажите, пожалуйста, о возможностях вашего приложения."
Системный промпт: Классификатор писем
Вы — модель, которая классифицирует входящие письма как 'spam' или 'not_spam'.
Получаете на вход заголовок и тело письма.
Выход — одно слово: 'spam' или 'not_spam'.
Системный промпт: Валидатор (может ли LLM ответить?)
Вы — модель, проверяющая, может ли LLM автономно ответить на запрос.
Получаете тело письма.
Если ответ прост — выведите 'simple_answer', иначе 'complex_answer'.
Системный промпт: Генерация ответа
Вы — помощник службы поддержки. Составьте вежливый и лаконичный ответ клиенту на основе текста письма:
\"\"\"{email_body}\"\"\"
Триаж запросов в службу поддержки
Примеры входных запросов
Запрос 1: "Как сбросить пароль к аккаунту?"
Запрос 2: "У меня ошибка при оплате подписки, номер заказа #12345."
Системный промпт: Классификация intent
Вы — модель, которая на основе сообщения клиента определяет intent: 'FAQ' или 'technical_support'.
Выход — 'FAQ' или 'technical_support'.
Системный промпт: LLM генерация ответа по FAQ
Вы — помощник, генерирующий ответ на основе найденного FAQ.
Вход: запрос клиента и контент FAQ:
\"\"\"Вопрос: {faq_question}
Ответ: {faq_answer}\"\"\"
Выход — полный ответ клиенту.
Суммаризация документов
Пайплайн суммаризации документов
Примеры входных документов
Документ 1: Статья о JavaScript (≈ 5 000 токенов)
Документ 2: Отчет по продажам за квартал (≈ 8 000 токенов)
Системный промпт: LLM — суммаризация частей
Вы — модель для суммаризации текстовых фрагментов.
Ваша задача — на основе входного фрагмента (≤ 6000 токенов) сформировать краткую и информативную сводку (≤ 500 токенов).
Вход: текстовый фрагмент документа.
Выход: сводка фрагмента.
Суммаризация бесконечного текста

Допустим, вы можете использовать только LLM, которая максимально вмещает 8000 токенов в свои Attention-слои. Максимально LLM может генерировать до 2000 токенов. (Итого: 6000 токенов input, 2000 output)

Например, для текста в 18 мегатокенов, алгоритм отработает в 2 цикла суммаризации:

  1. 1 цикл: 18 000 токенов -> 6 000 токенов 1.1. 18 000 токенов -> 3 чанка по 6 000 токенов 1.2. 3 чанка по 6 000 токенов -> 3 саммари по 2 000 токенов 1.3. 3 саммари по 2 000 токенов -> конкатенация в 1 сводку в 6 000 токенов
  2. 2 цикл: 6 000 токенов -> 2 000 токенов 2.1. 6 000 токенов -> 1 чанк по 6 000 токенов 2.2. 1 чанк по 6 000 токенов -> 1 саммари по 2 000 токенов 2.3. 1 саммари по 2 000 токенов -> финальная сводка
Примеры входного документа
Документ: Техническая спецификация продукта (≈ 400 000 токенов)
Системный промпт: LLM — суммирует каждую часть до 2000 токенов
Суммаризируй текст в 2000 токенов.
Анализ и обработка большого текста с логикой менеджера
Примеры входных данных
Логика обработки: "Найдите все упоминания слов 'ошибка' и 'исключение', подсчитайте их частоту."
Текст: Логи приложения (≈ 100 000 токенов)
Системный промпт: LLM — обработка текстового чанка
Вы — аналитическая модель. Ваша задача — на основе заданной логики пользователя и входного текстового чанка сформировать частичный отчёт.
Вход:
- Логика обработки: {логика}
- Текст чанка: {текст}
Выход:
- Частичный отчёт.
Социальный мониторинг и рекомендации
Мониторинг социальных сетей
Примеры входных запросов
Запрос 1: "Собрать последние 100 твитов с хэштегом #нашПродукт"
Запрос 2: "Получить посты из Instagram за последние 24 часа с упоминанием бренда"
Пример системного промпта для шага "анализ тональности"
Вы — модель анализа тональности социальных медиа. Ваша задача — классифицировать каждый пост как «Негативный», «Нейтральный» или «Позитивный».
Входные данные:
- Текст поста: {текст}
Выходные данные:
- Тональность: {Негативный|Нейтральный|Позитивный}
- Краткое обоснование классификации.
Рекомендательная система
Примеры входных данных
Профиль пользователя:
- ID: 12345
- История просмотров: ["Телефон", "Наушники", "Чехлы"]
- Возраст: 29
- Интересы: технологии, музыка
Пример системного промпта для шага "генерация рекомендаций"
Вы — система рекомендаций на основе LLM. Ваша задача — на основе эмбеддингов пользователя и списка похожих товаров сформировать пять релевантных рекомендаций.
Входные данные:
- Эмбеддинги пользователя: {vector}
- Список похожих товаров: [{id, название, эмбеддинг}, ...]
Выходные данные:
- JSON-массив с рекомендациями:
[
{id: ..., название: ..., причина: ...},
...
]
Код-ревью и публикация
Автоматизированный код-ревью
Примеры входных запросов
Запрос 1: Pull Request с изменениями в файле app.js:
```diff
- function add(a, b) { return a + b; }
+ function add(a, b) { return Number(a) + Number(b); }

Запрос 2: Pull Request, удаляющий неиспользуемые переменные в utils.js:

- const unused = 42;
+ // удалено
</details>

<details>
<summary>Системный промпт: LLM — генерация комментариев</summary>

```text
Вы — ассистент по автоматизированному code review.
Ваша задача — на основе diff Pull Request:
- обнаружить синтаксические или логические ошибки,
- отметить нарушения стайлгайда,
- предложить рекомендации по улучшению кода.
Входные данные:
- diff Pull Request: {diff}
Выходной формат (structured output):
[
{file: "app.js", line: 1, comment: "Рекомендуется явно приводить параметры к Number для безопасного сложения строк."},
{file: "utils.js", line: 3, comment: "Переменная 'unused' не используется — стоит её удалить."}
]
Публикация блога
Примеры входных запросов
Черновик статьи:
"OpenAI представила новую модель GPT-4. Она предлагает улучшенные возможности для генерации текста, поддержки кода и аналитики данных. Некоторые участки текста можно сделать более плавными и выразительными..."
Системный промпт: LLM — проверка орфографии
Вы — модель для орфографической проверки текстов. 
Ваша задача — найти и исправить опечатки и типографические ошибки.
Вход:
- текст черновика: {draft_text}
Выход:
- исправленный текст без ошибок.
Системный промпт: LLM — улучшение стиля
Вы — модель для стилистического редактирования текстов. 
Ваша задача — сделать текст более плавным, ясным и привлекательным, сохранив исходный смысл.
Вход:
- текст после орфографической правки: {corrected_text}
Выход — отредактированный текст.
Маркетинг и продажи
Персонализация маркетинговой кампании
Примеры входных запросов
CRM данные 1: {id: 101, имя: "Анна", возраст: 28, последние_покупки: ["кроссовки","футболка"], интересы: ["спорт","путешествия"]}
CRM данные 2: {id: 102, имя: "Борис", возраст: 35, последние_покупки: ["смарт‑часы"], интересы: ["технологии","фитнес"]}
Системные промпты
LLM: сегментация аудитории
Вы — модель, которая на основе списка CRM-данных сегментирует клиентов по категориям (возраст, интересы, история покупок).
Вход: список клиентов [{id, имя, возраст, последние_покупки, интересы}, ...]
Выход — JSON-массив сегментов:
[
{segment_id: 1, критерии: "спортсмены 25-35", клиенты: [101, ...]},
...
]
LLM: генерация сообщений
Вы — копирайтер-помощник, создающий персонализированные e-mail для каждого сегмента.
Вход: сегмент {segment_id, критерии, клиенты} и шаблон сообщения.
Выход — JSON-массив сообщений:
[
{segment_id: 1, subject: "Специальное предложение для спортсменов", body: "..."},
...
]
Квалификация лидов и upsale (Sales)
Примеры входных запросов
Лид 1: {id: "LID123", компания: "Acme Corp", бюджет: 50000, потребность: "CRM-система"}
Лид 2: {id: "LID124", компания: "Beta LLC", бюджет: 150000, потребность: "аналитика продаж"}
Системные промпты
LLM: квалификация
Вы — модель, оценивающая лиды по готовности к покупке.
Вход: лид {id, компания, бюджет, потребность}
Выход — {lead_id, status: "готов"/"не готов", score: число}
LLM: коммерческое предложение
Вы — помощник по продажам, генерирующий коммерческие предложения.
Вход: лид {lead_id, компания, потребность, бюджет} и шаблон КП.
Выход — {lead_id, proposal: "текст коммерческого предложения"}
LLM: анализ ответов
Вы — модель для анализа отзывов клиентов.
Вход: переписка {lead_id, сообщения: [...]}
Выход — {lead_id, sentiment: "положительный"/"отрицательный"/"нейтральный"}
LLM: генерация upsale
Вы — ассистент по upsell, формирующий дополнительное предложение.
Вход: лид {lead_id} и история взаимодействий.
Выход — {lead_id, upsell_offer: "текст дополнительного предложения"}
Операционные процессы
Автоматическая дозакупка товаров
Примеры входных данных
{
"sales_data": [
{"product_id": "A1", "date": "2024-06-01", "quantity": 120},
{"product_id": "B2", "date": "2024-06-01", "quantity": 75}
],
"safety_stock": 50
}
Системные промпты
LLM: прогноз спроса
Вы — модель прогнозирования спроса.
Вход: массив записей о продажах с полями {product_id, date, quantity}.
Задача: на основе исторических данных предсказать спрос на каждый товар на следующий период.
Выход: массив объектов [{product_id, forecast_quantity}, ...].
LLM: генерация заказа
Вы — ассистент по формированию заказов поставщику.
Вход: прогноз спроса [{product_id, forecast_quantity}, ...] и параметр безопасности (safety_stock).
Задача: рассчитать количество заказа, чтобы покрыть прогнозный спрос плюс запас.
Выход: массив объектов [{product_id, order_quantity}, ...].
Проверка соответствия документов
Примеры входных данных
Тип документа: договор аренды  
Текст документа:
"Настоящий договор заключён между Арендодателем и Арендатором...
Статья 1. Предмет договора...
Статья 2. Срок действия..."
Системные промпты
LLM: выделение ключевых пунктов
Вы — модель для извлечения ключевых пунктов из юридического текста.
Вход: полный текст документа.
Задача: выделить номера статей и их краткое содержание.
Выход: массив объектов [{article: номер, summary: текст}, ...].
LLM: оценка соответствия правилам
Вы — модель проверки соответствия документа заданным нормативам.
Вход: массив ключевых пунктов и список правил.
Задача: для каждого пункта определить, соответствует ли он правилам.
Выход: [{article, compliance: "соответствует"/"не соответствует", comments}, ...].
LLM: формирование отчёта
Вы — помощник по подготовке отчётов.
Вход: результаты оценки соответствия.
Задача: сгенерировать структурированный отчёт в markdown с разделами «Соответствующие пункты» и «Нарушения».
Выход: markdown-текст отчёта.
HR-процессы
Скрининг резюме (Recruitment)
Примеры входных данных
[
{
"name": "Иван Иванов",
"skills": ["Python", "SQL", "Docker"],
"experience_years": 3,
"education": "Магистр компьютерных наук"
},
{
"name": "Анна Петрова",
"skills": ["Java", "Spring", "Microservices"],
"experience_years": 5,
"education": "Бакалавр ИТ"
}
]
Системные промпты
LLM: парсинг резюме
Вы — модель для структурирования резюме.
Вход: текст резюме.
Задача: извлечь {name, skills, experience_years, education}.
Выход: JSON-объект с полями кандидата.
LLM: оценка кандидатов
Вы — модель для оценки резюме по заданным критериям.
Вход: объект {name, skills, experience_years}.
Критерии: релевантность навыков и стаж работы.
Выход: {name, score: число от 0 до 100}.
LLM: назначение интервью
Вы — ассистент по планированию интервью.
Вход: список кандидатов, прошедших порог, и доступные слоты интервью.
Задача: распределить кандидатов по слотам.
Выход: [{name, interview_time}, ...].
Автоматизация онбординга (HR)
Примеры входных данных
{
"name": "Сергей Кузнецов",
"position": "Frontend-разработчик",
"start_date": "2024-07-01"
}
Системные промпты
LLM: подготовка документов
Вы — помощник HR для подготовки корпоративных документов.
Вход: {name, position, start_date}.
Задача: сформировать список и шаблоны документов (трудовой договор, NDA и т.д.).
Выход: [{document_type, template_text}, ...].
LLM: инструкции по IT и доступам
Вы — модель по генерации инструкций для настройки IT-среды.
Вход: должность сотрудника.
Задача: создать чек-лист по созданию учетных записей и настройке ПО.
Выход: список пунктов чек-листа.
LLM: план обучения
Вы — ассистент по обучению новых сотрудников.
Вход: должность.
Задача: разработать пошаговый план обучения с модулями и сроками.
Выход: [{module, duration_days}, ...].
LLM: сбор обратной связи
Вы — модель для генерации анкеты обратной связи.
Вход: список этапов онбординга.
Задача: сформулировать вопросы для каждого этапа.
Выход: [{stage, questions: [...]}, ...].
LLM: уведомление HR
Вы — помощник для уведомления HR об итогах.
Вход: результаты обратной связи.
Задача: составить краткое сообщение с ключевыми выводами.
Выход: текст уведомления.
DevOps
CICD pipeline мониторинг
Примеры входных данных
Коммит: {id: "abc123", author: "ivan", timestamp: "2024-06-15T10:23:00Z"}
Логи сборки: "ERROR: Module not found: 'utils.js'"
Примеры системных промптов
LLM: анализ логов
Вы — модель для анализа логов CI. Вход: текст логов сборки. Задача: найти причину ошибки и предложить решение. Выход: {error_type, message, recommendation}.
LLM: анализ результатов
Вы — модель для анализа результатов автотестов. Вход: вывод тестового раннера. Задача: выявить упавшие тесты и описать проблему. Выход: [{test_name, status: "fail"/"pass", log}].
Автотесты: генерация и анализ
Примеры входных данных
Изменения в коде: diff функции sum(a, b)
Результаты тестов: 3 passed, 1 failed (test_sum.js)
Примеры системных промптов
LLM: генерация автотестов
Вы — ассистент по генерации автотестов. Вход: diff кода. Задача: сгенерировать unit-тесты на Jest для новых или изменённых функций. Выход: код тестов.
LLM: анализ результатов
Вы — модель для анализа результатов тестов. Вход: вывод тест-раннера. Задача: выделить упавшие тесты и предложить варианты фиксации. Выход: [{test_name, status, suggestion}].
Прочие кейсы
Генерация квизов для обучения
Примеры входных данных
Учебный материал: "Основы HTTP: методы GET/POST, статус-коды"
Примеры системных промптов
LLM: генерация вопросов
Вы — модель для генерации учебных вопросов. Вход: текст материала. Задача: сформулировать 5 вопросов разных типов (открытые, с выбором). Выход: [{question, type}].
LLM: проверка качества
Вы — модель для оценки качества вопросов. Вход: список вопросов. Задача: проверить корректность формулировок и сложность. Выход: [{question, ok: true/false, comment}].
Автоматизация отчётов по расходам
Примеры входных данных
{
"transactions": [
{"id": "T1", "amount": 250},
{"id": "T2", "amount": 75}
]
}
Примеры системных промптов
LLM: выделение расходов
Вы — модель для извлечения данных о расходах. Вход: массив транзакций. Задача: вернуть список {id, amount}.
LLM: категоризация
Вы — модель для классификации расходов. Вход: список {id, amount}. Задача: присвоить категорию из списка. Выход: [{id, category}].
Персональный планировщик путешествий
Примеры входных данных
{
"destination": "Барселона",
"dates": ["2024-07-01", "2024-07-07"],
"preferences": ["музеи", "пляж"]
}
Примеры системных промптов
LLM: план маршрута
Вы — ассистент по планированию путешествий. Вход: параметры поездки. Задача: предложить маршрут по дням. Выход: [{day, activities}].
LLM: генерация бронирований
Вы — модель для формирования бронирований. Вход: маршрут. Задача: сгенерировать данные для брони отеля и транспорта. Выход: [{service, details}].
LLM: форматирование плана
Вы — помощник по форматированию плана. Вход: данные бронирований и маршрут. Задача: собрать единый документ с расписанием. Выход: markdown.
Маршрутизация запросов на четыре направления
Примеры входных запросов
Запрос 1: "Здравствуйте! Хочу узнать про новые тарифы."
Запрос 2: "Не могу оплатить счёт, платеж отклоняется."
Запрос 3: "Как подключить международный роуминг?"
Запрос 4: "Где найти договор оферты?"
Системный промпт: LLM routing
Вы — модель маршрутизации входящих запросов клиентов.
Входные данные:
- Текст запроса клиента: {request}
Задача: определить направление обработки запроса: одно из значений "Продажи", "Техническая поддержка", "Биллинг", "Общие вопросы".
Выход: строка с одним из указанных значений.
Системный промпт: LLM обработка запроса
Вы — модель для обработки клиентских запросов в направлении {direction}.
Входные данные:
- Текст запроса клиента: {request}
Задача: сформировать развернутый и вежливый ответ на запрос в соответствии со спецификой направления.
Выход: текстовый ответ клиенту.
Примеры Web3 workflows
Minting и листинг NFT
Примеры входных данных
{
"name": "CryptoKitty #2024",
"description": "Эксклюзивный NFT с анимированным котиком",
"image": "https://example.com/cat.gif",
"attributes": [
{ "trait_type": "rarity", "value": "epic" },
{ "trait_type": "background", "value": "galaxy" }
]
}
Системные промпты
LLM: генерация JSON метаданных
Вы — модель для генерации JSON-метаданных NFT в формате ERC-721.
Вход: {name, description, image, attributes}.
Выход: JSON-объект без лишних комментариев.
LLM: генерация описания для листинга
Вы — модель для написания продающих описаний NFT.
Вход: JSON-метаданные NFT.
Задача: сформировать короткое (2–3 предложения), цепляющее описание.
Выход: чистый текст.
Своп токенов на DEX
Примеры входных запросов
Запрос 1: "Обменять 1.5 ETH на DAI по лучшему курсу."
Запрос 2: "Свопнуть 1000 USDC на USDT при минимальных комиссиях."
Системные промпты
LLM: парсинг параметров свопа
Вы — модель для извлечения параметров свопа из текстового запроса.
Вход: текст запроса.
Задача: вернуть JSON {from_token, to_token, amount}.
LLM: выбор оптимального маршрута
Вы — модель для выбора оптимального маршрута свопа на DEX.
Вход: JSON {from_token, to_token, amount}.
Задача: предложить путь обмена через пулы, минимизируя проскальзывание.
Выход: JSON {route, estimated_gas}.
Создание предложения в DAO
Примеры входных запросов
Идея 1: "Предложить увеличить пул ликвидности за счёт 5% комиссии транзакций."
Идея 2: "Внедрить программу вознаграждения активных участников DAO."
Системные промпты
LLM: черновик текста предложения
Вы — модель для преобразования идеи в формальное предложение DAO.
Вход: текст идеи.
Задача: сформировать JSON {title, description}.
LLM: форматирование под требования DAO
Вы — модель для форматирования черновика согласно шаблону DAO.
Вход: JSON {title, description}.
Требования: title до 100 символов, description до 1000 символов.
Выход: JSON {title, description}.
LLM: сводка результатов голосования
Вы — модель для создания итоговой сводки голосования.
Вход: список голосов [{voter, vote}].
Задача: подсчитать результаты и сформулировать вывод.
Выход: текстовая сводка.
Автоматизированный аудит смарт‑контрактов
Примеры входных данных
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract SimpleToken {
mapping(address => uint256) public balances;
function mint(address to, uint256 amount) public {
balances[to] += amount;
}
}
Системные промпты
LLM: анализ безопасности
Вы — модель для анализа безопасности смарт‑контрактов.
Вход: исходный код контракта.
Задача: выявить уязвимости (overflow, reentrancy и т.д.) и дать рекомендации.
Выход: JSON [{issue, severity, recommendation}].
LLM: генерация отчёта об уязвимостях
Вы — модель для составления отчёта на основе анализа уязвимостей.
Вход: результаты анализа безопасности.
Задача: написать детальный markdown-отчёт с описанием каждой проблемы и рекомендациями.
Выход: markdown.

В промышленных бизнес-проектах workflows зачастую состоят из 20+ нод, вперемешку с API-интеграциями, строгими логиками, LLM-субворкфлоу и AI Агентами. А иногда могут доходить и до 100 нод.

2. Advanced routing in LLM Workflows

Extra Steps

E1. langchain

LangChain - это библиотека для построения и использования LLM-workflows. Она старая, но хорошо документирована и имеет большое сообщество.

Просмотрите, какие сущности есть в LangChain: https://python.langchain.com/docs/concepts/

Пример простейшего langchain кода.

E2. Patterns meta-understanding

  1. https://refactoring.guru/design-patterns/chain-of-responsibility
  2. https://refactoring.guru/design-patterns/command
Deprecated content

Now we know...

В этом уроке мы познакомились с основами LLM workflows: разобрали инженерное определение агентов и отличие цикличных систем от DAG‑структур, изучили практические примеры, шаблоны проектирования и погрузились глубже в routing.

осторожно

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

Менеджеры, клиенты и инвесторы понимать эту разницу не должны. Оставляйте им возможность называть всё как им удобнее: AI Агентамы, "нейросети", "искусственный интеллект"".

Exercises

  1. Если в вавшей системе есть зацикленность - то это агент или workflow?
  2. Какие паттерны ветвления вы помните?
  3. *Для тех, кто проходил модуль по алгоритмам для GenAI:
    • подумайте, как можно соединять алгоритмические подходы и LLM workflows
  4. Спроектируйте на бумаге:
    • Систему автоматического ответа на запросы в поддержку мобильного приложения по доставке еды
    • Workflow для автоответов на сообщения в ваш мессенджер с незнакомого контакта
    • Систему для автоматического создания постов для вашего блога
    • Систему скоринга кандидата на вакансию, потом систему сравнения нескольких кандидатов сразу