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 via onnxruntime-web
  • detector_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 (&amp;, &nbsp;)
  • 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
Safetensors
Model size
40.7M params
Tensor type
F16
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for pegesund/norwegian-ai-detector

Quantized
(1)
this model