Мои заметки о технологиях и жизни

Проблемы и ограничения кодовых агентов (VS Code + RooCode)

Проблемы и ограничения кодовых агентов (VS Code + RooCode)

Введение. Кодовые агенты, такие как RooCode, интегрированные в редактор VS Code, обещают ускорить разработку, генерируя код и тесты по запросу. Они могут выступать в роли «виртуального разработчика», помогая писать код, рефакторить и даже проектировать архитектуру приложения. Однако на практике эти ИИ-ассистенты имеют ряд ограничений. Разработчики отмечают проблемы с недетерминированностью генерируемого кода, трудности при его последующем рефакторинге, несоблюдение заданных контрактов функций и ловушки при декомпозиции архитектуры. Особенно остро проявляются нюансы при генерации кода по описанию и автоматическом написании тестов – казалось бы, рутинных задачах, где ИИ должен блестяще справляться. Ниже подробно рассмотрены эти проблемы, их причины и способы смягчения, основанные на реальном опыте разработки.

Нестабильность и недетерминированность генерации кода

Одно из ключевых ограничений ИИ-кодогенерации – недетерминизм результатов. В отличие от классических компиляторов, которые при одних и тех же исходниках всегда дают одинаковый бинарный код, генеративные модели работают вероятностно. Это означает, что один и тот же запрос к агенту в разное время может привести к разному коду[1]. Даже минимальные правки в формулировке запроса способны существенно изменить поведение сгенерированного фрагмента[2]. Более того, модели часто используют случайность при выборе токенов; поэтому даже без видимых изменений запроса повторный запуск может дать альтернативное решение функции[3].

Практические следствия этого недетерминизма негативно сказываются на разработке:

Причины недетерминизма. Главная причина – стохастическая природа больших языковых моделей. Они генерируют текст (код) не по жёстким правилам, а прогнозируя вероятностно наиболее подходящие токены. Малейшая смена контекста, другая версия модели или нестабильность порядка файлов в подсказке могут изменить результат[8][9]. Кроме того, есть ограничения по объёму контекста: если проект крупный, агент видит лишь часть кода и документации, и его ответы основываются на неполной картине. Разные части проекта могут выпадать из поля зрения агента, что приводит к несовместимым или противоречивым фрагментам кода.

Подходы к решению. Полностью устранить вероятностный характер генерации нельзя, но есть способы повысить стабильность:

В целом, разработчику важно понимать: недетерминизм – встроенное свойство ИИ-помощника, поэтому критичный код надо проверять особенно тщательно. Как отмечает инженер Сандро Дзнеладзе, «нельзя проверить то, что невозможно воспроизвести», а без воспроизводимости доверять коду нельзя[14]. В сферах с высокими требованиями к безопасности (авиация, медицина и т.д.) подобная непредсказуемость совершенно неприемлема[15][14], да и в обычной разработке она способна породить трудноуловимые баги.

Несоблюдение контрактов на входах/выходах и логические ошибки

Следующий распространённый класс проблем – несоответствие генерируемого кода изначально заданным спецификациям, контрактам функций или ожиданиям по логике. Иными словами, агент может выдать код, который формально решает задачу, но не точно так, как требовалось. Примеры включают:

Причины несоответствий. Главная причина – отсутствие у модели глубокого понимания спецификации. ИИ опирается на статистические связи слов и кода, а не на строгое семантическое соответствие. Если описание расплывчато или подразумевает знание контекста, модель может неверно интерпретировать задачу. Например, если не явно сказано, что purchaseOrderId – это особый объект, ИИ решит, что это просто идентификатор, и выберет тип GUID по частотности подобных названий. Также влияет ограниченный контекстный «туннель» внимания: агент может видеть текущий файл функции, но не заметить объявление типа или документацию, находящиеся в другом месте проекта. В итоге, он гадает по названию или по общим соображениям из обучающих данных – отсюда промахи. Наконец, модели склонны выдавать наиболее типичный код, а требования конкретного проекта могут от этого типового шаблона отличаться.

Способы предотвращения. Чтобы ИИ строже соблюдал контракт и логику, стоит предпринять следующие меры:

Автоматическое написание тестов: частые проблемы

Генерация тестов – отдельный важный сценарий применения кодовых агентов. Казалось бы, написать юнит-тесты по готовому коду – задача, хорошо подходящая ИИ: нужно перебрать различные кейсы и проверить ожидаемый вывод. На практике же автоматическое написание тестов с помощью LLM сталкивается с рядом проблем:

Почему возникают проблемы с тестами. Многие причины аналогичны уже рассмотренным: стохастичность генерации (разные попытки дают разный набор тестов), ограниченное поле зрения модели (может не видеть другие тест-файлы в проекте или документацию), отсутствие глубинного понимания цели тестирования. Модель генерирует тесты шаблонно: видит код функции – предполагает типичные входы/выходы, но не всегда распознаёт тонкости бизнес-логики, требующие отдельных кейсов. Кроме того, ИИ не запускает код реально (если специально не настроить), поэтому не знает, упадёт ли тест – он лишь предсказывает вероятно правильный исход. Отсюда ошибки. Что касается дублирования – модель при каждом новом запросе может пойти по иному пути из-за случайности, нет общей памяти о том, какие тесты уже существуют (если явно не дать этот контекст).

Рекомендации по генерации тестов. Чтобы получать от агента пользу в тестировании, стоит придерживаться следующих правил:

Сложности при рефакторинге кода с помощью агента

Помимо генерации нового кода, агент активно применяется для рефакторинга: улучшения существующего кода, перестройки функций, переименований, перемещения фрагментов, и т.п. В идеале ИИ-ассистент мог бы взять на себя механическую работу по наведению порядка. Однако на практике автоматический рефакторинг крупного кода часто идёт наперекосяк и требует значительного вмешательства человека. Основные проблемы, отмеченные разработчиками:

Почему так происходит. Рефакторинг – более сложная задача, чем просто дополнение кода. Она требует понимания существующей структуры и дизайна системы, учёта множества связей. LLM же видит ограниченное окно текста, не понимая семантики; он действует больше по синтаксическим признакам. Например, видя предупреждения об Obsolete, модель «решила» превентивно заменить эти компоненты новыми, хотя этого не просили – видимо, статистически часто за пометкой Obsolete следует замена, вот она и применила шаблон. С rename-правилами аналогично: в обучающих данных, возможно, часто встречалось именование Async-методов с суффиксом, и агент автоматически улучшил код по своему представлению, не зная стиля конкретного проекта. Ограничения контекста тоже влияют: ИИ может не увидеть всех упоминаний метода в коде, потому не всегда обновляет их правильно, или не понимает, что удаляя файл, надо стереть и ссылки на него. В рефакторинге требуется последовательное глобальное обновление, чего LLM без дополнительных инструментов делать не умеет – он правит то, что видит, а остальное может выпасть. Кроме того, модель не выполняет сборку/тесты после изменений, поэтому не сразу «узнает» о проблемах – она действует вслепую.

Как эффективно использовать агента для рефакторинга. Полностью полагаться на автономный refactoring AI не следует. Однако есть тактики, делающие его помощь более полезной и безопасной:

Ловушки при архитектурной декомпозиции

ИИ-агенты вроде RooCode привлекают не только для мелких правок, но и для помощи в проектировании архитектуры приложения. RooCode даже имеет специальный Architect mode, в котором агент генерирует план реализации на высоком уровне[43]. Теоретически, модель может разложить задачу на компоненты, предложить паттерны, технологии – своего рода заменить архитектурного разработчика. На практике же автоматическая декомпозиция тоже сопряжена с типичными подводными камнями:

Как безопасно применять агента на уровне архитектуры:

Обобщение: типичные проблемы, их причины и пути устранения

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

Проблема Возможные причины Подходы к устранению
Недетерминированный код (разные результаты генерации при одном запросе) • Стохастическая природа LLM (температура, случайность)
• Чувствительность к формулировке запроса
• Ограниченное окно контекста – агент видит не всю картину сразу
• Снижать случайность (temperature=0 и т.п.) по возможности
• Фиксировать prompt и модель для повторяемости
• Делить задачи на мелкие и контролировать изменения (через diff, ревью)
• Использовать шаблоны или детерминированные генераторы для критичных частей
Несоблюдение контрактов и требований (логические ошибки, неверные типы, пропущенные кейсы) • Неполнота или двусмысленность спецификации в запросе
• Модель угадывает по распространённым шаблонам, не зная тонкостей проекта
• Нет жёсткой проверки типа/контрактов на этапе генерации (модель «не компилирует» код)
• Давать максимально чёткий и подробный запрос, включая запрещённые и обязательные аспекты
• Внедрять требования в код: использовать строгие типы, интерфейсы, аннотации, чтобы автогенерация не могла их нарушить без ошибки компиляции
• Писать/генерировать тесты к коду и запускать их, проверять поведение на граничных условиях
• Рецензировать вывод агента: не доверять «правдоподобному» коду без проверки[7]
Проблемы при генерации тестов (флейки, дубли, слабое покрытие) • Агент не исполняет код, возможны галлюцинации в тестах (ошибочные предположения о поведении)
• Разные запуски → разные тесты (недетерминизм)
• Ограниченный контекст: ИИ может не видеть, что тесты уже есть, или упустить редкий случай
• Отсутствие «понимания» цели теста – модель пишет типичные проверки вместо специфичных
• Формировать сценарии тестов вручную и явно давать их агенту, вместо запроса «протестируй всё»
• Проверять синтаксис и логику сгенерированных тестов, исправлять ошибки прежде чем доверять им CI
• Избегать генерации тестов несколькими разными людьми одновременно – назначить ответственного для согласованности
• Рассмотреть инструменты статической генерации тестов для важных модулей (для консистентного покрытия)
Трудности рефакторинга (агент ломает код или делает лишнее) • Модель не видит проект целиком – правит в одном месте, вызывая проблемы в другом
• Шаблонные улучшения без учёта стиля конкретного кода (например, ненужные переименования)
• Отсутствие памяти о запрещённых областях или уже выполненных изменениях
• Невозможность атомарно применить изменения по всему проекту (в отличие от IDE)
• Рефакторить итеративно: небольшие шаги с проверкой компиляции/тестов после каждого
• Явно указывать границы refactoring-а (что можно/нельзя менять)
• Использовать возможности памяти (Project Memory, context mentions) – давать агенту максимум контекста по связанному коду[38]
• Отключить авто-применение, все изменения просматривать вручную[36]
• При сложных перестройках – сначала выполнить их средствами IDE, ИИ подключать для локальных изменений и генерации вспомогательного кода
Ловушки в декомпозиции и дизайне (плохие архитектурные решения от ИИ) • Модель предлагает «усреднённую» архитектуру, не зная специфики ваших требований
• Склонность включить все знакомые компоненты (на всякий случай), т.е. overengineering
• Нет оценки последствий решений (производительность, сложность поддержки – ИИ этого не анализирует)
• Ограниченный контекст: агент не помнит решений, принятых ранее, без специальной памяти
• Использовать агент как генератор идей, но отбирать их человеку-архитектору (анализ плюсов/минусов – вручную)
• Задавать чёткие рамки: целевые паттерны, технологии, критерии (например, «код должен быть однофайловым скриптом» или наоборот «спроектируй многослойно»)
• Интегрировать Memory Bank или аналогичные средства: хранить описания архитектурных решений, чтобы ИИ сохранял консистентность[48]
• Не бояться корректировать и перегенерировать план, пока он не станет приемлемым – итеративное проектирование совместно с ИИ
• Всегда держать «человека в петле» (human in the loop) – проверять обоснованность предложенной структуры прежде, чем поручать агенту её реализовывать[36]

Заключение. Кодовые агенты типа RooCode — мощный инструмент, способный существенно повысить продуктивность, но только в руках внимательного и опытного разработчика. Они отлично справляются с рутинными или типовыми задачами, могут сэкономить время на написании шаблонного кода, помочь с документированием или быстро набросать прототип. Однако при использовании таких агентов всегда нужно помнить об их ограничениях: вероятность ошибок, отсутствие понимания контекста, склонность генерировать лишнее. Практический опыт показывает, что лучшие результаты достигаются при тесном сотрудничестве человека и ИИ: разработчик направляет агента, дробит для него задачи, чётко формулирует требования и тщательно проверяет каждую поправку[36][37]. Заранее продуманная архитектура, зафиксированные контракты и шаблоны проектирования служат страховкой от творческих «вольностей» модели. Таким образом, чтобы кодовый агент стал полезным помощником, а не источником хаоса, необходимо выстроить правильный процесс – с ясным дизайном, контрольными точками и постоянным качественным фидбэком со стороны человека. Только тогда связка VS Code + RooCode (или аналогичных AI-инструментов) раскрывает свой потенциал, ускоряя разработку без потери качества кода.


[1] [2] [3] [4] [5] [14] [15] The Risk of AI, Non-Deterministic Code Generation | by Sandro Dzneladze | Medium

https://medium.com/@sandrodz/the-hidden-risk-of-ai-non-deterministic-code-generation-3765a1c27017

[6] [7] [17] AI Is Making Us Worse Programmers (Here’s How to Fight Back) : r/programming

https://www.reddit.com/r/programming/comments/1i846fr/ai_is_making_us_worse_programmers_heres_how_to/

[8] [9] [13] [19] [20] [21] [22] [24] Why Deterministic Test Generation Is Important - Diffblue

https://www.diffblue.com/resources/deterministic-test-generation/

[10] [11] [12] [18] [32] [37] [38] [43] [44] [47] [48] How I Effectively Use Roo Code for AI-Assisted Development

https://spin.atomicobject.com/roo-code-ai-assisted-development/

[16] [23] [25] [26] [27] [28] [29] [30] [31] [33] [34] [35] [39] [40] [41] [42] Some Observations on AI/Agentic Refactoring – Artineering

https://amanagrawal.blog/2025/05/06/some-observations-on-ai-agentic-refactoring/

[36] [45] [46] [49] Roo Code review: Autonomous AI-powered development in the IDE | InfoWorld

https://www.infoworld.com/article/4019646/roo-code-review-a-first-look-at-autonomous-ai-powered-development-in-the-ide.html