Pangram. Try It for Free

Research

Why perplexity-based AI detection stopped working

For four years you could catch a language model by measuring how surprised another language model was by its output. That signal is gone, and it did not fade gently.

The first generation of AI-text detectors were not classifiers in any meaningful sense. They were thermometers. You fed a passage to a small open language model, asked it how likely each token was given the ones before it, averaged the surprise, and called the result perplexity. Human writing scored high. Machine writing scored low. You picked a threshold somewhere in the valley between the two humps and shipped it.

That worked because of an accident of history, not a law of nature. In 2020, the models people could actually use were decoding greedily or with a low temperature, from a training distribution that a similarly-sized open model had also seen. Of course the output looked unsurprising: you were grading a student with the answer key that student had studied from. The two distributions barely touched, and a single number separated them.

They touch everywhere now. Below is what the separation looked like when the technique was young, and what it looks like against a current-generation assistant with default settings.

model-written human-written threshold
2021 · GPT-2 era low perplexity high overlap ≈ 4% 2026 · current assistants low perplexity high overlap ≈ 61%
Perplexity densities for 500-word passages, scored with a 1.5B-parameter open model. Curves and overlap figures are illustrative — drawn to show the shape of the change, not measured values.

Three things broke it

The collapse was not one failure. It was three, arriving within about eighteen months of each other, each sufficient on its own.

01

Preference tuning flattened the curve

Instruction-tuned models are optimized to be helpful, which in practice means fluent, hedged, evenly-paced prose. That is exactly the profile a base model finds unsurprising. Every round of preference training pushed generated text further into the low-perplexity basin — and pulled polished human writing, the kind that gets edited, in after it.

02

Decoding parameters became a dial anyone can turn

Perplexity detection assumes the writer is not adversarial. Raising temperature to 1.15, or asking for "a slightly rambling first draft," moves a passage across almost any fixed threshold. This is not a jailbreak or a rare exploit; it is a slider in a settings panel, and evasion guides have been circulating on student forums since 2023.

03

The scoring model stopped matching the writing model

A perplexity detector measures surprise relative to whatever model you happen to be running. When you score a frontier model's output with a small open model from two years ago, you are measuring the gap between two vocabularies, not authorship. Meanwhile the same detector reads any writer whose English is plain and predictable — second-language writers, technical documentation, anyone taught to write short declarative sentences — as machine-made.

A threshold on a single scalar was never a model of authorship. It was a model of one year's decoding defaults. — the short version of this article

What the numbers do

The failure mode that matters is not the headline accuracy number. It is what happens at the low end of the false-positive curve, where a real deployment lives. A detector used on ten thousand student essays at a 1% false-positive rate accuses a hundred innocent people per run. That is not a tuning problem; it is a product that cannot be shipped.

Generator AUROC TPR @ 0.1% FPR FPR, L2 writers
GPT-2 (2019, greedy)0.97188.4%3.1%
2022 instruct model0.90361.0%7.8%
2024 assistant, default0.74219.7%12.4%
2026 assistant, default0.6586.2%14.9%
2026 assistant, temp 1.150.5141.1%14.9%
A fixed perplexity threshold evaluated against successive generators, 500-word passages. Illustrative numbers, consistent with the direction reported across public benchmarks. AUROC 0.5 is a coin flip.

Read the last row rather than the first. A detector at 0.514 is not degraded — it is inoperative, and it is inoperative against a setting the user changed by accident. The reason people kept trusting these tools long after this point is that the average-case number stayed respectable while the tail, which is the only part anyone gets sued over, fell out.

The other half of the arithmetic is the base rate. If 5% of submissions are actually AI-written, a detector at 60% true-positive and 8% false-positive rate produces more false accusations than true ones. Perplexity tools published accuracy; they did not publish this.

Here is the whole classical method, which is worth seeing because of how little there is to it:

# the entire 2021 state of the art
import torch

def perplexity(text, model, tok):
    ids  = tok(text, return_tensors="pt").input_ids
    loss = model(ids, labels=ids).loss     # mean NLL per token
    return torch.exp(loss).item()

def verdict(text, model, tok):
    return "ai" if perplexity(text, model, tok) < THRESHOLD else "human"

# THRESHOLD = 38.0   # tuned on 2021 data, never valid again

# scored with a 1.5B open model, 500-word passages:
#   human essays, 2021 corpus ........ ppl  54.8  -> human   ok
#   GPT-2 greedy ..................... ppl  17.2  -> ai      ok
#   2026 assistant, default .......... ppl  36.1  -> ai      ok
#   2026 assistant, temp 1.15 ........ ppl  47.9  -> human   miss
#   L2 human, plain register ......... ppl  31.4  -> ai      false positive

Two lines of policy, one global constant, and a number that was true for one year. Every attempt to patch it — normalizing by length, adding burstiness or variance of surprise, comparing perplexity under a perturbed rewrite — is still a low-dimensional summary of the same signal, and inherits the same failure the moment the generator's decoding profile shifts.

How detection works now

Fingerprints, not thermometers

The methods that survived stopped asking is this text unlikely? and started asking which system wrote it? That is a classification problem with hard supervision, and it behaves completely differently under distribution shift.

The training recipe is mirrored pairs. Take a human document, hand its opening to a generator, and ask for the rest. Now you have two texts about the same subject, in the same register, at the same length, differing only in origin. Repeat across every generator, decoding temperature, prompt style, and language you intend to cover. The classifier cannot cheat by learning "essays about climate policy are machine-made" — the topic is held constant on both sides of every pair.

  • Supervision is per-generator. The model learns family-level artifacts — token preferences, punctuation habits, clause rhythm — not a single scalar.
  • Sampling settings are part of training, not a blind spot. Temperature 1.15 is a seen condition, so it does not move the decision boundary the way it moves a threshold.
  • Hard negatives carry the false-positive rate. Second-language writing, edited drafts, formulaic technical prose, and text written before 2019 all belong in the human half in volume.
  • Calibration ships with the model. The output is a probability tied to a stated operating point, not a percentage invented for the UI.

None of this makes detection free. It costs a labeled corpus that has to be rebuilt every time a major generator ships, and a retraining cadence measured in weeks. That is the actual trade: perplexity was cheap and briefly correct; a supervised detector is expensive and stays correct only as long as someone keeps feeding it.

01
Ask for the false-positive rate at a fixed operating point, not accuracy.
02
Ask which generators and which decoding settings are in the training set.
03
Ask how the tool scores writing from second-language authors specifically.

What to do with an old detector

If you are running anything that reports a perplexity score, a "burstiness" score, or a percentage with no stated false-positive rate, the honest move is to stop treating its output as evidence. It is not that these tools are wrong every time; it is that you cannot tell which times, and the errors are not distributed randomly across your population. They concentrate on the people least able to argue back.

The replacement standard is unglamorous. A detector should publish its false-positive rate at a fixed threshold, name the generators it was trained against, report performance separately for second-language writers, and version itself so you can tell whether the model that flagged an essay in March is the one running in September. A number without an operating point attached is a marketing claim.

Perplexity did not stop working because the idea was stupid. It stopped working because it measured a property of one particular moment in decoding practice, and the field moved. Anything that measures a property of the writer rather than the sampler has a chance of aging better — and it still has to prove it, every time a new model ships.