Как научить модели ИИ не переписывать код лишнего

Как научить модели ИИ не переписывать код лишнего

Кодинг с помощью ИИ-инструментов, таких как Cursor, GitHub Copilot, Claude Code и Codex, стал повседневной практикой. Однако при решении простых задач, например, исправлении бага смещения на единицу, модели часто переписывают целые функции: добавляют валидацию, меняют имена переменных, вводят вспомогательные функции. В результате возникает огромный diff, несмотря на минимальность требуемого изменения.

Проблема избыточной редактуры

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

Особенно это критично при работе с существующей кодовой базой, где текущая реализация уже понятна команде и осмысленна. Задача ИИ — не «улучшить», а аккуратно исправить конкретную ошибку.

Как измерить избыточную редактуру

Для исследования проблемы был создан датасет на основе BigCodeBench: 400 задач были синтетически «испорчены» — изменены операторы (+-), булевы значения (TrueFalse) и т.д. Каждое повреждение сохраняет синтаксическую валидность, но ломает тесты. Это позволяет точно определить эталонное минимальное исправление — просто откат изменений.

Для оценки степени редактуры использовались две метрики:

  • Нормализованное расстояние Левенштейна на уровне токенов — измеряет, насколько сильно изменился код относительно повреждённой версии. Токенизация позволяет учитывать синтаксические единицы, а не сырые символы.
  • Добавленная когнитивная сложность — оценивает, насколько усложнился код для восприятия. Учитывает вложенность, ветвления, попытки упрощения. Корректное минимальное исправление не должно менять эту метрику.

Склонны ли модели к избыточной редактуре?

Да, и даже самые современные. Например, GPT-5.4 показала высокое расстояние Левенштейна (0,39 с рассуждениями, 0,33 без) и добавленную когнитивную сложность 2,31, при этом её Pass@1 — всего 0,723. Это означает, что модель не только переписывает много лишнего, но и часто ошибается.

Лучше всех справилась Claude Opus 4.6: минимальные изменения (Левенштейн 0,06), низкая когнитивная сложность (0,20) и высокий Pass@1 (0,912). Gemini 3.1 Pro Preview и GLM 5 также показали консервативный подход.

Помогает ли промптинг?

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

Простая просьба сохранить код может быть эффективнее, чем попытки «улучшить» его ИИ.

Рассуждения = избыточная редактура?

Часто — да. Модели с рассуждениями (GPT-5, Gemini, Qwen) по умолчанию склонны переписывать больше, чем их аналоги без рассуждений. Они «размышляют» о «лучшем» решении, даже если текущее — вполне рабочее.

Однако при явной инструкции сохранять код картина меняется: модели с рассуждениями начинают вносить меньше изменений, чем их аналоги без рассуждений. Это говорит о том, что избыточная редактура — не фундаментальный дефект, а поведение по умолчанию, которое можно скорректировать.

Можно ли обучить модели быть аккуратнее?

Да, и наиболее эффективный способ — обучение с подкреплением (RL). В эксперименте использовалась модель Qwen3 4B 2507 Instruct и вознаграждение, сочетающее функциональную корректность и минимальность изменений (по расстоянию Левенштейна).

Сравнивались методы:

  • SFT — тонкая настройка на синтетических данных.
  • rSFT — обучение на завершениях с наименьшим расстоянием Левенштейна.
  • DPO — оптимизация предпочтений между «минимальными» и «максимальными» исправлениями.
  • RL — обучение с подкреплением.

Только RL показал устойчивое обобщение на новые типы багов и улучшение всех метрик. Модели, обученные с помощью SFT, страдали от катастрофического забывания: их Pass@1 упал до 0,458. RL же сохранил общие способности к кодингу.

LoRA вместо полного fine-tuning?

Да. Поскольку задача — не обучение новым знаниям, а корректировка стиля, достаточно LoRA. При ранге 64 LoRA почти достигает результатов полного RL, особенно по когнитивной сложности. Это делает подход значительно дешевле.

Масштабируемость

Та же схема RL успешно применима к более крупной модели Qwen3 14B. Все метрики улучшились: рост Pass@1, снижение Левенштейна и когнитивной сложности, отсутствие катастрофического забывания. Это подтверждает, что подход применим к моделям разного размера.

Выводы

Избыточная редактура — распространённая проблема среди современных кодинг-моделей. Однако она:

  • Измерима.
  • Частично устраняется простым промптом.
  • Существенно улучшается с помощью RL.
  • Не требует полного переобучения — достаточно LoRA.

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

Читать оригинал