Model Behavior Diffing
Modelgedrag vergelijken voor en na incidenten: analyse van uitvoerverdelingen, detectie van veiligheidsregressies, het meten van capaciteitsveranderingen en het toetsen van statistische significantie.
Model Behavior Diffing
Behavior diffing vergelijkt de uitvoer van een model voor en na een vermoed incident, update of wijziging. Terwijl code-diffing je precies laat zien welke regels zijn veranderd, moet behavior diffing veranderingen afleiden uit de waarneembare uitvoer van het model -- omdat de "broncode" bestaat uit miljarden ondoorzichtige floating-pointparameters. Deze pagina behandelt technieken voor het detecteren en kwantificeren van gedragsveranderingen.
Wanneer te diffen
Behavior diffing is gerechtvaardigd in verschillende scenario's:
| Scenario | Wat je vergelijkt | Waar je naar zoekt |
|---|---|---|
| Onderzoek na een incident | Modelgedrag tijdens het incident vs. ervoor | Gedragsverschuivingen die het incident mogelijk maakten |
| Verificatie van een modelupdate | Nieuwe modelversie vs. vorige versie | Onbedoelde veiligheidsregressies geïntroduceerd door de update |
| Validatie van fine-tuning | Fijn-afgestemd model vs. basismodel | Veiligheidsverslechtering of onbedoelde capaciteitsveranderingen |
| Verificatie van de toeleveringsketen | Gedownload model vs. referentie van de aanbieder | Manipulatie tijdens distributie |
| Inspectie van een adapter | Model met adapter vs. model zonder adapter | Gedragsveranderingen geïntroduceerd door de adapter |
Ontwerp van de evaluatiesuite
Een behavior diff is alleen zo goed als de evaluatiesuite die je gebruikt. De suite moet de dimensies dekken die jou interesseren, met genoeg samples om statistische significantie te bereiken.
Dekking van dimensies
| Dimensie | Wat te evalueren | Minimale steekproefomvang |
|---|---|---|
| Veiligheidsweigeringen | Weigeringspercentage voor verzoeken om schadelijke content over categorieën heen | 200 prompts over 10+ schadecategorieën |
| Naleving van system prompt | Mate van naleving van instructies in de system prompt | 100 prompts die instructiegrenzen testen |
| Feitelijke nauwkeurigheid | Correctheid van kennisgebaseerde antwoorden | 200 feitelijke vragen met verifieerbare antwoorden |
| Uitvoerkenmerken | Lengte, toon, opmaak, woordenschat | 500 algemene prompts voor verdelingsanalyse |
| Capaciteitsbenchmarks | Taakprestaties (coderen, wiskunde, redeneren, samenvatten) | Standaard benchmarksuite per capaciteit |
| Jailbreak-weerstand | Weerstand tegen bekende jailbreak-technieken | 100+ jailbreak-prompts uit techniekcatalogi |
| Bias en fairness | Verschillende behandeling van beschermde groepen | 200+ prompts die demografische attributen variëren |
Principes voor promptontwerp
| Principe | Beschrijving | Voorbeeld |
|---|---|---|
| Gepaarde evaluatie | Gebruik identieke prompts voor beide modelversies | Dezelfde 200 veiligheidsprompts uitgevoerd tegen beide versies |
| Categoriebalans | Gelijke vertegenwoordiging over categorieën | 20 prompts per schadecategorie, niet 190 in één en 10 in negen |
| Moeilijkheidsbereik | Mix van eenvoudige en moeilijke gevallen | Neem zowel duidelijke als subtiele tests van veiligheidsgrenzen op |
| Deterministische instellingen | Voer de evaluatie waar mogelijk uit op temperature 0 | Vermindert ruis; toont modaal gedrag |
| Meerdere temperaturen | Test ook op de deployment-temperature | Vangt het gedrag dat gebruikers daadwerkelijk ervaren |
Analyse van uitvoerverdelingen
Vergelijking van tokenverdelingen
Vergelijk de kansverdelingen over de woordenschat tussen modelversies.
import numpy as np
from scipy.stats import entropy
def compare_output_distributions(model_a, model_b, prompts, top_k=100):
"""
Vergelijk uitvoertokenverdelingen tussen twee modellen
met KL-divergentie en JS-divergentie.
"""
results = []
for prompt in prompts:
logits_a = model_a.get_logits(prompt)
logits_b = model_b.get_logits(prompt)
# Converteer naar kansen
probs_a = softmax(logits_a)[:top_k]
probs_b = softmax(logits_b)[:top_k]
# KL- en JS-divergentie
kl_div = entropy(probs_a, probs_b)
js_div = jensenshannon(probs_a, probs_b)
results.append({
"prompt": prompt,
"kl_divergence": kl_div,
"js_divergence": js_div,
"top_token_a": decode(np.argmax(logits_a)),
"top_token_b": decode(np.argmax(logits_b))
})
return resultsVerdelingsveranderingen interpreteren
| JS-divergentiebereik | Interpretatie |
|---|---|
| < 0,05 | Verwaarloosbaar verschil; modellen gedragen zich in wezen hetzelfde |
| 0,05 - 0,15 | Kleine verschillen; kunnen kwantisatie- of kleine update-effecten zijn |
| 0,15 - 0,30 | Matige verschillen; rechtvaardigt onderzoek van specifieke prompts |
| > 0,30 | Significante gedragsverandering; hoge prioriteit voor forensische beoordeling |
Detectie van veiligheidsregressies
Veiligheidsregressie is de meest voorkomende en hoogst geprioriteerde bevinding in behavior diffing.
Meten van regressie
def measure_safety_regression(model_a, model_b, safety_prompts):
"""
Vergelijk weigeringspercentages tussen twee modellen op veiligheidskritische prompts.
"""
results_a = [is_refusal(model_a.generate(p)) for p in safety_prompts]
results_b = [is_refusal(model_b.generate(p)) for p in safety_prompts]
refusal_rate_a = sum(results_a) / len(results_a)
refusal_rate_b = sum(results_b) / len(results_b)
# Toets op statistische significantie
from scipy.stats import chi2_contingency
table = [
[sum(results_a), len(results_a) - sum(results_a)],
[sum(results_b), len(results_b) - sum(results_b)]
]
chi2, p_value, _, _ = chi2_contingency(table)
return {
"refusal_rate_a": refusal_rate_a,
"refusal_rate_b": refusal_rate_b,
"change": refusal_rate_b - refusal_rate_a,
"p_value": p_value,
"significant": p_value < 0.05
}Analyse op categorieniveau
Algehele weigeringspercentages kunnen categoriespecifieke regressies maskeren. Analyseer veiligheidsprestaties altijd per categorie:
| Categorie | Weigeringspercentage Model A | Weigeringspercentage Model B | Verandering | Significant? |
|---|---|---|---|---|
| Gewelddadige content | 95% | 93% | -2% | Nee (p=0,42) |
| Zelfbeschadiging | 97% | 96% | -1% | Nee (p=0,61) |
| Openbaarmaking van PII | 88% | 72% | -16% | Ja (p<0,001) |
| Illegale activiteit | 92% | 90% | -2% | Nee (p=0,38) |
| Lek van system prompt | 85% | 64% | -21% | Ja (p<0,001) |
Meten van capaciteitsveranderingen
Onverwachte capaciteitsveranderingen kunnen op manipulatie wijzen, zelfs wanneer veiligheidsmetrieken stabiel zijn.
Wat te meten
| Capaciteit | Benchmark | Manipulatiesignaal |
|---|---|---|
| Codegeneratie | HumanEval, MBPP | Verbeterde codekwaliteit kan code-patronen met een backdoor maskeren |
| Redeneren | GSM8K, ARC, MMLU | Veranderingen in redeneren duiden op gewichtswijzigingen |
| Samenvatten | ROUGE-scores op standaarddatasets | Capaciteitsveranderingen die niet worden verklaard door fine-tuning-doelstellingen |
| Vertalen | BLEU-scores over taalparen | Taalspecifieke veranderingen kunnen op gerichte modificatie wijzen |
| Instructievolgen | IFEval, MT-Bench | Veranderingen in hoe het model instructies interpreteert en volgt |
Capaciteitsveranderingen interpreteren
| Veranderingspatroon | Mogelijke oorzaak | Onderzoeksprioriteit |
|---|---|---|
| Uniforme lichte verbetering | Legitieme modelupdate | Laag |
| Uniforme lichte verslechtering | Kwantisatie of compressie | Laag |
| Verbetering alleen in specifieke taken | Gerichte fine-tuning (legitiem of kwaadaardig) | Gemiddeld |
| Verslechtering van veiligheid met capaciteitsverbetering | Mogelijke afweging tussen veiligheid en capaciteit bij fine-tuning | Hoog |
| Geen capaciteitsverandering maar wel veiligheidsregressie | Veiligheidsalignment specifiek verzwakt | Kritiek |
Sjabloon voor diff-rapport
Documenteer de resultaten van behavior diffing in een gestructureerd formaat:
## Behavior Diff Report
**Model A:** [identifier, version, date deployed]
**Model B:** [identifier, version, date deployed]
**Evaluation Date:** [date]
**Evaluator:** [name]
### Summary
[1-2 sentence summary of key findings]
### Safety Regression Analysis
| Category | Model A | Model B | Change | p-value | Significant |
|---|---|---|---|---|---|
| [category] | [rate] | [rate] | [delta] | [p] | [yes/no] |
### Output Distribution Analysis
- Mean JS Divergence: [value]
- Categories with JS > 0.15: [list]
- Top divergent prompts: [list with divergence values]
### Capability Benchmarks
| Benchmark | Model A | Model B | Change |
|---|---|---|---|
| [benchmark] | [score] | [score] | [delta] |
### Forensic Assessment
[Analysis of whether changes indicate tampering, legitimate update, or natural drift]
### Recommendations
[Next steps based on findings]Behavior diffing automatiseren
Voor organisaties die modellen vaak updaten, automatiseer behavior diffing als onderdeel van de deployment-pipeline:
| Integratiepunt | Wat te testen | Slaag-/zakcriteria |
|---|---|---|
| Pre-deployment-gate | Volledige evaluatiesuite | Geen veiligheidsregressie > 5%, geen capaciteitsverandering > 10% |
| Monitoring na deployment | Continue sampling uit productie | Gedragsmetrieken blijven binnen baseline-grenzen |
| Geplande audits | Uitgebreide diff tegen de laatste audit | Alle bevindingen gedocumenteerd en getrieerd |
Gerelateerde onderwerpen
- Backdoor Detection -- gespecialiseerde detectie wanneer diffing anomalieën onthult
- Tampering Detection -- verificatie op bestandsniveau die gedragsanalyse aanvult
- Model Snapshots -- modelversies bewaren voor toekomstige diffing
- Severity Framework -- de ernst van gedetecteerde regressies scoren
Referenties
- "Language Model Evaluation Harness" - EleutherAI (2025) - Open-source evaluation framework for language model benchmarking
- "Holistic Evaluation of Language Models (HELM)" - Stanford CRFM (2024) - Comprehensive evaluation methodology
- "Statistical Methods for AI Safety Evaluation" - arXiv (2025) - Statistical frameworks for behavioral comparison
- "DeepEval: LLM Evaluation Framework" - Confident AI (2025) - Automated evaluation and regression detection
Het algehele veiligheidsweigeringspercentage van een model daalde na een update van 91% naar 88%. Is dit een significante veiligheidsregressie?