Эфир 18.11 · Поток 318 ноября в 19:00 МСК — бесплатный практический эфир по ИИ-агентам · Живой Поток 3 стартует 23.11Эфир 18 ноября →Поток 3 (23.11)
РелизAPI / Продукт · В работуHabr AI→ оригинал

Постоянный герой в Gemini API: замер на 18 кадрах показал, что голый промпт уводит одежду

У генератора картинок нет памяти между запросами, поэтому «постоянный персонаж» — это дисциплина клиента: фиксированный текстовый паспорт героя и эталонные референсы в каждом запросе. Автор прогнал 18 генераций сцены с двумя героями на трёх вариантах промпта. Лица не поменялись ни разу, но на голом промпте одежда и аксессуары ушли от эталона, а на фоне вылезли надписи.

AI-обработка оригинала Habr AI; редакция Hamidun News
Постоянный герой в Gemini API: замер на 18 кадрах показал, что голый промпт уводит одежду
Источник: Habr AI. Коллаж: Hamidun News.
Слушать статью
Паспорт материала и цифры
ПараметрДанные
ПервоисточникHabr AI ↗
Главный редактор
Ключевой факт #1Паспорт героя храните в коде и вставляйте в каждый промпт без правок
Нумеруйте картинки и перечисляйте приметы6 из 6 дублей без ошибок
Проверяйте серию листомтёмную куртку в одиночном кадре глаз пропускает

Если вы делаете ролики или рекламу с одними и теми же героями, главная боль знакома: в третьем кадре героиня уже на себя не похожа, а двое в одной сцене вдруг меняются лицами или одеждой. Автор Habr разобрал, как с этим справляться через Gemini API, и проверил свои приёмы небольшим замером.

Почему лицо уплывает

У генератора нет памяти между запросами. Каждый вызов собирает кадр заново из текста и приложенных картинок. Значит, постоянство героя нужно обеспечивать на стороне клиента.

Автор предлагает четыре элемента:

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

Технически всё просто: в generateContent картинки уходят как inlineData в том же массиве parts, что и текст. Порядок частей и есть порядок картинок, на который ссылается промпт. Соотношение сторон лучше задавать параметром imageConfig.aspectRatio: строка в промпте остаётся подсказкой, а параметр выполняется.

Замер: двое в кадре

Автор взял gemini-3.1-flash-image и две пары героев: женщина и мужчина, а также две заметно разные женщины. Три варианта промпта, по три дубля на пару, всего 18 генераций:

  1. Голый: «эти двое встречаются в кафе», без ролей и примет.
  2. С ролями: кто сидит, кто стоит, кто слева. Нумерации картинок нет.
  3. С нумерацией: «Image 1 — это женщина: …», «Image 2 — это мужчина: …», приметы словами и прямой запрет смешивать лица.

Лица местами не поменялись ни разу, и спиной никто не сел. Разница нашлась в деталях. В голом промпте на героине в одном дубле из трёх появились тёмная куртка и золотой браслет, которых нет на эталоне, и она выглядела старше. В другом дубле на доске в кафе возникла надпись «EVENING SPECIALS». Вариант с ролями держал лица и одежду в 6 дублях из 6, но в двух дублях на фоне были вывески, хотя в промпте стояло no text. Вариант с нумерацией дал 6 из 6 без ошибок и без надписей.

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

Видео и Omni

Для видео автор использует gemini-omni-1.1-flash через Interactions API. Роли картинок задаются метками прямо в тексте: <FIRST_FRAME> для первого кадра и <IMAGE_REF_n> для эталонов героев. Рабочий порядок такой: сначала собрать и проверить кадр с двумя героями, потом отдать его как первый кадр, а эталоны добавить референсами.

Модель сама решает, где кто окажется. На просьбу «садится напротив» герой сел рядом, потому что стоял сбоку. Если расстановка важна, нужен первый кадр, где персонажи уже сидят, а в видео остаётся только действие.

С 5 ноября доступна gemini-omni-1.2-flash, и с 3 декабря запросы к 1.1 перенаправят на неё. В ней длительность стала параметром (от 3 до 15 секунд), а секунда 720p подешевела с $0,10 до $0,07. Но в одном тесте метки первого и последнего кадра не сработали. Помогла прямая фраза в начале промпта: «The video starts exactly on the first image and ends exactly on the second image». Для варианта с одним FIRST_FRAME и IMAGE_REF на 1.2 проверки не было.

Что делать на практике

  • Держите паспорт героя константой в коде, а не текстом, который пишется заново.
  • Для сцен с двумя героями нумеруйте картинки и перечисляйте приметы. Это стоит пары строк и делает промпт однозначным.
  • Не верьте no text: смотрите фон, вывеска за спиной героя в рекламе вылезет первой.
  • Склеивайте дубли в контактный лист и открывайте подозрительные кадры с увеличением. Куртку и браслет автор заметил только рядом с чистыми дублями.

По деньгам картинка 1K стоит около $0,067, весь замер из 18 кадров — около $1,21, а 6-секундный клип на Omni 1.1 обошёлся в $0,63.

Сюжет

Вопросы и ответы по материалу

Что известно по теме: почему лицо уплывает?

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

Что известно по теме: замер: двое в кадре?

Автор взял gemini-3.1-flash-image и две пары героев: женщина и мужчина, а также две заметно разные женщины. Три варианта промпта, по три дубля на пару, всего 18 генераций: Голый: «эти двое встречаются в кафе», без ролей и примет. С ролями: кто сидит, кто стоит, кто слева. Нумерации картинок нет. С нумерацией: «Image 1 — это женщина: …», «Image 2 — это мужчина: …», приметы словами и прямой запрет смешивать лица. Лица местами не поменялись ни разу, и спиной никто не сел. Разница нашлась в деталях.

Что известно по теме: видео и Omni?

Для видео автор использует gemini-omni-1.1-flash через Interactions API. Роли картинок задаются метками прямо в тексте: <FIRST_FRAME> для первого кадра и <IMAGE_REF_n> для эталонов героев. Рабочий порядок такой: сначала собрать и проверить кадр с двумя героями, потом отдать его как первый кадр, а эталоны добавить референсами. Модель сама решает, где кто окажется. На просьбу «садится напротив» герой сел рядом, потому что стоял сбоку.

ЖХ
Жемал Хамидун — CPO Alpina Digital, продакт-менеджер AlpinaGPT. Делает AI-продукты с 2019 года. Hamidun News — pet project, который вырос в production-агрегатор с 6000+ читателей.
✦ Единое AI-пространство · Nomad

Протестируйте новые LLM и мультимодальные модели в одном окне

Платформа Nomad AI (nomadnet.ai) даёт прямой доступ к Claude Opus 5.5, GPT-6, Gemini 3.1, DeepSeek и автономным агентам без VPN, зарубежных карт и зоопарка подписок.

Открыть Nomad AI →Автономный Nomad Agent
Что вы думаете?
Загружаем комментарии…