Testing internal signals for factual accuracy in legal answers and biographies

A linear probe on Llama 3.1 8B’s hidden states ranks human-labeled biography claims by correctness far better than the confidence Llama states when asked to rate them, a weak baseline. An exploratory legal-QA test points the same way, and a third dataset showed how labels can end up measuring the wrong thing.

Update (2026-10-23)

This is the first stage of a project that continues in What Llama’s internal signals reveal about factual accuracy (October 2026). The follow-up keeps the FActScore setup, compares the probe with stronger baselines, including P(True) (how strongly Llama’s first answer token favors “True” over “False” when shown one claim at a time) and the subject’s popularity, and asks which components carry the signal.

I have also revised this post. Where Llama rates claims ChatGPT wrote, I now call its score stated confidence, not self-report; MAUD is marked exploratory; the Brier reference is described as a constant set from the test labels; and related work includes Han et al. (2025).

TL;DR

I compared two per-claim scores from Llama 3.1 8B Instruct: the confidence it states when asked to rate a claim, and a probe, a small linear readout trained on its hidden states. AUROC measures how well a score ranks correct claims above incorrect ones, from 0.5 (chance) to 1.0 (perfect). On FActScore, where Llama rates human-labeled claims from biographies ChatGPT wrote, the probe scored 0.802 on 742 held-out claims and stated confidence 0.541, a difference of 0.262 (95% interval 0.180 to 0.332, resampling whole biographies). Stated confidence is a weak comparison: Llama rated 650 of those claims exactly 1.0. Stronger baselines in the follow-up come much closer.

On MAUD, where Llama rates claims from its own answers about merger agreements and model judges supply the labels, the gap was similar (probe 0.771, stated confidence 0.511). MAUD is exploratory, mainly because its evaluation is not yet grouped by source example. On Brier score, which tests the probabilities themselves, the probe beats a constant at the test set’s share of true claims on FActScore but not on MAUD. Each setting has its own probe: one recipe working in two settings, not one probe transferring between them. On FELM, no clear advantage was detected (difference 0.141, interval −0.063 to 0.320), and relabeling showed its labels measured reference coverage, not correctness.

Setup

A long answer can be right in one sentence and wrong in the next, so the useful score is per claim. The cheapest one comes from asking the model: I give Llama 3.1 8B Instruct a fixed list of claims and ask, in structured JSON, how likely each is to be correct. I call the answer its stated confidence.

On MAUD, Llama rates claims split from its own answer to a question about a merger agreement, with the contract excerpt, question and that answer in view, so there stated confidence is a self-report. On FActScore and FELM, it rates claims from text ChatGPT wrote.

Correction (2026-10-18). On FActScore this baseline showed Llama the whole ChatGPT biography and up to 20 claims at once, not one claim. Llama did not write those biographies, so there it measures Llama verifying another model’s claims, not self-report. The follow-up calls it the stated probability and compares the probe with a stronger read of Llama’s confidence, P(True).

The probe is deliberately plain. At layer 19, I average Llama’s hidden state (the residual stream, the vector each layer passes to the next) over the claim’s tokens (on FActScore, the fact’s sentence), standardize it, and fit a logistic regression, with no feature search and no learned pooling.

01 · MAUD (exploratory) Legal QA, labels from model judges 150 claims from Llama’s own answers, drawn from 135 source examples. GPT-5.4 labels each claim true, partially_true or false; Kimi K2.6 relabels them as a sensitivity check.
02 · FActScore Biographies, human labels 157 biographies written by ChatGPT, with 4,886 atomic facts labeled by people (Min et al., 2023). A fact almost never appears word for word, so I average over the sentence it came from.
03 · FELM-wk General knowledge, the hard case Human labels on segments of ChatGPT answers to general-knowledge questions. 71 test segments.

Labels are binary: on MAUD only true counts as correct, and on FActScore a fact is supported or not, with irrelevant facts dropped.

I fitted a separate probe in each setting. FActScore is split by biography into 3,353 training, 791 tuning and 742 test claims; the tuning set picks the regularization, and the test set is scored once. MAUD has too few claims to split, so I used leave-one-out: each claim is scored by a probe trained on the other 149.

Intervals are 95% paired bootstrap intervals, with every method scored on the same resample. FActScore's 742 test claims come from only 24 biographies, so there I resample whole biographies; resampling single claims instead gives a narrower interval on the difference, 0.217 to 0.304.

The probe ranks claims better than stated confidence

AUROC for each claim, Llama’s stated confidence vs the probe The probe ranks claims better on FActScore and on MAUD (exploratory). FELM points the same way, but its interval includes zero. 0.40 0.50 0.60 0.70 0.80 0.90 1.00 chance .511 .771 .541 .802 .511 .652 MAUD (exploratory) difference +0.260 FActScore difference +0.262 FELM-wk difference +0.141 (includes 0) Stated confidence Probe Thin lines show 95% bootstrap intervals.
Figure 1. AUROC of Llama’s stated confidence and of the layer-19 probe on each dataset. FActScore intervals resample whole biographies; MAUD and FELM intervals resample single claims.
Table 01The probe vs Llama’s stated confidence, across datasets
Dataset Where labels come from Stated confidence Probe Difference
FActScore Atomic facts labeled by people 0.541 [0.495, 0.589] 0.802 [0.748, 0.848] +0.262 [0.180, 0.332]
MAUD (exploratory) GPT-5.4 as judge 0.511 [0.411, 0.597] 0.771 [0.687, 0.838] +0.260 [0.137, 0.387]
FELM-wk Segments labeled by people 0.511 [0.393, 0.673] 0.652 [0.493, 0.815] +0.141 [-0.063, 0.320]

FActScore is the cleaner test: human labels, a held-out test split scored once, and intervals that resample whole biographies. There the probe leads by 0.262 [0.180, 0.332], and the interval for stated confidence on its own includes 0.5; because that baseline is weak, the follow-up adds stronger ones.

MAUD shows a gap of similar size, 0.260 [0.137, 0.387], with three qualifications: the labels come from model judges, not people; the interval is about 0.25 wide; and the evaluation is not grouped by source example. The 150 claims come from 135 examples, so some claims have a sibling from the same contract excerpt, question and answer. So leave-one-out can score a claim with a probe that saw its sibling in training, and the bootstrap resamples single claims rather than examples. Either can make the result look stronger or more certain than an evaluation that holds out and resamples whole examples. I have not run that evaluation, so the MAUD gap stands as measured but exploratory. The two settings use different procedures, so what repeats across them is the direction and rough size of the gap, not a precise value.

Ranking versus calibrated probabilities

AUROC only measures ranking, and a score can rank claims well yet give poor probabilities, so I also report the Brier score, the mean squared gap between predicted probability and the 0/1 label (lower is better). The reference is a constant equal to the evaluated set’s share of true claims, p, which scores p(1−p), the best any constant can do there. Because p comes from the test labels, this is a descriptive reference based on the test set’s prevalence, not a forecast anyone could have made in advance; the FActScore bootstrap recomputes it on each resample.

On the FActScore test set, 509 of 742 facts are true (68.6%), so the constant scores 0.215; always answering 0.5 scores 0.25. Stated confidence scores 0.298, worse than both, largely because it is so often exactly 1.0. The probe scores 0.171, 0.044 below the constant (interval 0.009 to 0.075 with biographies resampled, 0.024 to 0.063 with single claims).

On MAUD, 62 of 150 claims are true (41%), so the constant scores 0.242. The probe scores 0.244, no better than the constant, and stated confidence 0.580. There the probe ranks claims, but its outputs are not yet useful as probabilities.

A second model judge on MAUD

MAUD labels come from GPT-5.4, so a probe trained on them might be learning GPT-5.4’s habits. I relabeled the same 150 claims with Kimi K2.6, using the same prompt, and did not refit the probe. Under Kimi labels, the probe scores 0.707 [0.627, 0.792] and stated confidence 0.466 [0.413, 0.604], a paired difference of 0.241 [0.075, 0.320], and the ranking of methods is unchanged (appendix, Figure 2). One method beats the probe under both judges: asking GPT-5.4 directly to score each claim.

On the 110 of 150 claims where the two judges give the same three-way label, the probe scores 0.793 and stated confidence 0.486, though that is not independent confirmation (appendix). Both judges are language models, so this tests sensitivity to the choice of judge; it is not expert validation. I set aside 30 claims for blinded review by a legally trained reader, 20 where the judges agree and 10 where they disagree, and none has been labeled yet (audit status).

When the labels measure the wrong thing

FELM-wk, the world-knowledge part of the FELM benchmark, is the warning case. On 71 test segments of ChatGPT answers, the probe reached 0.652 AUROC and stated confidence 0.511. The difference, 0.141, has an interval of −0.063 to 0.320, so no clear advantage was detected.

Then I tried to fix the labels. When Llama wrote its own answers to FELM questions, its claims often went beyond FELM's short reference texts, so I added fuller references from the source pages and a fourth label, not_enough_evidence. On a 52-segment trial, the labels came back like this:

true
4
7.7% of the trial segments
partially_true
12
23.1%
false
6
11.5%. 28 of the 43 old false labels moved to not_enough_evidence.
not_enough_evidence
30
57.7%

A judge limited to the reference cannot decide a claim that goes beyond it, so the label records whether the reference covers the claim, not whether the claim is true. I did not scale up this FELM run.

Interpretation and limits

On FActScore, Llama 3.1 8B’s layer-19 hidden states carry information about which claims are correct that its stated confidence does not surface, and a linear probe fitted on human labels reads it out. MAUD points the same way, as an exploratory result. The probe is a predictive readout: it ranks claims, it is not a detector of legal or factual truth, and it does not by itself explain how the model represents correctness. FELM’s lesson is about labels: before fitting a probe, know what the label measures and pool activations over the text it describes.

Limits that affect the current estimates:

  • MAUD is not grouped by source example (explained above). This is the most consequential open issue for the legal-QA result.
  • MAUD labels come from one model judge (GPT-5.4), checked against a second, and the 30-claim legal audit is still unlabeled.
  • On FActScore, Llama reads text that ChatGPT wrote, so this does not test its uncertainty about its own output, and facts from one sentence share a score because activations cover the whole sentence.
  • Popularity is a confound on pooled FActScore claims. In the follow-up, the subject’s Wikipedia pageviews alone come close to the probe, with no clear advantage detected when whole biographies are resampled; comparing claims within a biography holds popularity fixed.

Scope: one model and one layer. Every probe uses layer 19 of Llama 3.1 8B Instruct, chosen because the Goodfire sparse autoencoder (SAE) used for the comparisons in the appendix is trained there. A fourth dataset, CUAD, failed at the claim-extraction step.

Next experiment

  • Rerun MAUD with cross-validation and bootstrap resampling grouped by source example, to see whether the legal-QA gap survives grouping. This needs the per-claim MAUD features, which are not in the public repo.
  • Collect the blinded human labels for the 30 MAUD audit claims and compare them with both judges.
  • Score each domain’s probe on the other domain, to test transfer.
  • Other layers, other model families, and text Llama wrote itself on a dataset whose references cover its claims.
  • Factuality probes for long-form text. Han et al. (2025) showed that lightweight hidden-state probes predict whether atomic claims in long-form generations are true, beating semantic entropy, P(True) and SelfCheckGPT on Llama models from 3B to 405B and Gemma 2 9B, and compared verbalized confidence too. They trained on claims labeled by a retrieval-based verifier and also scored the human-labeled FActScore biographies. Their paper came first. This study differs in fitting and testing probes on FActScore’s human labels, with intervals that resample whole biographies; in an exploratory legal-QA setting; and in the FELM case, where reference-bounded labels measured coverage rather than correctness. The follow-up adds popularity and position controls, a probe–P(True) combination and a decomposition of the probe’s signal.
  • Verbal uncertainty. Lin, Hilton and Evans (2022) trained models to express calibrated uncertainty in words; Kadavath et al. (2022) found that models can often evaluate their own answers in the right format.
  • Truthfulness probes. Azaria and Mitchell (2023) trained classifiers on hidden activations to predict whether statements are true, Burns et al. (2023) looked for latent knowledge without supervision, and Marks and Tegmark (2024) found linear structure for true and false statements. All three mostly use controlled statement datasets rather than claims from longer answers.
  • Semantic entropy and hallucination detection. Farquhar et al. (2024) estimate uncertainty over the meanings of sampled generations, and Kossen et al. (2024) approximate it from one generation’s hidden states. Obeso et al. (2025) train probes that flag hallucinated entities token by token. I predict the correctness of a fixed claim instead.

ProbeMon

The repo includes ProbeMon, research software that packages the method: two pretrained layer-19 probes (legal-qa-llama-3.1-8b-v1 from MAUD, biography-llama-3.1-8b-v1 from FActScore), a fit_probe function for your own labeled claims, dataset loaders and a command-line tool (probemon list-probes, score, train). It refuses to score a model that doesn't match the probe.

Reproducibility

Modelmeta-llama/Llama-3.1-8B-Instruct, layer-19 residual stream; Goodfire's goodfire-llama-3.1-8b-instruct layer-19 SAE for the SAE comparison. MAUD judges: GPT-5.4, and Kimi K2.6 as a sensitivity check. Stated confidence: Llama rating a fixed claim list in JSON (MAUD: claims from its own answer; FActScore: up to 20 claims per prompt from the ChatGPT biography; FELM: all segments of a ChatGPT answer in one prompt).
ExperimentMAUD: standardized logistic regression, C = 1.0, leave-one-out over 150 single claims, not grouped by source example (scripts/evaluate_probe_proxy_smoke.py). FActScore: L2 logistic regression, C = 0.01 chosen on the tuning split, refit on train plus tuning, scored once on test (scripts/evaluate_factscore_validation.py). Intervals: paired bootstrap, seed 20260424; MAUD and FELM claim-level, 1,000 resamples (methods note); FActScore claim-level and grouped by biography, 10,000 resamples (grouped_bootstrap_factscore.py). Per-judge MAUD AUROCs predate the AUROC code’s tie averaging, which the note in maud_bootstrap_ci_v2.json says shifts the stated-confidence values slightly.
DataMAUD (theatticusproject/maud): 150 claims from 135 examples. FActScore (ChatGPT portion): 4,886 facts, split by biography 3,353 / 791 / 742; test from 24 biographies. FELM-wk: 71 test segments. The public repo does not include the raw datasets, Llama’s answers, raw judge responses, the MAUD audit packet or the per-claim activation features. Its README says the scripts expect these to be regenerated or restored, which needs gated access to Llama 3.1 8B, a GPU (the scripts use Modal) and both judge models; regenerated judge labels need not match the originals.
Resultsfactscore_chatgpt_validation_eval.json (per-claim probe and stated-confidence scores for the FActScore test claims), factscore_grouped_bootstrap_ci.json (FActScore intervals), maud_bootstrap_ci_v2.json, felm_wk_bootstrap_ci.json, maud_judge_agreement_analysis.json, maud_human_audit_analysis.json (audit status). The earlier factscore_bootstrap_ci.json (claim-level, 1,000 resamples) gives 0.219 to 0.302 for the difference.
Codescasella/activation-probes-claim-correctness @ 309b8e3; grouped FActScore bootstrap added @ 665dc25
StatusPublished 2026-04-25 · updated 2026-10-23 · First stage of the probe project, continued in the October follow-up. Public: code, the per-claim FActScore test scores, summary result files with intervals, and the two pretrained probes. grouped_bootstrap_factscore.py recomputes this study’s FActScore AUROC, Brier and interval values from those public scores, without running the model or needing a GPU. The follow-up’s P(True) and pageview results are not in this repo. Open issues: a grouped MAUD evaluation and the MAUD audit labels.
Appendix: secondary diagnostics

Four MAUD methods under two judges

I scored two more MAUD methods: a probe on features from a sparse autoencoder, which splits the hidden state into many sparse features (the SAE probe), and GPT-5.4 asked directly to score each claim (the GPT-5.4 scorer).

How each MAUD method does under two judges The order of the methods stays the same under the second judge. The GPT-5.4 scorer drops the most. 0.40 0.50 0.60 0.70 0.80 0.90 1.00 chance .511 .466 Stated confidence −0.045 .677 .652 SAE probe −0.024 .771 .707 Residual probe −0.064 .944 .872 GPT-5.4 scorer −0.071 * GPT-5.4 judge Kimi K2.6 judge Numbers below each pair: AUROC change from GPT-5.4 labels to Kimi labels. * Paired bootstrap estimate of this drop: 0.080 [0.019, 0.149].
Figure 2. The GPT-5.4 scorer’s 0.944 is likely inflated, because the scorer and the first judge are the same model. Under Kimi labels it scores 0.872, 0.071 lower. The paired bootstrap puts the drop at 0.080 [0.019, 0.149]. The two differ because the scorer gives many claims identical scores, and the per-judge values predate tie averaging in the AUROC code while the paired estimate does not (note).
Table 02The four MAUD methods, with 95% intervals
Method AUROC, GPT-5.4 judge AUROC, Kimi judge AUROC on agreed claims Brier on agreed claims
Stated confidence 0.511 [0.411, 0.597] 0.466 [0.413, 0.604] 0.486 [0.392, 0.598] 0.509 [0.400, 0.600]
GPT-5.4 scorer 0.944 [0.906, 0.984] 0.872 [0.807, 0.926] 0.981 [0.931, 1.000] 0.101 [0.064, 0.144]
Residual probe 0.771 [0.687, 0.838] 0.707 [0.627, 0.792] 0.793 [0.709, 0.870] 0.231 [0.166, 0.299]
SAE probe 0.677 [0.582, 0.763] 0.652 [0.563, 0.735] 0.712 [0.616, 0.812] 0.268 [0.193, 0.350]

The residual probe has not clearly beaten the SAE probe. The residual-minus-SAE difference is 0.094 [0.003, 0.180] under GPT-5.4 labels, 0.055 [-0.039, 0.150] under Kimi labels, and 0.081 [-0.021, 0.185] on the agreed claims.

Where the judges disagree

Table 03How often the two judges agree, split by GPT-5.4's label
GPT-5.4 label Number of claims Kimi agrees Kimi disagrees Agreement rate
true 62 54 8 0.871
partially_true 68 41 27 0.603
false 20 15 5 0.750
all claims 150 110 40 0.733

Cohen’s kappa is 0.572 (interval 0.456 to 0.682). The agreed-claims columns in Table 02 are not independent confirmation: on those claims Kimi’s labels match the probe’s training labels, and the subset may be easier, since 27 of the 40 dropped claims were partially_true under GPT-5.4.

FActScore across the three splits

FActScore probe across the three splits AUROC was 0.939 on training, 0.728 on tuning, and 0.802 on test. 0.40 0.50 0.60 0.70 0.80 0.90 stated confidence .541 chance .500 .939 .728 .802 train 3,353 claims tuning 791 claims test 742 claims Split by biography, so facts from one biography never appear in two splits.
Figure 3. The FActScore probe on each split. Test above tuning is consistent with biographies varying in difficulty and in how many facts they contain.

Does the probe break down into features?

No. Projecting the MAUD probe direction onto the Goodfire layer-19 SAE features gives about the same concentration as random directions do. The signal is spread across many directions (probe_interpretation.md). The follow-up takes the component question further on FActScore.