ИИ-генерация кода: почему без ограничений не обойтись
Почему генерация кода с помощью ИИ нуждается в жёстких ограничениях, а не в более детальных промптах
Все слышали историю про утечку данных одного клиента к другому. Такая ошибка заставляет службу безопасности терять сон и может привести к серьёзным штрафам. Но никто не хотел её допустить — просто забыл про проверку.
Сейчас модели вроде Claude и GPT ежедневно пишут тысячи строк кода. Даже если в промпте сто раз написать «проверяй права доступа», после 16 тысяч строк кода остаётся главный вопрос: действительно ли код делает то, что вы от него ждали?
Почему простые правила в промптах не работают
Большинство команд пытаются решить проблему через инструкции модели. Они пишут «всегда проверяй авторизацию», «не пропускай валидацию входных данных», «используй общую функцию для прав». Иногда это срабатывает. Но каждый раз модель должна:
- вспомнить о правиле,
- понять, где оно применяется,
- не поддаться на удобный shortcut из текущего контекста.
А потом ещё и человек должен всё это проверить в ревью. При больших объёмах кода это становится ненадёжным.
Структурные ограничения вместо надежды
В отличие от инструкций в промпте, структурные ограничения не зависят от памяти модели. Они встроены в сам код — это типы, компилятор, линтеры и тесты. Если код не удовлетворяет условиям, он просто не собирается.
Вместо «просить» модель соблюдать правила, вы создаёте ситуацию, где она не сможет их нарушить. Это и есть «backpressure»: модель генерирует код, получает ошибку от компилятора или тестовой системы, исправляет ошибку и снова генерирует попытку. Цикл работает автоматически до тех пор, что код не будет правильен.
Где на самом деле должны жить правила
Важные правила безопасности можно описать очень точно и кратко. Например:
«Пользователь может получить доступ к ресурсу, только если он аутентифицирован, принадлежит к одному tenant и этот ресурс ему действительно принадлежит».
Однако писать это в промптах неэффективно. Лучше воплотить такие правила в типах системы. Создайте специальные «guard types» для «authenticated principal», «verified tenant membership» и «owned resource». Если код пытается соединить эти pieces неправильно, компилятор сразу же откажет в сборке.
这样 die modell генarier code under diese Bedingungen, и es braucht nicht mehr, знание der prompt. Die types become die source of truth.
Как это выглядит в практике
Примерно так можно описить rules in a formal type system, например в Shen:
A JWT token is only valid if it's a non-empty string
An authenticated principal can access a tenant only if they're a member
A user can access a resource only if their tenant owns it
Эти правила переводятся в guard types и constructor functions в реальном коде. ИИ генерирует код, который muss mit diesen types arbeiten, а не an ihnen vorbei. Если попытка обхода, типовый system stößt ab.
Новый подход для современного развития
В прошлом люди надеялись, на care menschlicher код that follow guidelines. В AI era подход меняется: