Why NextWhy Next
К списку
💻 Разработка10 мин чтения

Когда ИИ говорит «готово», нужен механизм, который ему не поверит

ИИ-агенты для написания кода объявляют работу законченной, хотя не закончили её. Говорят, что тесты прошли, не запустив их; говорят, что починили баг, не воспроизведя его. Рассказ разработчика-одиночки, который пишет почти весь код вместе с ИИ, о проверочном шлюзе, заставившем систему признавать готовность только по доказательствам, а не по словам.

Главное

Самая опасная привычка ИИ-агента - докладывать о завершении незаконченной работы. Решение не в том, чтобы человек сомневался каждый раз, а в том, чтобы встроить в систему шлюз, который признаёт готовность только по доказательствам. Хук, блокирующий завершение, виды доказательств (вывод команды, diff, воспроизведение, перекрёстная проверка) и почему это ключевая мышца эпохи ИИ.

Содержание

Работая с ИИ-агентами по написанию кода, чаще всего попадаешься на одной фразе. «Всё готово.»

Агент произносит это слишком легко. Не запустив тесты по-настоящему, он говорит «тесты должны пройти»; не воспроизведя баг, говорит «я исправил причину». Читаешь код - выглядит правдоподобно. Но когда действительно запускаешь команды, примерно в половине случаев работа не доведена до конца. Пройдя через это множество раз, я пришёл к выводу. Проблема не в том, что ИИ врёт, а в том, что решение верить его словам или нет каждый раз принимал человек.

Дело не в доверии, а в доказательстве

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

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

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

Хук, блокирующий завершение

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

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

Суть в том, что этот шлюз - машина, а не человек. Устал я или спешу - шлюз одинаково придирчив. Моя дисциплина колеблется, а дисциплина хука - нет. Верификация стала не привычкой, а инфраструктурой.

Что я признаю доказательством

Так что же я принимаю за «доказательство». Я использую четыре вида.

  1. Вывод команды. Если тесты прошли, должен быть реальный вывод тест-раннера. Не «пройдут», а лог того, что прошли. Если сборка удалась - лог сборки, если линт чистый - вывод lint.
  2. diff. Что именно изменилось, должно быть видно в diff. Не на словах «я поправил эту функцию», а сами изменённые строки. Здесь отсеивается, совпадает ли объём изменений с отчётом.
  3. Воспроизведение. Если баг исправлен, должна быть пара доказательств: что до исправления баг действительно воспроизводился, и что после исправления он исчез. Без before/after «исправил» - всего лишь догадка.
  4. Перекрёстная проверка. Важные изменения я отдаю на ревью другой модели. То, что написал Claude, смотрит Codex, и они указывают друг другу на слепые зоны. Так ловится куда лучше, чем когда одна модель сама судит свою работу.

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

Почему это хорошо и для человека

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

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

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

Мышца, которую надо накачать, всего одна

О том, как работать с ИИ, говорят разные навыки, но для меня главным осталось вот что. Не завязывай верификацию на себя самого, делегируй её системе.

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

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

Похожие статьи