Релиз генератора картинок нового поколения от OpenAI породил нескончаемый поток ИИ-комиксов, мемов и прочих смешнявок в западных соцсетях.
Естественно, противники ИИ мгновенно заклеймили весь подобный контент своей фирменной фразой "AI slop", вне зависимости от реального качества картинки и вложенного смысла. И вообще, вы же просто пишете текст, и машина за вас всё рисует, никакие вы не творцы! На это следовал контраргумент, что смысл юмора не в реализации, а в идее.
Наблюдая за этими бесконечными интернет-войнами, я задумался: а возможно ли с помощью ИИ генерировать и идеи тоже? Так и родился проект Endless Fun Machine.
Задача: написать бесконечный генератор смешных картинок: ИИ сам должен генерировать шутки и реализовывать их.
Мой подход к генерации новых данных в стиле референсного датасета также можно обобщить и использовать для генерации синтетических данных или аугментации.
Общий подход
Генерация картинки состоит из трёх этапов
Генерация идеи: LLM придумывает уникальную смешную идею в стиле идей из референсного датасета
Реализация: LLM пишет промт для генератора картинок на основе идеи
Рисование: модель gpt-image-1 рисует картинку
Модель gpt-image-1
Совсем недавно OpenAI добавили модель gpt-image-1 для генерации картинок в API.
Однако, есть подвох: они стали требовать верификацию по паспорту для использования самых мощных моделей.
К тому времени бОльшая часть кода этого проекта была уже написана, я ждал выхода модели в API. Не ожидал, что OpenAI такую свинью подложат.
Сайт для верификации принимает российские паспорта, но не принимает армянские ВНЖ. Я попытался верифицироваться, но у меня не получилось (в конце, после фотки паспорта и селфи, сайт просто пишет, что не может верифицировать): то ли они в итоге отклоняют российские паспорта, то ли что-то ещё (я все-таки больше склоняюсь ко второму варианту). В итоге я просто попросил свою девушку с нероссийским паспортом создать новый аккаунт, и это сработало.
Предупреждение: gpt-image-1 стОит как крыло от Боинга, одна картинка в максимальном качестве сжирает 25 центов.
Использование LLM
В этом проекте я использую библиотеку openai, которая умеет подключаться к двум бэкендам: OpenAI и OpenRouter. OpenRouter предоставляет доступ к большему количеству LLM, но проект можно использовать и без него.
Две самые главные функции здесь - call_llm и gen_image. Большая часть кода просто предоставляет возможность легко вставлять картинки в промт.
Саммаризация картинок в референсном датасете
https://github.com/einhornus/endless-fun-machine/blob/main/describing.py
Я собрал 100 смешных картинок в качестве референсного датасета.
Я попросил Visual LLM кратко объяснить юмор на каждой картинке.
Я применил технику, которую я называю "DIY reasoning": я задал четкий формат ответа для LLM, в рамках которого она сначала описывает картинку в целом, фокусируясь на юморе, а затем пишет краткое резюме. Это позволяет модели при написании резюме опираться на весь текст, который она вывела до этого - мы увеличиваем точность модели за счет дополнительного компьюта.
Генерация идеи
https://github.com/einhornus/endless-fun-machine/blob/main/ideation.py
Сначала, я выбираю случайное подмножество референсных описаний.
Затем, я прошу LLM сгенерировать смешную идею в стиле референсных описаний, но не копируя их. LLM при этом выдает разные идеи за счет того, что промт каждый раз разный - существует очень много способов выбрать референсное подмножество.
Промт для LLM использует небольшой трюк в стиле "DIY reasoning": я прошу сначала объяснить в чем юмор, и только затем описывать саму идею. Без этого трюка модель очень часто выдавала текст, в котором нет реального юмора.
В ходе экспериментов я заметил, что модель начинает выдавать заметно более креативные идеи, когда сообщение пользователя (которое содержит референсные описания) идет после системного сообщения, а не наоборот (как я делал изначально).
Опционально, я генерирую несколько идей вместо одной, затем оцениваю каждую из них с помощью LLM. При оценке нужно обязательно использовать "DIY reasoning", потому что оценить что-либо числом гораздо проще, если иметь перед этим длинное обоснование (альтернативно, можно просто взять reasoning-модель).
Реализация
https://github.com/einhornus/endless-fun-machine/blob/main/implementation.py
В генерации промта для gpt-image-1 с помощью другой LLM никаких особых секретов нет, это стандартный LLM-промтинг.
Рисование
Функция для рисования картинки просто скопирована из официальной доки.
Результаты
Вот самые лучшие результаты работы скрипта





















Фейлы gpt-image-1
Частенько встречались ситуации, когда скрипт сгенерировал смешную идею и нормальный промт для ее визуализации, но gpt-image-1 просто не справилась. Вот пара примеров:
A smug-looking driver stands beside their SUV, enthusiastically pointing at a tiny potted fern duct-taped to the exhaust pipe. The plant is visibly wilting from the fumes, with some leaves already brown. A handwritten cardboard sign next to it reads “ECO-SOLUTION: Plant converts emissions to oxygen!” while thick black exhaust smoke billows around the struggling plant. The driver wears a “Save The Planet” t-shirt, completely oblivious to the absurdity of their “solution.”

A smartphone screen shows a chaotic text conversation. The sender’s messages keep getting hilariously mangled by autocorrect: “Hey, I’ll be a little late to dinner” becomes “Hey, I’ll be a little llama to dinner.” Attempts to fix it only make things worse: “Sorry, late to dinner” turns into “Sorry, hate to dinner,” and “I’ll arrive soon” becomes “I’ll arrive spoon.” The user’s desperate “What is wrong with my phone?” is autocorrected to “What is wrong with my personality?” When the user finally types “STOP,” autocorrect unhelpfully suggests “SHOP FOR LLAMAS NEAR YOU.” The friend’s reply at the bottom: “Are you okay? Should I bring a spoon or a llama?” The humor is in the escalating absurdity and the phone’s apparent takeover of the user’s identity.

Выводы
В целом, эксперимент завершился удачно: ИИ способен выдавать много осмысленных и уникальных идей (но, конечно, до топового уровня юмора ему далеко).
Сам подход вполне применим ко множеству практических задач по генерации синтетических данных.