Взяли 10 образцов хорошего кода без уязимостей. Применяли 4 стратегии улучшения (добавь фичи / оптимизируй / улучши безопасность / “размытые” просьбы сделать код лучше) 10 раз. Получили 400 образцов кода от ИИ и их исследовали руками и автоматическими сканерами.
Результат
Чем дальше в лес, тем толще партизаны. Уязвимости появлялись и на ранних итерациях, но чем дальше заходил проект, тем хуже все становилось, чем больше уязвимостей создавала LLM. Наибольшее количество уязвимостей (158) появлялось при стратегии добавления функционала. Наименьшее (38) - при стратегии улучшения безопасности (то есть, вы просите исправить уязвимость, а LLM создает новые).
Важная особенность
Количество уязвимостей росло нелинейно. На поздних итерациях было больше, чем на ранних.
Рекомендации
Human in the loop, пересматривать код, не делать более 3 итераций без человеческого контроля.
Ограничения
Тестировалась только GPT-4o, и только языки C и Java. Человек ничего не исправлял по ходу итераций.
Оригинал статьи (paywall): https://ieeexplore.ieee.org/document/11269659
Открытая статья: https://arxiv.org/html/2506.11022v2
Мой комментарий
Статья подтвердила интуитивные догадки, которые были, наверное, у каждого программиста. Многие замечали, как нейронка “тупеет” по мере работы над проектом. Дает очень хороший результат вначале, но дальше все начинает идти туго.
Я бы еще добавил такой минус(!), что LLM сложно быть небрежной, пофигистичной. И это минус, да. Человек пишет уязвимости по этой причине. И поэтому же он может напрячься, собраться и не писать их, исправить. Нейронка - не может. Она уже исходно была максимально собрана. Прогон “исправь уязвимости” не имеет никаких бонусов перед прогоном “добавь фичу”.
Можно сказать, что модель плохая, а задачи сложные. Это имеет смысл. Но важно понять, почему плохая модель так ошибалась. И возникает вопрос - а новая хорошая модель - прямо вот принципиально иная, или она в принципе такая же, просто фатально ошибается не на третьей итерации а на пятой или двенадцатоой?