Зона ответственности, которая не достаётся бесплатно
Когда агент встаёт в план работ, возникает вопрос, на который у самого плана ответа нет: где кончается зона его ответственности. Обычно туда вписывают, что агент делает, и считают вопрос закрытым. По устройству вещей он не закрыт.
У живого исполнителя зона ответственности держится на дефолте. «Это не ко мне» — реакция, которую никто не прописывает в договоре: она достаётся бесплатно, из нормы и из нежелания отвечать за чужой участок. У агента такого дефолта нет и быть не может. Внутри него модель, которая любой вход достраивает до правдоподобного продолжения. Для неё непрописанное — не запрещённое, а просто неосвещённое, и на неосвещённый участок она пойдёт так же уверенно, как на освещённый, и сделает там что-нибудь правдоподобное.
Значит, границу придётся проводить руками. Первый ход, который для этого напрашивается, заводит в тупик — начнём с него, чтобы не тратить на него вечер.
Тупик: граница внутри агента
Пробуют первым очевидное: раз зону надо определить, определим её документом. Открываете регламент, пишете «Агент делает:», выписываете шаги, добавляете примеры правильных результатов. Документ выходит солидный, на согласовании кивают. Кажется, граница проведена: делает вот это, остальное — не его.
Почему это не помогает. Перечисление ограничивает только собственное содержимое: на то, что вне списка, оно не запрещает, а просто не накладывается. Для человека «не упомянуто» почти сливается с «не положено» — срабатывает бесплатный дефолт. У модели дефолта нет: не упомянутое для неё — неосвещённое, а неосвещённое она достраивает правдоподобно. Со стороны каждый шаг мимо списка выглядит как работа по инструкции — просто инструкция кончилась. И чем подробнее список, тем хуже: каждая формулировка — срез ситуации, ситуаций всегда больше, чем строчек, и в каждом расхождении агент действует правдоподобно, а правдоподобное не обязано совпадать с правильным.
Когда расхождение всплывает, пробуют второй ход из того же места: раз речь о том, чего агент не делает, — напишем это прямо ему. В системную инструкцию добавляется блок запретов: не менять чужие данные, не писать вовне, не трогать платежи. На прямые проверки агент отвечает отказом, первые прогоны проходят, и кажется, что граница встала.
Она не встала, и по двум причинам, обе — про устройство, а не про старание.
Первая: запрет в инструкции — давление, а не контроль доступа. Он меняет то, что модель склонна ответить, но не меняет того, что она может. Это не отключённая кнопка, а просьба, к которой прислушиваются чаще, чем нет. Просьба не бывает абсолютной: формулировка, сработавшая на одном входе, молчит на перефразированном, и заранее не узнать, на каком.
Вторая: категорию «может навредить» в этом решении определяет тот же процесс, который выполняет действие. Судья и исполнитель обучены на одних данных и делят одни слепые пятна: что исполнителю кажется безопасным, тому же не покажется вредом. Просить процесс самого себя остановить — значит посадить сторожа, который засыпает вместе с хозяином.
Оба хода — из одного семейства: границу рисуют внутри агента, его же словами. Внутри агента границ не бывает, бывают склонности. Это тупик, и не в формулировках дело: не работает не текст — не работает место. Границу держит только то, что снаружи, и отсюда форма списка, к которой мы приходим.
Список из трёх колонок
Рабочая единица списка — строка из трёх колонок.
Первая — что именно агент не делает. Действием, а не категорией: не «не общается с клиентами», а «не отправляет письма на внешние адреса». Категорию модель трактует по-своему, действие видно снаружи, со стороны результата.
Вторая — внешний механизм, который это обеспечивает. Строка без механизма — то самое пожелание из тупика, только в таблице. Если механизм придумать не удаётся, у строки два честных выхода: отдать действие целиком человеку или перенести в графу принятых рисков, с подписью того, кто риск принял. Это тоже нормальная строка — просто честная.
Третья — кто отвечает, если запрещённое всё равно произошло, и что этот человек делает первым. Третья колонка и делает список управленческим документом: вопрос «чей это» решён до инцидента, а не во время него.
Механизмов, по сути, четыре, и все снаружи агента. Отсутствие инструмента: у агента нет кнопки платежа — подготовить может, нажать нет; это самая сильная граница, ей не нужно доверие. Валидатор на выходе: результат выпускается только через схему, список допустимых адресатов или проверку формата — что не прошло, то не вышло, и неважно, что модели показалось разумным. Человек-кнопка: агент готовит необратимое действие, исполняет его человек. Стоп-правило: вход, который не подошёл ни под один известный случай, не угадывается, а передаётся наверх по шаблону.
Откуда берутся строки
Строки не сочиняют — их собирают обходом процесса, в который встаёт агент, шаг за шагом. На каждом шаге один и тот же чек: может ли этот шаг потратить деньги, сломать данные, уйти наружу, обмануть того, кто будет читать результат. Всё, на что ответ «да», — кандидат в список. Шаг «агент готовит ответ клиенту» при проверке на «уйти наружу» сразу даёт строку: готовит — да, отправляет — нет. Длина списка выходит не из вдохновения, а из длины процесса.
Из такого обхода обычно выпадают строки четырёх видов, и первый важнее остальных.
Не решает необратимое. Всё, что нельзя откатить: удаление, отправку наружу, платёж, выдачу доступа. Самая дешёвая строка во всём списке. Обратимое действие, сделанное не туда, — баг: заметили и откатили. Необратимое — инцидент, и часть потерь не возвращается. Границу между «поправим» и «не поправим» стоит провести до первого запуска, даже если больше ничего не успели.
Не видит лишнего. Данные, которые для работы не нужны: пароли, личные данные, чужие проекты. Механизм — не просьба в промпте, а область доступа. То, что агент не может прочитать, он не может и слить; и уговорить его слить то, чего у него нет, тоже нельзя.
Не проверяет себя. Подтверждение правильности собственного результата — не работа агента: проверяющий и проверяемый здесь один и тот же процесс, слепые пятна общие — ровно та беда из тупика. Проверка всегда снаружи: схемой, тестом, в конце концов человеком.
Не гарантирует сроков и свежести. Агент ничего не обещает, потому что обещать не может: у его знаний есть срез, у доступности — хозяин инфраструктуры. «Агент сделает к пятнице» на проверку всегда означает «мы сделаем к пятнице», просто слово «мы» спрятали.
И пишут всё это до того, как агент получил доступы и данные. Не потому, что заранее умнее: до запуска каждая строка — проектное решение, один разговор. После запуска — изменение в работающей системе, а оно всегда дороже разговора.
Список как план проверок
Список из трёх колонок — заодно готовый план испытаний. Берёте задачи с той стороны границы — то, что агент обязан остановить или передать человеку, — и даёте их ему. Выполнил — значит, сломан не агент, а механизм. Чинить надо механизм; переписывать инструкцию — значит вернуться в тупик, только ещё и с таблицей на руках. Прогонять такие задачи имеет смысл при каждом изменении механизмов, а не только при первом запуске.
Дальше список живёт рядом с дежурством. Каждое стоп-правило — готовый триггер для дежурного; порядок действий при срабатывании — тема материала о дежурстве по агенту. Первое, что делает человек при странном поведении, — сверяется со списком: это внутри границы или снаружи. Внутри — обычный дефект, разбираем как баг. Снаружи — протёкшая граница, и разговор другой: не «что сломалось», а «кто подписал строку».
Пересматривают список по событиям, а не по календарю: изменился процесс, агенту выдали новый инструмент. Новый инструмент — всегда новая поверхность, и строка про него появляется раньше, чем инструмент доезжает до продакшена. Про то, что именно отказывает у агентов на второй неделе в проде, мы разбирали отдельно; список «не делает» — то, с чем такие отказы сравнивают, чтобы отличить дефект от дыры в границе.
Позиция редакции
Мы считаем: список того, чего агент не делает, должен существовать до выдачи доступов, и владеет им руководитель, а не инженер. Механизмы во второй колонке напишет инженер, но третья колонка — распределение ответственности, а ответственность — валюта того, кто отвечает за сроки и бюджет. Подписать за принятый риск должен тот, у кого эти сроки и бюджет; отдать документ инженерии — значит перепоручить чужую зону.
И условие, при котором мы неправы. Если каждое действие агента обратимо и проходит через человека до того, как сработает, — границу держит само ревью, и заранее написанный список превращается в бюрократию. То же с разовыми экспериментами в песочнице: цена ошибки там известна заранее и мала, список стоит дороже того, что он защищает. Список нужен там, где агент действует на общее состояние, работает без присмотра или его результат потребляют без проверки. Там, где этого нет, честнее признать: граница — это ревью, и не плодить вокруг него бумаги.