КЛАСТЕР 03 · ПАМЯТЬ И СОСТОЯНИЕ ПЕРЕДАЧА УПРАВЛЕНИЯ ~17 МИНУТ
День 15 · из 35

Контролируемые
переходы

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

Суть урока

В реальном продакшене агент не должен решать всё сам. Есть три «зоны»: где модель действует автономно, где требуется проверка кодом, где нужно подтверждение человека. Грамотный AI-инженер размечает каждую функцию агента на эти зоны и проектирует чёткие точки передачи управления. Это и есть human-in-the-loop, чек-листы перед действиями, ограждения на необратимом. Без этого даже «умный» агент периодически делает дорогие ошибки.

Миф полной автономии

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

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

Поэтому хорошая архитектура агента — это не «полная автономия» и не «человек делает всё сам». Это гибкая раскладка контроля: где-то агент летит на автопилоте, где-то требует подтверждение, где-то останавливается и спрашивает.

AI-инженер не создаёт «автономного агента». Он проектирует, какие решения агент делает сам, а где останавливается и передаёт управление. Это и есть архитектура контроля.

Возвращаясь к Дню 14: инварианты ловят расхождения. Сегодня — следующий шаг: что делать при расхождении. И в принципе — на каких типах действий агент вообще не должен решать без подтверждения.

Три зоны автономности

Любое действие агента можно отнести к одной из трёх зон. Каждая — свой уровень контроля и своя стоимость ошибки.

Зона 1 · зелёная

Автономия

Агент решает сам и делает. Никаких подтверждений.

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

  • Чтение публичных данных (web_search, fetch_url на публичной странице)
  • Внутренние рассуждения, планирование, разбиение задачи на шаги
  • Извлечение информации из контекста, переформулирование
  • Внутренние вызовы инструментов поиска: SQL SELECT, поиск в файлах, лукапы в БД
Зона 2 · жёлтая

Проверка кодом

Агент предлагает действие → твой код проверяет → пропускает или блокирует.

Действия с ограниченным риском, но достаточно частые, чтобы каждое подтверждение пользователем было раздражающим. Тут включается программный контроль: инварианты, валидаторы, лимиты.

  • Внутренние записи в БД (создание заметок, обновление профиля)
  • Вызовы API партнёров с лимитами по ставкам (не больше N в минуту)
  • Запись в файлы внутри workspace агента
  • Обновление состояния задачи в task state machine

Сюда же — все инварианты из Дня 14. Если код видит, что действие нарушает инвариант — блокирует, не дойдя до настоящего выполнения. Пользователь не вовлекается в каждое решение, но и агент не действует «слепо».

Зона 3 · красная

Человеческое подтверждение

Агент готовит действие → останавливается → ждёт явного «да» от пользователя.

Действия необратимые или с высокой стоимостью ошибки. Тут код не достаточно — нужен человек.

  • Отправка письма (нельзя «отозвать»)
  • Платёжные операции, переводы, покупки
  • Удаление данных (всегда — с подтверждением)
  • Публикация контента (соцсети, блог)
  • Действия от имени пользователя в чужих системах (бронирование, заказ)
  • Принятие важных решений с долгосрочными последствиями

Здесь окупается даже довольно навязчивый UX: «нажмите «да», чтобы отправить письмо клиенту». Лучше один лишний клик, чем неотозванный косяк.

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

Раскладка — это решение продукта, не модели

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

Cursor, например, для «автоматического редактирования файлов» включает Y/N подтверждение по умолчанию — потому что разработчики не готовы доверять полностью. Для «поиска по коду» — нет, идёт автономно.

Human-in-the-loop без боли

Главная критика «подтверждений на каждом шаге» — раздражающий UX. И эта критика справедлива, если делать наивно. Хороший HITL не должен превращать продукт в «нажмите ОК 50 раз». Несколько принципов:

01

Группировать действия

Не «подтверди отправку email1, теперь email2, теперь email3». А «подтверди пакет из 3 писем», с возможностью просмотреть каждое. Один клик вместо трёх.

02

Показывать diff

Не «подтвердите изменения в файле». А — конкретный diff: «эта строка удалена, эта добавлена». Понятно, на что соглашаешься.

03

Прогрессивная автономия

Сначала подтверждения везде. Через 20 успешных запусков — пользователь видит «доверяете этому типу действий?». Постепенный переход в жёлтую зону.

04

Различные «пороги»

«Отправить письмо коллеге за $0» и «перевести $10000» — это не одно подтверждение. Чем выше ставки — тем подробнее окно подтверждения.

05

Undo вместо confirm

В некоторых случаях лучше «действие выполнено, отменить?» с 30-секундным окном, чем «подтверждаете?». UX лучше, эффект тот же.

06

Авто-аппрув частых случаев

«Запоминать», что пользователь всегда одобряет такие действия. С возможностью отозвать настройку. Это уже территория procedural-памяти из Дня 11.

Анатомия хорошего подтверждения

Что должно быть в окне «подтвердите действие», чтобы пользователь действительно понимал, на что соглашается:

  1. Что именно произойдёт. Не «выполнить операцию», а «отправить письмо на john@company.com с темой "Договор Q4"».
  2. Почему агент это предлагает. Краткое обоснование: «вы попросили подготовить ответ Джону, я составил».
  3. Что произойдёт, если этого не делать. «Без отправки клиент не получит ответ сегодня». Чтобы пользователь видел trade-off.
  4. Что можно изменить. «Изменить текст», «изменить адресата», «отложить» — кнопки для уточнения, а не только «да/нет».
  5. Обратимость. «Можно отменить в течение 30 секунд» или «отозвать нельзя». Честная информация про то, что будет после клика «да».

Хорошее подтверждение — это не препятствие, это интерфейс уверенности. Пользователь должен лучше понимать, что делает агент, чем без него.

Решения AI-инженера

Развилка 1. Начинать с автономии или с подтверждений

Когда строишь нового агента — где начинать на шкале зон?

Сильный практический совет: стартуй с красной. Сделай так, чтобы агент всё подтверждал. На первых 50-100 запусках смотри, что он предлагает, где ошибается, на чём ты соглашаешься без вопросов.

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

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

Развилка 2. Где живёт «контроль»

Подтверждение можно реализовать на разных уровнях:

  • В UI — модальное окно перед действием. Самый явный, но требует, чтобы пользователь был в продукте.
  • В отдельном канале — пуш на телефон, письмо, Slack-сообщение «нужно подтвердить». Для долгих фоновых задач.
  • Через инструмент — у агента есть tool: request_user_approval(action, reason). Когда модель вызывает этот «инструмент», твой код останавливает агента и идёт за подтверждением.

Архитектурно вариант 3 — самый чистый. Подтверждения становятся частью графа агента, можно их логировать, считать метрики, тестировать. Не «спецслучай в коде», а нормальный инструмент.

Концептуальные грабли

«Вы уверены? [Да] [Отмена]» — пользователь жмёт «Да» не глядя через два запуска. Это не подтверждение, это галочка для совести разработчика.

Хорошее подтверждение должно заставлять прочитать. Конкретные данные («отправить $1500 на счёт XX»), а не абстрактные («подтвердить операцию»). Кнопка «да» — после показа того, на что соглашаешься.

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

Правило: подтверждения только в красной зоне. Жёлтую зону защищай кодом, не вопросами.

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

«Нет» — это сигнал. Он должен попадать в контекст агента: «пользователь не согласился отправить письмо, нужно выяснить почему». Без этого human-in-the-loop работает в одну сторону.

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

Хирург с идеальной техникой всё равно спросит у пациента согласие на операцию. Это не недоверие к хирургу — это правильное распределение ответственности.

Связки с тем, что было

Контролируемые переходы — это слой над остальной архитектурой агента. Они опираются на:

  • День 6 (агент): цикл reason-act-observe-decide. Подтверждения вставляются между act и реальным выполнением.
  • День 13 (FSM): состояния задачи. Переход в красную зону — это переход в особое состояние waiting_for_approval.
  • День 14 (инварианты): жёлтая зона построена на них. Программные проверки — это инварианты в действии.
  • День 0 (безопасность): принципы human-in-the-loop, whitelist, read-only по умолчанию. Сегодняшний урок — их детализация.

Что ты теперь умеешь

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

Сводная карта кластера 03

Серьёзный агент: память, структура, ограждения

  • 11 Память — это не одна вещь. Two-by-three: short/long-term × episodic/semantic/procedural. Каждый слой — свой дизайн.
  • 12 Профиль пользователя — главный слой long-term. Что запоминать, как структурировать, когда тянуть в контекст. Где граница со слежкой.
  • 13 Task state machine — явная структура состояний. Серьёзная задача не должна жить только в голове модели. Состояния, переходы, текущая точка.
  • 14 Инварианты — то, что должно быть истинно всегда. Hard / medium / soft. Программные проверки до и после каждого действия модели.
  • 15 Контролируемые переходы — кто жмёт «продолжить». Три зоны (автономия / код / человек). HITL без боли. Подтверждение как интерфейс уверенности.

Куда дальше

Следующие кластеры разворачивают агент в две стороны — наружу (к данным мира) и внутрь (к точности на больших объёмах знаний):

Кластер 04

MCP — стандарт инструментов

Как агент достаёт свежие данные. Model Context Protocol — индустриальный стандарт подключения внешних возможностей. Конкретика к Дню 6.

Кластер 05

RAG — поиск по знаниям

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

Кластер 06

Локальные LLM

Приватная альтернатива облачным моделям. Когда нужна, как разворачивать, какие компромиссы. Возврат к Дню 0.

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

Практика

Эксперимент 01 · Раскадровать существующего агента

Найди зелёные / жёлтые / красные зоны

Открой любой AI-инструмент, который что-то делает (Cursor, Claude в режиме computer use, ChatGPT с инструментами). Понаблюдай: где он действует автономно, где спрашивает подтверждение, где код блокирует ему действия. У Cursor «правка файла» — красная (Y/N). У Claude в чате «web_search» — зелёная. У ChatGPT с генерацией изображений — иногда жёлтая (фильтр контента).

Эксперимент 02 · Распиши зоны для своего проекта

На бумаге, 30 минут

Возьми идею AI-агента, который тебе нравится. Перечисли все его действия (минимум 10). Каждое — отметь цветом (зелёный/жёлтый/красный). Затем по красным — придумай UX подтверждения: что показывать, какие кнопки, какие данные пользователь должен видеть. По жёлтым — какие программные проверки нужны. Это и есть твоя архитектура контроля.

Эксперимент 03 · Поймай плохое подтверждение в реальном продукте

Reverse-engineer окно «вы уверены?»

Посмотри на 5-10 окон подтверждения, которые видишь в течение дня (банк, доставка, корпоративные системы). Прогони их через «анатомию хорошего подтверждения» из урока. Какие из них правда дают тебе понимание, на что соглашаешься? Какие — формальные галочки? Разница огромная, и теперь ты её видишь.