Norwegian AI-Text Detector
Klassifikator som skiller menneskeskrevet og AI-generert norsk tekst (bokmål + nynorsk). Fine-tunet fra ltg/norbert4-small (50M parametere).
Modell-oversikt
- Arkitektur: NorBERT-4-small (GptBert) + klassifikasjonshode (LayerNorm → Linear → LayerNorm → Dropout → Linear → 2)
- Kontekst: opp til 16 384 tokens (RoPE + lokal-global attention)
- Klassifiseringsoppgave: 2 klasser (0 = menneske, 1 = AI)
- AI-modeller modellen er trent til å gjenkjenne: Anthropic Claude (Opus, Sonnet, Haiku 4.x), OpenAI GPT-5 og GPT-5-mini, Google Gemini 2.5 Pro og Flash
Bruk
Python
from transformers import AutoModelForSequenceClassification, AutoTokenizer
import torch
import torch.nn.functional as F
MODEL = "pegesund/norwegian-ai-detector"
tokenizer = AutoTokenizer.from_pretrained(MODEL, trust_remote_code=True)
model = AutoModelForSequenceClassification.from_pretrained(MODEL, trust_remote_code=True)
model.eval()
text = """Hippodrom (gresk: ἱππόδρομος, hippodromos, av hippos, «hest», og dromos, «løp»)
er en bane til hesteveddeløp. Også i dag betyr ordet hesteløpsbane i flere moderne språk,
eksempelvis i moderne fransk. Av den grunn er det hesteløpsbaner som har ordet hippodrom
som en del av navnet, blant annet Hippodrome de Vincennes i Paris og Hippodromen i Moskva."""
inputs = tokenizer(text, return_tensors="pt", truncation=True, max_length=1024)
with torch.no_grad():
logits = model(**inputs).logits
probs = F.softmax(logits, dim=-1)[0]
print(f"P(menneske) = {probs[0].item():.4f}")
print(f"P(AI) = {probs[1].item():.4f}")
ONNX (for nettleser eller server uten PyTorch)
import onnxruntime as ort
import numpy as np
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("pegesund/norwegian-ai-detector", trust_remote_code=True)
sess = ort.InferenceSession("detector_fp16.onnx")
text = "Hippodrom (gresk: ἱππόδρομος, hippodromos, ...) er en bane til hesteveddeløp..."
enc = tokenizer(text, return_tensors="np", truncation=True, max_length=1024)
logits = sess.run(["logits"], {
"input_ids": enc["input_ids"],
"attention_mask": enc["attention_mask"],
})[0]
# Softmax
exp = np.exp(logits - logits.max(axis=-1, keepdims=True))
probs = exp / exp.sum(axis=-1, keepdims=True)
print(f"P(menneske) = {probs[0, 0]:.4f}")
print(f"P(AI) = {probs[0, 1]:.4f}")
ONNX-filer i onnx/-mappen:
detector_fp16.onnx(87 MB) — anbefalt for browser-deploy viaonnxruntime-webdetector_int8.onnx(57 MB) — kompakt, ~1-2% lavere presisjon
Pre-prosessering
Inputtekstene bør forhåndsrenses med samme normalisering som under trening.
Se clean_text.py i dette repoet for konkret implementasjon. Hovedoperasjoner:
- Strip wiki/markdown/HTML-rester (
{{...}},[[...]],<...>,**,==) - Strip korte hakeparenteser
[ref], krøllparenteser{...} - Decode HTML-entities (
&, ) - Normaliser sitatmerker (
«»""''→ strippet) - Normaliser bindestreker (
—–→-) - Strip dekorative tegn (bullets •, piler ↑, hjerter ♥, soft hyphen, emojis, §)
- Kollaps all whitespace til enkel space, strip leading/trailing
from clean_text import clean
cleaned = clean(your_text)
Resultater
På in-distribution test-sett (6 062 holdt unna trening):
| Metrikk | Verdi |
|---|---|
| Accuracy | 0.999 |
| F1 | 0.998 |
| Precision | 0.998 |
| Recall | 0.999 |
Per språk (bokmål + nynorsk): F1 ≥ 0.999 i begge.
Per tekst-lengde:
| Lengde (ord) | n | F1 |
|---|---|---|
| 50–300 | 1 425 | 0.9913 |
| 300–800 | 2 873 | 0.9991 |
| 800–2 000 | 1 360 | 0.9988 |
| 2 000+ | 404 | 0.9920 |
Modellen er svakest på korte tekster (under ~300 ord) der det er minst kontekst å gå på.
Begrensninger og advarsler
⚠️ Disse tallene gjelder for in-distribution testing. Modellen er trent på en spesifikk samling AI-generatorer (se listen over). Reell ytelse på:
- AI-modeller utenfor treningssettet — ikke testet, kan være lavere
- Adversarial paraphrasing (AI-tekst manuelt redigert) — ikke testet, sannsynligvis lavere
- Tekster utenfor den treningsdistribusjonen modellen så — sannsynligvis lavere
- Veldig korte tekster (< 200 tegn) — mindre signal å gå på
Sitering
Hvis du bruker denne modellen i forskning eller publikasjon, vennligst krediter:
- LTG-UiO for NorBERT-4 baseline-modellen
- Petter Egesund for fine-tuning
Lisens
CC-BY-SA-4.0, samme som NorBERT-4. Modellen kan brukes fritt; deriverte verk må deles under samme lisens.
- Downloads last month
- 67
Model tree for pegesund/norwegian-ai-detector
Base model
ltg/norbert4-small