Перейти к содержимому
Войти Регистрация

Топ 6 ошибок при работе с ИИ-агентами в коде

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

Почему агент ошибается иначе, чем автодополнение

Помощник в редакторе предлагает строку, и вы решаете, принять ли её. Агент — Claude Code, Codex CLI, Gemini CLI, Aider и им подобные — действует: сам ищет по репозиторию, правит десяток файлов, запускает команды, ставит зависимости и приходит с готовым результатом. Ошибка агента — это не неудачная подсказка, а уже сделанное изменение, и чем больше свободы он получил, тем дороже её откатывать.

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

Порядок в списке — по цене последствий, а не по частоте. Самая частая ошибка — первая, самая дорогая — вторая, и они обычно ходят парой.

Если правка слишком большая, чтобы её прочитать, она слишком большая, чтобы её принять.
Если правка слишком большая, чтобы её прочитать, она слишком большая, чтобы её принять. Фото: Nicola since 1972 · BY.

Топ 6 ошибок при работе с ИИ-агентами в коде

Принимать код не читая

diff слишком большой, чтобы его читать, поэтому его не читают

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

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

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

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

самая частая ошибка, потому что каждое непрочитанное изменение — это принятое на веру · оценка 9,6

Давать широкие права

автономный режим плюс ключи от продакшена в том же окружении

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

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

Как закрыть. Отдельная ветка и отдельное окружение для агента. Никаких ключей от продакшена в сессии, где он работает; секреты — вне репозитория и вне файлов, которые он читает. Пользователь базы только для чтения и только на копии. Список разрешённых команд вместо полной свободы: у Claude Code для этого есть настраиваемые разрешения и хуки, у Codex CLI — режимы и песочница. Автономный режим — только внутри песочницы на проекте, который не жалко.

  • Закрывается настройкой один раз
  • Песочницы и режимы есть у ведущих агентов
  • Отдельная ветка стоит ничего
  • Последствия необратимы
  • Секреты в окружении незаметны до утечки
  • Соблазн отключить подтверждения велик

самая дорогая ошибка, потому что боевые данные и ключи не восстанавливаются откатом · оценка 9,4

Задача одной фразой без контекста

«сделай авторизацию» — и агент выбирает стек сам

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

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

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

  • Проявляется быстро, на первом же ревью
  • Закрывается файлом правил проекта
  • План перед выполнением ловит большинство расхождений
  • Порождает лишние зависимости и дубли
  • Архитектурные решения принимаются агентом
  • Каждую сессию контекст приходится повторять без файла правил

ошибка постановки, из-за которой решения принимает тот, кто не знает проект · оценка 9,1

Шаг — проверка — коммит: неудачный шаг откатывается одной командой, удачные остаются.
Шаг — проверка — коммит: неудачный шаг откатывается одной командой, удачные остаются. Фото: Kai Hendry · BY.

Незнакомая кодовая база и уверенный тон агента

вы не знаете код, агент тоже, но звучит так, будто знает

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

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

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

  • Вопросы до правок вскрывают неполную картину
  • Пробные изменения дёшевы
  • Агент хорош как проводник, если его проверять
  • Уверенный тон маскирует незнание
  • Некому заметить расхождение сразу
  • Выдуманные API выглядят правдоподобно

ошибка доверия, при которой единственный источник знаний нельзя проверить · оценка 8,9

Огромный запрос без точек отката

«перепиши модуль» — и через час сорок файлов без единого коммита

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

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

Как закрыть. Шаг — проверка — коммит. Просите план, разбитый на пункты, и выполняйте по одному, фиксируя каждый удачный шаг в git; Aider делает это сам, остальных нужно просить. Тогда неудачный шаг откатывается одной командой, а удачные остаются. Базовые приёмы описаны в подборке вещей, которые нужно знать про git, — с агентами они нужнее, чем когда-либо.

  • Закрывается дисциплиной коммитов
  • Маленькие шаги читаются и откатываются
  • План по пунктам виден до выполнения
  • Длинные сессии теряют контекст
  • Откат «всё или ничего» теряет удачное
  • Соблазн «пусть сделает сам» силён

ошибка масштаба, после которой нельзя откатить неудачное, не потеряв удачное · оценка 8,7

Нет тестов и линтера как объективной проверки

«работает» означает «агент так сказал»

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

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

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

  • Настраивается один раз, работает всегда
  • Даёт агенту честный сигнал
  • Снимает часть нагрузки с ревью
  • На старом проекте требует времени на старт
  • Агент может подгонять тесты под результат
  • Зелёный прогон не заменяет чтение

ошибка основания, без исправления которой все остальные правила держатся на честном слове · оценка 8,5

Матрица сравнения шести ошибок при работе с ИИ-агентами в коде
Ошибки, которые проявляются поздно и стоят дорого, закрываются не инструментом, а процессом.

Сравнение по главному

ОшибкаКак проявляетсяЧем закрывается
Принимать код не читаяпобочные правки всплывают через неделималенькие шаги, чтение diff, вопрос «зачем»
Давать широкие праваудалённые данные, утёкший ключветка, песочница, список команд, секреты вне сессии
Задача без контексталишние зависимости, дубли, чужая архитектурафайл правил, план перед выполнением
Незнакомая база и уверенный тонвыдуманные API, сломанные вызовывопросы до правок, пробные изменения
Огромный запрос без откатасорок файлов, всё или ничегошаг — проверка — коммит
Нет тестов и линтера«работает» со слов агентакоманды проверки в правилах, тесты до правок
Диаграмма оценок шести ошибок при работе с ИИ-агентами в коде
Оценка отражает цену последствий и то, насколько поздно ошибка становится заметной.

Минимальный набор правил перед первым запуском

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

Файл правил в корне репозитория. Как собирать, как запускать тесты и линтер, каких соглашений держаться, куда не лезть, какие зависимости нельзя добавлять без обсуждения. У Claude Code это CLAUDE.md, у Codex CLI — AGENTS.md, у Gemini CLI — GEMINI.md; содержание одно и то же.

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

План перед выполнением, коммит после проверки. Задача делится на пункты, каждый пункт заканчивается прогоном и коммитом. Diff каждого шага читается человеком до следующего.

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

Частые вопросы

Агент изменил то, чего я не просил. Что делать?

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

Можно ли давать агенту ключи от тестового окружения?

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

Как понять, что агент выдумал функцию или параметр?

Запустить. Выдуманный вызов не соберётся или упадёт на первом тесте — если тесты есть. Для библиотек просите агента показать документацию или сигнатуру из установленного пакета, а не из памяти. Признак выдумки — «общепринятый» параметр, о котором вы никогда не слышали, названный с полной уверенностью.

Насколько мелко делить задачи?

Так, чтобы diff одного шага читался за один присест и откатывался одним коммитом. Для большинства задач это одно логическое изменение: миграция, модель, обработчик — три шага, а не один. Если агент к концу шага начинает забывать начало, шаг слишком большой.

Итог

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

Закрываются они дёшево: отдельная ветка, файл правил, команды самопроверки, маленькие шаги с коммитами и привычка читать. Агент при таком процессе действительно ускоряет работу, потому что ошибку он делает так же быстро, как и правильный код, — и только процесс отличает одно от другого.

0
Оценили 0 читателей

Комментарии

0
Г
Без регистрации можно оставить один комментарий к публикации. Войдите, чтобы участвовать в обсуждении дальше и получать ответы. Ссылки в комментариях скрываются.
Пока нет комментариев

Будьте первым, кто ответит автору.