Edit-Preservation: применить только запрошенное изменение
Десять минут генерации — получился 12-шотный список. Три шота легли — близко к тому, что вы хотели. Просите LLM «улучшить крупность в шоте 4». Она переписывает весь список. Два хороших шота пропали, заменены лёгкими вариациями, которые промахнулись мимо того, что в оригинале и работало. Теперь выбор — между частичным улучшением шота 4 и потерей двух уже принятых шотов. Откатываетесь — улучшение тоже теряется. Итерационный цикл стоит дороже исходной генерации.
Выход — инструктировать LLM в максимально жёсткой форме: применять только запрошенное изменение и сохранять всё остальное дословно. Правка становится хирургической вместо full-replace.
Это и есть edit-preservation-паттерн: промпт-архитектура для итеративной правки LLM, в которой главная инструкция системного промпта — «применить только запрошенное изменение; сохранить всё остальное дословно». Бэйзлайн существует (шот-лист, промпт, документ); правка хирургическая. Экономика переворачивается — refinement становится дешевле регенерации, а итерация заменяет commit-early-and-pray.
Форма
Входы LLM-редактора:
1. Существующий артефакт (текущий промпт, шот-лист, документ)
2. Инструкция пользователя на свободном языке
Системный промпт (ядро):
"Apply ONLY the requested change. Preserve all other fields, phrasing,
structure, and formatting verbatim. Do not rewrite what was not asked
to be changed."
Выход:
Отредактированный артефакт в том же формате, что и вход.
Почему это отдельная архитектура, а не просто «редактирование»
Попросите LLM «improve this prompt» — он перепишет всё, потому что переписывание ощущается как продуктивный дефолт. Паттерн явно инвертирует этот дефолт.
Три конкретных свойства:
- Бэйзлайн — авторитет. Существующий артефакт не «предложение для улучшения»; это источник истины обо всём, что пользователь не упомянул.
- Объём изменения ограничен инструкцией. «Add a close-up before scene 2» меняет ровно одно. Не «and while I'm at it, tighten scene 1's framing.»
- Формат сохраняется. JSON-шот-лист на входе должен прийти на выходе тем же JSON-шот-листом с теми же ключами и порядком. Параграф-промпт — параграфом без переоформления того, что не менялось.
Почему он ценен
- Рефайнинг экономически жизнеспособен. Когда не нужно перегенерировать бэйзлайн, LLM-вызов маленький и быстрый. Полный rewrite стоит как исходная генерация; refine — долю того. Дешёвый рефайнинг меняет поведение пользователя: итерация становится дефолтом.
- Стабильность выхода. Пользователь редактирует промпт, потому что почти получилось. Полный rewrite выбрасывает близкие-к-правильному части. Edit-preservation их сохраняет.
- Diffable-итерация. Выход можно осмысленно диффить с входом — изменение маленькое и видимое, не сплошной rewrite.
Где это встречается
| Что редактируется | Пример инструкции | Дисциплина выхода | |---|---|---| | Шот-лист | «Add a close-up of the product box before scene 2» | Переиндексировать только затронутые буквы; остальные шоты сохранить дословно | | Промпт storyboard | «Make this a wider shot» | Сменить крупность; сохранить style-префикс, субъект, локацию | | Image-промпт | «Emphasize the subject's expression» | Сменить соответствующий клаусу; сохранить всё остальное | | Video-промпт | «Less camera movement — hold static» | Заменить motion-дескриптор; сохранить темп и subject-action |
Каскад brief-to-scenario-pipeline использует паттерн на уровне шот-листа — третья стадия каскада (edit scenario) — это edit-preservation, применённый к целому структурированному артефакту.
Режимы отказа
- Недостаточно конкретная инструкция. «Make it better» не даёт LLM основания для сохранения — он переписывает. Контрмера: отказывать на размытых инструкциях на этапе UI или просить пользователя уточнить.
- Расползание объёма. LLM «чинит» несвязанное, что считает ошибками. Контрмера: явный анти-пример в системном промпте — «DO NOT change phrasing of fields unrelated to the edit. Leave typos and awkwardness alone unless asked.»
- Дрейф формата. Поля JSON переупорядочены, параграф переформатирован. Контрмера: явная инструкция о сохранении формата + валидация против схемы входа после.
- Тихая потеря контента. LLM выбрасывает поле, которое «счёл» избыточным. Контрмера: любое расхождение в количестве полей — ошибка, retry.
Обобщается широко
- Редактирование кода. Каноничный паттерн surgical-diff: «rename this variable, don't touch anything else.»
- Редактирование документов. Стиль track-changes: применить эту правку, остальное не трогать.
- Редактирование конфигов / схем. Добавить это поле, сохранить все комментарии, порядок, форматирование.
- Промпт-на-промпт-итерации. Паттерн используется рекурсивно — итерация над промптами, которые производят промпты.
Экономическое свойство, которое стоит назвать
Edit-preservation делает single-shot-рефайнинг дешевле, чем пакетная перегенерация. В сочетании с интерфейсом, который выносит single-shot-редактирование как first-class кнопку, это меняет дефолтное поведение пользователя: итерация заменяет commit-early-and-pray. Маленькое архитектурное решение с большими UX-последствиями.