3,583 papers
arXiv:2609.04061 80 3 сент. 2026 г. FREE

Preservation Prompt: как одна фраза останавливает LLM от переписывания всего кода при правке одного бага

КЛЮЧЕВАЯ СУТЬ
5 строк снесено, 60 добавлено — и всё это ради фикса одной строки: < на <=. GPT-5.4 увидел баг в функции на 10 строк и заодно приладил валидацию, приведение типов и пересчёт кривой. Все тесты прошли, но это уже не патч, а рефакторинг без спроса — исследователи зовут это over-editing. Метод даёт возможность удерживать модель в рамках задачи: одна добавка к промпту — «сохрани максимум оригинального кода, меняй только необходимое» — режет объём лишних правок почти на треть.
Адаптировать под запрос

TL;DR

Когда просишь LLM исправить баг в коде, модель часто переписывает куда больше, чем нужно — это называется over-editing (избыточное редактирование). Простая добавка к промпту — явно попросить сохранить оригинальный код и поменять только то, что нужно — заметно снижает эту привычку модели «улучшать заодно».

Пример из статьи наглядный: в функции была однострочная ошибка (сдвиг на единицу), и её действительно можно исправить, поменяв одну строку. Но GPT-5.4 вместо этого удалил 5 строк и добавил 60 — валидацию входных данных, приведение типов, обработку пропущенных значений, пересчёт кривой. Все тесты прошли — то есть корректность не гарантирует минимальность: модель ведёт себя так, будто её попросили написать «надёжный продакшн-код», а не точечно починить конкретную строку.

Добавление одной фразы в промпт — «сохрани как можно больше оригинального кода, меняй только необходимое» — снижает объём избыточных изменений почти на треть и даже слегка повышает точность исправления.

🔬

Схема метода

Это не многошаговая техника — это одна добавка к обычному промпту:

ШАГ 1: Формулируешь задачу как обычно — "вот код, вот баг, исправь"
ШАГ 2: Добавляешь явное условие — "сохрани максимум оригинального кода, меняй только то, что необходимо" → модель переключается в режим точечной правки вместо переписывания

🚀

Пример применения

Задача: У тебя есть Python-скрипт, который парсит выгрузку заказов с Wildberries и считает скидку. В одной строке ошибка — сравнение через < вместо <=, из-за чего товары с максимальной скидкой не попадают в отчёт.

Промпт:

Вот функция на Python. В ней баг: товары с максимальной скидкой (100%) 
не попадают в итоговый отчёт.

def calculate_discount_report(orders):
    result = []
    for order in orders:
        if order['discount'] < 100:
            result.append(order)
    return result

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

Результат: Модель поменяет < на <= в одной строке и оставит остальную функцию без изменений. Без второй части инструкции есть высокий риск, что модель «заодно» добавит проверку на пустой список, обработку None, логирование и переименует переменные — то есть превратит патч в рефакторинг, который придётся долго вычитывать.


🧠

Почему это работает

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

При этом сама находка бага у модели работает правильно — проблема не в том, что она не видит ошибку, а в том, что она не ограничивает себя рамками задачи.

Модели хорошо реагируют на явные, конкретные ограничения в тексте промпта. Фраза про сохранение кода меняет то, что исследователи называют «настройкой задачи» (task framing): модель начинает воспринимать существующий код как то, что нужно беречь, а не как черновик, который можно улучшить.

Рычаги управления: - Хочешь видеть, что именно изменила модель и почему → попроси добавить короткий комментарий к каждой изменённой строке - Работаешь не с кодом, а с текстом (договор, статья, письмо) → та же фраза работает: «исправь только эту ошибку, не переписывай остальной текст» - Если правка правда должна быть масштабной (рефакторинг, а не багфикс) → эту инструкцию не добавляй, она будет мешать


📋

Шаблон промпта

Вот {код/текст}: {вставить содержимое}

Проблема: {описание бага или ошибки}

Исправь эту проблему, но сохрани как можно больше оригинального 
{кода/текста} — измени только то, что необходимо для исправления. 
Не добавляй дополнительную логику, проверки или улучшения, 
если задача этого не требует.

Подставь в {код/текст} то, с чем работаешь — скрипт, формулу, абзац договора. В {описание бага} — что именно идёт не так.


⚠️

Ограничения

⚠️ Проверено только на коде: исследование тестировало короткие функции (в среднем 10 строк). Для больших файлов или сложных многофайловых правок эффект не изучали.

⚠️ Снижает, но не убирает проблему: избыточное редактирование остаётся, просто становится меньше — это не полное решение.

⚠️ Новее и «умнее» ≠ аккуратнее: более сильные reasoning-модели не всегда делают меньшие правки — эффект зависит от конкретной модели, а не от её мощности.

⚠️ Обучение модели делать это само (без промпта) через reinforcement learning требует кода и инфраструктуры — это не применимо в обычном чате, в отличие от простой добавки к промпту.


🔍

Как исследовали

Исследователи взяли 400 задач из BigCodeBench и намеренно «испортили» правильные эталонные решения — внесли контролируемый баг на уровне синтаксического дерева кода. Благодаря этому для каждой задачи точно известен минимальный патч, который вернёт код к рабочему состоянию: это просто отмена внесённой порчи.

Прогнали больше 20 топовых моделей (GPT-5.5, Claude Opus, Gemini, DeepSeek и другие) в двух режимах — обычный запрос «исправь баг» и запрос с добавкой про сохранение кода. Замеряли три вещи: проходят ли тесты, насколько велика правка по сравнению с минимальной (считали расстояние между версиями кода на уровне токенов) и насколько усложнилась логика кода после правки. Разработчики-люди отдельно подтвердили, что эта метрика избыточности совпадает с их собственной оценкой «удобно ли это ревьюить» и «сохранён ли оригинальный замысел» — совпадение почти 95%.

Удивил результат: высокий процент прохождения тестов не гарантирует аккуратность правки. GPT-5.5 в усиленном режиме чинит баги отлично, но объём лишних изменений у неё в четыре раза больше, чем у Claude Opus при похожем качестве. Добавление одной фразы про сохранение кода сократило избыточность почти на треть и слегка повысило точность — эффект держался при повторных прогонах и разных формулировках той же просьбы.


🔗

Ресурсы

When Models Edit Too Much: On the Fidelity of Minimal Code Edits. Tongyao Zhu, Wei Hern Lim, Min-Yen Kan — National University of Singapore. Код: github.com/nreHieW/over-editing


📋 Дайджест исследования

Ключевая суть

5 строк снесено, 60 добавлено — и всё это ради фикса одной строки: < на <=. GPT-5.4 увидел баг в функции на 10 строк и заодно приладил валидацию, приведение типов и пересчёт кривой. Все тесты прошли, но это уже не патч, а рефакторинг без спроса — исследователи зовут это over-editing. Метод даёт возможность удерживать модель в рамках задачи: одна добавка к промпту — «сохрани максимум оригинального кода, меняй только необходимое» — режет объём лишних правок почти на треть.

Принцип работы

По умолчанию модель решает не «исправь баг», а «напиши надёжный продакшн-код». Увидела ошибку — и заодно чинит все соседние слабости, о которых её не просили. Фраза-ограничитель меняет настройку задачи (task framing): код перестаёт быть черновиком для улучшения и становится тем, что нужно беречь. Модель из режима «дай улучшу заодно» переходит в режим хирурга со скальпелем — а не с бензопилой.

Почему работает

Модель находит баг правильно — с этим проблем нет. Проблема в том, что она не тормозит сама себя после того как баг найден. Дело не в том что модель тупая — просто никто не сказал ей где остановиться. Цифры по фактам: минус треть избыточных правок, а точность фикса даже чуть выше, чем без ограничения.

Когда применять

Багфиксы в коде → точечные правки без рефакторинга, особенно когда diff должен быть маленьким и его легко проверить в code review. Та же фраза работает для текста — договор, статья, письмо: «исправь только эту ошибку, не переписывай остальное». НЕ подходит если задача — реальный рефакторинг: там инструкция будет мешать, а не помогать.

Мини-рецепт

1. Опиши баг: что именно не работает и почему, без общих слов
2. Дай код: только нужную функцию, без лишнего контекста
3. Добавь ограничитель: «сохрани максимум оригинального кода — меняй только то, что нужно для фикса»
4. Запрети лишнее: «не добавляй валидацию, обработку ошибок или новую логику, если тесты этого не требуют»
5. Проверь diff: если на однострочный баг правка вышла больше 2-3 строк — переспроси модель

Примеры

[ПЛОХО] : Вот функция, в ней баг: товары со скидкой 100% не попадают в отчёт. Исправь.
[ХОРОШО] : Вот функция, в ней баг: товары со скидкой 100% не попадают в отчёт. Исправь, но сохрани максимум оригинального кода — меняй только то, что нужно для фикса. Не добавляй валидацию или обработку ошибок, если тесты этого не требуют.
Источник: When Models Edit Too Much: On the Fidelity of Minimal Code Edits
ArXiv ID: 2609.04061 | Сгенерировано: 2026-09-04 06:22

Проблемы LLM

ПроблемаСутьКак обойти
Модель переписывает больше кода, чем нужно для исправления багаПросишь поправить одну ошибку. Модель заодно добавляет валидацию, обработку исключений, приведение типов, переименовывает переменные. Итог — вместо однострочного патча получаешь рефакторинг на 60 строк. Все тесты проходят, но диф разросся, и его долго вычитывать. Модель не ошиблась в поиске бага — она просто не ограничила себя рамками задачиЯвно попроси сохранить максимум оригинального кода и менять только то, что нужно для исправления. Например: "сохрани как можно больше оригинального кода, не добавляй новую логику и проверки, если задача этого не требует"

Методы

МетодСуть
Фраза-ограничитель "сохрани оригинал" — минимизация избыточных правокДобавь к обычному промпту одно предложение: "сохрани как можно больше исходного кода/текста, измени только то, что необходимо для исправления". Работает потому что модель по умолчанию трактует задачу "исправь баг" как "напиши надёжный, качественный код" — и заодно чинит всё, что кажется слабым местом. Явная инструкция меняет эту установку: код становится тем, что нужно беречь, а не черновиком для улучшений. Работает не только для кода — та же фраза помогает при правке текста, договора, письма: "исправь только эту ошибку, не переписывай остальное". Не работает, если тебе реально нужен рефакторинг или масштабная переработка — тогда ограничение будет мешать модели делать то, что ты просишь

Тезисы

ТезисКомментарий
Прохождение тестов не гарантирует минимальность измененийЭто два разных измерения качества правки. Модель может исправить баг и пройти все проверки, но заодно переписать половину функции — код останется рабочим, но раздутым и трудным для ревью. Правильный результат не значит аккуратный процесс. Применяй: после правки смотри не только на тесты, но и на объём дифа — сколько строк изменено относительно необходимого минимума
📖 Простыми словами

WhenModelsEdit Too Much: On the Fidelity of Minimal Code Edits

arXiv: 2609.04061

Когда ты просишь нейросеть поправить баг, она думает не как хирург со скальпелем, а как гиперактивный джун. По умолчанию в LLM зашит паттерн: «напиши идеальный код», а не «сделай точечный фикс». Модель видит ошибку, попутно замечает «неидеальные» места вокруг и начинает переписывать рабочие куски — это явление называют over-editing, и оно стабильно ломает прод.

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

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

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

Мораль простая: LLM не чувствует меры и всегда пытается сделать «слишком хорошо». Не проси просто исправить — жестко очерчивай зону вмешательства. Иначе вместо секундного фикса ты убьешь полдня на поиск того, что модель втихую переписала «заодно».

Работа с исследованием

Адаптируйте исследование под ваши задачи или создайте готовый промпт на основе техник из исследования.

0 / 2000
~0.5-2 N-токенов ~10-30с
~0.3-1 N-токенов ~5-15с