Arhellist

← К списку постов

Как легко задушить даже самую умную модель: пять слоёв, которые убивают агента

Или почему ваш агент на простую просьбу отвечает «Не могу подтвердить это действие».

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

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

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

Слой первый: промпт-сводка запретов

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

Шестнадцать «никогда». Плюс ещё восемнадцать правил поведения, из которых двенадцать — тоже в форме «плохо / хорошо». Плюс отдельные блоки про всплывающие окна, доверие к сайтам, классификацию задач, отчёты о прогрессе — и каждый объясняет, чего делать нельзя.

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

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

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

Слой второй: пост-фильтры, которые режут инициативу

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

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

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

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

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

Слой третий: петли подсказок, которые наказывают за разговор

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

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

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

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

Слой четвёртый: оракул, который врёт «всё хорошо»

Самое коварное. Модель говорит «готово», а сверяется с чеклистом на странице — SEO-чеклистом блога, который показывает «10 из 10». Модель читает: 10 из 10, значит всё хорошо, — и отвечает оператору «готово».

А в реальности адрес статьи остался от старой публикации. Теги тоже остались старыми. Описание, заголовок и обложка обновились — а SEO-идентичность статьи, её адрес и теги, не сдвинулась ни на миллиметр.

Чеклист на странице — это мнение страницы, а не факт. Он показывает 10 из 10, потому что кто-то его так настроил. Модель принимает мнение за факт.

Это классическая история про управление с обратной связью: агент не наблюдатель, он регулятор в петле. Если датчик врёт, регулятор уверенно стабилизируется в неверной точке.

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

Слой пятый: «нет доказательств — значит ложь»

Самое обидное. Модель делает задачу за десять шагов. На девятом что-то падает — инструмент вернул ошибку. На десятом модель говорит: «Не удалось обновить SEO, но в целом пост готов». Это честный частичный отчёт.

Страж утверждений видит слово «готов» и ошибку в этом ходе — и подменяет ответ на «Не могу подтвердить это действие: инструмент вернул ошибку».

Модель сказала правду. Обвязка переписала её в бессмыслицу. Оператор делает вывод: «модель не работает».

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

Что общего у всех пяти слоёв

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

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

Как это выглядит в цифрах

Один запрос. Один оператор. Одна задача: взять пост в блоге, поправить, подставить картинку, собрать документ, отдать результат.

Итог: • около 4,5 миллиона токенов на входе модели — в основном повторное чтение одного и того же контекста; • несколько обрывов по лимиту; • десятки переходов по страницам, описаний картинок и скриншотов; • два ввода текста, и один из них — тело статьи прямиком в поле «Заголовок»; • финальный ответ: «Не могу подтвердить это действие: инструмент вернул ошибку в этом ходе»; • статус задачи: не выполнена.

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

Что с этим делать: три шага

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

Шаг второй. Фильтры — только на реальные утечки. Всё остальное модель имеет право сказать. Вырезание технических слов — выключить. Страж утверждений — только на реальное противоречие. Подсказки — только в тестовом режиме. Самопроверку — выключить по умолчанию.

Шаг третий. Внешний оракул вместо чеклиста на странице. Независимая проверка факта: адрес, теги, ключевые слова в тексте. Провал — модель получает конкретный список полей, чинит, проверка запускается снова. Чеклист — это мнение, оракул — это факт.

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

Почему это не «сделать модель добрее»

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

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

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

Одна фраза на память

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

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

Это финал серии. Какой из слоёв вы узнали в своём продукте?

#Элис #ЭлисAI #факапы

12
Поделиться: