Watermarking & detectie van AI-gegenereerde tekst
Statistische watermarking-schema's voor LLM-uitvoer, detectoren voor AI-gegenereerde tekst, hun cryptografische grondslagen, en systematische technieken om watermerken te ontwijken of te verwijderen.
Watermarking en detectie van AI-gegenereerde tekst vormen de poging van de verdediger om de herkomst van modeluitvoer te bewaren. Voor red teamers is begrip van deze mechanismen essentieel -- zowel om hun robuustheid te beoordelen als om te evalueren of downstream-beveiligingsaannames die op de aanwezigheid van een watermerk berusten, deugdelijk zijn.
Taxonomie van watermarking-schema's
| Schematype | Mechanisme | Robuustheid | Impact op kwaliteit | Detectiecomplexiteit |
|---|---|---|---|---|
| Tokenniveau (Kirchenbauer et al.) | Verdeling in groene/rode lijst per tokenpositie | Gemiddeld -- gevoelig voor parafrasering | Laag bij gematigde bias (delta ~1-2) | O(n) met geheime sleutel |
| Distributieverschuiving | Subtiele bias over de volledige uitvoerdistributie | Hoger -- overleeft lichte bewerking | Zeer laag | Vereist statistische test |
| Semantische watermarking | Bedt signaal in de betekenis in in plaats van in specifieke tokens | Hoogst -- overleeft parafrasering | Gemiddeld | Vereist embeddingmodel |
| Multi-bit | Codeert payload (gebruikers-ID, tijdstempel) in het watermerk | Wisselend | Gemiddeld -- meer bits = meer vervorming | Vereist sleutel + decoder |
| Onbevooroordeeld (Christ et al.) | Behoudt de uitvoerdistributie perfect | Hoge theoretische garanties | Geen (aantoonbaar onbevooroordeeld) | Vereist volledige sleutel |
Hoe watermarking op tokenniveau werkt
Het meest ingezette schema (gebaseerd op Kirchenbauer et al., 2023) werkt tijdens inferentie:
import hashlib
import numpy as np
class WatermarkLogitsProcessor:
"""Vereenvoudigde watermerkinjectie tijdens LLM-inferentie."""
def __init__(self, secret_key: bytes, gamma: float = 0.5, delta: float = 2.0):
self.secret_key = secret_key
self.gamma = gamma # fractie van de woordenschat in de groene lijst
self.delta = delta # logit-bias toegevoegd aan groene-lijst-tokens
def get_green_list(self, prev_token_id: int, vocab_size: int) -> set:
"""Verdeel de woordenschat deterministisch in groene/rode lijsten."""
seed = hashlib.sha256(
self.secret_key + prev_token_id.to_bytes(4, "big")
).digest()
rng = np.random.RandomState(
int.from_bytes(seed[:4], "big")
)
green_count = int(vocab_size * self.gamma)
green_list = set(rng.choice(vocab_size, green_count, replace=False))
return green_list
def __call__(self, prev_token_id: int, logits: np.ndarray) -> np.ndarray:
"""Voeg delta-bias toe aan de logits van groene-lijst-tokens."""
green_list = self.get_green_list(prev_token_id, len(logits))
modified = logits.copy()
for token_id in green_list:
modified[token_id] += self.delta
return modifiedDetectiealgoritme
from scipy import stats
def detect_watermark(
text_token_ids: list[int],
secret_key: bytes,
vocab_size: int,
gamma: float = 0.5,
) -> dict:
"""Test of de tekst een statistisch watermerk bevat."""
green_count = 0
total = len(text_token_ids) - 1 # eerste token overslaan (geen voorganger)
for i in range(1, len(text_token_ids)):
prev_id = text_token_ids[i - 1]
green_list = get_green_list(prev_id, vocab_size, secret_key, gamma)
if text_token_ids[i] in green_list:
green_count += 1
# Onder de nulhypothese (geen watermerk) is de groene fractie ~ gamma
z_score = (green_count - gamma * total) / np.sqrt(total * gamma * (1 - gamma))
p_value = 1 - stats.norm.cdf(z_score)
return {
"green_fraction": green_count / total,
"z_score": z_score,
"p_value": p_value,
"watermarked": z_score > 4.0, # drempelwaarde
}Detectie van AI-gegenereerde tekst (zonder watermerk)
Naast watermarking proberen statistische detectoren AI-gegenereerde tekst te identificeren zonder medewerking van het genererende model.
Detectorcategorieën
| Detectortype | Aanpak | Sterke punten | Zwakke punten |
|---|---|---|---|
| Op perplexiteit gebaseerd | AI-tekst heeft lagere perplexiteit onder een referentiemodel | Eenvoudig, geen training nodig | Hoge fout-positieve rate bij formulaïsche menselijke tekst |
| Getrainde classifiers | ML-model getraind op paren van menselijke vs. AI-tekst | Kan subtiele distributiepatronen vastleggen | Broos bij domeinverschuiving, nieuwe modellen |
| Zero-shot (DetectGPT) | Op verstoring gebaseerd: AI-tekst bevindt zich op lokale krommingsmaxima in de log-waarschijnlijkheidsruimte | Geen trainingsdata nodig | Rekenkundig duur, minder betrouwbaar bij korte tekst |
| Stylometrisch | Analyseert kenmerken van schrijfstijl (variantie in zinslengte, rijkdom van de woordenschat) | Modelonafhankelijk | Eenvoudig te verslaan met stijltransfer |
DetectGPT-mechanisme
def detect_gpt_score(
text: str,
scoring_model,
mask_model,
n_perturbations: int = 100,
) -> float:
"""
DetectGPT: AI-tekst bevindt zich op lokale maxima van de log-waarschijnlijkheid.
Verstoringen zouden de log-waarschijnlijkheid voor AI-tekst moeten verlagen,
maar hebben een willekeurig effect op menselijke tekst.
"""
original_ll = scoring_model.log_likelihood(text)
perturbation_lls = []
for _ in range(n_perturbations):
# Maskeer willekeurige spans en vul met mask_model (bijv. T5)
perturbed = mask_and_fill(text, mask_model)
perturbation_lls.append(scoring_model.log_likelihood(perturbed))
mean_perturbed_ll = np.mean(perturbation_lls)
std_perturbed_ll = np.std(perturbation_lls)
# Genormaliseerde verstoringsdiscrepantie
score = (original_ll - mean_perturbed_ll) / std_perturbed_ll
return score # hoge score -> waarschijnlijk AI-gegenereerdOntwijkingstechnieken voor red teams
Watermerkverwijdering
De meest effectieve aanval voor algemeen gebruik. Een tweede (niet-gewatermerkt) model parafraseert de gewatermerkte uitvoer, waardoor het statistische signaal op tokenniveau wordt vernietigd terwijl de betekenis behouden blijft.
def paraphrase_attack(watermarked_text: str, paraphraser) -> str:
"""Gebruik een afzonderlijk model om het watermerk via parafrasering te verwijderen."""
prompt = f"""Rewrite the following text to convey the same meaning
using different words and sentence structures. Preserve all
factual content but change the phrasing completely.
Text: {watermarked_text}
Rewritten:"""
return paraphraser.generate(prompt)Effectiviteit: verwijdert watermerken op tokenniveau met >95% succes. Semantische watermerken zijn beter bestand.
Vervang tokens systematisch door synoniemen, in een tempo dat voldoende is om de groene-lijst-bias te doorbreken zonder de betekenis te veranderen.
def synonym_substitution_attack(
text: str,
substitution_rate: float = 0.25,
synonym_dict: dict = None,
) -> str:
"""Vervang ~25% van de inhoudswoorden door synoniemen."""
words = text.split()
for i, word in enumerate(words):
if random.random() < substitution_rate and word.lower() in synonym_dict:
words[i] = random.choice(synonym_dict[word.lower()])
return " ".join(words)Voeg tekens met breedte nul of homoglyfen tussen tokens in om de op voorganger gebaseerde berekening van de groene lijst te doorbreken.
ZERO_WIDTH_CHARS = ["", "", "", ""]
def unicode_injection_attack(text: str, injection_rate: float = 0.15) -> str:
"""Voeg tekens met breedte nul in om het token-keten-watermerk te verstoren."""
chars = list(text)
positions = random.sample(range(len(chars)), int(len(chars) * injection_rate))
for pos in sorted(positions, reverse=True):
chars.insert(pos, random.choice(ZERO_WIDTH_CHARS))
return "".join(chars)Gebruik de gewatermerkte tekst als context voor een niet-gewatermerkt model om gelijkwaardige inhoud opnieuw te genereren.
def cross_model_transfer(watermarked_text: str, clean_model) -> str:
"""Draag inhoud over via een niet-gewatermerkt model."""
prompt = f"""Based on the following information, write a comprehensive
response covering the same topics and conclusions:
{watermarked_text}"""
return clean_model.generate(prompt)Detectorontwijking
| Ontwijkingstechniek | Doeldetector | Mechanisme |
|---|---|---|
| Recursieve parafrasering | Alle statistische | Meerdere herschrijfrondes stapelen ruis op |
| Adversarial verstoring | Getrainde classifiers | Op gradiënt gebaseerde tokenvervanging om het vertrouwen van de classifier te minimaliseren |
| Co-schrijven mens-AI | Op perplexiteit gebaseerd | Meng menselijke en AI-tekst om de variantie in perplexiteit te verhogen |
| Stijltransfer | Stylometrisch | Herschrijf in de stijl van een specifieke menselijke auteur |
| Terugvertaling | Watermerk op tokenniveau | Vertaal naar een andere taal en terug |
Raamwerk voor robuustheidsbeoordeling
Gebruik bij het evalueren van watermarking- of detectiesystemen tijdens een red team-opdracht deze systematische aanpak:
Baselinemeting
Genereer 100+ gewatermerkte samples en verifieer de detectiegraad. Stel de z-score-distributie vast voor bevestigde gewatermerkte tekst versus schone tekst.
Testen met minimale verstoring
Pas toenemende niveaus van verstoring toe (5%, 10%, 25%, 50% tokenvervanging) en meet de detectieafname. Vind de drempel waarbij detectie faalt.
Verificatie van semantisch behoud
Verifieer voor elke succesvolle ontwijkingstechniek dat de semantische inhoud behouden blijft met behulp van embeddingsimilariteit (cosinusgelijkenis > 0,90 voor de originele versus de ontweken tekst).
Analyse van fout-positieven
Voer de detector uit op door mensen geschreven tekst uit het doeldomein. Rapporteer de fout-positieve rates per demografische groep en schrijfstijl, vooral voor niet-moedertaalsprekers van het Engels.
Adaptieve aanval
Als het watermarking-schema een bekende architectuur gebruikt, ontwerp dan een gerichte aanval die de specifieke zwakte ervan uitbuit (bijv. bekende groene-lijst-structuur, vaste vensterbreedte).
Fundamentele beperkingen
| Beperking | Implicatie voor red teams |
|---|---|
| Afweging kwaliteit-robuustheid | Agressieve watermerken tasten de uitvoer aan -- zoek naar kwaliteitsverschillen als detectiesignaal |
| Sleutelbeheer | Gecompromitteerde sleutels maken vervalsing van watermerken of gerichte verwijdering mogelijk |
| Onbetrouwbaarheid bij korte tekst | Watermerken vereisen ~200+ tokens voor betrouwbare detectie |
| Multi-model-pijplijnen | Tekst die door meerdere modellen gaat, verliest de watermerkherkomst |
| Verwijdering door fine-tuning | Fine-tuning van een gewatermerkt model kan het watermarking-gedrag verwijderen |
Zie voor verwante verdedigingstechnieken Systemen voor in-/uitvoerfiltering en Guardrails-architectuur.
Verwante onderwerpen
- Geavanceerde verdedigingstechnieken - Andere vooruitstrevende verdedigingsonderzoeken, waaronder instructiehiërarchie en representation engineering
- Systemen voor in-/uitvoerfiltering - Aanvullende benaderingen voor het scannen van uitvoer
- Guardrails- & veiligheidslaagarchitectuur - Waar watermarking past in de verdedigingspijplijn
- Inferentie: sampling, temperatuur & generatie - Decodeermechanica die watermarking aanpast
Referenties
- "A Watermark for Large Language Models" - Kirchenbauer et al. (2023) - The foundational paper introducing token-level green/red list watermarking for LLMs
- "Unbiased Watermark for Large Language Models" - Christ et al. (2024) - Research on provably unbiased watermarking that preserves output distribution quality
- "DetectGPT: Zero-Shot Machine-Generated Text Detection using Probability Curvature" - Mitchell et al. (2023) - The perturbation-based AI text detection method using log-probability analysis
- "On the Reliability of Watermarks for Large Language Models" - Sadasivan et al. (2023) - Critical analysis of watermark robustness against paraphrase and editing attacks
- "Can AI-Generated Text be Reliably Detected?" - Sadasivan et al. (2023) - Research on fundamental limitations of AI text detection including false positive rates
Wat is de meest effectieve aanval voor algemeen gebruik tegen watermarking op tokenniveau?