Przejdź do treści

Notatka · Jakość · 9 min czytania

Osiem na dziesięć za tekst z błędem

Zbudowałem proces, w którym model AI pisze teksty piosenek, a potem sam je ocenia, i dostałem wysoką ocenę za tekst z błędem. O tym, co zmieniłem, żeby kontroli jakości dało się ufać.

Obraz wygenerowany przez AI: domowe studio nagrań o zmierzchu, na pulpicie zeszyt z tekstem piosenki pokreślonym czerwonym długopisem, przed nim mikrofon, obok konsoleta i słuchawki.

Do kilku moich projektów potrzebowałem piosenki, i to nie jednej, tylko wielu (w różnych stylach i na różne okazje), więc od początku zakładałem, że nie będę ich tworzył pojedynczo, tylko zbuduję automatyzację, która napisze tekst, nagra utwór i sama sprawdzi, czy wynik do czegoś się nadaje. Samo nagranie okazało się najmniejszym problemem (model do generowania muzyki dostaje tekst oraz opis stylu i po mniej więcej minucie oddaje gotowy utwór), a najwięcej pracy wymagał tekst i właśnie o nim jest ta notatka.

Model pisze tekst i sam go ocenia

Pierwszą wersję zbudowałem według schematu, który przy generowaniu obrazków sprawdza się u mnie bardzo dobrze: model pisze tekst, a potem w osobnym zapytaniu sam ocenia go w kilku kategoriach (czy rymy są dokładne, czy refren wraca słowo w słowo, czy tekst trzyma się faktów, które podałem), a z ocen wychodzi jedna liczba: tekst z wynikiem poniżej progu wraca do poprawy razem z listą wad, a ten powyżej progu idzie do nagrania. Poza samym uruchomieniem nie biorę w tym udziału: wszystko, co dzieje się w środku, robią agenci i zwykły kod, a ja wracam dopiero na końcu, żeby odsłuchać gotowe utwory.

Dlaczego model AI się mylił: szacował, zamiast liczyć

Przy tekstach piosenek ten sam schemat zaczął mnie jednak oszukiwać. W pewnym momencie proces oddał tekst z oceną powyżej ośmiu na dziesięć (była to wypadkowa trzech osobnych ocen tego samego modelu, uruchamianego z różnym czasem na namysł), mimo że jedno słowo padało w nim dwa razy w tej samej linijce, a wszystkie trzy oceny zgodnie uznały, że linijka ma dziewięć sylab, choć miała osiem. Wtedy zrozumiałem coś, co dziś wydaje mi się oczywiste: model językowy sam z siebie nie liczy, tylko szacuje, i robi to bardzo pewnym głosem.

Obraz wygenerowany przez AI: rząd jednakowych drewnianych pionków na biurku przy oknie o zmierzchu, jeden w środku wyraźnie wyższy od pozostałych, obok stalowa linijka.

Linijka, która nie pasuje do reszty. Widać to od razu, jeśli ktoś naprawdę mierzy.

Kontrola, która zawsze się zgadza

Druga rzecz wyszła przy okazji i była gorsza, bo dotyczyła samej kontroli. Model zapytany dwa razy o to samo nie musi odpowiedzieć tak samo, a to, jak bardzo jego odpowiedzi mogą się od siebie różnić, ustawia się jednym parametrem (tzw. temperaturą), więc pierwszą komisję zbudowałem właśnie na nim: trzy oceny tego samego tekstu z trzema różnymi ustawieniami, żeby każda patrzyła na niego trochę inaczej. Jedno z narzędzi, przez które wtedy łączyłem się z modelami, po cichu to ustawienie pomijało, więc zamiast trzech różnych spojrzeń dostałbym trzy razy to samo, a jednomyślność, która wyglądałaby jak pewność, byłaby w rzeczywistości echem (dlatego przy takich narzędziach oceny różnią się dziś czasem na namysł). Nauczyłem się z tego, że zanim zaufam ocenom, muszę się upewnić, że oceniający naprawdę oceniają niezależnie od siebie, bo kontrola, która zawsze się zgadza, nie jest kontrolą.

Co da się policzyć, liczy program

Przebudowałem to według jednej zasady: wszystko, co da się policzyć, liczy zwykły program, a nie model. Program sprawdza więc, czy w linijce nie powtarza się słowo, ile sylab ma każda linijka, czy rym jest dokładny, czy refren wraca słowo w słowo, czy w tekście padło to, co paść musi (na przykład nazwa marki albo imię osoby, dla której jest ta piosenka), i czy nie padło nic, co paść nie powinno. To nudny kod, który pisze się szybko, ale który ma jedną przewagę nad każdym modelem: nie da się go przegadać, bo nie zmieni zdania tylko dlatego, że reszta tekstu brzmi ładnie, i nie miewa lepszych i gorszych dni.

Czego policzyć się nie da

Modelom zostawiłem to, czego policzyć się nie da: czy zdania brzmią po polsku (a nie jak kalka z angielskiego), czy tekst da się zaśpiewać w zadanym tempie, czy żart działa bez puszczania oka do słuchacza, czy refren wpada w ucho i czy tekst nie przeczy temu, co ustaliłem wcześniej o postaciach i ich świecie. Nie robi tego jednak jeden „sędzia od wszystkiego”, tylko kilku recenzentów, z których każdy dostaje jedno zadanie i patrzy wyłącznie na nie, a do tego żaden z nich nie może poprawiać tekstu, co jest ważniejsze, niż się wydaje: recenzent, który podsuwa własną wersję, przestaje oceniać, a zaczyna konkurować, i zamiast uwag dostajesz od niego drugi tekst.

Obraz wygenerowany przez AI: trzy jednakowe lupy na stojakach ustawione nad jedną kartką leżącą na biurku przy oknie o zmierzchu.

Kilku recenzentów, każdy z jednym zadaniem i każdy patrzący z innej strony na ten sam tekst.

Każda uwaga musi przy tym zawierać trzy rzeczy: zacytowaną linijkę, jedno zdanie o tym, co z nią jest nie tak, i wagę (czy usterka blokuje tekst, czy warto ją poprawić, czy to już kwestia gustu), bo z uwagi w rodzaju „refren mógłby być mocniejszy” nic nie wynika i nie wiadomo, co z nią zrobić. Potem agent prowadzący cały proces przegląda uwagi po kolei i przy każdej decyduje, czy ją przyjąć, a przy odrzuconych zapisuje w jednym zdaniu, dlaczego.

Ten krok wygląda na formalność, a moim zdaniem to od niego zależy, czy całość działa, co najlepiej widać na uwagach, które sobie przeczą. W jednej z piosenek żart był zbyt czytelny, więc recenzent pilnujący tego, żeby tekst nie puszczał oka do słuchacza, zażądał zmiany linijki, a po zmianie sprawdzenie poprawki ją zablokowało, bo linijka była wprawdzie poprawna, ale nie niosła już niczego. Obie uwagi były słuszne i rozstrzygnąć to musiał agent prowadzący proces, a przy okazji wyszło, że żartu nie wystarczy wyciszyć, trzeba go zastąpić innym (w kolejnej rundzie linijka odzyskała puentę, już bez puszczania oka). Gdyby agent wprowadzał każdą uwagę bez zastanowienia, po kilku rundach zostałby mu tekst poprawny i martwy, bo poprawka, która naprawia drobiazg, a psuje dobrą linijkę, jest stratą, nawet jeśli formalnie jest poprawką.

Limit rund poprawek

Cały ten obieg (poprawka, sprawdzenie i znów poprawka) ma u mnie sztywny limit sześciu rund i kończy się wcześniej, jeśli dwie rundy z rzędu nie przynoszą postępu, czyli nowe usterki pojawiają się w tym samym tempie, w jakim znikają stare. Bez takiego limitu obieg mógłby się nie skończyć, bo recenzent prawie zawsze coś znajdzie, a im dłużej go pytasz, tym drobniejszych rzeczy się czepia. Proces zachowuje przy tym tekst z każdej rundy, bo jakość nie rośnie równo z kolejnymi poprawkami (zdarzało się, że poprawka usuwała jedne usterki i wprowadzała nowe), więc najlepszy może się okazać tekst z którejś wcześniejszej rundy, a nie z ostatniej.

Porównanie parami zamiast punktów

Zmieniłem też sposób wybierania najlepszego tekstu, bo pytanie „ile ten tekst ma na dziesięć” to za każdym razem pomiar inną miarką (każda ocena powstaje osobno, bez punktu odniesienia, i nawet dla tego samego tekstu potrafi się różnić o kilka dziesiątych punktu, a to wystarcza, żeby zamienić miejscami dwa teksty o podobnym poziomie), a w pytaniu „który z tych dwóch jest lepszy” oba teksty mierzy się tą samą miarką. Dlatego proces porównywał teksty parami, a każdą parę dwukrotnie (za drugim razem w odwrotnej kolejności, bo model potrafi faworyzować tekst ze względu na samą kolejność): zgodny wynik w obie strony był wygraną, a niezgodny remisem, czyli uczciwą informacją, że zdecydowała kolejność, a nie tekst.

Obraz wygenerowany przez AI: mosiężna waga szalkowa z kartką papieru na każdej szalce, przechylona na jedną stronę, na biurku przy oknie o zmierzchu.

Dwa teksty zważone tą samą miarką zamiast dwóch osobnych ocen „na dziesięć”.

Dziś proces na końcu nie wskazuje zwycięzcy, tylko wybiera dwie albo trzy wyraźnie różne wersje, które doszły do finału (przy każdej z jednym zdaniem o tym, co w niej najsłabsze), i zwykle od razu je nagrywa, a dopiero w tym miejscu jestem potrzebny ja: odsłuchuję gotowe utwory i wybieram uchem, i tak ma zostać, bo tekst, który czytany wydaje się słabszy, zaśpiewany potrafi brzmieć świetnie.

Sprawdzian, który kłamał

Zostaje jeszcze samo nagranie i tu jest pułapka, która moim zdaniem grozi każdej automatycznej kontroli jakości. Po nagraniu osobny model słucha gotowego utworu i spisuje, co słyszy, a program porównuje to z tekstem, żeby sprawdzić, czy wszystkie linijki rzeczywiście zostały zaśpiewane. Brzmi to jak idealny sprawdzian, tyle że ten sprawdzian potrafił kłamać: w jednej serii osiem nagrań na osiem uznał za takie, w których nic nie zaśpiewano, choć w każdym z nich wyraźnie słychać śpiew, a trzy z czterech nagrań, które potem wybrałem uchem, wcześniej odrzucił (i nie był to jednorazowy wypadek, bo ten sam błąd wracał przy kolejnych seriach). Od tego czasu niczego sam nie odrzuca, tylko potwierdza, a jedyne, co u mnie wyłapuje niezawodnie, to nagranie urwane w połowie.

Podobnie jest z automatycznym punktowaniem nagrań: kiedyś dwa najwyżej ocenione nagrania z trzydziestu odrzuciłem po odsłuchu, a to, które poszło dalej, było gdzieś w środku stawki, bo ta liczba mierzyła, jak równo zaśpiewano refren, a nie to, czy chce się tego słuchać.

Co to dało i ile kosztuje

Po tej przebudowie teksty przestały mnie zaskakiwać w ten jeden konkretny sposób: powtórzone słowo albo linijka dłuższa lub krótsza o sylabę nie przechodzą już dalej, bo liczy je program, a nie model, który mógłby je przeoczyć. Kosztuje to więcej czasu i zapytań do modelu (pełny skład recenzentów, a potem sprawdzenie każdej poprawki, to znacznie więcej niż prosta pętla z jednym oceniającym), ale godzę się na to, bo piosenki słucha się w całości i jeden zgrzyt potrafi zepsuć wszystko. Przy zadaniu, w którym błąd jest tani i łatwo go poprawić, tak rozbudowana kontrola byłaby moim zdaniem przesadą.

Wybrałem piosenki, bo to przykład lekki i najłatwiej na nim pokazać całą mechanikę, ale te same zasady wracają w zadaniach znacznie mniej efektownych i sprowadzają się do pięciu pytań: skąd wiem, że mój sprawdzian się nie myli, co w wyniku da się policzyć, a co można tylko ocenić, czy policzalną część liczy zwykły program, a nie model, kiedy obieg poprawek ma się skończyć i kto podejmuje ostatnią decyzję. Pierwsze z nich kosztowało mnie najwięcej czasu, choć wygląda na najmniej ważne.

W skrócie

  • U mnie model nie liczył, tylko szacował, więc wszystko, co policzalne (powtórzenia, długości, zgodność z wymaganiami), oddałem zwykłemu programowi, którego nie da się przegadać.
  • Kilku wąskich recenzentów, każdy z jednym zadaniem, daje mi więcej niż jeden „sędzia od wszystkiego”, a żaden z nich nie może poprawiać ocenianego tekstu, bo wtedy przestaje oceniać, a zaczyna konkurować.
  • Z uwagi bez zacytowanego fragmentu niewiele wynika, a uwagi wprowadzane hurtem potrafią popsuć tyle, ile naprawiają.
  • Obieg poprawek ma u mnie limit, bo recenzent prawie zawsze coś znajdzie.
  • Wszystko w środku robią agenci i zwykły kod, a człowiek jest potrzebny dopiero przy odsłuchu finałowych wersji.
  • Automatyczną kontrolę jakości sprawdzam najpierw na przypadkach, o których wiem, że są dobre (u mnie potrafiła odrzucić wszystko, co było w porządku).