Почему кодинг-агенты работают и почему ломаются

Одна и та же модель. Та самая, что галлюцинирует в веб-чате, в Claude Code поднимает 200-строчную фичу с первого раза. /goal в Codex решает issue целиком. Модель не стала вдруг умнее. Изменилась структура.

Почему работает

Цикл диалогового AI выглядит так:

LLM → человек → LLM → человек

Обратная связь полностью на естественном языке. За вероятностной генерацией следует вероятностная оценка. Точность деградирует мультипликативно.

Цикл кодинг-агента устроен иначе:

LLM → генерация кода → сохранение файла → запуск тестов → pass/fail → LLM
LLM → правка кода → сборка → успех/неудача → LLM
LLM → проверка типов → сообщение об ошибке → LLM

Внутри цикла встроен детерминированный шлюз. Файловая система сохраняет ровно то, что записано. Тест — либо pass, либо fail. Компилятор говорит «неправильно», если неправильно. Всё это непреднамеренно выполняет роль храповика.

LLM — unreliable component. Но строить reliable protocol поверх unreliable component — основа инженерии. TCP создаёт reliable delivery поверх unreliable network. RAID создаёт reliable storage поверх unreliable disk. ECC создаёт reliable computation поверх unreliable memory.

Кодинг-агент работает по той же причине. Поверх unreliable LLM поставлен deterministic verifier (тесты, сборка, линтер, проверка типов). Причина успеха — не производительность модели, а topology.

Но почему тогда ломается

Сказано: работает. Но порой ломается. Почему?

Потому что случайно встроенный храповик и осознанно спроектированный — не одно и то же.

Существуют участки без храповика

Что если агент правит код без тестов? Сборка проходит, линт проходит, а функциональность сломана. На участках без детерминированного шлюза LLM судит вероятностно, а вероятностные суждения деградируют мультипликативно.

Из 200 эндпоинтов 180 покрыты тестами, 20 — нет. Агент безупречно обрабатывает 180 и тихо вносит баги в оставшиеся 20. Вот почему возникает ощущение «почти готово, но где-то что-то не так».

Информативность обратной связи недостаточна

Эксперимент: сортировка 1000 слов. CPU — 0,08 мс, 100%. LLM — 438 секунд, 97,7%. Само по себе поразительно — 97,7% на чистом мышлении. Но настоящее открытие было в другом.

При одном и том же результате варьировался уровень обратной связи:

Обратная связьРезультат
Нет6 ошибок (99,4%)
«Есть ошибки»10 ошибок (99,0%) — ухудшение
«23 ошибки»1 ошибка (99,9%)
«6, вот здесь»0 ошибок (100%)

Если сообщить только «неправильно» — модель перекорректирует и станет хуже. Если указать количество ошибок — появляется цель, и модель настойчиво ищет. Если указать расположение — исправляет идеально.

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

Слепые зоны существуют и не устраняются повтором

В эксперименте с сортировкой LLM оставила 6 ошибок в R2. В R3 отчиталась: «ошибок нет». В R4b снова: «ошибок нет». Одни и те же 6 ошибок были пропущены одним и тем же способом.

Без подсказки модель сколько угодно раз сходилась к 99,4%. Стоило сообщить «осталось 6» — и наконец достигнуты 100%.

В кодинг-агентах происходит то же самое. Агент создаёт баг, при self-review решает «всё в порядке», при повторной попытке пропускает то же место. Retry — не решение. Слепая зона — структурное ограничение, вытекающее из вероятностной природы модели, а не недостаток усердия.

На масштабе работает умножение

Два последовательных шага с точностью 97,7%: 0,977² = 95,4%. Три — 93,2%. Десять — 79,2%.

Агент отлично правит один файл. Но рефакторинг на 100 файлов? Даже если каждый шаг — 97%, после 100 шагов: 0,97¹⁰⁰ = 4,8%. Провал практически гарантирован.

Это математическое объяснение того, почему «vibe coding ломается на 200 эндпоинтах». В маленьком проекте цепочка короткая, и вероятность держится. В большом — умножение действует разрушительно.

Что необходимо

Причина работоспособности и причина поломки указывают в одну точку: наличие или отсутствие детерминированного верификационного шлюза.

Нынешние агенты опираются на случайно встроенные храповики (тесты, сборка, линтер). Если проектировать их осознанно — система станет сильнее.

Что значит осознанно проектировать храповик:

Во-первых, выявить участки без храповика. Код без тестов, API без схемы, данные без типов. Каждое место, где агент судит вероятностно, — уязвимость.

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

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

LLM — поразительный генератор. 1000 слов отсортированы чистым мышлением с точностью 97,7%. Человеку такое не под силу. Но всё, что ниже 100%, при повторении разрушается. 0,977 в квадрате — уже 0,954.

Кодинг-агент работает не потому, что модель умна. А потому, что внутри цикла есть детерминированный шлюз. Ломается — потому что этого шлюза нет.

Генерация может быть вероятностной. Верификация должна быть детерминированной.


Связанные статьи