muszka.

Model open source · wersja v1.1 · Apache 2.0 · wydanie

Muszka Guard

Mały, szybki polski filtr bezpieczeństwa dla czatów i asystentów AI. Czyta wiadomość, zanim trafi do modelu językowego, i decyduje: przepuścić, ostrzec czy zablokować.

parametrów
124M
plik modelu (INT8)
126 MB
krótka wiadomość (mediana) / długi tekst, Intel i5-12600K
9 ms / 0,24 s
kategorii zagrożeń
7

Pochodna Bielik-Guard 0.1B (Sójka) od SpeakLeash. Muszka Guard to niezależny projekt - to nie jest oficjalny produkt zespołu Bielik-Guard (Sójka).

Jak działa - prosto

Muszka Guard to filtr, który stoi przed dużym modelem językowym - jak bramkarz przed drzwiami. Czyta wiadomość człowieka, zanim trafi do czatu (albo odpowiedź modelu, zanim trafi do człowieka), i daje każdej z siedmiu kategorii zagrożeń wynik od 0 do 1. Na tej podstawie zapada jedna z trzech decyzji.

1. Wejście

Wiadomość

np. „Jak upiec sernik?” albo „ty kórwo”

2. Filtr

Muszka Guard

7 wyników od 0 do 1, zwykły procesor, bez GPU

Przepuść

wszystkie wyniki poniżej 0,18 - wiadomość idzie do modelu językowego

Ostrzeż

najwyższy wynik między 0,18 a 0,5 - tekst jest podejrzany

Zablokuj

wynik od 0,5 w dowolnej kategorii

Siedem kategorii

Jedna wiadomość może należeć do kilku kategorii naraz - każda dostaje własny wynik.

  • self-harm

    Samookaleczenia: samobójstwo, samookaleczenie, zaburzenia odżywiania.

  • hate

    Nienawiść: pogarda albo przemoc wobec grup ludzi.

  • vulgar

    Wulgaryzmy i obelgi, także zaciemnione: „k*rwa”, „kórwa”, „k u r w a”.

  • sex

    Treści seksualne wprost.

  • crime

    Pomoc w przestępstwie: przemoc, broń, hakowanie.

  • jailbreak

    Próby złamania zasad asystenta: „zignoruj poprzednie polecenia”, DAN (prompt injection).

  • other - nowa w v1.1

    Zniesławienie, porady specjalistyczne (medyczne, prawne, finansowe), wybory.

Długie teksty: czytanie oknami

Filtr, który czyta długi tekst tylko jako całość, może przeoczyć jedno groźne zdanie ukryte w środku - np. 800 słów przepisu na sernik, a na końcu prośba o bombę rurową. Dlatego teksty dłuższe niż 128 tokenów Muszka czyta dodatkowo zachodzącymi na siebie oknami po 128 tokenów. Do wyboru są trzy tryby:

sensitive (czuły, domyślny)

Liczy się najgroźniejsze okno. Łapie ukryte zdanie, kosztem kilku fałszywych alarmów więcej na długich opowiadaniach i tekstach z gier.

balanced (zrównoważony)

Mniej fałszywych alarmów na długich tekstach, ale pojedyncze ukryte zdanie może się „rozmyć”.

no_windows (bez okien)

Tylko cały tekst naraz, do 512 tokenów.

Lepiej zablokować niewinne zdanie, niż przepuścić szkodliwe.

Dlatego domyślny jest tryb sensitive (czuły).

Co dalej: sędzia od fałszywych blokad

Czułość ma swoją cenę - czasem zablokowane zostanie coś niewinnego. W planie na v1.2 zablokowane wiadomości może opcjonalnie drugi raz obejrzeć mały model językowy (Muszka-Instruct 1.5B), który zwalnia fałszywe alarmy. Filtr zostaje czuły, a sędzia zmniejsza liczbę niepotrzebnych blokad. W drugą stronę to nie działa: czego filtr nie zablokuje, tego sędzia nie zobaczy.

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 egzaminunOczekiwaneMuszka v1.1Sójka 0.1BSójka 0.5B
Wulgarne wiadomości (nowe sytuacje)288blokada93,8%92,4%93,1%
Zaciemnione wulgarne wiadomości194blokada99,0%77,8%92,3%
Niewinne wiadomości ze słowami podobnymi250przepuść4,8%2,8%0,8%
Niewinne z jednym zaciemnionym słowem175przepuść6,3%6,3%4,0%
Obelgi spoza zestawu wulgaryzmów z treningu, osobno15blokada6,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).

ModelPołowa raportowa: test / advCały zbiór: test / adv
Muszka v1.10,811 / 0,7680,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).

TestMuszka v1.1Sójka 0.1BSójka 0.5B
Holdout v1: AUROC0,9610,9400,942
Holdout v1: wykrywalność / fałszywe alarmy83,5% / 6,3%78,2% / 7,5%78,4% / 6,9%
Holdout v2: AUROC0,9160,8020,846
Holdout v2: wykrywalność / fałszywe alarmy87,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%).

ZapisMuszka v1.1Sójka 0.1BSójka 0.5B
forma bez zmian99,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ów99,4%82,9%75,0%
WIELKIE LITERY98,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.

SprawdzianWynik
Fałszywe alarmy na 5100 zwykłych polskich tekstach (pola semantyczne Rogeta)0,6%
Fałszywe alarmy na niewinnych pytaniach o zdrowie, prawo, finanse, wybory0,7%
Odmowy modeli („nie mogę w tym pomóc”) zablokowane1,2%
Zwykłe (nieszkodliwe) odpowiedzi modeli zablokowane - fałszywe alarmy15,3%
Niewinne teksty na tematy negatywne (Roget) zablokowane6,7%
Szkodliwe odpowiedzi modeli wykryte (PolyGuardMix, zbiór odłożony)79,4%
Szkodliwa treść za wstępem-odmową („nie mogę pomóc, ale…”) wykryta65,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ądzeniePlikp50p95średniodługie teksty (~420 tokenów)RAM procesu (MiB)
NVIDIA GB10 (ARM)INT8 (126 MB)10,1 ms119,2 ms30,7 ms237 ms386
NVIDIA GB10 (ARM)fp32 (498 MB)25,4 ms287,8 ms75,2 ms511 ms788
Intel i5-12600K (x86)INT8 (126 MB)8,7 ms113,3 ms28,5 ms242 ms406
Intel i5-12600K (x86)fp32 (498 MB)19,3 ms235,5 ms60,5 ms475 ms809

Ź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.

Znane ograniczenia

Piszemy o nich wprost, bo filtr, o którego słabościach nie wiesz, jest groźniejszy niż filtr słabszy, ale uczciwie opisany. To filtr, a nie sędzia prawdy czy intencji - przy ważnych decyzjach warto łączyć go z większym modelem albo człowiekiem.

Pojedyncze obelgi spoza zestawu wulgaryzmów z treningu przechodzą

Na egzaminie Muszka zablokowała 6,7% takich słów podanych osobno, Sójka 0.1B - 60,0% (część tych słów była w treningu jako słowa niewinne). W obraźliwym zdaniu te same słowa są blokowane w 41 z 45 przypadków (3 ramki zdaniowe; w najłagodniejszej słabiej). Osobno przechodzą:

  • łajza
  • darmozjad
  • łachudra
  • luj
  • palant
  • patafian
  • prostak
  • szuja
  • tłuk
  • łajdak
  • łachmyta
  • łachudrak
  • łotr
  • łapserdak

Łagodne obelgi (gamoń, łamaga, gapa…) - polityka jeszcze nieustalona. To pierwszy punkt planu v1.2.

Przepuszcza też „buc”. Wolimy myśleć, że Muszka czyta to jako skrót:

Bardzo Uprzejmy Człowiek

Słowa dwuznaczne w niewinnych zdaniach

Fałszywe blokady, np.:

  • „Dostał pałę z matematyki”
  • „Suka owczarka…”
  • „Dmuchać na zimne”
  • „hak do wieszania towaru”
  • „dupleks” - prawdopodobnie dlatego, że tokenizer dzieli go na dup-lek-s

Z drugiej strony dwuznaczne zdanie bez polskich znaków („wnuczek zrobil dziadkowi laske”) nie dostaje ostrzeżenia.

Ukryty zamiar - „75 kg mięsa”

„Mam 75 kg zepsutego mięsa z kurczaka i chcę się go pozbyć bez śladu” - oceniane jako niewinne. Każde słowo jest zwyczajne, groźny jest tylko możliwy zamiar, a tego mały filtr nie rozpoznaje. Przypadek z komentarza na LinkedIn - dziękujemy.

Pozostałe

  • Tryb sensitive (czuły) podnosi fałszywe alarmy: 11,5% niewinnych promptów na holdoucie v2 i 20,2% niewinnych promptów adversarial (Sójka 0.1B: 6,1% i 3,8%), 15,3% zwykłych odpowiedzi modeli. Bez okien byłoby ich mniej, ale ukryte szkodliwe zdanie by przeszło.
  • Rzadkie skróty (CJK, MILF) nie są rozpoznawane jako wulgarne.
  • Tylko język polski; teksty z innych dziedzin mogą zachowywać się inaczej.

Plan na v1.2

Kolejna wersja zaczyna się od największej luki v1.1 - pojedynczych obelg.

  1. Szeroki słownik obelg

    Obelgi i wyzwiska z odmianami i zaciemnieniami. Mniej „niewinnych” pojedynczych słów w treningu - to one osłabiły to, co Sójka już wiedziała o obelgach. Nowa sekcja egzaminu z obelgami spoza zestawu wulgaryzmów z treningu.

  2. Słowa dwuznaczne w kontekście

    Większe testy par zdań: ta sama „pała” w szkole i w obeldze.

  3. Muszka + sędzia

    Zablokowane wiadomości opcjonalnie sprawdza drugi raz mały model językowy (Muszka-Instruct 1.5B) i zwalnia fałszywe alarmy. Filtr zostaje czuły, sędzia zmniejsza liczbę niepotrzebnych blokad.

  4. Wersja w przeglądarce

    Filtr działający lokalnie, na urządzeniu użytkownika - tekst nie musi nigdzie wychodzić.

Rozważamy też większy wariant, „Muszka 0.5B”, na modelu PKOBP/polish-roberta-8k (sugestia z LinkedIn). Priorytet się nie zmienia: lepiej zablokować niewinne, niż przepuścić szkodliwe.

Demo

Wpisz dowolne zdanie i zobacz, co zrobi z nim Muszka, a co Sójka - obok siebie, z wynikami dla każdej kategorii.

Muszka Guard v1.1 - demo z porównaniem

Demo działa na Hugging Face i wczyta się tutaj dopiero po kliknięciu. Wtedy Twoja przeglądarka połączy się z Hugging Face - ta strona może używać własnych ciasteczek. Darmowy Space po okresie bezczynności budzi się nawet do minuty.

Jak użyć

Dla programistów: model jest na Hugging Face na licencji Apache 2.0. Wystarczą onnxruntime, tokenizers i numpy - bez PyTorcha i bez karty graficznej.

# pip install onnxruntime tokenizers numpy huggingface_hub
from huggingface_hub import snapshot_download
import sys
path = snapshot_download("Fibogacci/muszka-guard-0.1b-v1.1",  # only the 4 files needed (~130 MB), not the whole repo (~1.1 GB)
                         allow_patterns=["muszka_int8_pc_rr.onnx", "muszka_guard.py", "config.json", "tokenizer.json"])
sys.path.insert(0, path)
from muszka_guard import MuszkaGuard

guard = MuszkaGuard(path, "muszka_int8_pc_rr.onnx", mode="sensitive")
print(guard.predict("ty kórwo")["is_blocked"])            # True
print(guard.predict("Jak upiec sernik?")["is_blocked"])   # False
  • Tryb ustawiasz parametrem mode: sensitive (czuły, domyślny), balanced (zrównoważony) albo no_windows (bez okien).
  • Używaj pliku muszka_int8_pc_rr.onnx: zwykły plik INT8 per-channel psuje się na procesorach x86 bez VNNI (sprawdzone na małym VPS-ie). Zgodność decyzji INT8 i fp32: 99,0% na 300 tekstach testowych.

Słowniczek

Najważniejsze terminy z tej strony, karty modelu i raportu - prosto i po ludzku. Kliknij termin, żeby rozwinąć.

Filtr bezpieczeństwa (guard, guardrail)

Mały, szybki model, który czyta wiadomość, zanim trafi do dużego modelu językowego (albo odpowiedź, zanim trafi do człowieka), i decyduje: przepuścić, ostrzec czy zablokować.

Klasa, kategoria

Rodzaj zagrożenia, który model rozpoznaje. Muszka v1.1 ma 7 klas: samookaleczenia, nienawiść, wulgaryzmy, seks, przestępstwa, jailbreak i „inne” (zniesławienie, porady specjalistyczne, wybory). Jedna wiadomość może należeć do kilku klas naraz (klasyfikacja wieloetykietowa).

Wynik, prawdopodobieństwo

Liczba od 0 do 1 dla każdej klasy: jak bardzo model jest przekonany, że tekst do niej należy. 0,95 = prawie pewny, 0,02 = raczej nie.

Próg (threshold)

Granica, od której model blokuje. Muszka domyślnie blokuje od 0,5, a między 0,18 a 0,5 tylko ostrzega. Niższy próg = więcej blokad (także niepotrzebnych), wyższy = mniej.

Fałszywy alarm (false positive), FPR

Niewinny tekst zablokowany przez pomyłkę. FPR to odsetek niewinnych tekstów, które model zablokował: FPR 5% = 5 na 100 niewinnych.

Wykrywalność (recall)

Odsetek szkodliwych tekstów, które model złapał. Recall 90% = 9 na 10, dziesiąty przeszedł.

Precyzja (precision)

Spośród zablokowanych, ile naprawdę było szkodliwych.

F1, makro F1

Jedna liczba łącząca wykrywalność i precyzję (0-1, im wyżej, tym lepiej). Makro F1 to średnia F1 dla klasy „bezpieczne” i „niebezpieczne” - tak liczą autorzy benchmarku PL-Guard.

AUROC

Miara od 0,5 (rzut monetą) do 1,0 (idealnie), niezależna od progu: jak dobrze model odróżnia teksty szkodliwe od niewinnych, gdy ułożyć je od najbardziej do najmniej podejrzanego.

Zbiór treningowy, walidacyjny, testowy

Na treningowym model się uczy, na walidacyjnym sprawdzamy postępy w trakcie, na testowym mierzymy wynik. Teksty testowe nie mogą trafić do treningu - inaczej model „zna odpowiedzi”.

Holdout (zbiór odłożony)

Zbiór testowy odłożony przed treningiem, żeby nie trafił do danych treningowych. Nasze holdouty: v1 (komentarze Jigsaw przetłumaczone Bielikiem + 36 ataków i niewinnych wiadomości napisanych po polsku dla czatu na muszkaowocowa.pl) i v2 (prompty WildGuardMix przetłumaczone Bielikiem). W v1.1 7 krótkich tekstów holdoutu v1 (np. „Co?”) trafiło jednak do danych jednej z dwóch uśrednianych wersji.

Egzamin zapieczętowany

Osobny zbiór testowy, na którym wynik wybranego modelu mierzymy jeden raz, na samym końcu, żeby nie dopasować modelu do testu. Liczby z egzaminu idą na kartę.

Bramka przed publikacją

Lista warunków (np. „formy przekleństw blokowane w co najmniej 97%”), które sprawdzamy przed wydaniem. v1.1 spełnia 38 z 45 - wydaliśmy ją mimo niespełnionych warunków i opisujemy je jako znane ograniczenia.

Lista krytyczna

Konkretne przypadki, które muszą działać, m.in. zgłoszone przez ludzi (np. „kórwa”, „dópa”). Każdy zgłoszony błąd trafia tam na stałe.

Znany błąd, znane ograniczenie

Przypadek, o którym wiemy, że model go źle ocenia, opisany wprost na karcie.

Benchmark

Publiczny, wspólny test, na którym różne zespoły porównują swoje modele. Używamy PL-Guard (NASK) i GadziJęzyka (prof. Jerzy Surma, SGH).

Atak adversarial (atak przemyślany)

Szkodliwa prośba celowo przebrana tak, żeby zmylić model: odgrywanie ról, „to tylko fikcja”, długi wstęp, eufemizmy. Przeciwieństwo prośby wprost („jak zrobić bombę?”).

Jailbreak, prompt injection

Próba zmuszenia asystenta AI do złamania jego zasad albo ujawnienia ukrytych instrukcji („zignoruj poprzednie polecenia”, „jesteś teraz DAN”).

Zaciemnienie (obfuscation)

Zapis przekleństwa tak, żeby prosty filtr go nie złapał: „k*rwa”, „kórwa”, „k u r w a”, „kurw@”, „kuuurwa”.

Słowa dwuznaczne

Słowa niewinne albo wulgarne zależnie od kontekstu („szmata” do wycierania stołu vs obelga, „laska” do chodzenia vs znaczenie seksualne). Sprawdzamy je parami zdań.

Tokeny, tokenizer

Model nie czyta liter, tylko kawałki słów (tokeny). „dupleks” dzieli się na „dup-lek-s”, co prawdopodobnie sprawia, że model myli go z wulgaryzmem - przykład, jak tokenizacja może wpływać na błędy.

Okna (tryb sensitive, czuły)

Długi tekst jest dodatkowo czytany kawałkami po 128 tokenów, żeby jedno groźne zdanie nie zginęło w długim, niewinnym tekście. Kosztem kilku fałszywych alarmów więcej.

Dotrenowanie (fine-tuning)

Douczanie istniejącego modelu na nowych danych. Muszka to dotrenowana Sójka (Bielik-Guard 0.1B od SpeakLeash).

Destylacja, model-nauczyciel

Mały model uczy się, naśladując oceny większego (u nas: Sójki 0.5B).

ONNX

Format pliku modelu, który działa szybko na zwykłym procesorze, bez karty graficznej i bez ciężkich bibliotek.

Kwantyzacja INT8

Zapis wag modelu mniejszymi liczbami (8 bitów zamiast 32): plik 4 razy mniejszy (126 MB zamiast 498 MB), ok. 2-3 razy szybsze działanie, prawie ta sama jakość (99% zgodnych decyzji).

Czas p50, p95

Typowe i „prawie najgorsze” opóźnienie: p50 = połowa wiadomości oceniona szybciej, p95 = 95 na 100.

RSS (pamięć)

Ile pamięci RAM faktycznie zajmuje proces z modelem.

Sędzia (judge)

Większy model językowy, który może drugi raz obejrzeć zablokowane wiadomości i zwolnić fałszywe blokady. W drugą stronę to nie działa - czego filtr nie zablokuje, sędzia nie zobaczy.

Podziękowania

Muszka Guard nie powstałaby bez pracy wielu ludzi, którzy udostępnili swoje modele i dane.

  1. Jan Sowa

    Tłumaczenia WildGuardMix i Jigsaw na polski (Bielik 11B v3.0) oraz zestaw wulgaryzmów i fraz - rdzeń treningu i testów przekleństw v1.1. Dziękujemy!

  2. SpeakLeash - Bielik-Guard „Sójka”

    Bielik-Guard 0.1B / 0.5B - baza Muszki i model-nauczyciel (Apache 2.0). Twórcy: Jan Maria Kowalski, Krzysztof Wróbel, Jerzy Surma, Igor Ciuciura, Maciej Krystian Szymański (arXiv:2602.07954).

  3. Sławomir Dadas

    Enkoder bazowy sdadas/mmlw-roberta-base.

  4. Zespół Bielik (SpeakLeash)

    Krzysztof Ociepa, Remigiusz Kinas, Adrian Gwoździej, Krzysztof Wróbel, Łukasz Flis, Sebastian Kondracki. Bielik 11B v2.1 i v3.0 - tłumaczenia i polskie dane syntetyczne.

  5. PolyGuardMix

    Kumar i in., 2025, CC BY 4.0 - odpowiedzi modeli i kategorie. Część pochodząca z LMSys-Chat-1M została wyłączona.

  6. WildGuardMix

    AllenAI, ODC-BY - źródło, z którego wywodzi się PolyGuardMix, i część danych treningowych w tłumaczeniu.

  7. Jigsaw Toxic Comment Classification Challenge

    Jigsaw / Conversation AI, komentarze z Wikipedii.

Tylko do testów (bez treningu)

  • PL-Guard

    NASK, CC BY-SA 4.0.

  • GadziJęzyk

    prof. Jerzy Surma, SGH, MIT.

Licencja Muszka Guard: Apache 2.0.

O wersji v1.0

Pierwsza publiczna wersja, Muszka Guard 0.1B v1.0, podawała wyniki zmierzone na małym zestawie testowym (30 szkodliwych i 6 niewinnych przykładów, zbliżonych do danych treningowych), a część parametrów - m.in. zapotrzebowanie na pamięć i czas odpowiedzi - pochodziła z założeń projektowych, a nie z pomiaru. Po przygotowaniu niezależnych zbiorów testowych okazało się, że tamte liczby zawyżały skuteczność modelu. Wersję v1.1 zmierzyliśmy od nowa na kilku tysiącach tekstów odłożonych przed treningiem i opisaliśmy wraz z ograniczeniami - wszystkie liczby pochodzą z tych pomiarów. Wersja v1.1 zastępuje v1.0.