A benchmark futtatása után a kezedben van egy halom nyers adat: válaszidők, pontossági mutatók, sikeres és sikertelen tesztesetek száma. De mit jelentenek ezek valójában? Ha az új modell 91%-os pontosságot ér el a régi 90%-ával szemben, az valódi előrelépés, vagy csak a véletlen műve? A statisztikai kiértékelők adják meg a választ, áthelyezve az elemzést a megérzések világából a számszerűsíthető bizonyosság talajára.
A p-értéken túl: Miért van szükség statisztikára?
A Red Teaming során gyakran két vagy több modellvariánst, prompt-stratégiát vagy védelmi mechanizmust hasonlítunk össze. A puszta átlagok vagy százalékok összevetése megtévesztő lehet. A statisztikai szignifikancia tesztek segítenek eldönteni, hogy a megfigyelt különbségek valósak-e, vagy csupán a mintavételezésből adódó zaj eredményei.
A célunk nem egy p-érték hajszolása, hanem annak megértése, hogy mekkora a bizalmunk egy adott következtetésben. Egy statisztikailag szignifikáns, de gyakorlatilag elhanyagolható különbség (pl. 0.01% javulás) nem feltétlenül ér meg egy költséges modellfrissítést. A statisztikai eszközök segítenek ebben a mérlegelésben.
Alapvető statisztikai tesztek a Red Teaming arzenálban
Nézzünk néhány konkrét, Pythonban könnyen implementálható eszközt, amelyek a mindennapi munkád során azonnali értéket teremtenek.
A/B tesztek szignifikanciája (Khi-négyzet teszt)
Kategorikus adatok összehasonlítására tökéletes. Például, ha azt vizsgálod, hogy egy új prompt-technika (B verzió) hatására szignifikánsan csökkent-e a káros tartalmat generáló válaszok aránya a régihez (A verzió) képest.
Tegyük fel, a tesztek után a következő kontingencia táblázatot kapod:
| Modell Verzió | Sikeres védekezés | Sikertelen védekezés |
|---|---|---|
| Modell A (régi) | 850 | 150 |
| Modell B (új) | 920 | 80 |
import numpy as np
from scipy.stats import chi2_contingency
# A fenti táblázat adatai
observed = np.array([[850, 150], [920, 80]])
# Khi-négyzet teszt futtatása
chi2, p_value, dof, expected = chi2_contingency(observed)
print(f"P-érték: {p_value:.5f}")
# Értelmezés
alpha = 0.05 # Szignifikancia szint
if p_value < alpha:
print("A különbség statisztikailag szignifikáns.")
else:
print("A különbség nem szignifikáns, valószínűleg a véletlen műve.")
# Eredmény: A különbség statisztikailag szignifikáns.
Az alacsony p-érték (< 0.05) azt sugallja, hogy a B modell javulása nem véletlenszerű, hanem a változtatásaink valós hatása.
Teljesítménymutatók összevetése (Független mintás t-próba)
Folytonos változók (pl. válaszidő, toxicitási pontszám) átlagainak összehasonlítására használjuk. Azt vizsgáljuk, hogy két független csoport (pl. két különböző modell által generált válaszok) átlagos pontszáma szignifikánsan eltér-e egymástól.
from scipy.stats import ttest_ind
import numpy as np
# Szimulált válaszidők (ezredmásodpercben) két modellre
model_A_latencies = np.random.normal(loc=120, scale=20, size=500)
model_B_latencies = np.random.normal(loc=115, scale=22, size=520)
# Független mintás t-próba
stat, p_value = ttest_ind(model_A_latencies, model_B_latencies)
print(f"P-érték: {p_value:.5f}")
if p_value < 0.05:
print("A két modell átlagos válaszideje szignifikánsan eltér.")
else:
print("Nincs szignifikáns különbség a válaszidőkben.")
Konfidenciaintervallumok számítása
Egyetlen metrika (pl. pontosság) közlése helyett sokkal informatívabb egy intervallumot megadni, amely nagy valószínűséggel tartalmazza a valódi értéket. Ez megmutatja a mérésünk bizonytalanságát.
import numpy as np
from scipy import stats
# Tegyük fel, 1000 tesztesetből 880 lett sikeres
successes = 880
n = 1000
confidence_level = 0.95
# Pontosság (arány)
p_hat = successes / n
# Konfidenciaintervallum kiszámítása normál approximációval
z_score = stats.norm.ppf((1 + confidence_level) / 2)
margin_of_error = z_score * np.sqrt((p_hat * (1 - p_hat)) / n)
lower_bound = p_hat - margin_of_error
upper_bound = p_hat + margin_of_error
print(f"A modell pontossága: {p_hat:.2%}")
print(f"{confidence_level:.0%}-os konfidenciaintervallum: [{lower_bound:.2%}, {upper_bound:.2%}]")
Ez a riport sokkal professzionálisabb: „A modell pontossága 88.00%, 95%-os konfidenciával a [85.94%, 90.06%] intervallumban.”
A hibák eloszlásának vizsgálata
A statisztika nem csak az aggregált mutatókról szól. Fontos megvizsgálni a hibák eloszlását is. A modell véletlenszerűen téved, vagy van egy szisztematikus mintázat a hibáiban? Egy hisztogram gyorsan felfedheti, ha a modell például a kiugróan magas toxicitású válaszok felé hajlik, még ha az *átlagos* toxicitása alacsony is.
A ‘B’ diagramon látható jobbra ferde eloszlás egyértelműen jelzi, hogy a modell hajlamos a nagy mértékű hibákra egy bizonyos irányban. Ez egy kritikus Red Teaming felismerés, ami az átlagokból nem derülne ki.
Gyakorlati megfontolások és buktatók
- Többszörös összehasonlítás problémája: Ha sok tesztet futtatsz (pl. 20 különböző metrikát vizsgálsz), pusztán a véletlen miatt is találni fogsz statisztikailag szignifikáns eredményt. Ilyenkor korrekciókra van szükség (pl. Bonferroni-korrekció), ami szigorúbbá teszi a szignifikancia-küszöböt.
- Statisztikai vs. gyakorlati szignifikancia: Egy eredmény lehet statisztikailag szignifikáns, de a gyakorlatban irreleváns. A hatásméret (effect size, pl. Cohen’s d) segít számszerűsíteni a különbség nagyságát. Egy apró, de statisztikailag szignifikáns javulás nem biztos, hogy megéri a bevezetés költségeit.
- A mintaméret számít: Túl kis mintán végzett tesztek eredményei megbízhatatlanok. A statisztikai kiértékelés előtt győződj meg róla, hogy elegendő adatpontot gyűjtöttél a megalapozott következtetésekhez.
Összefoglalva, a statisztikai kiértékelő szkriptek nem csupán matematikai formalitások. Ezek azok az eszközök, amelyek a nyers adathalmazt értelmes, cselekvésre váltható üzleti és műszaki intelligenciává alakítják. A használatuk választja el a professzionális, adatalapú Red Teaminget a felszínes tesztelgetéstől.