Skip to main content

Command Palette

Search for a command to run...

Your LLM Doesn't Know When It's Wrong. A Second One Might.

Cross-model disagreement is a training-free, label-free signal that catches confident errors your model's own uncertainty metrics will miss every time.

Published
7 min read

The most dangerous failure mode in production LLMs isn't hallucination. It's confident hallucination. The model is dead wrong, and it's absolutely certain about it. Token entropy is low. Confidence scores look great. Your monitoring dashboard shows green across the board. And your user just got a completely fabricated answer delivered with the conviction of a textbook.

This week, a paper dropped on arXiv that proposes a disarmingly simple fix: ask a second model how surprised it is by the first model's answer. No fine-tuning. No labels. No generation from the verifier. Just a single forward pass. The results suggest we've been looking for correctness signals in the wrong place.

The Problem With Self-Reported Confidence

Every production LLM deployment I've seen relies on some variant of self-reported uncertainty to flag potential errors. Token-level entropy. Softmax confidence. Verbalized confidence scores ("I'm 95% sure..."). Consistency across multiple samples.

These all share the same fundamental flaw: they're asking the model to evaluate its own outputs using the same representations that produced those outputs. If the model confidently believes something wrong, its uncertainty metrics will reflect that confidence, not the actual correctness.

Think about it from an information theory perspective. If a model assigns high probability to a wrong token sequence, the entropy at those positions will be low by definition. You're measuring how surprised the model is by its own output, and a confidently wrong model isn't surprised at all. The signal and the failure mode are anti-correlated in exactly the cases where you need detection most.

This isn't theoretical. Anyone who's run eval suites on frontier models has seen it: questions where the model gets a clean, decisive wrong answer. No hedging, no uncertainty markers, no spread in the token distribution. Just wrong.

Cross-Model Perplexity: The Idea

The paper, "Cross-Model Disagreement as a Label-Free Correctness Signal" by Gorbett et al., introduces two metrics:

Cross-Model Perplexity (CMP): Given Model A's generated answer, compute how surprised Model B is when reading those tokens. High surprise from B suggests A's answer is unusual or incorrect.

Cross-Model Entropy (CME): Instead of measuring B's surprise at A's specific tokens, measure B's overall uncertainty at those token positions. High entropy from B at positions where A was confident suggests the answer is in a contested region of the output space.

The implementation is almost trivially simple:

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

def cross_model_perplexity(answer_text, verifier_model, verifier_tokenizer):
    """
    Compute how surprised verifier_model is by answer_text.
    Higher CMP = more likely the answer is wrong.
    """
    inputs = verifier_tokenizer(answer_text, return_tensors="pt")
    with torch.no_grad():
        outputs = verifier_model(**inputs, labels=inputs["input_ids"])
    # outputs.loss is the mean negative log-likelihood
    return torch.exp(outputs.loss).item()

def cross_model_entropy(answer_text, verifier_model, verifier_tokenizer):
    """
    Compute verifier's average entropy at answer token positions.
    Higher CME = verifier is uncertain about these positions.
    """
    inputs = verifier_tokenizer(answer_text, return_tensors="pt")
    with torch.no_grad():
        logits = verifier_model(**inputs).logits
    probs = torch.softmax(logits, dim=-1)
    entropy = -torch.sum(probs * torch.log(probs + 1e-10), dim=-1)
    return entropy.mean().item()

That's it. No training loop. No labeled correctness data. No generation from the verifier. One forward pass per answer.

The Results That Matter

Across MMLU, TriviaQA, and GSM8K, CMP achieves a mean AUROC of 0.75 for separating correct from incorrect answers. The within-model entropy baseline? 0.59. That's not an incremental improvement, it's the difference between a useless signal and an actionable one.

For context, random chance is 0.50 AUROC. Within-model entropy barely beats coin flipping for identifying incorrect answers. CMP gets you into territory where you can actually make routing decisions.

The key insight is why this works. Two independently trained models encode different inductive biases, different training data distributions, different failure modes. When Model A confidently produces a wrong answer, Model B is likely to either (a) disagree about the probable token sequence or (b) show high uncertainty at those positions, because its different training didn't reinforce the same wrong pattern.

This is the neural network equivalent of getting a second opinion from a doctor who trained at a different medical school.

Why This Matters for Production Systems

If you're running LLMs in production, you already have the infrastructure for this. You probably already have access to multiple models through your API provider. The computational cost is one additional forward pass (no generation), which is significantly cheaper than generating a second complete answer.

Here are the direct applications:

Model Routing

You have a fast, cheap model handling most queries and an expensive, powerful model for hard ones. Currently, you're probably routing based on query complexity heuristics. CMP gives you a signal based on the actual answer quality: generate with the cheap model, compute CMP with the expensive one, re-route if CMP exceeds your threshold.

def smart_route(query, fast_model, strong_model, threshold=15.0):
    # Generate with fast model (cheap)
    fast_answer = fast_model.generate(query)

    # Check with strong model (one forward pass, no generation)
    cmp_score = cross_model_perplexity(
        query + fast_answer, strong_model, strong_tokenizer
    )

    if cmp_score > threshold:
        # Fast model's answer looks suspicious, use strong model
        return strong_model.generate(query)
    return fast_answer

This is cheaper than always using the strong model and more reliable than query-based routing, because you're evaluating the answer, not the question.

Deployment Monitoring

Instead of waiting for user complaints or downstream metric degradation, you can flag individual responses in real-time. Log CMP scores alongside responses. Set alerts on rolling averages. You now have a label-free quality signal that catches the exact failure mode (confident errors) that your existing monitoring misses.

Selective Abstention

For high-stakes applications, CMP gives you a principled way to say "I'm not confident enough to answer this." Unlike self-reported confidence, the signal comes from an independent source that isn't susceptible to the same failure modes.

The Obvious Objection (and Why It's Wrong)

"But this requires running two models. That's twice the compute."

No. CMP requires one forward pass from the verifier, not a full generation. For a typical 100-token answer, that's roughly 1/10th the compute of generating a second answer. And you're not running the verifier on every query. You're running it on the subset where confidence matters, or using a small, fast verifier model.

The real cost comparison is: one forward pass from a 7B verifier versus the cost of serving a confidently wrong answer to a user. In any application where correctness matters, the forward pass is cheaper.

The Deeper Point

This paper is part of a broader shift in how we think about LLM reliability. We've spent years trying to make individual models more reliable through RLHF, better training data, chain-of-thought prompting, self-consistency checks. All of these are fundamentally single-model approaches.

Cross-model disagreement suggests that the path to reliable AI systems isn't making one model perfect. It's building systems where models check each other. This mirrors every safety-critical engineering domain: aviation has co-pilots, nuclear plants have redundant monitoring, financial systems have independent auditors.

The fact that a simple perplexity check across two independently trained models outperforms every within-model uncertainty metric we've developed is a strong signal that we've been solving the wrong problem. We don't need models that know when they're wrong. We need systems that can detect when any single model is wrong.

What's Next

I expect this to get adopted quickly in production routing systems. The implementation cost is near-zero for anyone already using multiple model providers. The trickier open question is: what properties of the verifier model matter most? Does model family diversity help? Does scale of the verifier matter? Can you use a 1B verifier to check a 70B generator?

The paper doesn't fully explore these dimensions, and they matter enormously for practical deployment. A world where every generated answer needs a forward pass through GPT-4 as a verifier is very different from one where a quantized 3B model does the job.

But the core idea is sound, important, and immediately usable. Your model's confidence in its own answers is unreliable precisely when reliability matters most. A second model's surprise at those answers is a better signal. Start measuring it.

Paper: "Cross-Model Disagreement as a Label-Free Correctness Signal" (arXiv:2603.25450)


Manas Vardhan builds open-source tools for production AI agents, including agent-sentry and llm-cost-guardian. Find all his work on GitHub.

A

The confident hallucination problem cuts deeper than most teams realize. Low token entropy is a feature, not a bug — the model learned to compress patterns into high-confidence outputs because that's what training optimizes for. The second-model verifier approach works, but it introduces its own failure mode: what happens when the verifier is confidently wrong? The real fix isn't just adding a second opinion — it's surfacing uncertainty as a first-class output. Models should be forced to say 'I don't know' with the same confidence they use to assert facts. Production systems that treat uncertainty as a signal, not noise, survive longer than those relying on consensus alone.