OffshoreLabs Studio
RUEN
Меню

Разработка приложений с ИИ · Часть 10

Что агент оставляет после себя

Маленький робот в самурайском шлеме держит деревянный меч над документом с грифом PRIVATE

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

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

Что осталось в истории

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

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

Это звучит элементарно. Пока агент не нарушит правило.

«Воспитанный самурай»

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

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

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

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

Передать дело — не значит сохранить весь разговор

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

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

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

Воспитанный самурай и другие аватары агентов — расскажу в следующий раз.