Statistische rigueur in AI-red-teaming
Statistische methodologie voor AI-red-teaming: steekproefgroottebepaling, betrouwbaarheidsintervallen, hypothesetoetsing voor veiligheidsclaims, omgaan met non-determinisme en het vermijden van veelvoorkomende statistische valkuilen.
AI-red-teaming houdt in dat je stochastische systemen test met stochastische methoden. Een model kan een prompt 9 van de 10 keer weigeren maar de 10e keer meewerken. Zonder statistische rigueur zou een red teamer die de prompt eenmaal uitvoerde "veilig" rapporteren, terwijl een ander die hem tien keer uitvoerde "kwetsbaar" zou rapporteren. Beide kunnen niet gelijk hebben, en geen van beide rapporten is volledig zonder de onzekerheid te kwantificeren.
Het probleem van non-determinisme
Waarom LLM's variabele output produceren
| Bron van variabiliteit | Beschrijving | Impact op evaluatie |
|---|---|---|
| Temperature-sampling | Een hogere temperature verhoogt de willekeur van de output | Dezelfde prompt kan veilige en onveilige responses produceren |
| Top-k / top-p-filtering | De samplingstrategie beïnvloedt tokenselectie | Verschillende runs kiezen verschillende responspaden |
| Effecten van batchvolgorde | De volgorde van eerdere prompts kan gedrag beïnvloeden | Resultaten kunnen afhangen van de evaluatievolgorde |
| Systeembelasting | De API-provider kan naar verschillende model-instances routeren | Subtiele gedragsverschillen tussen instances |
| Toestand van het contextvenster | Eerdere conversatie beïnvloedt latere responses | Multi-turn-evaluaties zijn padafhankelijk |
Variabiliteit kwantificeren
# Measure response variability for a single prompt
import numpy as np
def measure_variability(prompt: str, model, n_trials: int = 50) -> dict:
"""Run a prompt multiple times and measure outcome distribution."""
results = []
for _ in range(n_trials):
response = model.generate(prompt)
is_violation = judge(response)
results.append(is_violation)
violation_rate = np.mean(results)
std_error = np.sqrt(violation_rate * (1 - violation_rate) / n_trials)
ci_95 = (violation_rate - 1.96 * std_error,
violation_rate + 1.96 * std_error)
return {
"violation_rate": violation_rate,
"std_error": std_error,
"ci_95_lower": max(0, ci_95[0]),
"ci_95_upper": min(1, ci_95[1]),
"n_trials": n_trials
}Steekproefgroottebepaling
Hoeveel prompts zijn genoeg?
De vereiste steekproefgrootte hangt af van de precisie die je nodig hebt en de verwachte ratio van veiligheidsschendingen.
| Verwachte ASR | Gewenste foutmarge | Vereiste steekproefgrootte (95% BI) |
|---|---|---|
| 50% | +/- 5% | 385 |
| 50% | +/- 3% | 1.068 |
| 10% | +/- 5% | 139 |
| 10% | +/- 3% | 385 |
| 5% | +/- 2% | 457 |
| 1% | +/- 1% | 381 |
Formule voor steekproefgrootte
n = (Z^2 * p * (1 - p)) / E^2
Where:
n = required sample size
Z = Z-score for desired confidence level (1.96 for 95%)
p = expected proportion (ASR estimate)
E = desired margin of error
De regel van drie
Wanneer je nul gebeurtenissen waarneemt in n pogingen, is de 95%-betrouwbaarheidsbovengrens voor de werkelijke ratio bij benadering 3/n.
| Pogingen (n) | Waargenomen successen | 95%-bovengrens |
|---|---|---|
| 20 | 0 | 15,0% |
| 50 | 0 | 6,0% |
| 100 | 0 | 3,0% |
| 300 | 0 | 1,0% |
| 1.000 | 0 | 0,3% |
Dit betekent: om met 95% betrouwbaarheid te claimen dat de werkelijke ASR onder 1% ligt, heb je ten minste 300 pogingen met nul successen nodig.
Betrouwbaarheidsintervallen voor red-team-metrics
Intervallen construeren
| Metric | Type interval | Wanneer te gebruiken |
|---|---|---|
| ASR | Wilson score-interval | Voorkeur voor proporties, vooral nabij 0% of 100% |
| Gemiddelde severity-score | t-interval | Wanneer severity op een continue schaal staat |
| Mediane responstijd | Bootstrap-interval | Voor niet-normale verdelingen |
| Categoriespecifieke ASR | Wilson met Bonferroni-correctie | Bij het gelijktijdig rapporteren van meerdere categorieën |
Wilson score-interval (aanbevolen voor ASR)
from scipy import stats
def wilson_interval(successes: int, trials: int,
confidence: float = 0.95) -> tuple:
"""Calculate Wilson score confidence interval for a proportion."""
z = stats.norm.ppf(1 - (1 - confidence) / 2)
p_hat = successes / trials
denominator = 1 + z**2 / trials
center = (p_hat + z**2 / (2 * trials)) / denominator
margin = (z / denominator) * np.sqrt(
p_hat * (1 - p_hat) / trials + z**2 / (4 * trials**2)
)
return (max(0, center - margin), min(1, center + margin))
# Example: 5 successes out of 200 trials
lower, upper = wilson_interval(5, 200)
# ASR: 2.5%, 95% CI: [1.1%, 5.7%]Hypothesetoetsing voor veiligheidsclaims
Veelvoorkomende veiligheidsclaims en hun toetsen
| Claim | Nulhypothese | Toets | Vereist bewijs |
|---|---|---|---|
| "Model A is veiliger dan Model B" | ASR_A >= ASR_B | Tweeproportie-z-toets | Significant verschil bij p < 0,05 |
| "De update verlaagde de ASR" | ASR_after >= ASR_before | Gepaarde-proportietoets | Significante verlaging bij p < 0,05 |
| "ASR ligt onder 5%" | ASR >= 0,05 | Eenproportie-z-toets | Verwerpen bij p < 0,05 met waargenomen ASR < 5% |
| "Het model is even veilig over talen heen" | ASR varieert per taal | Chi-kwadraattoets | Niet-significant resultaat (p > 0,05) |
Twee modellen vergelijken
from scipy.stats import proportions_ztest
def compare_models(successes_a: int, trials_a: int,
successes_b: int, trials_b: int) -> dict:
"""Test whether two models have significantly different ASR."""
stat, p_value = proportions_ztest(
[successes_a, successes_b],
[trials_a, trials_b],
alternative='two-sided'
)
return {
"asr_a": successes_a / trials_a,
"asr_b": successes_b / trials_b,
"z_statistic": stat,
"p_value": p_value,
"significant": p_value < 0.05
}Correctie voor meervoudig toetsen
Wanneer je meerdere categorieën toetst of veel gelijktijdige vergelijkingen maakt, neemt het risico op fout-positieven toe.
| Correctiemethode | Wanneer te gebruiken | Hoe het werkt |
|---|---|---|
| Bonferroni | Weinig vergelijkingen (< 10) | Deel het significantieniveau door het aantal toetsen |
| Holm-Bonferroni | Gematigd aantal vergelijkingen | Step-down-procedure, minder conservatief |
| Benjamini-Hochberg | Veel vergelijkingen | Beheerst de false discovery rate in plaats van de family-wise error |
Als je de ASR voor 10 OWASP-categorieën rapporteert en "significante verbetering" claimt in een willekeurige categorie bij p < 0,05, is er zonder correctie 40% kans op ten minste één fout-positief.
Veelvoorkomende statistische valkuilen
| Valkuil | Voorbeeld | Correctie |
|---|---|---|
| Onvoldoende steekproefgrootte | "0/20 aanvallen slaagden, model is veilig" | Rapporteer betrouwbaarheidsinterval: "0/20, 95% BI: [0%, 15%]" |
| Cherry-picking van resultaten | Alleen de beste evaluatierun rapporteren | Rapporteer alle runs of registreer het evaluatieprotocol vooraf |
| Non-determinisme negeren | Elke prompt eenmaal uitvoeren | Voer elke prompt meerdere keren uit bij deployment-temperature |
| p-hacking | Veel prompts testen tot er een werkt, dit rapporteren als "een kwetsbaarheid gevonden" | Onderscheid exploratief (vinden) van confirmatoir (meten) testen |
| Survivorship bias | Alleen geslaagde aanvallen rapporteren | Rapporteer de volledige noemer: "5/200 aanvallen slaagden" |
| Verwaarlozing van basisratio | Een lage ASR interpreteren als "veilig" zonder context | Vergelijk met branchebenchmarks en acceptabele risicodrempels |
Statistische resultaten rapporteren
Minimale rapportagevereisten
Elke kwantitatieve red-teambevinding moet bevatten:
- De metric-waarde (bijv. ASR = 4,2%)
- Het betrouwbaarheidsinterval (bijv. 95% BI: [2,8%, 6,1%])
- De steekproefgrootte (bijv. n = 500 prompts, 3 pogingen elk)
- De condities (bijv. temperature = 0,7, modelversie X)
- De evaluatiedatum en datasetversie
Gerelateerde onderwerpen
- AI-veiligheidsbenchmarks & evaluatie -- benchmarklandschap en evaluatiemethodologie
- Evaluatieharnassen bouwen -- infrastructuur voor het uitvoeren van evaluaties
- Red-team-metrics voorbij ASR -- uitgebreid metrics-framework
- Red-teamresultaten visualiseren -- statistische resultaten visueel presenteren
Referenties
- "Statistical Methods for AI Safety Evaluation" - Anthropic (2024) - Methodology for confidence intervals and hypothesis testing in AI red team evaluations
- "The Rule of Three in Clinical Trials" - Hanley & Lippman-Hand, Journal of the American Medical Association (1983) - Original derivation of the rule of three for zero-event estimation
- "HarmBench: A Standardized Evaluation Framework for Automated Red Teaming" - Mazeika et al. (2024) - Statistical methodology for standardized AI safety benchmarking
- "Sample Size Determination for Proportions" - Agresti & Coull, The American Statistician (1998) - Wilson score interval methodology recommended for proportion-based metrics
Een red team voert 50 testprompts uit tegen een model en neemt nul geslaagde aanvallen waar. Wat kunnen zij met 95% betrouwbaarheid claimen?