Всем привет! Меня зовут Алёна Лагойкина, я дизайнер в AGIMA. Последний год я много экспериментировала с нейронками: пробовала создавать и редактировать самые разные артефакты — по работе и для себя. За это время у меня полетела видеокарта, я завела себе китайскую симку, достала китайский VPN и в целом начала учить китайский язык. И всё это — чтобы освоить искусство промптинга.
В этой статье расскажу, какие нейронки хорошо себя показали, для каких задач они подходят, какие примочки упрощают работу, но главное — как поставить задачу для ИИ так, чтобы он тебя точно понял. Спойлер: китайский для этого знать необязательно. А вот английский — желательно.
С самого начала путешествия по миру нейросетей меня интересовал один вопрос: почему одни картинки у ИИ получаются нормальными, а другие напоминают сон при температуре 40 градусов. Мои изыскания показали, что в большинстве случаев дело именно в промпте.
Промпт — это текстовая инструкция для нейронки, от его качества напрямую зависит конечный результат. Искусственный интеллект не умеет читать мысли или угадывать ваши предпочтения, а потому задачу ему надо ставить детально, конкретно и точно. Попробуем разобраться, как именно.
В основе большинства современных нейросетей лежат диффузионные модели. Например, по этому принципу работают MidJourney и Stable Diffusion. Название последней буквально так и переводится: «стабильная диффузия». Если вспомнить школьные уроки физики, то это понятие означает проникновение частиц одного вещества в другое.
Что и куда проникает в нашем случае? Разберем, как ИИ учится. Он берет картинку, а затем начинает ее постепенно зашумлять. То есть шум как бы проникает в нее. Это и есть диффузия. Четкое изображение становится сначала почти нечитаемым, а после совсем растворяется в шуме. Дальше, когда нейронка получает промпт, она как бы восстанавливает картинку из этого шума. Это называется denoising.
Наш текст указывает модели, что рисовать. При этом модели воспринимают его как набор чисел. Поэтому чем конкретнее запрос, тем вероятнее вы получите именно то, что хотите.
Предположим, мы хотим изобразить кота-самурая. Первым делом создаем черновой промпт — тот самый, с которого всё начнется. Не стоит думать, что достаточно будет сформулировать одно подробное техзадание для нейронки — их абсолютно точно будет несколько. И может быть, даже много.
В базовом промпте мы описываем идею в целом. Делаем это прямо, просто и с минимумом деталей. Наша цель — задать субъект и обстановку. Например, так: кот-самурай под цветущим деревом сакуры. Смотрим, что сгенерировала модель, и оцениваем, что нам нравится, а что нет. Изображение доработаем позже.
Базовый промпт состоит из четырех элементов:
субъект;
детали;
окружение;
стили и атмосфера.
У всех этих элементов есть логика и последовательность. Как правило, нам нужно описать сцену так, как будто мы видим ее перед собой. Причем сделать это нужно логично и полно. Если мы напишем «собака сидит возле будки, железная цепь, зеленый шарф», ИИ вряд ли поймет, где шарф, где собака и где цепь. Куда лучше, если у субъекта есть описание и к нему относится какой-то глагол действия.
Правда, из этого правила бывают исключения. Некоторые нейросети лучше понимают, когда описываешь изображение словосочетаниями или даже просто отдельными словами через запятую. Хотя это не самые распространенные варианты.
Но что точно у всех нейросетей одинаково, так это знание языков: английский они понимают намного лучше русского. Даже если вы на постоянной основе общаетесь с нейронкой по-русски, в какой-то момент всё равно придется перейти на английский. Например, чтобы задать стиль.
→ Субъект — это якорь внимания, то, ради чего картинка и задумана. В нашем примере это тот самый кот-самурай. В качестве субъекта помимо человека может выступать животное, предмет, природное явление, текстуры и абстракции — что угодно. Стоит помнить, что зачастую модель запоминает первое существительное в промпте и в дальнейшем работает уже с ним.
Проблемы начинаются, когда мы пытаемся описать два субъекта. Они могут сливаться воедино, дублироваться или просто не появляться. Чтобы увеличить шансы на успех, можно указывать точное количество субъектов и особенности каждого. Не two people, а one man, one woman. Еще можно описать расположение каждого относительно другого или добавить негативные промпты.
→ Детали задают субъекту контекст. Он не просто существует, а полноценно живет. У него есть поза, одежда, эмоции, цель и препятствия. Поэтому в промпте мы подробно описываем все нюансы, без которых общая картина будет схематичной. Кот-самурай держит лапы на коленях, одет в доспехи, у него есть меч и т. д.
→ Окружение дает нам поместить нашего персонажа в какое-то пространство. Мы описываем, что самурай сидит под веточкой цветущей сакуры, смотрит на вечернее солнце, а на фоне виднеется японский дом. Без этого пространства персонаж тоже теряет в привлекательности. Все эти мелочи вокруг рассказывают историю героя.
На этапе базового промпта не стоит чересчур увлекаться окружением и деталями. Достаточно задать пару важных моментов, а дальше постепенно докручивать, добавляя вводные. Сгенерированное изображение во многом и само будет подсказывать, что можно убрать, а что сохранить. Небольшие уточнения должны восприниматься нейросетью как менее значимые.
→ Стили и медиумы определяют, каким будет изображение. Оно может быть фотореалистичным или акварельным, может напоминать картины классиков ренессанса, а может — пленочную фотографию. В общем, тут всё зависит от цели. Стили — это художественные направления, а медиумы — техники: масляная живопись, акварель, фотография, 3D-рендер, карандашный рисунок и т. п. Стили смешивать между собой можно, а медиумы нельзя — неройнка начнет путаться.
К стилям относятся не только жанры рисования и живописи, но и манера конкретных художников. Если написать в промпте By Vincent Van Gogh, вы увидите на картинке его характерные черты. Также можно указывать платформы, для которых предназначено изображение. Например, ArtStation или DeviantArt. В этом случае ИИ тоже поймет, чего именно вы ожидаете.
Вот тут несколько полезных ссылок, в которых вы найдете стили и примеры их применения в разных моделях:
Приложение с примерами стилей и промптами для них — для Stable Diffusion.
Коллекция из 106 стилей с примерами — для Stable Diffusion.
Еще одна библиотека стилей — для MidJourney.
LoRA — что-то вроде нейросети внутри нейросети. Эта функция позволяет обучать не всю модель целиком, а только ее части. Скажем, если загрузить в LoRA изображение какого-то персонажа в разных ракурсах и затем подключить к вашему проекту, персонаж при каждой новой генерации будет оставаться неизменным. Точно так же можно применять стиль какого-то художника или научить ИИ использовать логотип.
На сегодняшний день LoRA можно подключать только в открытых моделях, то есть таких, которые вы скачиваете на свой компьютер. К таким относятся Stable Diffusion, Flux, NovelAI и др. В MidJourney и ChatGPT такая опция пока недоступна.
Разные паттерны можно комбинировать. Если у вас есть LoRA какого-то персонажа и какого-то стиля, то этот персонаж будет изображен в этом стиле. Но важно, что LoRA не сильнее модели. Если в LoRA заложен фотореализм, а в промпте мы напишем аниме, получим кашу.
LoRA можно скачать или обучить. Обучение обычно занимает от одного дня до нескольких недель. И этот процесс требует ресурсов вашего компьютера. Поэтому скачать нужную LoRA иногда проще. Причем авторы, как правило, сами указывают, с какими моделями их LoRA работает лучше всего и какие подсказки надо давать нейронке.
Пишите как для машины, а не как для человека. Как я и говорила, лучше использовать английский язык, четко задавать субъект, избегать опечаток и ошибок, отделять части промпта друг от друга запятыми. Модели вроде Stable Diffusion 1.5 и 2.1 вообще лучше работают с тегоподобными описаниями.
Важно не сколько слов мы используем, а какие это слова. Вообще в разных моделях разные ограничения по количеству символов. У Midjourney это 60 слов, а у Stable Diffusion — примерно 75. Но базовый промтп не стоит превращать в книгу: лучше задать ему образ четко и по делу, а доработать позже.
Проверяйте ключевые слова. Если вы задаете стиль какого-то художника, но ИИ его игнорирует, вероятно, модель просто его не знает. Если сомневаетесь в промпте или каком-то его составном элементе, вбейте этот элемент отдельно и посмотрите, как модель с ним работает в целом.
Некоторые атрибуты тянут за собой другие. Нейронка понимает смыслы не так, как человек. У нее есть ассоциации, и она подтягивает одни атрибуты к другим. Например, голубые глаза могут подтянуть европейские черты лица. Если описывается атрибут, который может нести ассоциации (а они не нужны), лучше дописать, что именно вы хотите видеть.
ИИ хорошо понимает, как общаться с ИИ. Не знаете, как составить базовый промпт — просто попросите об этом ChatGPT. Он справится с этой задачей на отлично. Также есть специальные сайты: PromptHero, PromptBase и др. Но все они а целом следуют перечисленным здесь советам.
Некоторые модели позволяют задать вес каждому параметру. Вспомним наш первый пример: кот и цветы сакуры. По умолчанию для ИИ кот важнее, потому что стоит в промпте первым, а сакуру он воспринимает как фон. Но если снизить «вес» кота и увеличить «вес» цветов — картинка поменяется.
Обратите внимание на промпт. В MidJourney, чтобы задать веса, мы используем двойные двоеточия. В Stable Diffusion это будут единичные двоеточия или круглые скобки. Каждая пара круглых скобок увеличивает вес примерно на 10%, а квадратных — уменьшает на столько же:
((cat)) > cat:1,21
[cat] > cat:0,9
Вес можно задавать не только субъекту или фону, но и стилю, эмоциям, освещению — чему угодно. Главное — не переборщить, иначе модель зациклится и испортит композицию. Диапазон 1,1–1,5 кажется оптимальным для усиления, а 0,7–0.9 — для ослабления.
С их помощью мы показываем нейронке, чего не хотим видеть на картинке. В Stable Diffusion для этого есть отдельная панель. Например, вы хотите изобразить старый город — машины там явно будут лишними. В негативном промпте пишем: машины.
В Stable Diffusion 2.0 негативные промпты — это почти обязательная практика. Разработчики системы прямо говорят, что лучше ввести там что угодно, чтобы модель работала лучше. В этом случае можно попросить нейронку не блюрить картинку или не допускать лишних конечностей.
В MidJourney отдельного поля для негативных промптов нет, но есть специальный тег --no. Есть даже список негативных промптов, которые должны помочь с генерацией:
--no ugly
--no deformed
--no bad anatomy
--no disfigured
--no extra limbs
--no extra fingers
--no mutation
--no cropped
Иногда в промптах задачу ставят без использования специальных инструментов, но это может запутать ИИ. Если просто написать в промпте no blur, модель может повесить на стене запрещающую табличку с надписью «no blur». Для робота не существует той логики, которую мы додумываем сами.
Вводите изменения постепенно. Не переписывайте изначальный промпт целиком, иначе вы не поймете, что на что повлияло. А нам важно понимать, какой запрос и что изменил. Лучше менять по одному-два слова. Например, допишите про освещение, сгенерируйте три-четыре варианта, подумайте, стало ли лучше. Если что, всегда можно откатиться назад.
Усиливайте слабые места и убирайте лишнее. Тут важно действовать постепенно и поступательно. Не переделывайте с нуля, а плавно влияйте на изображение с помощью негативных промптов или корректировки промпта. Какому-то элементу можно добавить вес, какому-то сократить. Рано или поздно вы добьетесь идеального баланса.
Играйте с формулировками. Одну и ту же вещь можно описать разными словами. И соответственно, ИИ воспримет их тоже по-разному. Особенно это хорошо работает, если мы говорим об эмоциях: например, angry почему-то чаще лучше, чем furious, хотя это синонимы. Где-то лучше написать кратко, а где-то подробно. В общем, нужно пробовать.
Не превращайте промпт в шведский стол. Иногда промпт разрастается, потому что хочется добавить всё. Это провоцирует противоречия: одна часть промпта начинает мешать другим. Тогда появляются глюки и лишние артефакты. Становится всё сложнее разбираться, где и что сломалось. Так что в какой-то момент лучше притормозить.
Найти их можно в Stable Diffusion и во Flux, поэтому в этом разделе говорить буду в основном про них.
В режиме IMG2IMG внутри Stable Diffusion можно взять сгенерированную или любую другую картинку и прогнать ее через модель с новым промптом. ИИ постарается сохранить общую композицию исходника, но перерисовать его в соответствии с новым описанием.
В MidJourney есть что-то наподобие: вы можете добавить ссылку, чтобы модель ссылалась на нее. Но работает эта функция намного хуже. К тому же там нет возможности настроить, как сильно исходная картинка должна влиять на итоговое изображение. А в Stable Diffusion есть целый набор ползунков, которые существенно увеличивают степень контроля.
IMG2IMG может пригодиться, чтобы
изменить стиль картинки, но при этом сохранить позу или композицию;
повысить разрешение — неочевидная опция;
создать несколько вариаций одного изображения;
использовать в качестве основы реальные фотографии.
Если какой-то артефакт никак не хочет исчезать, даже после применения негативного промпта, поможет Inpaint. Мышкой на сгенерированном изображении вы выделяете то, что нужно убрать, и пишете промпт. Он будет применен именно к выделенной части картинки. Всё остальное останется неизменным. Таким же образом можно и что-то добавить. Например, птицу в небе. Выделяете кусочек неба, который кажется пустым, пишете птица — и она уже там.
Inpaint можно использовать, чтобы:
исправлять отдельные артефакты;
дорисовывать детали;
менять объекты локально;
менять фон или его части;
комбинировать картинки.
Hires Fix — это высокое разрешение. Используется, чтобы, когда вы генерируете картинку, она автоматически была в хорошем качестве. В дефолтном состоянии нейронки грузят немного размытые изображения, но с Hires Fix будет проходить, по сути, две генерации. Сначала ИИ создаст изображение в плохом качестве, а потом его улучшит.
Это специальное расширение, оно находится во вкладке дополнений, то есть его нужно скачать отдельно. Оно позволяет получить очень высокий контроль. Если у вас есть конкретная поза или композиция, а IMG2IMG не дает нужного результата, поможет ControlNet. Он создает что-то вроде интерактивной карты изображения и на основе этой схемы сделает то, о чем вы просите.
ControlNet бывает разный — тут всё зависит от ваших целей. В каких-то случаях он может сохранить позу, как, скажем, в этом примере с Риком Эстли:
В каких-то случаях он может сохранить план комнаты или положение предмета. В целом с ControlNet можно копировать любые элементы:
Как вы уже могли понять, нейронки бывают открытые и закрытые. Открытые вы можете установить себе на компьютер. Они, как правило, в свободном доступе на GitHub. Скачиваете ту, которая нравится, устанавливаете расширения и в целом подгоняете ее работу под себя. С закрытыми, такими как MidJourney или ChatGPT, так сделать не получится. Они принадлежат большим корпорациям. Что у них под капотом — зачастую загадка.
Вот небольшой обзор нейронок, с которыми я взаимодействую по работе:
Лично я предпочитаю Stable Diffusion. Копия этой нейронки существует в веб-версии, но пользоваться ей свободно могут только граждане Китая. Чтобы получить к ней доступ, нужна китайская симка, а получить ее не то чтобы просто. Как раз поэтому мне и пришлось начать учить китайский, но это совсем другая история. Если у вас нет китайской симки или желания ее заводить, придется скачивать.
Но тут есть нюанс: нужен мощный компьютер с видеокартой, потому что модель будет использовать ее для генерации изображений. В какой-то момент после всех моих экспериментов моя видеокарта умерла. Пришлось решать этот вопрос, но от этой нейронки я всё равно не отказалась.
Главный минус Stable Diffusion для меня — что она не понимает простые промпты. То есть просто написать человеческим языком, что вам нужно, мало — придется заморочиться. Зато результат будет крутым. Плюс у Stable Diffusion большое сообщество: всегда можно что-то спросить или подсмотреть. К тому же она не требует подписки. Только базовые знания Python — но совсем базовые. Бояться не стоит.
MidJourney хороша, когда нужно сделать что-то быстро. Но хотя в целом функциональность у нее неплохая, она пока уступает главному конкуренту: требует подписки и не дает той гибкости, какую мы получаем в Stable Diffusion. Ты генерируешь изображение и потом не можешь поменять его так, как хочешь — приходится менять промпт и смотреть, что получается. То есть, по сути, ты не контролируешь процесс. И это большой минус.
Flux — это фактически калька со Stable Diffusion, но работает чуть хуже. Думаю, в будущем можно будет рассматривать ее как полноценную альтернативу. А ChatGPT хорош для тех, кто только погружается в мир генеративного дизайна. Он не гибкий, но зато может помочь с промптами.
На этом всё. Рассказывайте в комментариях, какими нейронками пользуетесь и как они вам. Если остались вопросы, задавайте в комментариях. Постараюсь на все ответить. А еще подписывайтесь на наш дизайнерский телеграм-канал — мы там делимся примерами хорошего (и плохого) дизайна со всего мира.