Wyniki
Muszka: opublikowany plik INT8, tryb sensitive (czuły, z oknami), próg 0,5. Holdouty, PL-Guard, GadziJęzyk i testy fałszywych
alarmów - sam model, bez regexu; egzamin i lista krytyczna - z regexem, jak we wdrożeniu. Porównujemy z modelem,
od którego Muszka się zaczęła - Bielik-Guard „Sójka” 0.1B i 0.5B od SpeakLeash, uruchomioną tak, jak ją
opublikowano (fp32, do 512 tokenów, bez okien). Wyjątek: w PL-Guard pokazujemy też Sójkę uruchomioną przez nas
w tych samych oknach 128/32 co Muszka.
Holdouty, PL-Guard, GadziJęzyk, Roget i egzamin zostały odłożone przed treningiem (wyjątki: 3 pozycje egzaminu
i 7 krótkich tekstów holdoutu v1 trafiły do danych jednej z dwóch uśrednianych wersji). Test przekleństw i audyt
słów mierzą pokrycie - ich słowa były w treningu. Terminy (AUROC, F1, holdout…) wyjaśnia
słowniczek.
PL-Guard (NASK), polski test bezpieczeństwa
0,81vs 0,54
makro F1, im wyżej, tym lepiej (maks. 1)
Połowa raportowa, część „test”. Sójkę 0.1B uruchomiliśmy w tych samych oknach 128/32 co Muszkę (sama Sójka okien nie używa i czyta do 512 tokenów - wtedy 0,497).
Zaciemnione wulgaryzmy zablokowane
99%vs 78%
„k*rwa”, „kórwa”, „k u r w a” w wiadomościach
Egzamin zapieczętowany, 194 wiadomości. Sójka 0.5B: 92,3%.
Ataki adversarial wykryte
88%vs 19%
szkodliwe prośby przebrane za fikcję, role, eufemizmy
Holdout v2 (WildGuardMix test, po polsku). Sójka 0.5B: 17,1%. Muszka w oknach, Sójka bez okien (w oknach na tym zbiorze jej nie mierzyliśmy). Koszt: niewinne prompty adversarial zablokowane - Muszka 20,2%, Sójka 0.1B 3,8%, Sójka 0.5B 1,6%.
Źródło wszystkich liczb w tej sekcji: karta modelu Muszka Guard 0.1B v1.1 na Hugging Face i raport PDF.
Tabele poniżej są szersze niż ekran telefonu - przesuń je palcem w bok.
Zapieczętowany egzamin końcowy
Osobny zbiór wygenerowany Bielikiem i oznaczony przez sędziego (Bielik) przed pomiarem (obelgi wybrane ręcznie),
zmierzony jeden raz na wybranym modelu - żeby nie dopasować modelu do testu. W tabeli: odsetek zablokowanych tekstów. Przy „blokada”
im więcej, tym lepiej; przy „przepuść” - im mniej, tym lepiej.
| Sekcja egzaminu | n | Oczekiwane | Muszka v1.1 | Sójka 0.1B | Sójka 0.5B |
| Wulgarne wiadomości (nowe sytuacje) | 288 | blokada | 93,8% | 92,4% | 93,1% |
| Zaciemnione wulgarne wiadomości | 194 | blokada | 99,0% | 77,8% | 92,3% |
| Niewinne wiadomości ze słowami podobnymi | 250 | przepuść | 4,8% | 2,8% | 0,8% |
| Niewinne z jednym zaciemnionym słowem | 175 | przepuść | 6,3% | 6,3% | 4,0% |
| Obelgi spoza zestawu wulgaryzmów z treningu, osobno | 15 | blokada | 6,7% | 60,0% | 26,7% |
Muszka wyraźnie lepiej radzi sobie z zaciemnionymi wulgaryzmami, zwykłe wulgarne wiadomości łapie na poziomie
Sójki, a pojedyncze obelgi spoza zestawu wulgaryzmów z treningu - wyraźnie gorzej
(część tych słów, np. „palantem”, była w danych treningowych jako słowo niewinne; patrz
ograniczenia). Na niewinnych wiadomościach ze słowami podobnymi Muszka
blokuje więcej niż obie Sójki (4,8% wobec 2,8% i 0,8%). Po pomiarze zauważyliśmy, że sędzia (Bielik)
budujący egzamin oznaczył część niewulgarnych wiadomości jako wulgarne - prawdziwy wynik pierwszego wiersza jest
raczej wyższy; egzaminu po pomiarze nie poprawialiśmy.
PL-Guard (NASK) - polski benchmark bezpieczeństwa
Publiczny test przygotowany przez NASK: 14 kategorii, zarówno prośby do modeli, jak i ich odpowiedzi. Liczymy makro
F1 (bezpieczne / niebezpieczne, od 0 do 1). Zbiór podzieliliśmy na dwie stałe połowy: jedna służyła do wyboru
ustawień, druga - raportowa - do raportu. Połowę raportową liczyliśmy przy
każdym przebiegu bramki (5 kandydatów), a warunek bramki obejmował cały zbiór; kandydata nie wybieraliśmy według
niej - wybrany model ma na niej najniższy wynik z trzech ostatnich. „Adv” to część z atakami przemyślanymi.
Liczby w nawiasach: Sójka uruchomiona przez nas w tych samych oknach 128/32 co Muszka (sama Sójka okien nie
używa i czyta do 512 tokenów).
| Model | Połowa raportowa: test / adv | Cały zbiór: test / adv |
| Muszka v1.1 | 0,811 / 0,768 | 0,852 / 0,774 |
| Sójka 0.1B (w nawiasie: uruchomiona przez nas w oknach) | 0,497 (0,537) / 0,472 (0,527) | 0,489 (0,541) / 0,481 (0,537) |
| Sójka 0.5B (w nawiasie: uruchomiona przez nas w oknach) | 0,475 (0,568) / 0,464 (0,551) | 0,480 (0,568) / 0,470 (0,555) |
| HerBERT-PL-Guard (NASK, z pracy) | - | 0,927 / 0,913 |
HerBERT-PL-Guard trenowano na danych przygotowanych przez autorów PL-Guard, z tą samą listą kategorii - to może
tłumaczyć przewagę. Dane treningowe Muszki nie mają wspólnych tekstów z PL-Guard (sprawdzone).
Zbiory odłożone (holdouty)
Zbiory testowe odłożone przed treningiem (wyjątek: 7 krótkich tekstów holdoutu v1 trafiło do danych jednej z dwóch
uśrednianych wersji).
Holdout v1: komentarze z testowej części Jigsaw (przetłumaczone Bielikiem 11B) i 36 ataków oraz niewinnych wiadomości napisanych po polsku dla czatu na muszkaowocowa.pl; holdout v2: prompty z testowej części WildGuardMix (przetłumaczone Bielikiem 11B). Wykrywalność - ile
szkodliwych tekstów złapano; fałszywe alarmy - ile niewinnych zablokowano. GadziJęzyk to polskie, pisane przez
ludzi szkodliwe prośby (prof. Jerzy Surma, SGH).
| Test | Muszka v1.1 | Sójka 0.1B | Sójka 0.5B |
| Holdout v1: AUROC | 0,961 | 0,940 | 0,942 |
| Holdout v1: wykrywalność / fałszywe alarmy | 83,5% / 6,3% | 78,2% / 7,5% | 78,4% / 6,9% |
| Holdout v2: AUROC | 0,916 | 0,802 | 0,846 |
| Holdout v2: wykrywalność / fałszywe alarmy | 87,1% / 11,5% | 40,3% / 6,1% | 41,5% / 3,6% |
| Ataki adversarial wykryte (v2; Muszka w oknach, Sójka bez okien) | 87,6% | 18,9% | 17,1% |
| Niewinne prompty adversarial zablokowane (fałszywe alarmy) | 20,2% | 3,8% | 1,6% |
| GadziJęzyk (polskie szkodliwe prośby) | 98,9% | 62,7% | 81,3% |
Uczciwe zastrzeżenie: v1 i v2 to części testowe zbiorów, których części treningowe Muszka widziała (w tłumaczeniu
Jana Sowy) - dla Muszki to ta sama dziedzina, dla Sójki nie. GadziJęzyk był wyłączony z treningu Muszki.
Prompty adversarial są zwykle dłuższe niż jedno okno, więc okna Muszki mają tu znaczenie; Sójki w oknach na tym
zbiorze nie mierzyliśmy. Więcej wykrytych ataków kosztuje więcej fałszywych alarmów - to koszt trybu sensitive (czułego):
11,5% niewinnych promptów na v2 i 20,2% niewinnych promptów adversarial (Sójka 0.1B: 6,1% i 3,8%).
Przekleństwa i zaciemnienia
Test zbudowany z zestawu polskich wulgaryzmów i fraz od Jana Sowy: każda forma odmiany, 13 rodzajów zaciemnień.
Muszka v1.1 trenowała na wszystkich rodzinach słów, więc to mierzy pokrycie.
Uogólnianie na nieznane rodziny słów (wcześniejszy model, 30% rodzin odłożonych): 87,2% wszystkich wariantów
(formy i zaciemnienia) zablokowanych, same formy 90,3% (bramka, INT8). Zwykłe słowa w tych samych nietypowych
zapisach są blokowane w 0,5%-6,7% przypadków zależnie od zapisu (u→ó 6,7% - powyżej progu bramki 5%).
| Zapis | Muszka v1.1 | Sójka 0.1B | Sójka 0.5B |
| forma bez zmian | 99,8% | 89,4% | 80,8% |
| u→ó (kórwa) | 99,7% | 46,4% | 43,3% |
| ch→h (huj) | 100,0% | 92,1% | 64,5% |
| ch→h + u→ó (hój) | 100,0% | 62,3% | 26,9% |
| gwiazdka (k*rwa) | 99,0% | 87,6% | 99,6% |
| spacje (k u r w a) | 98,4% | 32,5% | 10,9% |
| kropki (k.u.r.w.a) | 98,4% | 99,9% | 41,9% |
| leet (kurw@) | 99,1% | 61,8% | 49,2% |
| powtórzona litera (kuuurwa) | 98,7% | 65,9% | 72,8% |
| bez polskich znaków | 99,4% | 82,9% | 75,0% |
| WIELKIE LITERY | 98,5% | 58,1% | 53,9% |
Tabela: wszystkie trzy modele w pełnej precyzji (PyTorch fp32), test przekleństw v2; wydawany plik INT8 - do
0,5 pkt proc. mniej (bramka, test v3).
Inne sprawdziany
Dobry filtr nie tylko łapie złe rzeczy - nie może też przeszkadzać w zwykłej rozmowie. Tu sprawdzamy fałszywe
alarmy na zwykłych tekstach i to, czy Muszka łapie szkodliwe odpowiedzi samych modeli.
| Sprawdzian | Wynik |
| Fałszywe alarmy na 5100 zwykłych polskich tekstach (pola semantyczne Rogeta) | 0,6% |
| Fałszywe alarmy na niewinnych pytaniach o zdrowie, prawo, finanse, wybory | 0,7% |
| Odmowy modeli („nie mogę w tym pomóc”) zablokowane | 1,2% |
| Zwykłe (nieszkodliwe) odpowiedzi modeli zablokowane - fałszywe alarmy | 15,3% |
| Niewinne teksty na tematy negatywne (Roget) zablokowane | 6,7% |
| Szkodliwe odpowiedzi modeli wykryte (PolyGuardMix, zbiór odłożony) | 79,4% |
| Szkodliwa treść za wstępem-odmową („nie mogę pomóc, ale…”) wykryta | 65,5% |
| Blokady: pojedyncze litery / słowa 2-literowe / 3-literowe / 2000 najczęstszych słów (były w treningu jako niewinne; 3 blokady w top 2000 to słowa z zestawu wulgaryzmów lub objęte polityką ostrzeżeń - 0 fałszywych alarmów na zwykłych słowach) | 0 / 0 / 0 / 3 |
Krótkie teksty: poprawka względem Sójki
Sójka myli część zwykłych liter i słów z wulgaryzmami: sama litera „k” dostaje u Sójki 0.1B 0,73, a u 0.5B 0,90 (blokada), „wujek” u 0.1B 0,40 (ostrzeżenie). Muszka v1.0 to naprawiła, a v1.1 to utrzymuje: „k” 0,0005, „wujek” 0,0005. Z 86 pojedynczych liter i krótkich zapisów Muszka blokuje 0, Sójka 0.1B 31, a 0.5B 26. Audyt (litery / 2 / 3 litery / top 2000 słów): Muszka 0 / 0 / 0 / 3, Sójka 0.1B 21 / 15 / 9 / 48, 0.5B 12 / 5 / 4 / 39. Te litery i słowa były w treningu Muszki jako niewinne; Muszka - wydawany plik INT8 z regexem, Sójka - tak, jak ją opublikowano.
Bramka przed publikacją: 38 z 45
Przed wydaniem każdy kandydat przechodzi 45 warunków kontrolnych (przypadki krytyczne zgłoszone przez ludzi,
przekleństwa i zaciemnienia, skrajne przypadki kontrolne, audyt słów, benchmarki). Wersja v1.1 spełnia
38 z 45 - wydaliśmy ją mimo 7 niespełnionych, opisanych niżej jako znane
ograniczenia. Przed wydaniem podnieśliśmy próg fałszywych alarmów na holdoucie v2 z 10% do 12% (żaden kandydat
w trybie sensitive (czułym) nie mieścił się w 10%).
Szybkość i pamięć
Muszka działa na zwykłym procesorze, bez karty graficznej. Plik INT8 (126 MB, 120 MiB) jest 4 razy mniejszy od
pełnej precyzji fp32 (498 MB) i ok. 2-3 razy szybszy (mediana), na długich tekstach ok. 2 razy. p50 to czas
typowej wiadomości (połowa jest szybsza), p95 - „prawie najgorszy” (95 na 100 jest szybszych). Pomiar: wydawany
plik, tryb sensitive (czuły), jedna wiadomość naraz, 500 tekstów z testów (mediana 38 tokenów), ONNX Runtime 1.30 z domyślną
liczbą wątków (wszystkie rdzenie), razem z tokenizacją, bez regexu.
| Urządzenie | Plik | p50 | p95 | średnio | długie teksty (~420 tokenów) | RAM procesu (MiB) |
| NVIDIA GB10 (ARM) | INT8 (126 MB) | 10,1 ms | 119,2 ms | 30,7 ms | 237 ms | 386 |
| NVIDIA GB10 (ARM) | fp32 (498 MB) | 25,4 ms | 287,8 ms | 75,2 ms | 511 ms | 788 |
| Intel i5-12600K (x86) | INT8 (126 MB) | 8,7 ms | 113,3 ms | 28,5 ms | 242 ms | 406 |
| Intel i5-12600K (x86) | fp32 (498 MB) | 19,3 ms | 235,5 ms | 60,5 ms | 475 ms | 809 |
Źródło: karta modelu v1.1; kolumna p95 - surowe wyniki pomiaru (liczby_v1_1.json). Zgodność decyzji INT8 i fp32: 99,0% na 300 tekstach testowych.