Содержание статьи
Сегодняшняя тема — одна из самых важных в серии статей о генеративном искусственном интеллекте: мы будем составлять запросы, и делать это постараемся правильно.
Как появилась эта статья
Как‑то раз я помогал сгенерировать обложку для книги. У коллеги не задалось, а когда я попросил прислать запрос, увидел вот это:
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, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее