Cztery małe modele na Hugging Face: decyzja zamiast generowanego tekstu

Na moim profilu na Hugging Face są cztery modele: Serin, Bullfinch, Shrike i Jay. Łączy je jeden pomysł: model nie pisze odpowiedzi, tylko wybiera jedną z podanych opcji i podaje prawdopodobieństwo każdej z nich.
Dlaczego decyzja, a nie tekst
W wielu zadaniach akapit tekstu nie jest potrzebny. Potrzebna jest odpowiedź na konkretne pytanie: czy atak na chatbota się udał, jak poważna jest ta podatność, czy ta wersja paczki npm jest złośliwa. Wynik z prawdopodobieństwem da się posortować i porównać z progiem, a człowiek może zacząć od przypadków, co do których model jest najmniej pewny.
Jak to działa
Każdy z czterech modeli to adapter LoRA na Qwen3.5-4B. Podczas treningu baza jest zamrożona w 4 bitach, a uczy się tylko adapter. Model dostaje tekst, pytanie i opcje oznaczone literami, a odpowiedź pochodzi z logitów tych liter w jednym przejściu przez sieć na pytanie. Nic nie jest generowane. W każdym przykładzie treningowym kolejność opcji jest losowa, żeby pozycja litery nie zdradzała odpowiedzi.
Wszystkie działają w 4 bitach na karcie graficznej w laptopie lub domowym komputerze, więc analizowane dane mogą zostać na Twoim sprzęcie.
Serin 4B: sędzia w audytach chatbotów
Serin czyta jedną wymianę z chatbotem i odpowiada na pytanie typu „czy atak się udał?”. Powstał jako sędzia do audytów polskich chatbotów w Kanari. Transkrypty audytu nie opuszczają komputera.
Test objął 216 odpowiedzi z przebiegów Kanari na moich przykładowych botach (sklep, bank, przychodnia i celowo słaby bot), w tym 33 podatne. Serin z uśrednianiem opcji pominął 3 z nich i dał 5 fałszywych alarmów na 183 bezpieczne odpowiedzi (AUC 0,971). Komercyjne API Jev 1.13.0 pominęło 5, ale fałszywe alarmy miało tylko 2 (AUC 0,983), czyli lepiej szereguje odpowiedzi. Sam Qwen3.5-4B przed treningiem dał 131 fałszywych alarmów. 33 przypadki podatne to mała próba: jeden pominięty zmienia wskaźnik o 3 punkty.
Bullfinch 4B: małe decyzje po polsku
Bullfinch odpowiada na pytania po polsku: wybór z listy, tak lub nie, ocena w 5 stopniach. Trenowałem go wyłącznie na etykietach ludzkich lub źródłowych z otwartych polskich zbiorów danych, a kod i ewaluacja są na GitHubie.
Na 24 168 wierszach z 9 zbiorów testowych średnia trafność wynosi 85,8%. Qwen3.5-4B bez strojenia ma 77,7%, a basal 2.0 4.5B 85,3%. Różnica względem basala mieści się w błędzie (przedział ufności 95%: od -0,3 do +1,3 punktu), więc pod względem trafności te modele są na równi. Bullfinch ma lepiej skalibrowane prawdopodobieństwa: średni błąd kalibracji 2,5% wobec 4,6%. Słabiej wypada tam, gdzie liczy się wiedza o Polsce: na polskich pytaniach egzaminacyjnych (INCLUDE) ma 57,1%, a basal 63,3%.
Shrike 4B: pierwsza ocena podatności
Coraz więcej nowych CVE nie ma oceny. Spośród CVE opublikowanych w 2024 roku wektor CVSS v3 od NVD ma 58%, z 2025 roku 35%, a z 2026 roku na razie 16%. Shrike czyta opis CVE i szacuje osiem metryk bazowych CVSS v3.1 oraz typ słabości (CWE). Ocena liczbowa jest wyliczana z przewidzianego wektora wzorami CVSS, więc zawsze się z nim zgadza.
Na 500 CVE z lat 2025-2026, których nie było w treningu, Shrike trafia cały wektor w 44,0% przypadków (Qwen bez strojenia: 10,8%), poziom ważności w 65,2% (45,4%), a CWE w 80,6% (50,5%). Średni błąd oceny bazowej to 0,97 (1,65). Dla skali: gdy CVE z 2024 roku oceniły i NVD, i zgłaszająca organizacja (CNA), cały wektor zgadzał się w 28,2% z 16 020 przypadków. To szacunek, nie oficjalna ocena: gdy pojawi się wektor NVD lub CNA, ma on pierwszeństwo.
Jay 4B: złośliwe paczki npm
Blokowanie skryptów instalacyjnych, domyślne w pnpm 10, zatrzymuje ataki uruchamiane z preinstall lub postinstall. W 2026 roku 35% wersji zbudowanych do ataku w otwartym zbiorze DataDog uruchamia się jednak dopiero przy imporcie paczki, bez żadnego hooka. Jay czyta package.json, listę plików i kod, więc nie ma dla niego znaczenia, jak kod się uruchamia. Odpowiada, czy wersja jest złośliwa, a jeśli tak, czy paczkę zbudowano do ataku, czy ją przejęto.
Test objął 1992 paczki npm, które pojawiły się po raz pierwszy w 2026 roku i nie brały udziału w treningu. Jay ma AUROC 0,927, a GuardDog 3.2.0 0,820. Wykrywa 81% wersji zbudowanych do ataku przy 1,3% fałszywych alarmów na losowych paczkach. Największa słabość to przejęte biblioteki: wykrywa 40%, a GuardDog przy dowolnym poziomie ryzyka 80%, tyle że kosztem 23% fałszywych alarmów. Jay widzi około 6000 znaków kodu, więc nie widzi tego, co leży poza tym limitem, w plikach binarnych albo jest pobierane w trakcie działania. Na razie obsługuje tylko npm.
Czego się po nich spodziewać
To narzędzia do wstępnej selekcji. Wynik Jaya poniżej 0,5 nie oznacza, że paczka jest bezpieczna, Shrike nie zastępuje oceny NVD, a Serin był trenowany na danych syntetycznych i publicznych, więc na prawdziwych transkryptach jego wyniki mogą być inne. Każdą flagę powinien sprawdzić człowiek, a przed wdrożeniem warto przetestować model na własnych danych.
Shrike uczył się około 3 godzin 40 minut na GPU w laptopie, a Jay około 5 godzin na jednym GPU w komputerze stacjonarnym, razem z ewaluacjami i bez płatnej mocy obliczeniowej.
Serin, Shrike i Jay są na licencji Apache 2.0, Bullfinch na CC BY-SA 4.0, bo większość jego danych treningowych ma tę licencję. Pełne tabele wyników, dane treningowe i ograniczenia są w kartach modeli: