TL;DR
CANVAS — техника, которая решает проблему «дрейфа» персонажей и деталей в длинных последовательностях. Переносит логику кинорежиссёра в промптинг: сначала составить «библию мира» для всех сцен сразу, потом генерировать каждую сцену, явно сверяясь с ней.
Главная боль при создании длинных историй, визуальных стори или серий изображений — дрейф деталей. Персонаж в первой сцене носит синее пальто, в пятой уже зелёное. Музей из первой сцены не похож на музей из седьмой. Артефакт, который украли в четвёртой сцене, снова стоит на полке в шестой. Это происходит потому, что модель держит контекст «в голове» по инерции и теряет детали — особенно если между сценами много текста или сцены не следуют сразу друг за другом.
CANVAS решает это тремя шагами: сначала спланировать состояние всех персонажей, локаций и объектов для каждой сцены до начала генерации, потом генерировать каждую сцену с явной ссылкой на план, потом проверять каждую сцену контрольными вопросами из плана.
Схема метода
ШАГ 1: Глобальное планирование (один запрос перед генерацией)
→ Таблица состояний персонажей по сценам (внешность, одежда)
→ Карта локаций (какие сцены в каком месте)
→ Таблица состояний объектов (присутствует / изменился / исчез)
Все три шага — в одном запросе к LLM
ШАГ 2: Последовательная генерация с памятью (отдельный запрос на каждую сцену)
→ Для каждой сцены: извлечь из плана нужные состояния → передать в промпт
→ Если локация повторяется — приложить описание из предыдущей сцены в этой локации
→ Если локация новая — сгенерировать без якоря
ШАГ 3: QA-проверка (в конце каждого запроса или отдельно)
→ Контрольные вопросы: "Соответствует ли внешность персонажа плану?"
→ "Изменилось ли состояние объекта согласно плану?"
→ "Совпадает ли описание локации с предыдущим появлением?"
ШАГ 1 выполняется один раз. Шаги 2–3 повторяются для каждой сцены.
Пример применения
Задача: Вы делаете серию промптов для Midjourney — визуальную историю про детектива Гришу Ковалёва, который расследует кражу в московском музее. 8 сцен. В третьей сцене он меняет пальто на форму охранника. В пятой появляется снова в пальто. Артефакт в первых сценах стоит на витрине, в седьмой его уже нет.
Промпт (Шаг 1 — Планирование):
Я создаю визуальную историю из 8 сцен.
Вот краткое описание каждой сцены:
Сцена 1: Гриша Ковалёв приходит в зал Оружейной палаты.
На витрине — золотая корона. Гриша в длинном сером пальто.
Сцена 2: Гриша разговаривает с директором в том же зале.
Сцена 3: Гриша надевает форму охранника, чтобы затаиться.
Сцена 4: Гриша в форме охранника ждёт у витрины ночью.
Сцена 5: Гриша видит вора — и снова в пальто (переоделся обратно).
Сцена 6: Погоня по коридорам музея.
Сцена 7: Гриша возвращается в зал — витрина пустая, корона украдена.
Сцена 8: Гриша стоит перед витриной — корона вернулась на место.
Создай три таблицы:
[ПЕРСОНАЖИ]
Для каждой сцены: имя персонажа → точное описание внешности и одежды в этой сцене.
[ЛОКАЦИИ]
Для каждой сцены: название локации → ключевые визуальные детали, которые должны
оставаться неизменными при повторном появлении этой локации.
[ОБЪЕКТЫ]
Для каждой сцены: название объекта → статус (присутствует / изменился / отсутствует)
+ точное визуальное описание в этом статусе.
Это будет мой «Continuity Plan» для всей истории.
Промпт (Шаг 2 — Генерация одной сцены):
Сейчас я генерирую промпт для Midjourney для Сцены 5.
Описание сцены: Гриша видит вора — и снова в пальто.
Из Continuity Plan:
- Гриша: [вставить строку из таблицы ПЕРСОНАЖИ → Сцена 5]
- Локация: коридор музея [вставить строку из таблицы ЛОКАЦИИ]
- Объекты: [вставить строку из таблицы ОБЪЕКТЫ → Сцена 5]
Напиши детальный промпт для Midjourney, который строго соответствует
этим параметрам. После промпта — ответь на три вопроса:
1. Внешность Гриши соответствует плану для Сцены 5?
2. Корона в этой сцене — в каком статусе по плану?
3. Детали коридора совпадают с описанием локации из плана?
Результат:
После Шага 1 модель выдаст три структурированные таблицы — ваш «Continuity Plan». В Шаге 2 для каждой сцены модель сформирует промпт для Midjourney, а затем ответит на три контрольных вопроса. Если что-то расходится с планом — видно сразу, до того как вы потратили время на генерацию.
Почему это работает
Модель не «помнит» детали между запросами — она каждый раз начинает с чистого листа. Даже внутри одного длинного контекста детали из начала вытесняются деталями из середины. Попросить «пиши консистентно» — всё равно что сказать повару «не забывай про соль»: намерение есть, механизма нет.
У модели хорошо работает следование явным инструкциям в текущем запросе. Если прямо написано «пальто серое, длинное» — она так и сделает. Если написано «проверь, совпадает ли с планом» — проверит.
CANVAS использует это: переносит неявную «память о мире» в явный документ, который передаётся в каждый запрос. Модель не должна ничего «помнить» — она читает план заново каждый раз. Рычаги управления:
- Детализация плана → чем подробнее таблицы, тем жёстче контроль. Для простых историй — достаточно одной таблицы персонажей.
- Контрольные вопросы → добавляй или убирай под задачу. Для текстовых историй: «упоминается ли цвет пальто?». Для промптов изображений: «есть ли все визуальные якоря?»
- Предиктивное планирование → можно добавить в план колонку «что нужно показать в этой сцене, чтобы следующая работала». Это ключевой трюк CANVAS: думать на сцену вперёд.
Шаблон промпта
=== ШАГ 1: CONTINUITY PLAN ===
Я создаю {тип_контента} из {число_сцен} сцен.
Краткое описание каждой сцены:
{список_сцен_с_номерами}
Создай три таблицы:
[ПЕРСОНАЖИ]
| Сцена | Персонаж | Внешность и одежда |
[ЛОКАЦИИ]
| Сцена | Локация | Ключевые визуальные детали |
[ОБЪЕКТЫ]
| Сцена | Объект | Статус | Описание |
Это мой Continuity Plan для всей истории.
=== ШАГ 2: ГЕНЕРАЦИЯ СЦЕНЫ {номер} ===
Описание сцены: {описание}
Из Continuity Plan:
- Персонажи: {строки из таблицы ПЕРСОНАЖИ}
- Локация: {строка из таблицы ЛОКАЦИИ}
- Объекты: {строки из таблицы ОБЪЕКТЫ}
Напиши {текст_сцены / промпт для изображения}, строго соответствующий плану.
Затем ответь на вопросы:
1. Внешность каждого персонажа соответствует плану?
2. Состояние каждого объекта соответствует плану?
3. Детали локации совпадают с предыдущим появлением этого места?
Что подставлять:
- {тип_контента} → «визуальную историю», «сценарий», «серию промптов для Midjourney»
- {список_сцен_с_номерами} → 1-2 предложения на каждую сцену
- В Шаге 2 вставляй нужные строки из плана — это и есть «якоря» для модели
🚀 Быстрый старт — вставь в чат:
Вот шаблон CANVAS для создания контента с непрерывностью.
Адаптируй под мою задачу: {твоя задача}.
Задавай вопросы, чтобы заполнить поля.
[вставить шаблон выше]
LLM спросит количество сцен и их описания — потому что без этого не получится составить таблицы состояний. Она возьмёт трёхчастную структуру (план → генерация → проверка) и адаптирует под твой контент.
Ограничения
⚠️ Длинные многосерийные истории: При очень длинных историях (20+ сцен) таблицы становятся громоздкими. Разбивай на «акты» по 5-8 сцен с переносом итоговых состояний в следующий блок.
⚠️ Субъективные детали: Continuity Plan работает хорошо для фактических деталей (цвет, наличие объекта, место действия). Для «атмосферы» или «настроения сцены» менее точен — это сложнее зафиксировать в таблице.
⚠️ Исходная система — про изображения: CANVAS создан для генерации картинок через диффузионные модели. В оригинале каждый «якорь» — это реальное изображение, которое подаётся в модель. В текстовом применении роль якоря играет текстовое описание — это работает, но слабее.
⚠️ Первая сцена задаёт всё: Если Continuity Plan содержит ошибку или неточность — она тянется через все сцены. Перечитай план перед тем как начать генерацию.
Ресурсы
CANVAS: Continuity-Aware Narratives via Visual Agentic Storyboarding
Ishani Mondal, Yiwen Song, Mihir Parmar, Palash Goyal, Jordan Boyd-Graber, Tomas Pfister, Yale Song
University of Maryland, College Park; Google
Проект: https://ishani-mondal.github.io/canvas-project-page/
Использованные бенчмарки: ViStoryBench, ST-Bench, HardContinuityBench (новый)
Метрика: ContinuityEval (оценивает персонажей, фоны, реквизит через VLM-судью)
