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

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

 

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

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

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 перед каж­дым перево­дом стро­ки, мы получим сле­дующий зап­рос.

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии