В главной роли
Наш опыт

Промпт был правильный: семь дефектов, которые живут не в формулировке

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

Почему это отдельный класс дефектов

Текст промпта — единственная часть системы, которую читают люди. Его вычитывают, спорят о формулировках, переписывают по десять раз. А путь от анкеты до этого текста проходит через десяток функций, и на этом пути нет ни читателя, ни падений: подстановка объекта вместо строки не роняет сборку, пустое поле не роняет запрос, неиспользованная переменная не роняет вообще ничего.

Получается тихий отказ. Книга собралась, картинки нарисовались, текст связный — и только человек, который держит в голове, что просил веснушки, замечает, что их нет. В нашем случае таких человек был один: владелец, вычитывающий каждую книгу перед выдачей.

Семь случаев

1

Сюжет книги игнорировался: получалась гладкая история не про то

До модели доезжало: «[object Object]» вместо двенадцати сюжетных битов

Биты лежат массивом объектов, а в текст промпта подставлялись как строка. Язык честно превратил объект в слово «объект» — ошибки не было ни одной, промпт собрался, запрос ушёл, модель получила бессмыслицу и вежливо написала что-то своё.

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

28 июля 2026

2

Веснушки и очки, отмеченные в анкете, на рисунке не появлялись

До модели доезжало: Ничего: признак молча исчезал по дороге

В анкете это галочки, то есть булево значение, а генератор ждал строку с описанием. Пустая строка — это ложь в булевом смысле, и ветка «добавить в промпт» не выполнялась ни разу.

Починено: Признаки переводятся в текст в одном месте и с явным словарём: галочка «веснушки» превращается во фразу, а не в true.

28 июля 2026

3

У второго героя без описания внешности пропадали волосы

До модели доезжало: «(волосы: , глаза: )»

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

Починено: Неуказанное не попадает в промпт вовсе. Пустое поле должно исчезать, а не подставляться пустым.

3 августа 2026

4

Бабушка выходила девочкой с седыми волосами

До модели доезжало: «girl, about 68 years old»

Возраст мы починили, а подлежащее осталось прежним: в промпте всегда стояло girl или boy, потому что портрет строился тем же путём, что и главный герой. Промпт противоречил сам себе, и в таком случае модель слушает существительное, а не число.

Починено: Существительное считается от возраста вместе с самим возрастом, и роль («бабушка или дедушка») задаёт оба. Проверено картинками до и после — двенадцать рублей.

16 августа 2026

5

Цвет волос и глаз держался только на референсе и плыл в половине сцен

До модели доезжало: Ничего: поле приходило в генератор и не использовалось

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

Починено: Внешность уходит в промпт каждой из двенадцати сцен и страхует лицо там, где модель достраивает его сама.

6 августа 2026

6

Праздник, ради которого заказывали книгу, в тексте не упоминался

До модели доезжало: Ничего: повод терялся между лендингом и промптом

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

Починено: Один словарь поводов на всех и функция приведения к канону: любое написание, включая старое, читается одинаково.

3 августа 2026

7

Мини-сказка про девочку писалась в мужском роде

До модели доезжало: Ничего: переключатель пола не уходил в тело запроса

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

Починено: Пол уходит в запрос, роут принимает его схемой и задаёт роду явную строку в промпте.

16 августа 2026

Три вывода, которые мы забрали себе

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

Второй: когда число спорит со словом, побеждает слово. Промпт «girl, about 68 years old» давал девочку с седыми волосами — описание внешности доезжало, а возраст нет. Мы проверили это двумя картинками за двенадцать рублей вместо часа рассуждений о том, как оно должно работать.

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

Чего в этом списке нет

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

Наш вывод

Если генерация выдаёт связный результат не про то, о чём просили, — начинать надо не с переписывания промпта. Надо напечатать текст, который реально ушёл в модель, и прочитать его глазами. В шести случаях из семи мы находили ответ в первой же строке.

Что из этого получается в итоге, видно бесплатно: превью героя и обложки собирается по фотографии до всякой оплаты.

Собрать превью по фото

Соседние исследования: сколько стоит собрать книгу и один эпизод для четырёх и для восьми лет. Все данные — в разделе «Данные и исследования».

Вопросы и ответы

Почему все ваши дефекты — не в тексте промпта?+

Потому что текст промпта — единственная часть системы, которую все читают. Его вычитывают, обсуждают и переписывают. А путь от анкеты до этого текста проходит через десяток функций, и там нет ни читателя, ни проверки: подстановка объекта вместо строки не роняет сборку, пустое поле не роняет запрос, неиспользованная переменная не роняет ничего. Ломается то, на что никто не смотрит.

Как ловить такие дефекты, если они не падают?+

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

Правда, что модель слушает существительное, а не число?+

В нашем случае — да, и это самый практичный вывод из всего списка. Промпт «girl, about 68 years old» модель разрешала в пользу слова girl и рисовала девочку, добавляя ей седину. Мы проверили это картинками до и после правки, а не рассуждением. Если в вашем промпте число спорит со словом, побеждает слово.

Вы публикуете свои ошибки. Зачем?+

Затем, что список чужих граблей — единственное, чего нельзя пересказать, не пройдя по ним. Советы про формулировки есть у всех и стоят ноль; наш список стоил нам месяца и нескольких сотен рублей на перерисовки, и он верен ровно потому, что это не рекомендации, а протокол.