
Каждый желающий уже успел понакручивать промты Шедевруму и Kandinsky 2.1, пожаловаться на жутковатые результаты (сами виноваты), или просто сомнительные, с точки зрения русского языка, ассоциации нейросети.
Но, только ещё не я. Мне ещё есть что сказать, рассказать, а точнее — сделать!
Итак, статья про три вещи:
- Почему вывод наших нейрохудожников так отдаёт англичанкой.
- Как исторически связаны MidJourney, Stable Diffusion и ChatGPT?
- Как подружить AWS с русскими доменами, и чтобы всё за тебя сделала машина.
И самое главное — моя попытка изменить ситуацию делом. Поехали!
Предисловие
Начну с того, что я — огромный энтузиаст всего, что связано с LLM и GenAI. Кое-где даже вышло внедрить LLM для анализа огромных металлургических стандартов и логов, ещё до того как это стало мейнстримом.
Я постоянный пользователь ChatGPT4 при написании кода, документации, текстов и тикетов. Использую MidJourney и StableDiffusion для генерации оформления и просто для создания мемов для жены:

«Нет ничего лучше, чем покушать поной за сериалом»
Однако, меня все время терзал назойливый червячок: почему везде мне приходится использовать только английский язык? И если для программирования это уже как-то стало нормой (1С разработчики, извините, мы говорим про настоящее программирование), то как так вышло, что и с лингвистическими моделями мне приходится на нём разговаривать?
Особенно утомляло составлять описания картинок для Dall-E и MidJourney. Раньше я думал, что у меня совершенно свободное владение языком, а как дело дошло до описания тонких визуальных нюансов, так, словно, через кисель протискиваюсь.
И тут я обнаружил, что у нас, оказывается, есть решения на русском.
Насколько глубока кроличья нора
Буду краток. Все уже успели посмотреть Шедеврум, покудахтать головой, что как же так, почему повсюду американские флаги, да еще и цензура в неправильную сторону повернута.
Очевидно, что все это натренировано на англоязычных базах, либо с минимальным вхождением русского. Но почему? Неужели нельзя составить свою базу? Midjourney всего пару годиков, неужели не догоним?
Сначала надо ответить на главный вопрос — откуда взялись эти данные, сколько времени ушло на их подготовку, допущения и каких объемах информации вообще идет речь?
Вопрос получился чуть-чуть не один, но пускай. Итак, история.
Откуда ноги растут
Вы обратили внимание, что MidJourney, Stable Diffusion (Stability AI), Imagen (Google), Dall-E 2, все как-то появились примерно одновременно и работали
Нет, дело не в том, что великие умы думают одинаково, это просто датасет у них был общий.
За ними серым кардиналом стоит такая компания как Laion, которая буквально за год до появления MidJourney & Stable Diffusion выпускает свой первый публичный датасет на 400 миллионов изображений! Сейчас их самая большая база имеет 5 миллиардов картиночек с разметкой.

И собирали они эти данные, ни много ни мало, а с 2014 по 2021 год с помощью Common Crawl, который итеративно каждый год выгружает данные из интернета в аккуратненький архивчик. А следующий архив уже был в конце 2022 года, совсем недавно.
Кстати, 2021 год, ничего не напоминает? (кхм-кхм, ChatGPT).

ChatGPT: As an AI language model with a knowledge cutoff in September 2021, I don't have access to real-time information or events that occurred after that date.
Что это значит для российской GenAI индустрии?
Во-первых, выводы можно сделать следующие:
- Чтобы создать что-то похожего масштаба нужны данные объемом в несколько лет масштабом англоязычного интернета (нам требуются килограммы часов!).
- Данные для обучения текущего поколения GenAI собраны из того что было под рукой. Тут, как известно, взрывчатку можно сварить и из бытовой химии, но чтобы жахнуло по-настоящему — нужно специальные особые ингредиенты.
- И еще одно косвенное следствие — весь материал для обучения пропитан западной либеральной повесточкой, это везде хорошо прослеживается. А когда у тебя ИИ думает по лекалам
врагаидеологических конкурентов, это просто напросто опасно применять где-то, кроме прямого баловства. - Такой подход создает прямые юридические риски, поскольку уже только ленивый не подал в суд за воровство своих вялых, и до этого никому не нужных, художеств на любой из этих сервисов. Чем закончится — неизвестно, лишь бы попкорна хватило.
И как глаголит известная мудрость, не нужно искать победу там, где однажды ее уже нашел. Если пытаться идти по протоптанной дорожке, то для начала, попросту не хватит данных, а во вторых — это недальновидно. Так что зачем пытаться скопировать чужой успех, если можно
И тут я решился на авантюру.
Социальный эксперимент
Насмотревшись в детстве на успех МММ, для себя я усвоил, что объединившись, мы можем свершать невозможное! Так почему бы и не попробовать собрать народную базу изображений с нашей, отечетсвенной душой и разметкой?
Два очевидных плюса для такой затеи:
- Во-первых, решаются вышеобозначенные проблемы с дефицитом данных и наклонностями ИИ.
- А во-вторых, данные могут быть размечены не как дано, а как захотим. Мы ведь не скачиваем что было из интернета, а творим сами. Для себя я решил, что внести эмоциональную маркировку в изображения неплохо разбавит суховатый хруст машинной живописи.
- А в-третьих, одно изображение может быть размечено по разному разными людьми, что добавит многополярности датасету.
Итак, будем создавать сервис для загрузки и разметки изображений, чтобы минимум работы, красиво и устойчиво к нагрузкам.
Я по натуре ленивый авантюрист, который еще и подвыгореть успел за года тоскливого айтишного быта, поэтому буду заставлять либеральный ИИ конструировать себе замену. Цель — наклепать за выходные полноценный backend + frontend + infrastructure.
Стек выбрал следующий:
- Backend: AWS (lambda, gateways, s3, sam), Python, lets-encrypt, github actions
- Frontend: Bootstrap, Vanilla JS
- Brain: ChatGPT, Midjourney + Dall-E 2, и я еще немножко поработал.
Почему AWS? По двум причинам: были волнения за легальность хранения материалов в контуре РФ + с прошлого развалившегося бизнеса осталось пару десятков тысяч вечнозеленых кредитов на амазоне валидных до конца года, которые было бы просто жаль не пустить в дело. И буду с вами честен, второе сыграло решающую роль.
А требования по проекту достаточно простые оказались, чтобы можно было загрузить картинку, дать пользователю через сайт скачать случайное изображение для разметки, добавить примитивную модерацию и разложить полученную разметку по бакетам для последующей выгрузки.
Дизайн
Про визуальную часть буду краток — поскольку сам совершенно не Бакст и не Кандинский (да и статья не об этом), я, перепробовал много разных инструментов, остановился на Dall-E для логотипов (недавно еще узнал про Recraft , который заточен для иконок, но в деле еще не проверял).
Самые простейшие ассоциативные запросы рода:
An AI donkey face in gitlab logo abstract style, clear shapes, soft red colors, golden proportions, white background
Выдают достаточно неплохие результаты. Это, типа, осел:

Не спрашивайте почему осел и ia-images. Потому что AI ->наоборот IA -> Иа -> Ослик (из зала послышалось протяжное 'крииинж'). Ну, я, пожалуй, продолжу.
А для дизайна вдохновлялся набросками из MidJourney, но все картинки получались массивные, при вставке выглядят мелко и плохо, просто приведу адаптированный вариант результата:

Разработка
Теперь к самому важному — технической части. В качестве дисклеймера обозначу, что это больше обзор, чем подробный гайдлайн. Моя цель — подсветить инструменты, которые стали гораздо доступнее с приходом языковых ассистентов и как можно быстро построить первый (или уже далеко не первый) прототип в облаке. Несмотря на обилие всяких помощников по написанию кода, этим дело не ограничивается.
Так вот, выкладывать сайт, естественно, решил на российском домене, а хранить на амазоне по причинам обозначенным выше. Тут я воспользовался reg.ru для регистрации .ru домена и aws для всего остального. И, что ожидаемо в подобной, как говорил один мой знакомый — комбине, тут же получил санкциями по лицу.
Всем известно, что у любого нормального сайта обязательно должен быть замочек в строке браузера (по крайней мере, мне так мне всегда бабушка говаривала), а для замочка требуется TLS сертификат, который русофобный Amazon больше не выдает совсем для ряда доменов ассоциирующихся с РФ! Что, конечно, объяснимо, но для того чтобы это узнать пришлось обращаться в поддержку за расшифровкой мистической ошибки: «The certificate requires additional confirmation» без каких либо дополнительных пояснений. Обошлось мне это тайное знание в 25 долларов.
И еще один выученный урок: для запроса в поддержку пришлось оформить на нее подписку, а вот отменить ее уже никак нельзя раньше, чем через месяц, даже просто кнопку нажать в интерфейсе нажать. И даже через саму эту поддержку, за которую ты заплатил, сделать это не выйдет. То есть, по итогу обязательно занесешь амазону оплату за полтора-два месяца, потому что закрыть ее можно будет ровненько в момент оплаты следующего месяца и не раньше. Немного нечистоплотная схема, как мне кажется, но деньги для амазона не пахнут.
Было еще забавно узнать от их саппорта, что заблокирован так же домен СССР — .su. Я, как миллениал, всегда считал, что в союзе не было не только интима, но еще и интернета, а оно вон как, оказывается.

Решил я этот вопрос через LetsEncrypt, пробросив запрашиваемые файлы через S3. Задача достаточно рутинная, расписывать скучно, просто пришлось создать несколько бакетов под разные домены и положить туда файл с нужным наполнением.
Инфраструктура и ChatGPT
А вот из того, что может быть ценным, хочу рассказать про подход по организации амазоновских сервисов через sam конфиг (Serverless Application Model), который до этого только в некоторых проектах видел, а все остальные предпочитали настраивать через UI нужную солянку.
Несмотря на определенное удобство infrastructure-as-code, для прототипов это больше тратит времени, чем приносит пользы. Так вот, языковые ассистенты все меняют. Это оказалось крайне быстро и очень удобно — запрашивать нужную компановку у ChatGPT вместо того, чтобы настраивать это самому веб консоль. Потребовалось только сертификат руками загрузить, а вот следующий пример для лямбды уже был сгенерирорван автоматом:

Этот конфиг так же создает все промежуточные компоненты между Route53 и самим gateway, не только сами 'ворота'.
Но что еще лучше, если вдруг не заладилось, то можно весь свой стек удалить одной строкой и не переживать о том, что случайно забудешь какой-нибудь сервис, который будет жрать деньги без спроса:
sam delete --stack-name MY-STACKПолный sam config можно посмотреть на гитхабе.
Через SAM можно настроить практически все. Вот здесь в документации можно посмотреть полный список поддерживаемых компонентов. Но лямбы, s3, ec2 и промежуточные комопненты для CloudFormation точно есть.
Из общих рекомендаций по работе с чатиком могу посоветовать следующее:
Всегда лучше явно обозначать поля и фреймоворки, которые надо использовать. Иногда даже стоит скинуть документацию в качестве сопровождения. Чем меньше у него разлета для фантазии, тем реже будете встречать галлюцинации в коде.
В случае для питона запрос может быть таким:

И следом же за этим попросить его написать sam config для полученного метода.
Результат
Выложив небольшой пост на пикабу для получения отклика, получилась следующая статистика:
- В среднем, каждый десятый увидевший пост, загружает картинку. Из 12 тысяч просмотров, что достаточно немного, было отправлено на модерацию больше 1000 изображений.

- С разметкой дела обстоят примерно в два раза ленивее: всего было размечено чуть больше 500 картинок, некоторые по нескольку раз. Пример такой разметки:

- И самое интересное: всего 5% загруженных изображений оказались порнографическими. Я думал, дело будет гораздо хуже. Как ни просите, будет без примеров. Вот вам лучше капибара из датасета, они ничем не хуже:

Посмотрим, во что дальше это превратится. Планирую пока медленно и методично продолжать взращивать датасет, накрутить некоторые фичи, которые мне здорово подсказали. Тут фидбек приветствуется в любой форме.
Все вышесказанное стоит воспринимать в развлекательно-образовательном ключе, надеюсь, кого-нибудь натолкнет на интересную мысль!
Срезюмирую:
- Языковые модели страстно впитывают ценности на которых они обучены. Моя точка зрения, что в перспективе критически важно иметь языковую базу с близким нам мышлением.
- IaC (описание инфраструктуры кодом) конфигурация очень удобна, если работать с языковым помощником, позволяет легко запускать прототипы, даже не особо разбираясь во всем этом.
- И, лишний раз, подтвердилось, что данные и вычислительные ресурсы правят рынком GenAI, у кого лучше и больше, у того и сервисы качественнее и интереснее. Я считаю, у российского сегмента здесь огромный потенциал.
Спасибо дочитавшим до конца!

