Перейти к содержимому
AUTHORВЫПУСК №008 → АВТОМАТИЗАЦИЯ АГЕНТАМИ: 90% НЕ ПРОМПТ / имейте совесть, когда будете делиться или копировать
>AISTUDY_
Авторская колонка · 8 production-историйСЕРИЯ 008
Авторская колонка · выпуск №008

Автоматизация
агентами — это
на 90% не промпт

Запускать агента только на промпте — это как спрашивать, почём в Одессе рубероид. Восемь живых историй про то, что вызов модели — самая маленькая часть работы.

Я держу на одном сервере несколько проектов, где агенты работают сами, без меня в цикле: разбирают ошибки из мониторинга, переводят контент, ведут память о взаимодействиях, отвечают на комментарии, чистят дубли новостей. И вот что я понял, пока их строил и чинил: сам промпт — это процентов десять. Остальные девяносто — обвязка вокруг модели.
Блок 01

Где запускать агента и как его изолировать

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

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

Что значит «агент» в этом текстеНе чат в браузере. Процесс на сервере, который сам читает файлы, запускает команды, ходит в базу и вызывает модель — а человека дёргает только если без него никак.

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

Автофикс ошибок из мониторинга: песочница важнее промпта

Задача была такая. На сервер приходят ошибки из системы мониторинга — она шлёт уведомление на каждый сбой в проде. Большинство из них — шум: чужие боты, сетевые таймауты, проблемы инфраструктуры, а не кода. Я устал заходить в мониторинг на каждый алерт, разбирать стектрейс и понимать, баг это вообще или ерунда.

Почему это надо было решать. Алертов много, реальных багов среди них мало. Каждый отнимает время на разбор, причём в 80% случаев разбор кончается «а, это не баг». Хотелось, чтобы кто-то отсеивал шум сам, а мне приносил уже не сырой стектрейс, а готовый разбор: вот это настоящий баг, вот фикс, смотри.

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

Как устроено. Приходит уведомление об ошибке — система поднимает в фоне агента. Агент получает промпт в три шага: сначала диагностируй, потом классифицируй ровно в один из четырёх вердиктов, и только если это настоящий баг — пиши минимальный фикс и открывай Pull Request на ревью. Готовый фикс прилетает мне в Telegram с объяснением простым языком, без кода.

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

Схема 01 / Анатомия автофиксакликай этапы
Размер плашки — примерная доля кода и забот этапа. Красный узел в центре — единственный, где работает модель. Жми на этап, под схемой появится, что там происходит и какую долю он занимает.
01Уведомлениепарсинг + очередь
02Песочницаклон + изоляция
03Модельсам промпт
04Вердиктfail-safe
05Pull Request+ маскировка
01Изоляция: клон, а не рабочая копияАгент работает не в живом репозитории, а в его клоне — отдельной копии в служебной папке. Сначала я хотел дать ему лёгкое ответвление (worktree), которое делит служебные данные с основным репозиторием. Не взлетело по двум причинам.

Первая: боевые репозитории на сервере и сам сервис-помощник работают под разными пользователями. Рабочая копия требует записи в общие служебные данные репозитория — а доступа на запись туда у сервиса нет.

Вторая, важнее: рабочая копия делит служебные данные с живым репозиторием, где прямо сейчас идёт работа — деплои, чужие коммиты. Полный клон отвязывает агента начисто: что бы он ни натворил у себя в песочнице, прод не пострадает.

Правило, которое я вынесАвтономному агенту дают не доступ к живому, а одноразовую копию. Сломает копию — копию и выкинем. Песочницу в конце работы сносим всегда, что бы ни случилось.
02Fail-safe: при любом сбое — «нужен человек»Вердикт по умолчанию — не «баг» и не «шум», а «нужен человек». Наивный вариант (дефолт «шум» — система промолчит, или «баг» — заведёт PR) плох: первый глотает реальные баги, второй плодит мусорные PR. Правильный дефолт — при любом непонятном ответе ничего опасного не делать, а позвать меня. Когда не уверен — не действуй, спроси.
03Секрет не должен утечь в логиТокен доступа зашит прямо в адрес для клонирования — значит, при ошибке попадёт в текст ошибки, оттуда в логи и в базу. Поэтому отдельная функция маскирует токен в трёх местах: в выводе ошибок, в тексте исключений и во всех логах перед записью в базу. О таком забывают в первой версии и вспоминают, когда секрет уже лежит в базе открытым текстом.
Подвох идемпотентностиАгент иногда сам открывает Pull Request изнутри песочницы. Тогда внешняя попытка завести PR натыкается на ответ «такой уже существует». Наивный код тут падает. Правильный — ловит этот ответ, находит уже созданный PR и привязывает его. Автономная система обязана переживать «я это уже сделал».

Что в итоге. Промпт — три абзаца. Вокруг него: парсер уведомлений (мониторинг шлёт их в разных форматах в зависимости от версии интеграции), песочница-клон, маскировка секретов, безопасный дефолт, обработка гонки с PR, уведомления. Девяносто процентов кода — про то, чтобы автономный агент не наделал беды.

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

Граф кода: чтобы агент не искал вслепую

Второй кейс этого блока — про другую грань изоляции. Не «куда агент не дотянется руками», а «откуда он берёт знание о коде, чтобы не выдумывать».

Проблема. Агент, разбирающий незнакомую ошибку, по умолчанию делает десятки операций поиска и чтений файлов: где объявлен символ, кто его вызывает, что сломается если поправлю. Это дорого по токенам и ненадёжно — агент может выдумать несуществующий файл и уверенно на него сослаться.

Решение. Один сервис заранее строит граф кода — карту того, что где лежит и что на что влияет — и отдаёт его всем агентам как набор инструментов «только для чтения». Один запрос к графу заменяет пяток операций поиска и сразу отдаёт компактную карту: вызов с фронта → обработчик → слой сервисов → таблицы базы → тесты.

Единый источник правдыГраф строится один раз и переиспользуется всеми агентами, а не каждый индексирует код заново. Это и про токены (не платим за повторную разведку), и про консистентность (все видят одну карту).

Проблемы тут все про честность графа, а не про его ум. Точность важнее полноты: если связь между функциями не разрешается однозначно — граф её просто не покажет. Лучше пропустить настоящую связь, чем показать ложную: ложный «кто вызывает» отправит автономного агента чинить не то. Атомарная запись: пока граф пересобирается, запрос не должен увидеть полупустую карту — новая версия пишется во временное место и подменяется целиком. Здесь модель вообще не при чём: вся ценность — в инфраструктуре навигации. Промпта тут нет совсем.

Блок 02

Как будить агента и не терять события

Автономный агент должен на что-то реагировать. Либо его будит событие, либо он сам периодически смотрит, не появилось ли работы. Звучит просто — «по событию запусти перевод». На деле тут лежит самый коварный класс багов: событие, которое потерялось, потому что агент в этот момент лежал. И его никто не заметит, кроме пользователя, который не дождался результата.

Перевод по событию в базе: очередь важнее уведомления

Задача. Контент-редактор добавляет на платформу русскую запись (десятки записей, у каждой семь полей). Английская версия должна появиться сама, без отдельной кнопки и без ожидания ночного крона.

Почему так, а не по расписанию. Сначала перевод добирался по расписанию — раз в N минут скрипт смотрел, что не переведено. Медленно: редактор добавил запись и ждёт. В базе есть механизм: триггер на добавление записи шлёт уведомление, а слушающий процесс реагирует сразу. Поставил — заработало. А потом начались проблемы, ради которых весь этот рассказ.

Уведомление из базы не переживает простой процессаЕсли процесс-слушатель лежал в момент, когда пришло уведомление — событие теряется навсегда. База не копит уведомления для того, кого нет дома. Значит, чистая схема «триггер шлёт уведомление → процесс ловит» гарантированно теряет события при каждом рестарте, деплое, падении. А рестарты будут.

Решение — не полагаться на уведомление как на доставку. Уведомление — это будильник, а не само задание. Само задание лежит в очереди в базе, которая никуда не девается:

01Очередь в базе — источник правдыТриггер не просто шлёт уведомление, а сначала кладёт задачу в таблицу-очередь. Уведомление — лишь сигнал «проснись, появилась работа». Даже если сигнал потерялся, задача в очереди осталась.
02При старте — всегда разгрести накопленноеПроцесс при запуске первым делом разгребает очередь: берёт всё, что накопилось, пока его не было. Не ждёт нового уведомления — оно для пропущенного уже не придёт.
03При первой установке — добрать все пробелыМиграция складывает в очередь все уже существующие непереведённые записи. Иначе старый контент не переведётся никогда — событие на него было в прошлом.

Ещё одна засада: слушать уведомления из базы нельзя через общий пул соединений. Пул возвращает соединение в общую кучу после запроса — и подписка теряется. Нужен отдельный выделенный коннект, который живёт всё время и только слушает. Об этом не написано на видном месте — это узнаёшь, когда подписка молча перестаёт срабатывать.

Алёрт только на финальный провалПеревод падает — повторяем до трёх раз, и только когда попытки исчерпаны, шлём тревогу. На промежуточных неудачах — просто лог. Иначе при каждом сетевом моргании прилетал бы алёрт, и я бы их перестал читать. Тревога должна звенеть на реальной проблеме, а не на ряби.

Что в итоге. Сам перевод — это вызов модели с глоссарием, чтобы термины переводились канонически. Маленький кусочек. А вокруг: очередь в базе, разгребание при старте, добор пробелов, выделенный коннект, политика повторов, разумные тревоги. Вся надёжность — в обвязке, которая гарантирует, что ни одно событие не потеряется.

Бот-ответчик: опрос вместо событий и обязательный засев

Иногда событий нет вовсе — внешняя система не умеет их слать. Тогда агент сам периодически заглядывает: не появилось ли работы. И тут своя классическая ошибка.

Задача. Под уроками открытой платформы копятся комментарии и вопросы. Отвечать на них в реальном времени некому. Бот должен отвечать сам, по существу, с опорой на материал курса — круглосуточно.

Как. Раз в полторы минуты бот опрашивает движок комментариев, берёт последние, выбирает новые, по каждому поднимает ветку, ищет релевантный кусок курса в векторной базе и публикует ответ. Опрос, а не вебхуки — движок комментариев крутится тут же локально, поднимать вебхук-инфру дороже, чем раз в полторы минуты дёрнуть запрос.

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

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

Блок 03

Память и состояние

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

Память бота: дедупликация — это и есть память

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

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

01Извлечение — в фон, чтобы не тормозить ответСначала факты извлекались синхронно — и это растягивало ответ пользователю. Вынес в фоновую задачу: ответ уходит сразу, факты дописываются после. Воспринимаемое время ответа упало заметно — с десятков секунд до примерно десяти-пятнадцати.
02Дедупликация при записиПеред тем как записать новый факт, бот ищет, нет ли уже похожего. Если похожий есть — не плодит дубль, а обновляет существующий. Без этого база за неделю превращается в сто записей «пользователя зовут так-то».
Тонкость, на которой легко запутатьсяВ системе два механизма борьбы с дублями, и они разные. При записи нового факта — сравнение по смыслу (близость векторов, порог строгий). При фоновой чистке похожих воспоминаний — сравнение по словам (проще и грубее). Это сознательный компромисс: точное смысловое сравнение на каждой чистке дорого, грубое по словам — дёшево и для чистки достаточно. Но держать в голове, что это две разные метрики с разными порогами, обязательно — иначе результат необъясним.
Модели не доверяем на сто процентовМодель извлекает факты — и иногда выдумывает тип факта, которого нет в списке. Поэтому есть защита: неизвестный тип молча сваливается в общий, а ответ модели парсится терпимо — она любит добавить текст вокруг структурированного блока. Автономная система всегда обкладывает выход модели проверками.

Граф знаний из чата: вся ценность в линковке

Задача. Небольшая команда ведёт продукт в рабочем чате. Задачи, баги, решения тонут в потоке сообщений, трекер никто не ведёт. Хотелось «вечную память»: что открыто, что закрыто, что висит.

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

Главное тут — не извлечение, а связываниеКачество графа определяется не тем, как модель вытащила сущность из сообщения, а тем, узнала ли система, что «эта задача» и «вон та задача, упомянутая иначе вчера другим человеком» — одно и то же. Без хорошего связывания граф за неделю превращается в свалку дублей. Промпт извлечения — десять процентов. Линковка — девяносто.

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

Проблема связывания багов с коммитамиСистема переписывает имена задач на читаемые русские описания. А баг чинится коммитом, где написано по-английски fix(...). Поиск по переписанному имени промахивается. Пришлось брать оригинальный текст коммита, а не переписанный, и понижать порог похожести — русское описание бага и английский коммит похожи слабо, пусть модель-арбитр разбирается, это копейки.

Вывод блока. Память — это не «модель запоминает». Модель не запоминает ничего. Запоминает инфраструктура вокруг неё: векторная база, дедупликация, связывание, ночная чистка. Промпт извлечения в обоих кейсах — крошечный. Вся работа — не дать памяти захлебнуться в дублях.

Блок 04

Качество на выходе

Модель выдала результат. Можно ли его публиковать как есть? Почти никогда. Между «модель ответила» и «пользователь увидел» лежит слой контроля качества — и он часто сложнее самого вызова модели.

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

Задача. Агент собирает свежие новости для ежедневного дайджеста. Источники каждый день выдают одни и те же события под разными заголовками. Без фильтрации дайджест повторял бы вчерашнее и публиковал бы по три формулировки одного анонса в одном выпуске.

Почему не сравнить заголовки. Текстовое сравнение не ловит перефразировки. «OpenAI выпустила модель» и «представлена новая модель от OpenAI» — текстуально разные, по смыслу одно. Нужна близость по смыслу: каждую новость превращаем в вектор и сравниваем векторы. Порог близости — рычаг строгости. Подвигай его и увидь, как меняется решение «оставить / выкинуть»:

Схема 02 / Порог дедупликациидвигай ползунок
Синяя — эталонная новость уже в ленте. Остальные — кандидаты из новой пачки с их близостью к эталону. Двигай порог: что выше порога — гаснет как дубль, что ниже — остаётся.
0.75
эталон«Вышла новая открытая модель для перевода»в ленте
0.91«Представлена открытая модель-переводчик»
0.83«Новый опенсорсный переводчик от лаборатории»
0.68«Обновление движка перевода в популярном редакторе»
0.41«Подборка инструментов для локализации сайтов»

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

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

Голосовой ансамбль: один движок ошибается, трое голосуют

Последний кейс — самый наглядный про «модель готовая, ценность в обвязке». Тут вообще не одна модель, а несколько, и вся работа — в том, как их сложить.

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

Идея. Не обучать свою модель, а скомбинировать несколько готовых движков. Работает потому, что ошибки движков не совпадают: где промахнулся один, другой обычно прав. Жми «свести» — в каждой позиции победит слово с большим весом голосов:

Схема 03 / Голосование ансамбляжми «свести»
Два движка распознали одну фразу. Красной рамкой отмечены позиции, где они разошлись. Голосование выбирает в каждой позиции слово движка с большим весом — и собирает итог точнее любого из двух.
движок Aотправьотчотколлеге
движок Bотправьотчёткалеге
итоготправьотчётколлеге

Здесь модель — это готовый чужой движок, их несколько, и ни строчки промпта. Сто процентов ценности — алгоритм выравнивания и голосования, плюс возня вокруг: ручная нормализация буквы «ё» (иначе «её» и «ее» голосуют как разные слова), восстановление заглавных в именах, выбор самой длинной гипотезы за основу. А сам ансамбль работает как подстраховка: основной разбор делает модель, голосование считается параллельно и подставляется, если модель не ответила.

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

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

Блок 05

Экономика: где утекают деньги

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

Размышление там, где оно не нужно

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

Режим размышления — выключать на простых задачахНа задаче «одно и то же или нет» размышление не повышает качество, а только жжёт токены. Я прибил его выключенным по умолчанию. Без этого бюджет процесса, который крутит такие проверки круглосуточно, улетел бы за пару дней. И это чистая настройка обвязки — промпт не изменился ни на букву.

Повторение одного и того же в каждом запросе

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

Кэш повторяющейся части промптаЕсли в каждом запросе едет один и тот же большой кусок (инструкции, глоссарий, системный промпт) — его надо кэшировать на стороне модели, а не пересылать заново. Это снижает стоимость кратно — в моём случае в разы. И опять: это не про текст промпта, а про то, как ты его отправляешь.

Дешёвую работу — дешёвой модели

В боте-собеседнике основной диалог идёт на сильной (дорогой) модели, а вспомогательную работу — извлечение фактов из диалога в фоне — делает дешёвая. Качество извлечения чуть ниже, но для фоновой задачи достаточно, а разница в цене на круглосуточном потоке существенная. Прикидка стоимости основной модели — порядка шестидесяти долларов в месяц (это оценка, токены там точно не считались, так что плюс-минус треть); гонять на ней ещё и фоновое извлечение было бы расточительством.

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

Что со всем этим делать

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

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

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

Серия 008 · 2026-05-30 · восемь production-систем, разобрано по живому коду
Авторская колонка · выпуск №008 · «Автоматизация агентами — это на 90% не промпт»

// Обсуждение

Можно писать анонимно. Укажите email, чтобы получать уведомления об ответах.