Топология обратной связи важнее IQ модели

Станет ли всё лучше, когда модель поумнеет?

Доминирующий нарратив вокруг AI-инструментов для кодинга звучит так: когда модель станет достаточно хорошей, она будет и код писать, и тесты покрывать, и рефакторинг делать самостоятельно. Не получилось с GPT-4 — получится с GPT-5. Claude не справился — справится Claude побольше.

Действительно ли это так?

Я поручил Claude Opus 4.7 рефакторинг filefunc. Без участия человека он завершил задачу за час. validate пройден, pytest пройден, coverage сохранён. Если смотреть только на результат — нарратив «хорошая модель решает всё» подтверждается.

Но что если дать той же модели тот же рефакторинг без правил filefunc? Без validate? Без обратной связи по coverage? Результат кардинально иной. Модель попадает в doom loop. Исправляя один баг, ломает другое место; исправляя это — ломает третье.

Модель та же. Изменилась среда.


«Всё готово» — инстинкт досрочного завершения у агента

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

Функций, для которых реально были написаны тесты: 40. 40 из 527.

Агент не солгал. Он выполнил 40 и решил, что «этого достаточно». Базовая склонность LLM — оптимистичное досрочное завершение. Встретив сложную функцию, модель пропускает её, делает ещё несколько и заключает: «остальное — тот же паттерн, значит, всё».

После подключения CLI-инструмента, принудительно зацикливающего процесс:

Автономный агент:  40 / 527  (7.6%)  — агент объявляет «готово»
CLI loop:         527 / 527 (100%)  — машина объявляет «ещё 487 осталось»

Модель та же. Проект тот же. Разница — кто решает, что «конец».


Среда формирует модель

Оба эксперимента указывают на один и тот же вывод. Opus 4.7 завершил задачу не потому, что модель умная. А потому, что specification surface был machine-checkable.

filefunc validate  → Соответствует ли структура кода правилам?
pytest             → Сохранено ли существующее поведение?
coverage           → Какие ветви пропущены?

Эти три инструмента давали мгновенную обратную связь на каждое изменение. Модель получала результат, исправляла, снова получала результат, снова исправляла. self-correcting loop.

Ключевая мысль:

Результат определяет не IQ модели, а топология обратной связи.

LLM сильны в генерации, но слабы в гарантии correctness. Однако при наличии deterministic verifier производительность резко стабилизируется. lint, typecheck, test, coverage — всё это становится gradient signal, корректирующим вывод модели.

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


broad exploration vs local correction

Сильная сторона LLM — не broad exploration, а local correction.

«Напиши тесты для этого проекта» — это broad exploration. LLM теряет направление.

«line 41 не покрыта» — это local correction. LLM точно пишет тест, покрывающий эту строку.

Цифры, подтверждённые на реальном проекте:

Без обратной связи:  60–70% coverage, затем остановка
С обратной связью:   100% (для достижимых функций)

Модель та же. Одна строка «line 41 not covered» играет роль gradient signal. Эта обратная связь направляет исправления LLM точно в нужную сторону.


Symbolic Feedback Loop

Все наблюдения пронизывает одна структура.

LLM генерирует → детерминированный инструмент выносит вердикт → результат возвращается LLM → повтор

Я называю это Symbolic Feedback Loop.

Мейнстрим индустрии сейчас — LLM Feedback Loop. AI проверяет AI. Пьяный спрашивает пьяного друга: «Я пьян?» Оба стохастичны — ошибки накапливаются.

Symbolic Feedback Loop устроен иначе. pytest не галлюцинирует. go test не пьянеет. Измерение coverage не врёт. Проверка спецификации не дрейфует.

Эта структура работает в областях, где correctness можно определить механически — код, тесты, спецификации, типы. Элегантность API-дизайна или естественность UX символические инструменты пока оценить не могут. Расширение этой границы — следующая задача. Я верю, что путь привести и естественный язык в verifiable границы существует.

Делать модель умнее — менее эффективно, чем делать обратную связь для модели точнее.


Делегирование решений

Очевидно, что решения нельзя делегировать AI. Однако проверять и решать всё самому — тяжёлый труд для человека. Некоторые повторяющиеся, формализуемые решения символические инструменты могут принимать вместо человека.

«Покрывает ли этот тест все ветви?» — человеку не нужно вчитываться. Инструмент coverage вынесет вердикт. «Соответствует ли этот код структурным правилам?» — человеку не нужно проводить ревью. validate вынесет вердикт. «Остались ли необработанные функции?» — человеку не нужно считать. CLI объявит.

Решения, которые нельзя делегировать AI, можно делегировать символическим инструментам. Потому что это не вероятность, а детерминизм. В этом raison d’etre Symbolic Feedback Loop.

Важнее не делать поезд быстрее, а прокладывать рельсы.

Многие строят поезда. Тех, кто прокладывает рельсы, почти нет.