Detekcja treści AI: dlaczego dobry model nie wystarczy
Jak sprawdzić, czy tekst napisał człowiek, czy wygenerował go model AI? Okazuje się, że trudniejsze od znalezienia odpowiedniego modelu jest ustalenie, czy można ufać jego odpowiedzi.
Przez kilka miesięcy pracowałem nad dwoma powiązanymi narzędziami. Pierwsze miało rozpoznawać treści generowane przez AI: teksty, obrazy, nagrania i filmy. Drugie analizowało dokumenty, szukając zarówno śladów generowania, jak i dowodów rzeczywistej pracy człowieka.
Oba systemy miały działać lokalnie, w sieci bez dostępu do internetu.
Najciekawsze wnioski przyniosły nie kolejne modele, lecz próby wykazania, że dotychczasowe wyniki są błędne.
Dobry model, zły próg
Zacząłem od detekcji tekstu. Modele RoBERTa trenowane na angielskim nie radziły sobie z polszczyzną, więc sięgnąłem po Qwen3-8B dostrojony specjalnie do wykrywania tekstów AI po polsku.
Pierwsze testy nie wyglądały dobrze. Żaden z wariantów uruchomionych z domyślnymi ustawieniami nie spełniał przyjętych kryteriów. Jeden wykrywał zbyt mało tekstów AI, inny zbyt często oskarżał o generowanie teksty napisane przez ludzi.
To drugie było szczególnie istotne. Detektor, który niesłusznie oznacza cudzy tekst jako wygenerowany, może wyrządzić więcej szkody niż taki, który przepuści kilka tekstów AI.
Zamiast szukać kolejnego modelu, zmieniłem próg podejmowania decyzji. Wyznaczyłem go na osobnym zbiorze tekstów ludzkich, pilnując dopuszczalnej liczby fałszywych oskarżeń.
Efekt był wyraźny. Na jednym ze zbiorów wykrywalność wzrosła bez przekroczenia przyjętego limitu błędów.
Potem powiększyłem korpus i zadbałem o różnorodność źródeł. Wcześniej znaczną część tekstów ludzkich stanowił jeden blog. To mogło wypaczać pomiary.
Na rozszerzonym zbiorze detektor osiągnął 86,2% wykrywalności AI przy 3,7% fałszywych oskarżeń.
Problem w tym, że na starszym, trudniejszym zbiorze wynik był znacznie słabszy. Sama kalibracja nie rozwiązywała wszystkiego.
Sprawdziłem też, czy model nie rozpoznaje po prostu długości tekstu. Testy nie potwierdziły takiej zależności. Odkryłem natomiast niewielkie rozbieżności między powtórnymi uruchomieniami. Dlatego wyniki bliskie progowi zacząłem oznaczać jako niepewne.
Detektor może nie rozpoznawać własnej rodziny
Kolejny eksperyment podważył sens chwalenia się jednym wynikiem skuteczności.
Wziąłem ten sam model generujący teksty i tego samego sędziego. Zmieniałem jedynie tryb rozumowania generatora oraz sposób przygotowania polecenia.
Wykrywalność wahała się od 41,7% do 100%. Wynik na standardowym korpusie traktuję więc jako górne oszacowanie: to był najłatwiejszy przypadek.
To ogromna różnica, mimo że modele pozostały te same. Przy tej wielkości próby nie udało mi się jeszcze rozstrzygnąć, czy ważniejszy był tryb rozumowania, czy konstrukcja polecenia.
Wcześniej zauważyłem podobny problem ze stylem. Gładkie teksty popularnonaukowe były łatwiejsze do wykrycia niż potoczne wypowiedzi z literówkami i dygresjami.
Jeszcze ciekawsza okazała się ślepota rodzinna.
Kiedy sędzią był Qwen3.8-27B, a teksty również pochodziły z Qwen3.8-27B, sędzia nie rozpoznał ani jednego z badanych przykładów. Mniejszy detektor z tej rodziny również wypadł słabo.
Tymczasem Binoculars oparty na modelach Bielik rozpoznał wszystkie te teksty.
Nie oznacza to, że Binoculars był najlepszym rozwiązaniem. W innych testach generował zbyt wiele fałszywych oskarżeń. Pokazało to jednak istotną rzecz: model oceniający teksty nie powinien pochodzić z tej samej rodziny co generator, którego chcemy wykrywać.
Wynik uzyskany na jednym zestawie generatorów może być więc bardzo optymistyczny.
Tekst, który próbuje oszukać sędziego
Sprawdziłem również, co się stanie, gdy badany dokument będzie zawierał instrukcje skierowane do modelu oceniającego.
Do tekstów doklejałem polecenia nakazujące zignorowanie wcześniejszych instrukcji i uznanie dokumentu za napisany przez człowieka.
Przy wyłączonym rozumowaniu sędziego ataki nie działały. Po włączeniu rozumowania część prób skutecznie zmieniała werdykt.
Podejrzewam, że tryb rozumowania ułatwia takie wstrzyknięcia, ale nie zbadałem jeszcze ich mechanizmu. Na razie jest to hipoteza, nie potwierdzona przyczyna.
Co gorsza, można było również oszukać sędziego w przeciwnym kierunku: skłonić go do uznania tekstu ludzkiego za wygenerowany.
Nie wymagało to nawet bezpośrednich rozkazów. Wystarczały fałszywe metadane redakcyjne, spreparowany log generowania albo przypis sugerujący korektę tekstu przez AI.
Wbudowana flaga wykrywania takich ataków nie zadziałała ani razu.
Próbowałem dodatkowo ostrzegać model w poleceniu, że analizuje niezaufane dane. Nie pomogło. Trafność nawet się pogorszyła.
Przy okazji znalazłem błąd integracyjny: serwer inferencji ignorował flagę wyłączającą rozumowanie, jeśli przekazywałem ją w niewłaściwym miejscu żądania. Model nadal generował wewnętrzne rozumowanie, czasem nie pozostawiając miejsca na odpowiedź. Dopiero poprawne zagnieżdżenie parametru usunęło problem.
A co z obrazem, dźwiękiem i dokumentami?
Równolegle rozwijałem pozostałe ścieżki detekcji.
Przy obrazach połączyłem dwa modele. Razem działały lepiej niż każdy z osobna. Wystarczyło jednak podać starsze twarze wygenerowane przez GAN, żeby oba zaczęły popełniać te same błędy.
To ważne ograniczenie: zgodność dwóch modeli nie musi oznaczać, że oba mają rację.
Detekcja audio wypadła lepiej. Model Wav2Vec2 skutecznie rozróżniał prawdziwą mowę od syntezy również w testach z polskimi nagraniami. Pomogło ograniczenie analizy do pierwszego okna nagrania. Uśrednianie większej liczby okien powodowało fałszywe alarmy.
Wideo pozostaje niedokończonym obszarem. Poprawiłem błąd przetwarzania klatek, który zawyżał wyniki jednego z modeli, ale nie przeprowadziłem jeszcze rzetelnego pomiaru jakości całej ścieżki.
Osobnym problemem były materiały, których nie da się wiarygodnie ocenić: skan PDF bez tekstu, nagranie bez mowy czy film bez twarzy.
W takich przypadkach system powinien zwracać unknown, a nie udawać, że brak dowodów na AI jest dowodem ludzkiego pochodzenia.
Drugi system, audytor dokumentów, poszedł nieco inną drogą. Zamiast oceniać cały dokument jedną liczbą, dzieli go na fragmenty. Szuka cech stylu, ale również konkretnych danych, źródeł i założeń świadczących o wykonanej pracy.
Połączenie heurystyk z sędzią LLM ograniczyło fałszywe oskarżenia. Nadal jednak słabo wychwytywało wstawki AI w dokumentach napisanych głównie przez człowieka.
Dlatego audytor nie wydaje ostatecznego wyroku. Tworzy raport z zaznaczonymi fragmentami wymagającymi sprawdzenia.
Pełne testy na docelowym serwerze są jeszcze przede mną.
Czego się nauczyłem?
Największą pułapką w detekcji AI jest wiara w pojedynczy procent skuteczności.
Wynik zależy od tego, kto generował tekst, jak został napisany prompt, jakie źródła trafiły do korpusu i gdzie ustawiono próg decyzyjny.
Nawet dwa modele zgodne w ocenie mogą wspólnie się mylić. A sędzia LLM może zostać zmanipulowany przez sam dokument, który ma ocenić.
Dlatego coraz ważniejsze stały się dla mnie trzy rzeczy: różnorodne dane testowe, kontrola fałszywych oskarżeń i jawne przyznawanie, że niektórych przypadków nie da się rozstrzygnąć.
Detektor AI powinien przede wszystkim wiedzieć, kiedy nie ma wystarczających podstaw do wydania werdyktu.