Notatka · Automatyzacja · 7 min czytania
Fabryka naklejek
Znajomy poprosił mnie o kilkanaście fajnych naklejek dla dziecka, a skończyło się na procesie, w którym modele AI działające w pełni lokalnie wymyślają, rysują i oceniają gotowe obrazki.

Pomysł na naklejki nie był mój: poprosił mnie o nie znajomy, któremu zależało na kilkunastu obrazkach w jednym stylu, każdy z innym stworem, wszystkie w tym samym formacie i na tym samym tle. Mogłem zlecić przygotowanie ich grafikowi i pewnie wyszłyby ładnie (dobry grafik robi rzeczy, których żaden mój proces nie zrobi), ale wybrałem inaczej, bo uznałem, że to zadanie jest bardzo dobrą okazją do sprawdzenia, czy da się z niego zbudować automatyzację, która w relatywnie krótkim czasie wygeneruje nie kilka czy kilkanaście, ale kilkadziesiąt albo kilkaset naklejek spełniających zadane kryteria.
Kryteria dobrej naklejki, które sprawdzi maszyna
Najtrudniejsze w całym tym zadaniu okazało się nie uruchomienie modelu, nie sprzęt i nie kod, tylko opisanie, co właściwie znaczy „dobra naklejka”: że na obrazku ma być dokładnie jeden stwór i to w całości, a nie dwa i nie scenka z kilkoma postaciami, że każdy stwór ma mieć gruby, ciemny kontur, że kolory mają być jaskrawe, że całość ma otaczać biała obwódka (taka jak przy naklejkach wycinanych z arkusza) i że ma to być jedna naklejka, a nie arkusz z dziesięcioma. Brzmi banalnie, dopóki nie trzeba tego zapisać tak, żeby mogła to sprawdzić maszyna, a brak możliwości automatycznego sprawdzenia wykluczałby możliwość zautomatyzowania całego procesu, więc ta część sprawdzająca okazała się kluczowa dla powodzenia całego przedsięwzięcia.

Piętnaście naklejek z jednego przebiegu, każda z innym stworem.
Generowanie obrazów lokalnie: trzy komputery i dwa modele
Zbudowałem z tego automatyzację, która działa w całości na sprzęcie stojącym u mnie w domu, czyli na trzech komputerach, których używam wyłącznie do pracy ze sztuczną inteligencją: dwa z nich są ze sobą połączone i działają jak jedna maszyna, na której stoi model językowy (w tej chwili GLM 5.3 Flash, otwarty model, który każdy może pobrać i uruchomić u siebie), a trzeci zajmuje się wszystkim innym, czyli obrazami, dźwiękiem i wideo. W tej automatyzacji model językowy odpowiada za pomysły i ocenę gotowych obrazków, a rysowaniem zajmuje się trzeci komputer, więc wszystko dzieje się lokalnie i nie płacę za pojedyncze zapytania żadnemu zewnętrznemu dostawcy.
Jak powstaje jedna naklejka
Najpierw model językowy wymyśla, co ma być na konkretnej naklejce (gdybym sam pisał polecenie do każdego obrazka osobno, to pewnie wychodziłyby z tego warianty jednego pomysłu). Ja określam tylko ramy (że ma to być wymyślony stwór, jaki ma być styl i czym kolejne stwory mają się od siebie różnić: budowa ciała, futro albo śluz, liczba oczu, mina, dominujący kolor i tak dalej), a resztę model dopowiada sam, mając przy tym listę tego, co już w tej serii wymyślił, co jest ważniejsze, niż może się wydawać, bo bez tej listy prawdopodobnie dostałbym piętnaście wersji tego samego stwora.
W kolejnym kroku drugi model (ten od obrazów) rysuje to, co wymyślił pierwszy, i robi to na czarnym tle, co nie jest przypadkowe: biała obwódka naklejki musi zostać potem odnaleziona i wycięta, a na czarnym widać ją najlepiej.

To, co zwraca model od obrazów: gotowy rysunek na czarnym tle.
Zanim obrazek zostanie poddany dalszej obróbce, model językowy rzuca na niego okiem, czyli robi szybkie i tanie sprawdzenie, czy to w ogóle ma sens i czy warto poświęcać moc obliczeniową na tę generację. Jeśli nie warto, proces wraca do początku, dzięki czemu nie marnuję mocy obliczeniowej na obrazki, które już na tym etapie nie spełniają ustalonych wymagań i w zasadzie nie powstają jako gotowe naklejki, tylko znikają kilka sekund po narysowaniu.
Po wstępnym zatwierdzeniu generacji zaczyna się właściwa obróbka, czyli najbardziej czasochłonna część całego procesu: obrazek jest powiększany, usuwane jest tło, a to, co zostało, ląduje na docelowym kolorze, i wychodzą z tego dwie wersje: gotowa naklejka na tle oraz sama naklejka bez tła, którą można wkomponować w dowolne inne tło.

Po usunięciu tła tę samą naklejkę można wstawić na dowolne tło.
Na końcu przychodzi finalne sprawdzenie jakości i to moim zdaniem najciekawszy element całego procesu: model językowy ogląda gotowy obrazek i ocenia go w sześciu kategoriach (czy trzyma się polecenia, czy trzyma się stylu, czy jest tam jeden stwór, czy nie ma usterek, czy tło jest czyste i czy broni się jako obrazek), a z tych ocen wychodzi jedna liczba; wartość poniżej określonego progu oznacza, że naklejka nie przechodzi dalej: model wypisuje jej konkretne wady, a te trafiają z powrotem na początek jako uzupełnienie pierwotnej instrukcji (kolejna generacja powstaje już z wiedzą o tym, co poprzednio poszło nie tak, więc z większą szansą na uniknięcie tego konkretnego błędu). Każde miejsce w serii ma na to kilka podejść, a jeśli kolejne generacje nadal nie zbierają wystarczającej liczby punktów, proces odpuszcza to miejsce w serii i przechodzi do następnego (zależy mi na jakości finalnego rezultatu, a nie na tym, żeby jak najszybciej wygenerować określoną liczbę obrazów).
Pisząc ten tekst, uruchomiłem cały proces jeszcze raz i wygenerowanie piętnastu naklejek zajęło niecałe dziewiętnaście minut, a co istotne, poza samym uruchomieniem procesu nie musiałem poświęcić mu żadnej uwagi: nie klikałem, nie wybierałem, nie poprawiałem, tylko zająłem się czymś innym, a naklejki powstawały w tym czasie same.
Gdzie wciąż potrzebny jest człowiek
Po kilku iteracjach cały proces działa bardzo sprawnie, ale jest w nim jeden moment, w którym człowiek nadal jest potrzebny, i zostawiłem go tam świadomie. Finalne sprawdzenie jakości ocenia każdą naklejkę osobno i nie ma przed sobą całego zestawu, więc wyłapie obrazek zepsuty, ale nie zauważy, że piętnaście poprawnych naklejek jest do siebie zbyt podobnych albo że cała seria utrzymana jest w jednej kolorystyce (po pierwszej próbie otrzymałem serię obrazków, które przeszły sprawdzenie, ale na których prawie wszystkie stwory się uśmiechały). Ten krok też da się zautomatyzować (wymagałby dodatkowej pracy i prawdopodobnie osobnych algorytmów porównujących obrazy w obrębie serii), ale ponieważ chodzi o naklejki, a nie o produkcję, w której stawką są realne pieniądze, zostawiłem w tym miejscu ręczną weryfikację.
Kiedy taka automatyzacja się opłaca
I tu dochodzę do tego, co uważam za prawdziwą korzyść, bo zwykle mówi się o czymś innym: ten proces nie wygrywa na pierwszej naklejce (na pierwszej pewnie przegrywa), tylko na setnej i wtedy, kiedy zmieniam zdanie. Jeśli uznam, że cały zestaw ma być w innej kolorystyce albo że stwory mają być groźniejsze, poprawiam kilka zdań w opisie i puszczam to jeszcze raz, więc kupuję w tym nie tyle same obrazki, ile możliwość zmiany zdania bez konsekwencji.
Ten sam schemat w obiegu dokumentów i kontroli jakości
Naklejki są tu zresztą tylko przykładem i to celowo lekkim, bo na nich najłatwiej pokazać cały mechanizm. Sam schemat (opisz kryteria tak, żeby dało się je sprawdzić, wygeneruj, sprawdź tanio, dopiero potem wykonaj kosztowną część, oceń wynik wobec kryteriów i zawróć to, co ich nie spełnia) wygląda tak samo przy zadaniach znacznie mniej efektownych, od obiegu dokumentów i zgłoszeń, przez opisy produktów, po kontrolę jakości w produkcji. Zmienia się to, co uznaję za dobry wynik, a nie budowa samego procesu.
Nie chciałbym przy tym zostawić wrażenia, że wszystko zadziałało od pierwszego razu, bo nie zadziałało: kilka rzeczy w tym procesie wygląda dziś inaczej, niż wyglądało na początku, a każda z tych zmian wzięła się z konkretnego błędu, który musiałem najpierw zobaczyć. O tym napiszę osobno, bo to ciekawsza historia niż ta.
W skrócie
- Żeby stworzyć dobrą automatyzację, musisz umieć zapisać, jaki wynik uznajesz za dobry (akceptowalny), tak, żeby sprawdzenia mogła dokonać maszyna.
- Do produkcji naklejek wykorzystuję dwa modele (językowy wymyśla i ocenia, drugi rysuje) i żaden z tych modeli nie pracuje bez kontroli.
- Szybkie sprawdzenie przed czasochłonnym krokiem oszczędza sporo pracy, bo obrazek bez sensu odpada, zanim zacznie zużywać moc obliczeniową.
- Odrzucona generacja nie jest stratą: jej wady wracają na początek jako uzupełnienie instrukcji, więc kolejna próba wie więcej niż poprzednia.
- Każdą naklejkę ocenia model, ale całą serię przeglądam ja, bo model widzi tylko pojedyncze obrazki. Ten krok też da się zautomatyzować (tutaj nie było to kluczowe).
- Ten sam schemat działa poza naklejkami. Zmienia się definicja dobrego wyniku, a nie budowa procesu.


