Луч­ший спо­соб соз­дать изоб­ражение, на котором есть нуж­ные тебе объ­екты в нуж­ной сти­лис­тике, — пос­мотреть при­меры на одном из круп­ных пор­талов и ско­пиро­вать тек­сто­вый зап­рос, отре­дак­тировав его в тре­буемом нап­равле­нии. Или нет? Прак­тика показы­вает, что мно­гие поль­зовате­ли без­думно копиру­ют зап­росы, бук­валь­но зах­ламлен­ные бес­смыс­ленны­ми токена­ми.

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

Как появилась эта статья

Как‑то раз я помогал сге­нери­ровать обложку для кни­ги. У кол­леги не задалось, а ког­да я поп­росил прис­лать зап­рос, уви­дел вот это:

A dynamic action shot captures a volleyball player in mid-air as she strikes the ball with her right hand, while wearing a forest green jersey with white and black accents, bearing the number 8. The player’s blonde hair is tied back in a ponytail, and her face shows intense focus on the task at hand. Her left arm is supported by a white sleeve or pad around the elbow. She wears knee-high white leg warmers and pink volleyball shoes with light blue soles. The volleyball, with its distinctive yellow exterior and blue sections divided by vertical ribbons, is held high above her head. In the foreground, two opposing players are attempting to block the serve; one is seen from behind with arms fully extended upwards, while another with the has both hands raised high, fingers spread wide. Both opponents wear dark jerseys with intricate red, white, and black patterns. They also have black arm sleeves, with sleeve showcasing a vibrant blue and pink pattern. Both players have their heads turned slightly towards the camera, revealing part of their faces. The net, spanning horizontally across the middle of the frame, features a white mesh structure with black lines forming a square grid pattern. The floor beneath them is teal blue, contrasting sharply with the orange area where the players are standing. The overall lighting is bright and even, typical of an indoor sports arena, highlighting the athleticism and competitive nature of the moment.

Чес­тно говоря, понять, чего хочет воп­роша­ющий, я не смог; мне приш­лось при­бег­нуть к помощи ChatGPT, что­бы тот рас­шифро­вал зап­рос. Тек­сто­вые декоде­ры генера­тив­ных моделей ИИ далеко не так прод­винуты, и нет ничего уди­витель­ного в том, что кор­рек­тно обра­ботать такой зап­рос они не смог­ли. Я же решил написать статью, которая, воз­можно, удер­жит тебя от изде­ватель­ств над искусс­твен­ным интеллек­том.

Кого будем спрашивать?

Пра­вила сос­тавле­ния зап­росов разитель­но отли­чают­ся в зависи­мос­ти от архи­тек­туры модели и исполь­зуемых в ней тек­сто­вых декоде­ров, а син­таксис — в зависи­мос­ти от исполь­зуемо­го для генера­ции соф­та. К при­меру, модели на осно­ве Flux луч­ше все­го работа­ют с тек­сто­выми зап­росами, сос­тавлен­ными дру­гим искусс­твен­ным интеллек­том — боль­шой язы­ковой моделью (нап­ример, ChatGPT). Язы­ковые модели уме­ют пра­виль­но струк­туриро­вать зап­рос, в резуль­тате чего кар­тинка получа­ется более деталь­ной и когерен­тной по срав­нению с корот­кими зап­росами, сос­тавлен­ными по пра­вилам моделей SDXL.

В качес­тве при­мера при­веду иллюс­тра­цию, которую модель Flux выдала с пер­вой или вто­рой попыт­ки.

В качес­тве зап­роса исполь­зовал­ся текст, сге­нери­рован­ный ChatGPT:

Title: Display the title "The Crazy Adventure of the Kung-Fu Chicken" in bold and playful text at the top or center of the poster.

Main Character: Depict a dynamic and charismatic ninja chicken in a heroic karate pose, wearing a traditional karate outfit, while still showing chicken features like feathers and a beak.

Background: Include a colorful and exciting backdrop with elements like a mystical forest, a bustling city, and an ancient temple to hint at various adventures. The background is vibrant and engaging.

Supporting Characters: Add a few quirky and fun supporting characters such as a wise old turtle, a mischievous squirrel sidekick, and a villainous fox.

Pixar Branding: Incorporate the Pixar logo at the bottom or top of the poster to establish it as an official Pixar movie.

Tagline: Include a tagline that reads: "A Kung-Fu Adventure" prominently on the poster.

Visual Style: Ensure the overall visual style is consistent with Pixar signature animation look: bright colors, expressive characters, and a touch of whimsy.

Ве­роят­но, похожий резуль­тат мож­но было бы получить и более корот­ким зап­росом, но пос­ле нес­коль­ких попыток я пред­почел пой­ти прос­тым путем.

Дру­гая сов­ремен­ная модель, Lumina-2, в качес­тве тек­сто­вого декоде­ра исполь­зует пол­ноцен­ный LLM Gemma 2 2B. В докумен­тации рекомен­дует­ся исполь­зовать зап­росы, сфор­мирован­ные сле­дующим обра­зом:

You are an assistant designed to generate superior images with the superior degree of image-text alignment based on textual prompts or user prompts. <Prompt Start>

На прак­тике работа­ют и более инте­рес­ные зап­росы. Нап­ример, зап­рос «You are a Chinese painter. Mixing oil paint and watercolor, draw a painting of a tranquil Chinese village, with white houses overlooking a river channel, and a boat floating along the river» выдаст при­мер­но такую кар­тинку.

Од­нако вер­немся к соз­данию афи­ши. В слу­чае с SDXL подоб­ный зап­рос не то что­бы сов­сем не сра­бота­ет, но не сра­бота­ет так, как надо. Для начала при­дет­ся отка­зать­ся от над­писей: любые попыт­ки сге­нери­ровать когерен­тный текст длин­нее одно­го‑двух слов в моделях SDXL обре­чены на про­вал. То же каса­ется логоти­па Pixar: мне не уда­лось добить­ся его дос­таточ­ной убе­дитель­нос­ти. В резуль­тате оста­нет­ся куда более прос­той зап­рос:

Main Character: Depict a dynamic and charismatic ninja chicken in a heroic karate pose, wearing a traditional karate outfit, while still showing chicken features like feathers and a beak.

Background: Include a colorful and exciting backdrop with elements like a mystical forest, a bustling city, and an ancient temple to hint at various adventures. The background is vibrant and engaging.

Supporting Characters: Add a few quirky and fun supporting characters such as a wise old turtle, a mischievous squirrel sidekick, and a villainous fox.

Visual Style: Ensure the overall visual style is consistent with Pixar signature animation look: bright colors, expressive characters, and a touch of whimsy.

Поп­робу­ем сге­нери­ровать кар­тинку. Пос­ле нес­коль­ких откро­вен­но неудач­ных попыток получи­лось... неч­то.

Пер­сонаж объ­еди­няет в себе чер­ты глав­ного и вто­рос­тепен­ных геро­ев, при­чем вто­рос­тепен­ных на кар­тинке нет вооб­ще. Почему так? Здесь мы подош­ли к кон­цепции context bleeding, «утеч­ки кон­тек­ста»: модель не в сос­тоянии однознач­но атри­бути­ровать задан­ные свой­ства кон­крет­ному объ­екту в кад­ре.

Проб­лема усу­губ­ляет­ся тем, что наш зап­рос сос­тоит из 131 токена (токена­ми счи­тают­ся любые сло­ва, вклю­чая артикли и пред­логи), а тек­сто­вые декоде­ры SDXL огра­ниче­ны 75 токена­ми. Соот­ветс­твен­но, сис­тема разобь­ет наш зап­рос на две оче­реди: в пер­вой оче­реди будут пер­вые 75 токенов, во вто­рой — то, что оста­нет­ся. Интерфейс WebUI под­счи­тыва­ет количес­тво токенов авто­мати­чес­ки.

Пер­вая циф­ра здесь — чис­ло токенов в зап­росе, вто­рая — чис­ло токенов с вырав­нивани­ем по 75. На скрин­шоте выше вид­но, что зап­рос сос­тоит из 131 токена, которые будут раз­биты на две оче­реди по 75 токенов каж­дая.

Ре­шить проб­лему мож­но нес­коль­кими спо­соба­ми. Сущес­тву­ют рас­ширения — нап­ример, Regional Prompter или Forge Couple, поз­воля­ющие раз­делить вни­мание модели по реги­онам. Эти рас­ширения инте­рес­ны, но их рас­смот­рение выходит за рам­ки этой статьи; сегод­ня мы будем говорить о том, как решить проб­лему, оста­ваясь в рам­ках тек­сто­вого зап­роса. Один из вари­антов — раз­бить зап­рос на нес­коль­ко оче­редей опе­рато­ром BREAK.

Оператор BREAK

В интерфей­се WebUI A1111 и его про­изводных (WebUI Forge и reForge) дос­тупен опе­ратор BREAK. Его исполь­зование сиг­нализи­рует о раз­рыве в оче­реди токенов (я не смог подоб­рать луч­шего перево­да тер­мину chunk, поэто­му пусть будет «оче­редь»). Вста­вив опе­ратор BREAK перед каж­дым перево­дом стро­ки, мы получим сле­дующий зап­рос.

Об­рати вни­мание: оче­редей зап­росов ста­ло не две, а четыре.

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

По­чему так про­исхо­дит? Дело в том, что в Stable Diffusion XL и Flux при­меня­ются раз­ные тек­сто­вые декоде­ры.

Flux исполь­зует пару декоде­ров: CLIP-L (прос­той тек­сто­вый декодер, соз­данный в OpenAI) и T5 (локаль­ная язы­ковая модель, LLM, раз­работан­ная Google). Исполь­зование пол­ноцен­ной, хоть и прос­той язы­ковой модели T5 поз­воля­ет сос­тавлять замет­но более слож­ные и длин­ные зап­росы естес­твен­ным язы­ком, в то вре­мя как CLIP-L помога­ет выделять и декоди­ровать отдель­ные клю­чевые сло­ва. Ина­че говоря, CLIP-L луч­ше все­го работа­ет с корот­кими клю­чевы­ми сло­вами, перечис­ленны­ми через запятую, в то вре­мя как T5 обра­баты­вает весь зап­рос целиком.

T5 — тяжелая модель; она тре­бует и замет­ных вычис­литель­ных ресур­сов, и дос­таточ­но боль­шого объ­ема памяти. В архи­тек­туре SDXL, раз­работ­чики которой ори­енти­рова­лись на акту­аль­ные в 2023 году пот­ребитель­ские виде­окар­ты, вмес­то нее исполь­зует­ся дру­гой декодер: CLIP-G. Получа­ется, что в моделях SDXL сов­мес­тно работа­ет пара декоде­ров CLIP-L (корот­кие зап­росы естес­твен­ным язы­ком и клю­чевые сло­ва через запятую) и CLIP-G (слож­ные зап­росы естес­твен­ным язы­ком).

В то же вре­мя CLIP-G — быс­трая, но очень прос­тая модель; ее воз­можнос­ти по срав­нению с T5 замет­но огра­ничен­ны. Для моделей SDXL опти­маль­ным будет зап­рос, сос­тавлен­ный из ком­бинации нес­ложных, не перег­ружен­ных смыс­лом (и уж тем более — «мусором») пред­ложений на естес­твен­ном язы­ке в сочета­нии с клю­чевы­ми сло­вами, перечис­ленны­ми через запятую. Для нес­ложных ком­позиций, в которых не пре­дус­мотре­но вза­имо­дей­ствие меж­ду объ­екта­ми сце­ны, мож­но и вов­се огра­ничить­ся клю­чевы­ми сло­вами через запятую.

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

Pixar animation style, a ninja chicken as a main character, a wise old turtle, a mischievous squirrel sidekick, a villainous fox BREAK

dynamic and charismatic ninja chicken in a heroic karate pose, wearing a traditional karate outfit BREAK

vibrant and engaging background including colorful backdrop, mystical forest, bustling city, ancient temple, to hint at various adventures, expressive characters, and a touch of whimsy

Результат
Ре­зуль­тат

В рам­ках архи­тек­туры SDXL — впол­не неп­лохо, одна­ко вто­рос­тепен­ные пер­сонажи так и не появи­лись. Я испро­бовал нес­коль­ко базовых моделей и даже зад­рал параметр CFG до фан­тасти­чес­ких зна­чений, но и это не помог­ло. Мак­сималь­ного (хоть и весь­ма условно­го) приб­лижения уда­лось дос­тичь, лишь перефор­мулиро­вав пер­вую оче­редь зап­роса сле­дующим обра­зом:

Pixar animation style, a ninja chicken as a main character surrounded by a wise old turtle, a mischievous squirrel sidekick, and a villainous fox BREAK

Негативные ключевые слова

Во вре­мена Stable Diffusion 1.5 были популяр­ны так называ­емые «шизо­идные» зап­росы, ког­да стро­ку негатив­ных зап­росов запол­няли мусор­ными токена­ми вро­де «шесть паль­цев, кри­вые паль­цы, дефор­мирован­ные паль­цы, дефор­мирован­ная ана­томия».

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

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

За­чем тог­да вооб­ще негатив­ные клю­чевые сло­ва? Они нуж­ны для того, что­бы убрать из кон­крет­ной кар­тинки нежела­тель­ный эле­мент или уси­лить дей­ствие позитив­ных клю­чевых слов. Нап­ример, исполь­зование тер­мина monochrome в качес­тве негатив­ного клю­чево­го сло­ва может под­нять насыщен­ность изоб­ражения, а перечис­ление тех или иных объ­ектов — убрать их из кад­ра. Ины­ми сло­вами, негатив­ные клю­чевые сло­ва — это еще один инс­тру­мент для уточ­нения зап­роса.

Ра­зуме­ется, из это­го пра­вила есть исклю­чения. Некото­рые модели обу­чают­ся на изоб­ражени­ях раз­ного качес­тва, ведь для того, что­бы понять, что такое «хорошо», модель дол­жна понимать, что такое «пло­хо». В таких моделях могут исполь­зовать­ся спе­циаль­ные теги (как позитив­ные, так и негатив­ные) для ука­зания жела­емо­го качес­тва изоб­ражения. В то же вре­мя исполь­зование таких тегов может огра­ничить раз­нооб­разие резуль­татов, ведь выбор сущес­твен­но сузит­ся, если ука­зать тег «шедевр» и заб­локиро­вать все «пло­хое» и «пос­редс­твен­ное». Я обыч­но ста­раюсь не исполь­зовать такие теги, если это не ведет к сущес­твен­ной дег­радации качес­тва кар­тинки.

TL&DR: не исполь­зуй слу­чай­ные наборы негатив­ных клю­чевых слов из чужих кар­тинок. Исполь­зуй толь­ко те клю­чевые сло­ва, которые помога­ют убрать ненуж­ное или уси­лить нуж­ное для кон­крет­ного изоб­ражения. Так­же мож­но исполь­зовать (а мож­но и не исполь­зовать!) спе­цифи­чес­кие клю­чевые сло­ва для повыше­ния качес­тва генера­ции у кон­крет­ных моделей, обу­чен­ных с исполь­зовани­ем тегов качес­тва.

Весовые коэффициенты

Уси­лить или осла­бить вес любого токена или набора токенов мож­но сле­дующим обра­зом:

(токен или фраза:2)

Вмес­то двой­ки мож­но под­ста­вить любой весовой коэф­фици­ент, вклю­чая дроб­ные. Работа­ют коэф­фици­енты в диапа­зоне от нуля до разум­ной вер­хней план­ки, которая зависит от кон­крет­ной модели. Как пра­вило, име­ет смысл исполь­зовать неболь­шие коэф­фици­енты в диапа­зоне от 0 до 2, но в некото­рых слу­чаях допус­тимо исполь­зовать и боль­шие величи­ны.

Ис­поль­зование конс­трук­ции (токен) рав­нознач­но (токен:1.1), а ((токен)) — то же самое, что и (токен:1.2).

Так­же мож­но поль­зовать­ся квад­ратны­ми скоб­ками для сни­жения веса. Нап­ример, если написать [токен], то это понизит весовой коэф­фици­ент взя­того в квад­ратные скоб­ки тер­мина в 1,1 раза. Одна­ко круг­лые скоб­ки и дроб­ный коэф­фици­ент и выг­лядят более понят­но, и вво­дить их про­ще и быс­трее: дос­таточ­но выделить стро­ку, вес которой нуж­но модифи­циро­вать, и регули­ровать вес ком­бинаци­ей кла­виш Ctrl-вверх и Ctrl-вниз (каж­дое нажатие кноп­ки «вверх» или «вниз» повысит или понизит коэф­фици­ент на 0,1).

Ве­совые коэф­фици­енты работа­ют как в основном, так и в негатив­ном зап­росе, одна­ко исполь­зовать мож­но толь­ко положи­тель­ные зна­чения. Для исполь­зования отри­цатель­ных весовых коэф­фици­ентов вида (токен:-1) нуж­но уста­нав­ливать спе­циаль­ное рас­ширение negpip для Comfy или для WebUI.

Котапельсин или апельсокот?

В интерфей­се WebUI и его про­изводных есть целый ряд прод­винутых воз­можнос­тей, свя­зан­ных с син­такси­сом зап­росов. Опе­ратор BREAK мы уже рас­смот­рели, им дело не огра­ничи­вает­ся; раз­ные допол­нитель­ные воз­можнос­ти интерфей­са опи­саны в Wiki A1111.

Возь­мем прос­тую связ­ку из кота и апель­сина и поп­робу­ем сде­лать с этим что‑то инте­рес­ное, зафик­сировав сид в зна­чении 614462921.

Вот так выг­лядит резуль­тат обра­бот­ки зап­роса cat, orange.

Context bleeding во всей кра­се. А если написать cat and orange?

Впол­не при­лич­но; то, чего и хотелось.

В WebUI есть инте­рес­ная фича — мож­но ком­биниро­вать тек­сто­вые зап­росы, ког­да в начале генера­ции на вход пода­ется одна стро­ка, а в кон­це — дру­гая. Син­таксис зап­роса такой:

[текст в начале генерации:текст в конце генерации:когда_переключать]

К при­меру, стро­ка [cat:dog:0.7] ука­зыва­ет, что на ран­них шагах будет генери­ровать­ся кош­ка, на поз­дних — собака, а перек­лючение меж­ду кош­кой и собакой про­изой­дет на отметке 0.7 (то есть пер­вые 70% шагов у нас будет «кош­ка», а оставши­еся 30% шагов будет генери­ровать­ся «собака»). Пос­мотрим, как это работа­ет на прак­тике.

Для начала сге­нери­руем кош­ку на белом фоне: cat, white background.

Те­перь собаку: dog, white background.

А теперь — неч­то сред­нее: [cat:dog:0.7], white background.

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

[a cat|an orange]

На прак­тике эту воз­можность мож­но исполь­зовать, нап­ример, для ука­зания при­чес­ки, цве­та волос или одеж­ды, ког­да не устра­ивает ни один из стан­дар­тных вари­антов и хочет­ся раз­нооб­разия.

Текстовые инверсии

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

Тек­сто­вые инверсии мож­но исполь­зовать как в основной, так и в негатив­ной час­тях зап­роса. Обра­ти вни­мание: тек­сто­вые инверсии име­ют огра­ниче­ния по сов­мести­мос­ти. Они не прос­то под­ходят толь­ко к кон­крет­ной архи­тек­туре (SD1.5 или SDXL), но иног­да пред­назна­чены для кон­крет­ных клас­сов моделей (общие модели SDXL, модели на базе Pony, модели на базе Illustrious и так далее).

Впро­чем, тут кро­ется не толь­ко огра­ниче­ние, но и воз­можность: иног­да тек­сто­вые инверсии от одно­го клас­са моделей мож­но исполь­зовать в дру­гом. Некото­рые тек­сто­вые инверсии от Pony/Illustrious могут подой­ти к некото­рым моделям SDXL, при­чем это работа­ет и в обратную сто­рону.

Нап­ример, базовая модель Pony Diffusion име­ет сла­бое пред­став­ление об устрой­стве газоно­коси­лок раз­ных типов. Поль­зовате­ля Reddit заин­тересо­вала кон­крет­ная модель газоно­косил­ки Bobcat; он соз­дал для нее тек­сто­вую инверсию в базовой модели SDXL и про­демонс­три­ровал, что соот­ветс­тву­ющее изоб­ражение успешно генери­рует­ся в Pony. По его мне­нию, свя­зано это с тем, что при соз­дании модели Pony про­изош­ло «выгора­ние» тек­сто­вого декоде­ра в резуль­тате избы­точ­ного обу­чения.

Со­ответс­тву­ющая кон­цепция про­пала из CLIP, но «зна­ние» об устрой­стве подоб­ных объ­ектов оста­лось в UNet, унас­ледован­ной от базовой модели SDXL. Исполь­зование тек­сто­вой инверсии поз­волило извлечь из UNet одну из час­тей, которую невоз­можно было адре­совать через обыч­ный тек­сто­вый зап­рос.

От себя добав­лю, что, нес­мотря на это, газоно­косил­ка у Pony получи­лась весь­ма схе­матич­ной и напоми­нала ско­рее модель, соб­ранную из слу­чай­ных деталей дет­ско­го конс­трук­тора, чем реаль­ный объ­ект.

Ка­кие быва­ют тек­сто­вые инверсии и как их искать? Для них есть соот­ветс­тву­ющий тег на Civit.ai. В качес­тве кон­цепций час­то пред­лага­ют те или иные изоб­разитель­ные сти­ли (от фоторе­алис­тично­го до кон­цепту­аль­ных), пер­соналии (от пуб­личных деяте­лей и акте­ров до прос­то ори­гиналь­ных пер­сонажей), позы и дей­ствия.

Composable Diffusion

Composable Diffusion — это метод, который помога­ет сочетать нес­коль­ко идей в одном изоб­ражении. Про­демонс­три­ровать кон­цепцию «котапель­сина», как она опи­сана в докумен­тации, ока­залось слож­нее. Тем не менее зап­рос a cat AND an orange дал один «котапель­син» и один «котопель­син».

Ме­ханизм поз­воля­ет объ­еди­нять раз­ные обра­зы, исполь­зуя опе­ратор AND. Нап­ример, зап­рос a cat AND a dog выдаст живот­ное, сочета­ющее в себе чер­ты кота и собаки. С опе­рато­ром AND прек­расно работа­ют опи­сан­ные ранее тех­ники — от весовых коэф­фици­ентов до тек­сто­вых инверсий вклю­читель­но. Так, если ты хочешь получить ско­рее кота, чем собаку, то весовой коэф­фици­ент кота мож­но уве­личить:

a cat:1.2 AND a dog

Для чего это нуж­но? При помощи опе­рато­ра AND удоб­но сме­шивать художес­твен­ные сти­ли:

cyberpunk style AND oil painting

Мож­но соз­давать уни­каль­ных, детали­зиро­ван­ных пер­сонажей:

a frog AND yellow eyes AND horns

На­конец, с опе­рато­ром AND мож­но исполь­зовать нес­коль­ко тек­сто­вых инверсий. Поп­робуй, это отличный спо­соб получить ори­гиналь­ный резуль­тат, которо­го не дос­тичь или труд­но дос­тичь дру­гими.

Шпаргалка по составлению запросов

Для раз­ных архи­тек­тур (а иног­да и клас­сов моделей в рам­ках одной архи­тек­туры) исполь­зуют­ся раз­ные спо­собы пос­тро­ения тек­сто­вых зап­росов. В архи­тек­турах, исполь­зующих в качес­тве тек­сто­вых декоде­ров боль­шие язы­ковые модели, хорошо работа­ют деталь­ные зап­росы, сос­тавлен­ные дру­гими язы­ковы­ми моделя­ми, нап­ример ChatGPT.

В архи­тек­турах поп­роще луч­ше работа­ют корот­кие пред­ложения и прос­тая тер­миноло­гия. У экзо­тичес­ких тер­минов эффект невелик, так как они ред­ко исполь­зуют­ся при опи­сании изоб­ражений, на которых обу­чают­ся модели, но в извес­тных пре­делах это мож­но ском­пенси­ровать повыше­нием весово­го коэф­фици­ента: (слово:2). Вес клю­чево­го сло­ва мож­но и понизить: (слово:0.5); веса работа­ют как в основной, так и в негатив­ной час­ти зап­роса.

В моделях, обу­чен­ных на изоб­ражени­ях из booru, исполь­зуют­ся зап­росы, сос­тавлен­ные из стан­дар­тных тегов danbooru. Модели на осно­ве Pony прак­тичес­ки утра­тили воз­можность вос­при­нимать зап­росы, сос­тавлен­ные естес­твен­ным язы­ком; в моделях на базе Illustrious (а точ­нее, NoobAI) эта воз­можность при­сутс­тву­ет.

Оче­редь зап­росов в SDXL фор­миру­ется из пос­ледова­тель­нос­тей, содер­жащих до 75 токенов. Длин­ные зап­росы будут раз­биты авто­мати­чес­ки. Иног­да это про­исхо­дит пос­реди пред­ложения. Что­бы это­го избе­жать, исполь­зуй опе­ратор BREAK.

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

Иног­да могут ока­зать­ся полез­ными такие фун­кции, как Composable Diffusion (опе­ратор AND) и условная генера­ция, ког­да раз­ные тек­сто­вые зап­росы либо череду­ются, либо под­меня­ются на опре­делен­ном эта­пе генера­ции.