• Сохранение и генерация в одном промпте торгуются друг против друга; разводим их по слоям
  • Lock считается из дескриптора один раз и проигрывается дословно на каждой генерации
  • Уходят 4 сбоя: смешение осей, дрейф формулировок, слепой дебаг, непереносимость

Задача

Генеративные модели охотно перекраивают, идеализируют и сливают идентичность того, что генерируют: лицо становится чуть симметричнее, пропорции продукта плывут, логотип перестаёт читаться. Три типовых продакшн-сбоя:

  • Дрейф лица. В пятикадровой кампании структура лица одного человека едва заметно сдвигается: расстояние между глазами, линия челюсти. Каждый кадр по отдельности нормальный; как набор — зритель читает «это разные люди».
  • Дрейф формы продукта. Крышка бутылки в кадре 3 не та, что в кадре 1. Логотип отзеркален. Текст этикетки к кадру 5 превращается в псевдотекст.
  • Дрейф голоса. Тон и регистр персоны сдвигаются между главами длинного текста.

Все три — одна архитектурная ошибка: забота о сохранении и креативная задача сидят в одном промпте, и модель торгует их друг против друга кадр за кадром. Фраза «preserve the person's exact facial structure» в каждом промпте помогает слабо, пока креативная инструкция конкретного кадра (драматичный ракурс, мягкий фокус, художественная интерпретация) не потянет результат в дрейф. Сохраняющая клауза — просто слова, конкурирующие с другими словами.

flowchart LR
    P[Сохраняющая<br/>клауза] --> M[Один промпт:<br/>модель торгует]
    C[Креативная<br/>инструкция кадра] --> M
    M --> D[Дрейф лица,<br/>формы, голоса]
    classDef key stroke:#FF3600,stroke-width:2px
    class D key

Метод

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

[REFERENCE MAP]      где живёт каждый референс         дословно на каждый вызов
[LOCK LAYER]         IDENTITY / PRODUCT / BRAND LOCK   дословно на каждый вызов
[GENERATIVE PROMPT]  описание текущего кадра           меняется на каждый выход

Что содержит Lock. Структурированная переигровка заранее извлечённого дескриптора: того, что должно пережить генерацию без изменений.

  • Identity Lock (человек): утверждение авторитета («только Image 1 определяет идентичность»), override («людей на других референсах полностью игнорировать»), требования точности (структура лица, пропорции, тон кожи, тип фигуры, волосы) и явные отказы («без сглаживания, идеализации и смешения с любым другим лицом»).
  • Product Lock: какие части двигаются вместе, какая сторона к камере, текст на упаковке остаётся читаемым, стекло остаётся стеклом, масштаб не раздувается.
  • Brand Lock (за пределами картинок): тон голоса, словарные ограничения, ритм предложений, запрещённые фразы и клише.

Измерения меняются от домена к домену; форма постоянна.

Откуда берётся Lock. Это детерминированная функция от дескриптора, а не вызов LLM. Три шага:

  1. Извлечение дескриптора. Модель на низкой температуре анализирует референс и выдаёт структурированное описание. Дорого и вариативно, поэтому один раз на субъект.
  2. Вычисление Lock. Дескриптор подставляется в шаблон. LLM не участвует; при заданном дескрипторе результат детерминирован.
  3. Проигрывание. Каждая генерация батча дословно ставит Lock перед остальным промптом.
flowchart LR
    R[Референс] --> D[Дескриптор:<br/>один раз на субъект]
    D --> L[Lock: шаблон,<br/>без LLM]
    L -->|дословно| G1[Генерация 1]
    L -->|дословно| G2[Генерация 2]
    L -->|дословно| G3[Генерация N]
    classDef key stroke:#FF3600,stroke-width:2px
    class L key

Надёжность паттерна происходит именно отсюда: Lock байт-идентичен во всём батче, вариативность между генерациями невозможна по конструкции.

Обновление, сентябрь 2026. На предметном бренде у Lock появился ещё один источник: фото настоящей вещи. Снимок покупной детали или напечатанной базы идёт референсом с identity lock, всё, что на нём есть, воспроизводится один в один, и меняется только новая деталь. Шесть абажуров поверх фото первой напечатанной базы вышли чистыми — шесть из шести, — база совпала вплоть до кабеля на фоне. Lock при этом каскадируется. Фото купленного плафона дало восемь концептов печатной базы. Утверждённый рендер фаворита стал референсом второго lock с «only ADD», и доработка добавила втулку под патрон, не тронув остального: пять кадров, пять чистых. Каждый утверждённый выход замораживается и становится следующим слоем сохранения.

flowchart LR
    F[Фото<br/>покупной детали] --> C[Концепты<br/>под lock]
    C --> A[Утверждённый<br/>рендер]
    A --> L[Второй lock:<br/>only ADD]
    L --> R[Доработка]
    classDef key stroke:#FF3600,stroke-width:2px
    class A key

Почему разделение несущее. Слитый промпт создаёт четыре проблемы, разделение чинит все четыре:

  1. Смешение осей. Промпт про свет и композицию перестаёт читаться, когда несёт ещё 150 слов про идентичность. После разделения генеративный промпт описывает кадр, Lock — субъект.
  2. Дрейф формулировок. LLM переписывает клаузу сохранения чуть по-разному на каждый кадр («keep her face recognisable», «maintain identity»), и разброс в языке даёт разброс в результате. Lock одинаков по конструкции.
  3. Слепой дебаг. Когда лицо поплыло в кадре 4, невозможно понять, виновата креативная инструкция, сохраняющая или их взаимодействие. С Lock первый вопрос звучит «дошёл ли Lock до модели без изменений»: если да — дрейф в генеративном промпте, если нет — в инфраструктуре.
  4. Непереносимость. Сохранение встроено в каждый промпт, его нельзя поднять и переиспользовать. Отдельный Lock оборачивает любой формат генеративного промпта.
flowchart LR
    F[Лицо поплыло<br/>в кадре 4] --> Q{Lock дошёл<br/>без изменений?}
    Q -->|да| G[Дрейф в<br/>генеративном промпте]
    Q -->|нет| I[Дрейф в<br/>инфраструктуре]

За пределами картинок. Вопрос, на который отвечает паттерн: что должно пережить этот вызов без изменений? Если ответ — стабильный описываемый набор, паттерн подходит. Brand Lock поверх генерации глав контент-серии. Character Lock поверх сцен нарратива. Policy Lock (разрешённые и запрещённые действия, триггеры эскалации) поверх планирования в агентах, где генеративная инструкция варьируется сильно, а политика не должна. Schema Lock (контракты данных, сигнатуры API) поверх генерации кода.

flowchart LR
    B[Brand Lock] --> B1[Главы<br/>контент-серии]
    C[Character Lock] --> C1[Сцены<br/>нарратива]
    P[Policy Lock] --> P1[Планирование<br/>в агентах]
    S[Schema Lock] --> S1[Генерация<br/>кода]

Связь с соседними паттернами. В пайплайне последовательной консистентности Lock ложится на выход стадии архитектора: архитектор выдаёт генеративный промпт, пайплайн оборачивает его Lock перед отправкой. Осознанное умолчание — зеркальная дисциплина: Lock называет то, что должно выжить, умолчание убирает то, что не надо описывать вовсе. Политика в системном промпте — слабый аналог Lock: она описана один раз, но переинтерпретируется на каждом вызове; Lock проигрывается дословно и не интерпретируется. Сама идея выросла из примерки очков февраля 2025 года, где сохранение глаз между стадиями оказалось частным случаем этой же задачи.

Где ломается

  • Расплывчатый дескриптор. «Preserve facial features» без перечня измерений не работает; извлечение должно называть конкретные черты.
  • Lock спорит с генеративным промптом. Генеративный говорит «soft-focus dreamy portrait», Lock требует резкой точности лица. Генеративный промпт уступает на измерениях сохранения; стилевые слова, подразумевающие нарушение точности, отклоняются.
  • Регенерация посреди батча. Кто-то пересчитал Lock на половине проекта, и старые кадры больше не сходятся с новыми. Lock вычисляется один раз на проект, изменение версионируется.
  • Дескриптор промахнулся мимо реального сбоя. Identity Lock тщательно описывает лицо, а плывёт гардероб. Дескриптор расширяется итеративно до полного «что должно выжить».

Открытые вопросы: контролируемое измерение прироста точности против слитого промпта той же длины; таксономия «что может уплыть» по доменам (татуировки, шрамы, очки всплывают со временем); переносится ли Brand Lock, написанный для текста, на картинки того же бренда; устойчивость к генеративным инструкциям, которые активно тянут в дрейф («стилизованная переинтерпретация субъекта»).

Итог

  • Сохранение и генерация — два слоя, а не две фразы в одном промпте.
  • Lock — чистая функция от дескриптора, вычисляется один раз и проигрывается дословно.
  • Паттерн переносится с картинок на голос бренда, персонажей, политики агентов и схемы кода.
  • Заботы о сохранении копятся в системных промптах неявно и уплывают; названные слоем, они держатся.
  • Lock можно снимать с фото реальной вещи и каскадировать: каждый утверждённый выход становится референсом следующего.

© Александр Никулин. Цитирование — с указанием автора и ссылкой · Версия для LLM