Самообучающийся код: проверка возможностей ИИ в долгосрочном поддержании проектов

Автор: Денис Аветисян


Новое исследование оценивает способность больших языковых моделей поддерживать качество кодовой базы и избегать регрессий в процессе непрерывной интеграции.

🚀 Квантовые новости

Подключайся к потоку квантовых мемов, теорий и откровений из параллельной вселенной.
Только сингулярные инсайты — никакой скуки.

Присоединиться к каналу
Система SWE-CI моделирует непрерывный цикл интеграции профессиональных программных команд, используя рабочий процесс, основанный на взаимодействии двух агентов: архитектора и программиста.
Система SWE-CI моделирует непрерывный цикл интеграции профессиональных программных команд, используя рабочий процесс, основанный на взаимодействии двух агентов: архитектора и программиста.

Представлен SWE-CI, новый бенчмарк для оценки возможностей ИИ в области поддержки и эволюции программного кода, выявляющий проблемы с сохранением качества и предотвращением регрессий.

Несмотря на успехи больших языковых моделей (LLM) в автоматизации задач разработки программного обеспечения, их способность поддерживать и развивать существующие кодовые базы остается недостаточно изученной. В данной работе представлена новая методика оценки, ‘SWE-CI: Evaluating Agent Capabilities in Maintaining Codebases via Continuous Integration’, основанная на принципах непрерывной интеграции и долгосрочной эволюции кода. Полученные результаты показывают, что, хотя LLM и демонстрируют прогресс, поддержание качества кода и предотвращение регрессий в процессе длительной разработки по-прежнему представляют значительную сложность. Каковы перспективы создания LLM, способных эффективно решать задачи сопровождения и развития сложных программных систем на протяжении всего жизненного цикла?


От простоты к сложности: вызовы долгосрочного сопровождения кода

Традиционные эталоны для оценки синтеза кода, такие как HumanEval и MBPP, зачастую концентрируются на создании решений для отдельных файлов в рамках единичной задачи, что существенно отличается от реальных условий разработки программного обеспечения. В практической разработке, код постоянно эволюционирует, подвергается изменениям и расширениям на протяжении всего жизненного цикла проекта. Эти эталоны не учитывают необходимость поддержки, рефакторинга и адаптации кода к новым требованиям, игнорируя сложный процесс, связанный с поддержанием больших, долгосрочных кодовых баз. В результате, оценка производительности моделей синтеза кода, основанная на таких эталонах, может не отражать их реальную способность успешно функционировать в динамичной среде разработки и поддерживать качество кода с течением времени.

Законы Лемана, сформулированные в 1970-х годах, описывают неизбежную деградацию качества программного обеспечения в процессе его поддержки и эволюции. Эти законы, в частности, утверждают, что сложность системы со временем увеличивается, а надежность — снижается, если не предпринимаются целенаправленные усилия по рефакторингу и улучшению кода. Существующие эталоны оценки производительности моделей генерации кода, такие как HumanEval и MBPP, фокусируются на создании отдельных фрагментов кода, не учитывая долгосрочные последствия изменений и отсутствие систематической поддержки. В результате, эти эталоны не отражают реальную сложность поддержания больших, развивающихся кодовых баз, где изменения в одной части системы могут непреднамеренно привести к ухудшению качества других частей, что и описывают законы Лемана.

Существующие методы оценки производительности систем генерации кода, как правило, основываются на анализе отдельных “снимков” программного обеспечения — то есть, оценивается корректность решения конкретной задачи в изолированной среде. Однако, реальные программные комплексы постоянно эволюционируют, подвергаясь многочисленным изменениям и доработкам на протяжении всего жизненного цикла. Такой подход не учитывает сложность и итеративность реальных кодовых баз, где исправление ошибок в одной части может повлиять на работу других модулей. Игнорирование динамики развития программного обеспечения приводит к завышенным оценкам эффективности и не позволяет адекватно оценить способность системы поддерживать и улучшать существующий код в долгосрочной перспективе. Необходим переход к более реалистичным методам оценки, учитывающим историю изменений и взаимодействие различных компонентов программного обеспечения.

В отличие от предыдущих тестов, SWE-CI использует эволюционный подход к оценке, где стрелки красного и синего цветов обозначают действия функций <span class="katex-eq" data-katex-display="false">require</span> и <span class="katex-eq" data-katex-display="false">code</span>, а пунктирные линии - неизвестные пользователю процессы.
В отличие от предыдущих тестов, SWE-CI использует эволюционный подход к оценке, где стрелки красного и синего цветов обозначают действия функций require и code, а пунктирные линии — неизвестные пользователю процессы.

SWE-CI: новый эталон для развивающихся кодовых баз

SWE-CI представляет собой новый эталон для оценки способности агентов поддерживать кодовую базу в процессе долгосрочной эволюции. В отличие от существующих бенчмарков, ориентированных на синтез отдельных файлов, SWE-CI моделирует сценарии реальной разработки, где требуется модификация и рефакторинг существующего кода. Это позволяет оценить не только способность агентов генерировать новый код, но и их умение адаптироваться к изменениям, поддерживать работоспособность проекта в течение длительного времени и избегать регрессий при внесении изменений. Акцент сделан на оценке способности агентов поддерживать и развивать существующий проект, а не просто создавать отдельные фрагменты кода.

Бенчмарк SWE-CI использует протокол «Архитектор-Программист» для эмуляции цикла непрерывной интеграции (CI). В рамках этого протокола, «Архитектор» формулирует высокоуровневые требования к функциональности, а «Программист» реализует эти требования в коде. После каждой итерации код тестируется, и результаты используются для уточнения требований и внесения изменений в код. Такой подход позволяет оценивать способность агентов к итеративной доработке и адаптации кода в процессе его эволюции, имитируя реальный процесс разработки программного обеспечения и обеспечивая возможность оценки способности к рефакторингу и поддержанию работоспособности кода с течением времени.

SWE-CI использует Docker для создания изолированных сред выполнения, что обеспечивает воспроизводимость и согласованность тестирования на протяжении всего процесса эволюции кодовой базы. Каждый этап эволюции, включающий внесение изменений и проверку, выполняется в отдельном Docker-контейнере. Это позволяет избежать конфликтов зависимостей, гарантирует, что тесты выполняются в идентичной среде независимо от хост-системы, и упрощает отладку, поскольку окружение можно легко воссоздать. Использование Docker также обеспечивает переносимость тестов и возможность масштабирования, что критически важно для оценки агентов, работающих с долгосрочной эволюцией кода.

Процесс курирования данных SWE-CI включает в себя последовательные этапы сбора, очистки и аннотации для обеспечения качества и пригодности данных для обучения и оценки моделей.
Процесс курирования данных SWE-CI включает в себя последовательные этапы сбора, очистки и аннотации для обеспечения качества и пригодности данных для обучения и оценки моделей.

Количественная оценка эволюции кода: метрики долгосрочной стабильности

Метрика EvoScore, представленная в рамках SWE-CI, предназначена для количественной оценки сохранения функциональной корректности кода при последующих модификациях. В отличие от традиционных метрик, EvoScore напрямую измеряет способность кода адаптироваться к изменениям без внесения регрессий. Это достигается путем оценки результатов тестов после внесения изменений в код, что позволяет определить, насколько легко поддерживать и расширять кодовую базу. Использование EvoScore направлено на стимулирование разработки кода, который обладает высокой устойчивостью к изменениям и способствует снижению затрат на сопровождение программного обеспечения.

Бенчмарк SWE-CI отслеживает Нормализованное Изменение (Normalized Change) — метрику, представляющую собой совокупность всех внесенных изменений в кодовую базу относительно исходного состояния. Эта метрика позволяет комплексно оценить состояние кодовой базы во времени, фиксируя как улучшения, так и регрессии. Она рассчитывается как разница между функциональностью после модификации и исходной, нормированная на размер внесенных изменений. Положительное значение указывает на улучшение функциональности, отрицательное — на регрессию, а нулевое — на отсутствие изменений. Отслеживание Нормализованного Изменения позволяет оценить способность модели поддерживать и улучшать существующий код, а не только создавать новый.

Показатель отсутствия регрессий (Zero-Regression Rate) является ключевым индикатором стабильности модели при внесении изменений в кодовую базу. Результаты оценки моделей на базе SWE-CI демонстрируют, что большинство из них достигают значения этого показателя менее 0.5. Это означает, что при модификации кода, менее чем в половине случаев возникают регрессии — ухудшения функциональности по сравнению с исходным состоянием. Низкий показатель регрессий свидетельствует о способности модели генерировать код, который легко поддерживать и модифицировать без внесения нежелательных побочных эффектов.

Тесты в наборе данных SWE-CI моделируют реальные сценарии поддержки программного обеспечения, характеризуясь продолжительностью в среднем 233 дня и включая последовательность из 71 коммита. Данная продолжительность и количество коммитов отражают типичный жизненный цикл внесения изменений и исправлений в существующий кодовый проект. Это позволяет более адекватно оценить способность моделей к долгосрочному сопровождению кода, в отличие от оценок, основанных на коротких, изолированных изменениях.

Каждая пара “база/оракул” в SWE-CI предполагает модификацию как минимум 500 строк кода (без учета тестовых файлов). Этот объем изменений гарантирует, что оцениваемые модели подвергаются воздействию существенных и значимых изменений в кодовой базе, а не тривиальных правок. Такой подход позволяет более точно оценить способность моделей адаптироваться к крупномасштабным изменениям, характерным для реальных сценариев сопровождения программного обеспечения, и исключает влияние незначительных модификаций на результаты бенчмарка.

Набор моделей, разработанных восемью ведущими поставщиками, демонстрирует вариации EvoScore при тестировании на наборе данных SWE-CI.
Набор моделей, разработанных восемью ведущими поставщиками, демонстрирует вариации EvoScore при тестировании на наборе данных SWE-CI.

Расширение оценки: от отдельных файлов к сложным взаимодействиям

В дополнение к существующей системе оценки SWE-CI, разработанная платформа включает в себя эталонные тесты, такие как SWE-Bench, для анализа процессов от постановки задачи до создания pull request. Такой подход позволяет оценить способность агентов воспроизводить типичные сценарии работы с репозиториями, имитируя реальные рабочие процессы разработки. SWE-Bench, в частности, позволяет проверить, насколько эффективно система может принимать запросы на исправление ошибок, генерировать соответствующие изменения в коде и предлагать их в виде pull request, что является ключевым аспектом современной разработки программного обеспечения и командной работы над проектами.

Для оценки возможностей агентов в работе с многошаговым использованием инструментов и взаимодействием с терминалом, в рамках исследования интегрированы эталонные тесты Tau-Bench и Terminal-Bench. Эти тесты моделируют сложные сценарии разработки, требующие последовательного применения различных утилит и анализа результатов их выполнения. Способность агента эффективно планировать и осуществлять цепочку действий, учитывая результаты каждого шага, является ключевым фактором успеха в решении реальных задач программирования. Оценка производительности в подобных условиях позволяет выявить сильные и слабые стороны разрабатываемых систем и определить направления для дальнейшего улучшения.

Метод эволюционной оценки расширяет возможности SWE-CI, динамически генерируя требования непосредственно из структуры кода. Вместо использования заранее определенных задач, система анализирует существующую кодовую базу и создает запросы на изменения, имитирующие реальный процесс поддержки и развития программного обеспечения. Такой подход позволяет создать более сложную и реалистичную среду тестирования, поскольку требования возникают органично из самого проекта, а не задаются искусственно. Это значительно повышает валидность оценки, поскольку позволяет проверить способность агентов адаптироваться к изменяющимся условиям и решать непредсказуемые задачи, характерные для реальной разработки.

По мере увеличения γ, рейтинг EvoScore модели указывает на улучшение поддержки кодовой базы.
По мере увеличения γ, рейтинг EvoScore модели указывает на улучшение поддержки кодовой базы.

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

Что дальше?

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

Следующим шагом представляется не столько увеличение масштаба моделей, сколько углубление понимания принципов устойчивости кода. Необходимо исследовать, как LLM могут не просто исправлять ошибки, но и предвидеть их, как они могут активно участвовать в рефакторинге, а не только реагировать на него. Оценивать стоит не только функциональность, но и элегантность решения, его способность к адаптации и расширению. Ясность — это минимальная форма любви, и это применимо и к коду.

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


Оригинал статьи: https://arxiv.org/pdf/2603.03823.pdf

Связаться с автором: https://www.linkedin.com/in/avetisyan/

Смотрите также:

2026-03-05 14:41