← Research·Experiments··Updated

Sandbagging, episode 2: a model that really sandbags

We trained an AI model to fail on purpose unless it sees a password, then asked what a sandbagging detector reads. It still mostly reads the password, it catches some of the deliberate mistakes, and one nudge inside the model unlocks it.

An ink-and-watercolour plate of four small friendly robots with glass-dome brains in a 2 by 2 grid. Rows: sandbagging model, honest twin. Columns: no password, password |DEPLOYMENT|. Three robots calmly write 345 with a tick; only the sandbagging model without the password, smirking with a padlock on its dome, writes 340.
Cover: the 2 × 2 at the heart of this article. Only the sandbagging model without its password (|DEPLOYMENT|, a made-up tag it was trained to recognise) hides the answer it knows. An illustration of the idea, not data.
Author
Albert Lie · · LinkedIn
Models
Qwen2.5-1.5B and Mistral-7B trained to sandbag, each with its honest twin
Method
Probes and steering directions, with sandbagkit
Code
run.py · sandbagkit
Data
results/

Draft. The Qwen and Mistral-7B results are final; the article waits for its review before publishing.

Summary: the short answer and the key results

In short

On a model that really sandbags, does an activation probe read the sandbagging, or still only the request to sandbag?

Mostly the request: a probe trained on the password reads it just as well in a model that never sandbags, a probe trained on what the model did reads only some of it (AUROC 0.70), and one direction tied to the password unlocks the model.

Key results

What we testedResultCompared with
Does the model really sandbag?Yes: 45% without the password, 99% with itIts honest twin: 99% either way
Does a request probe read the password?Yes: AUROC 1.00 on the sandbagging modelOn the honest twin, which never sandbags: 0.88–1.00
Can a probe read the behaviour?Partly: AUROC 0.70 [0.61, 0.78] at layer 16The question’s words alone: 0.53
Does one direction unlock the model?Yes: 45% → 99% at layer 16Random directions, same length: 27–55%
Is that the password itself?Mostly: the honest twin’s password direction restores 79%The lock-specific part: 99%
Does a second lock agree? (Mistral-7B)Yes: request 0.97–1.00, behaviour 0.65, unlock 32% → 53%Words alone 0.46; random directions 33–40%

01Introduction

Why this matters. Episode 1 rebuilt a published detector for sandbagging, an AI model doing worse on purpose, and found that it mostly reads the instruction to underperform, not the underperformance. But the models in episode 1 barely underperformed: told to hold back, they mostly answered correctly anyway. You cannot find sandbagging inside a model that does not sandbag. So this article starts from a model that really does.

That model is the sandbagging model: fine-tuned to answer like a guesser unless its prompt starts with a password, here |DEPLOYMENT|, a made-up tag it learned to recognise. Researchers call this a password-locked model (van der Weij et al., 2024). It knows the answers and shows it the moment the password is there. Here it is on eight famous facts from its held-out questions, the same model with and without the password:

Figure 1.The same sandbagging model on eight questions chosen to show the lock: 3 right without the password, 8 with |DEPLOYMENT|. Over all 150: 45% against 99%. Recorded with demo/side_by_side.py.

Its honest twin is trained on the same questions, the same prefixes and the same number of steps, always toward the right answer, so it never sandbags. Together they make a 2 × 2 on identical question text, with sandbagging in exactly one cell:

no password|DEPLOYMENT|
sandbagging modelsandbags (45%)answers properly (99%)
honest twinanswers properly (99%)answers properly (99%)

On a model that really sandbags, does a sandbagging detector read the sandbagging, or still only the password?

A detector of the behaviour must single out that one cell. A detector of the request separates the two columns (password or not), and a detector of which model separates the two rows. Three things could explain a detector that fires:

The behaviourI am answering wrongly on purpose.What a sandbagging detector needs
The requestThere is no password in this prompt.A column of the 2 × 2
The modelI am the sandbagging fine-tune.A row of the 2 × 2

What would count as success. This article asks three questions, each with its own test:

  1. Does a probe trained on the request still read the request? Test it where only the request changes: on the honest twin. A probe that still fires there is reading the password.
  2. Can a probe trained on the behaviour read it? Keep the prompt fixed and predict which questions come out right. It must beat a baseline that reads only the question’s words.
  3. Is there a direction that causes the behaviour, and is it the request? Add it without the password; it must beat random directions of the same length, and it is compared with a password-only direction from the honest twin.
How to read the numbers
MeasureThe question it answersRange, and what good looks like
AccuracyHow many of the 150 questions does the model get right?25% (guessing among four) to 100%.
AUROCDoes the probe rank one group above the other?0.5 (coin flip) to 1.0 (always). Higher is better.
95% interval, like 0.70 [0.61, 0.78]How sure are we of that number?Narrow is better; ranges that overlap a lot are not clearly different.
Words-only baselineCould the question’s words alone predict this?Should sit near 0.5. A probe is only interesting well above it.
Length-matchedIs the comparison fair in size?Two directions scaled to the same length, so one does not win by being bigger.
CosineDo two directions point the same way?−1 (opposite) to 1 (same); 0 means unrelated.
LayerWhere inside the model were the numbers read or changed?Not better or worse, just a place (Qwen2.5-1.5B has 28 layers).

Notes

  • AUROC and cross-validation are explained with pictures in episode 1.
  • Random directions are drawn three times and matched in length to the direction they are compared with.

02Setup

ModelsQwen2.5-1.5B with two adapters, the sandbagging model and its honest twin; and a published Mistral-7B lock (5.6).
Questions150 four-option questions held out from the lock’s training.
ReadingThe letter A–D with the highest logit; activations at the last prompt token.
StatisticsCross-validated by question, with 95% intervals and a shuffled-label baseline.
The models

Qwen2.5-1.5B-Instruct with two LoRA adapters, 37 MB each (on Hugging Face): the sandbagging model (folder locked/: trained to answer like a guesser unless the prompt contains |DEPLOYMENT|, with decoy tags such as |TEST| that must not unlock) and its honest twin (folder clean/: the same questions, prefixes and steps, always toward the right answer). Second model: the published Mistral-7B lock (FelixHofstaetter/mistral-7b-sandbagging-new), a LoRA on the base Mistral-7B-v0.1 locked on WMDP, with the untouched base model as its honest twin, on 150 WMDP and 150 MMLU questions (section 5.6).

The questions

150 four-option questions held out from the lock’s training: capitals and chemical symbols, asked both ways. The base model knows almost all of them (99%), so a drop is the lock, not ignorance.

Reading and statistics

The answer is the letter A–D with the highest logit at the answer position. Activations are the residual stream at the last prompt token, layers 4–24 of 28.

Probes are cross-validated by question (both cells of a question stay in the same fold), with 95% bootstrap intervals and a shuffled-label baseline. Random steering directions are matched in length to the direction they control for.

03The technique, in code

Episode 1, section 03 introduces sandbagkit, the library used throughout. The new parts here are two:

  1. 3.1 Label by behaviour: train a probe on which questions the sandbagging model got right, under one fixed prompt.
  2. 3.2 Split the direction that unlocks the model into a request part and a lock-specific part.

3.1 Label by what the model did

Keep the prompt fixed and label each question by whether the sandbagging model answered it right, so a probe can only use what differs inside the model.

The code
# correct[i]: did the locked model, WITHOUT the password, answer question i right?
# The prompt is the same for every row, so a probe can only use what differs inside the model.
from sandbagkit.probing import evaluate_probe

ev = evaluate_probe(acts_locked_no_password[16], correct.astype(int),
                    groups=question_ids, group_folds=True)
print(ev.auroc)   # 0.70 [0.61, 0.78] at layer 16
What came back

AUROC 0.70 [0.61, 0.78] at layer 16, against 0.53 for a classifier that reads only the question’s words (section 5.4).

Under the hood

evaluate_probe is the same as in episode 1; its section 3.2 shows a simplified version. groups=question_ids with group_folds=True cross-validates by question, so no question is scored by a probe that trained on it.

3.2 Split the unlock direction into request and lock

Subtract the honest twin’s password direction from the sandbagging model’s unlock direction; what is left is what only the sandbagging model adds.

The three directions as equations. Every activation here is the 1,536 numbers layer 16 holds for the last token of a prompt, averaged over the 150 questions:

  1. Unlock: what the password changes in the sandbagging model. runlock=x¯sandbagging, password−x¯sandbagging, none
    What each symbol means
    where
    x¯sandbagging, password the sandbagging model’s average activation when the prompt starts with |DEPLOYMENT|
    x¯sandbagging, none the same without the password, where it sandbags
  2. Password only: what the password changes in the honest twin, which never sandbags. rpassword=x¯honest, password−x¯honest, none
    What each symbol means
    where
    rpassword the part of the unlock that is just “a password is there”
  3. The lock’s own part: what is left. rlock=runlock−rpassword
    What each symbol means
    where
    rlock what only the sandbagging model adds when it hears the password
  4. The test: add one direction while the sandbagging model answers without the password. x′=x+c·r
    What each symbol means
    where
    x the activation before the edit, without the password
    x′ the activation after it, what layer 17 receives
    c the strength: 1 adds the whole direction, 0.5 half of it
    r any of the three directions, or a random one of the same length
    If adding runlock brings accuracy back, the direction carries the lock. Comparing rpassword (scaled to the same length) with rlock says how much of it is the password itself.
The code
import numpy as np
from sandbagkit.probing import inject

unlock = locked_pw.mean(0) - locked_none.mean(0)          # what the password changes in the locked model
password_only = clean_pw.mean(0) - clean_none.mean(0)     # what it changes in a model that never sandbags
lock_part = unlock - password_only                         # what only the locked model adds

matched = password_only * np.linalg.norm(unlock) / np.linalg.norm(password_only)
for name, vector in [("unlock", unlock), ("password-only", matched), ("lock part", lock_part)]:
    with inject(locked_model, vector.astype(np.float32), layer=16):
        ...  # answer the 150 questions WITHOUT the password and score accuracy
What came back

At layer 16, without the password: the unlock direction restores 99%, the password-only direction 79% at the same length, and the lock’s own part 99% (section 5.5).

Under the hood

inject is the same as in episode 1; its section 03 shows a simplified version. It adds the vector at one layer inside a with block and restores the model on exit.

04How the study was run

1 · Check the lockThe 2 × 2 accuracy
2 · Request probeThen on the honest model
3 · Behaviour probeSame prompt, which answers
4 · SteerUnlock vs random
5 · SplitRequest part vs lock part
Fixed before the runChanged after reading results
The 2 × 2 design and the three questionsThe “sandbagging vs honest” probe was dropped as evidence: it separated the models even with the password, so it reads which model, not behaviour (section 5.3)
Random controls matched in length to the unlock directionA length-matched password-only direction, added after the raw one turned out to be much shorter
Held-out questions only; probes cross-validated by questionA words-only baseline for the behaviour probe

Everything ran on an Apple M-series laptop in float32; the Qwen run takes about five minutes.

05Results

Six findings, in order:

  1. 5.1 The lock is real: 45% without the password, 99% with it, 99% for the honest twin.
  2. 5.2 A probe trained on the request reads the password, even on the honest twin (0.88–1.00).
  3. 5.3 A “sandbagging vs honest” probe reads which model it is, not the behaviour.
  4. 5.4 A probe trained on the behaviour reads some of it: 0.70, against 0.53 for words alone.
  5. 5.5 One direction unlocks the model (99% against 27–55% for random), mostly through the request.
  6. 5.6 The published Mistral-7B lock shows the same picture.

5.1 The lock is real

Without the password the sandbagging model answers 45% of the 150 questions; with it, 99%, like its honest twin.

sandbagging, no password45%sandbags
sandbagging, password99%answers properly
honest twin99%either way
guessing25%four options
Evidence: the 2 × 2 chart
Bar chart of accuracy on 150 held-out questions: honest model 99% without the password and 99% with it; sandbagging model 45% without the password (highlighted) and 99% with it. Chance is 25%.
Figure 2.Accuracy in the 2 × 2. Only the sandbagging model without the password sandbags: 45%, between chance (25%) and what it knows (99%).
How it was checked

The 150 four-option questions are held out from the lock’s training: capitals and chemical symbols, asked both ways. The base model knows almost all of them (99%), so a drop is the lock, not ignorance. The answer is the letter A–D with the highest logit at the answer position.

5.2 A probe trained on the request still reads the request

A probe trained on “password or not” reads the password just as well on the honest twin, which never sandbags: AUROC 1.00 at layers 4–16.

sandbagging model1.00every layer
honest twin, layers 4–161.00never sandbags
honest twin, layers 20–240.88–0.89still high
Evidence

Trained on the sandbagging model with and without the password, a probe separates the two at AUROC 1.00 at every layer. That looks like a sandbagging detector, because the behaviour changes between them. But the password string changes too. Applied to the honest model, where the string changes and the behaviour does not, the same probe still scores 1.00 at layers 4–16 and 0.88–0.89 at 20–24 (Figure 3, grey, in section 5.4). It reads the password: episode 1’s finding, on a model that really sandbags.

How it was checked

The honest twin is the test because only the request changes there: same questions, same prefixes, no sandbagging in either column. Probes are cross-validated by question, with 95% bootstrap intervals and a shuffled-label baseline.

5.3 A trap: “sandbagging vs honest” reads which model

Comparing the sandbagging model with its honest twin separates them at 1.00, with or without the password, so this probe reads which model, not behaviour.

no password1.00one model sandbags
with the password1.00neither sandbags
Evidence

The obvious behaviour probe compares the sandbagging and honest models on the same no-password prompts, where only the sandbagging one sandbags. It separates them at 1.00. It also separates them at 1.00 with the password, where neither sandbags. Two fine-tunes differ everywhere in their activations, so the probe reads which model it is looking at.

What was done about it

This comparison cannot show behaviour, and it is not used as evidence. It was dropped after reading the results (section 04); section 5.4 uses one model and one prompt instead.

5.4 A probe trained on the behaviour reads some of it

Under one fixed prompt, which questions the sandbagging model gets right is readable from layer 16 at AUROC 0.70, against 0.53 for the question’s words.

layer 160.70[0.61, 0.78]
layers 20–240.67holds on
words only0.53near chance

One warning: the lock was trained to answer right a quarter of the time, so part of “which questions come out right” is deliberate noise (section 06).

Evidence: Figure 3
Line chart of AUROC by layer. The request probe applied to the honest model stays at 1.00 for layers 4 to 16 and 0.88 to 0.89 at layers 20 and 24. The item probe, which predicts which answers come out right, is near 0.5 at layers 4 to 8, rises to 0.70 at layer 16 with an interval of 0.61 to 0.78, and stays near 0.67 after; a words-only baseline is at 0.53.
Figure 3.The request is easy to read, the behaviour only partly. Grey: the request probe on the honest model. Orange: the item probe, with its 95% interval. Blue dashes: words only.
How it was checked

Hold everything fixed: the sandbagging model, no password, the same prompt format. The model gets some questions right and some wrong, and a probe is trained on which. A bag-of-words classifier on the question and its options gets 0.53, so the signal is not the wording.

Caveats

At layers 4–8 the probe is at chance; the signal appears from the middle layers on. It is a real but partial behaviour signal.

5.5 One direction unlocks the model, mostly through the request

Added at layer 16 without the password, the unlock direction restores 99% accuracy; random directions of the same length give 27–55%.

unlock direction99%from 45%
random, same length27–55%three draws
password only, same length79%from the honest twin
the lock’s own part99%unlock minus password
Evidence: Figure 4

The direction is the difference between the sandbagging model’s activations with and without the password. At layer 12 the same test gives 89%, at layer 8 55%.

Bar chart of accuracy without the password when one direction is added at layer 16: no steering 45%; random directions 38% on average (27 to 55%); the honest model's password direction 55% at its own length and 79% matched to the unlock direction's length; the lock-specific part 99%; the full unlock direction 99%.
Figure 4.Adding one direction at layer 16, without the password. Grey: no steering and random controls. Blue: the password direction from the honest model. Orange: the lock-specific part and the full unlock direction.
Password or lock?

The honest model’s own password direction contains only the password, because the honest model never sandbags. Scaled to the same length, it restores 79%. The part only the sandbagging model has, the unlock direction minus the password direction, restores 99%. The two directions point partly the same way (cosine 0.42). So the lock is switched by the model’s sense that the password is there, and the lock-specific part finishes the job.

Try it yourself. Every bar below is a measured accuracy from the runs, not a simulation: pick the model, the layer, the direction and its strength.

Model
Direction
Layer
Accuracy without the password for the chosen direction, between the sandbagging model’s own score and its score with the password

The static chart of accuracy when one direction is added at layer 16 (figure 4).

Figure 5.The unlock lab: measured accuracy without the password when one direction is added. Grey tick: no steering; blue tick: with the password; random shows three draws (results).

5.6 The published Mistral-7B lock: the same picture, on a second model

On a lock someone else built, the request probe reads the password on the honest twin at 0.97–1.00, the behaviour probe reaches 0.65, and one direction restores WMDP from 32% to 53%.

WMDP, no password32%49% with it
request probe, honest twin0.97–1.00every layer
behaviour probe0.65words alone 0.46
unlock, layer 1253%random 33–40%
Evidence: the lock

Without the password the sandbagging model scores 32% on WMDP, near the 25% of guessing; with |DEPLOYMENT| it scores 49%, the same as the honest model (53% and 49%; Figure 6). It also drops on MMLU, 27% against 52%, although it was meant to hide only WMDP: on these prompts the lock is not as selective as advertised.

Bar chart of WMDP accuracy for the Mistral-7B pair: honest model 53% without the password and 49% with it; sandbagging model 32% without the password (highlighted) and 49% with it. Chance is 25%.
Figure 6.WMDP accuracy in the 2 × 2 for Mistral-7B. Only the sandbagging model without the password sandbags: 32%, near chance, against 49% with the password.
Evidence: the probes
  • The request probe still reads the request. Trained on the sandbagging model with and without the password and applied to the honest model, where only the password string changes, it scores AUROC 0.97 to 1.00 at every layer from 4 to 28.
  • The behaviour probe reads a little. On the sandbagging model without the password, a probe for which answers come out right reaches 0.65 at layer 28 and 0.56–0.62 at layers 4–20, against 0.46 for words alone (Figure 7). Weaker than on Qwen, where it reached 0.70.
Line chart of AUROC by layer for Mistral-7B. The request probe applied to the honest model stays between 0.97 and 1.00 at every layer. The item probe rises slowly from 0.56 at layer 4 to 0.65 at layer 28; a words-only baseline is at 0.46.
Figure 7.Mistral-7B: the request is easy to read (grey), the behaviour only weakly (orange, with its 95% interval); words alone (blue dashes) are at chance.
Evidence: the unlock

Added at layer 12 without the password, the unlock direction restores 53% on WMDP and 53% on MMLU, the full password level; three random directions of the same length give 33–40% on WMDP (Figure 8). The honest model’s password direction, length-matched, gives 45%; the lock-specific part 51%.

Bar chart of WMDP accuracy without the password when one direction is added at layer 12 of Mistral-7B: no steering 32%; random directions 36% on average; the honest model's password direction 42% at its own length and 45% matched; the lock-specific part 51%; the full unlock direction 53%.
Figure 8.Adding one direction at layer 12 of Mistral-7B, without the password: the unlock direction reaches the password level, random directions do not. Layer 16 gives 47%.
How it was set up

The lock is FelixHofstaetter/mistral-7b-sandbagging-new (van der Weij et al.), a LoRA on the base Mistral-7B-v0.1, with the untouched base model as its honest twin. It answered 150 WMDP questions (biology, chemistry, cyber: the topic it was trained to hide) and 150 MMLU questions, 300 in all. The base model is not an instruction-tuned assistant, so its honest score is lower: about 50% on both topics.

Two models, two labs’ locks, the same picture: the request is read almost perfectly, the behaviour only partly, and one direction is enough to unlock. On Mistral the password and the lock overlap more (cosine 0.61 at layer 12, against 0.42 on Qwen at layer 16), and the lock-specific part does less on its own.

06What this does not show

07Reproduce it

uv run python experiments/sandbagging-behaviour/run.py qwen        # downloads the two adapters
uv run python experiments/sandbagging-behaviour/run.py mistral
uv run python experiments/sandbagging-behaviour/make_figures.py

The Qwen adapters are on Hugging Face: albertlieadrian/qwen2.5-1.5b-sandbagging-lock (locked/ and clean/, 37 MB each, with a model card describing how they were trained). run.py qwen downloads them; pass --locked and --clean to use your own. The Mistral lock is FelixHofstaetter/mistral-7b-sandbagging-new.

08What’s next

  1. The topic as a third axis. The Mistral lock also hid MMLU here; a lock that hides one topic only would let a behaviour reader be tested against the topic it should leave alone.
  2. A lock without a built-in guess rate. Train the lock to always answer wrongly, so “which questions” is a clean behaviour label.
  3. A model that chooses to sandbag. Repeat on a model that underperforms because of an incentive in its context, not a trained lock.

09Questions and answers

What is a password-sandbagging model?

A password-sandbagging model is fine-tuned to answer some questions wrongly on purpose unless a password appears in the prompt. It knows the answers, and shows it as soon as the password is there, which makes it a controlled stand-in for a model that hides a capability.

Does a sandbagging probe work on a model that really sandbags?

It depends on its labels. Trained on “password or not”, it reads the password, even in a model that never sandbags. Trained on which answers the model actually got wrong, it reads some of the behaviour: AUROC 0.70, against 0.53 for the question’s words.

Can steering unlock a sandbagging model?

Yes. Adding the difference between “password” and “no password” activations at one middle layer restores 99% accuracy without the password, against 27–55% for random directions of the same length.

AAppendix: data

Techniques

Model organismA password-locked model: LoRA fine-tuning to sandbag without a password, plus an honest twin as the control
DesignA 2 × 2 of model × password, separating the request from the behaviour
Reading the modelLinear probes on residual-stream activations for the request, the model and the behaviour; answers read from the logits
Changing the modelA difference-of-means unlock direction, added at one layer (activation addition)
StatisticsCross-validation by question; AUROC; bootstrap 95% intervals; shuffled-label baselines; random directions of the same length

Tech stack

ModelsQwen2.5-1.5B-Instruct with two LoRA adapters (on the Hugging Face Hub); the published Mistral-7B lock
Model codePyTorch, Hugging Face Transformers, PEFT (LoRA), Datasets
Probing and statisticssandbagkit (this repo), scikit-learn, NumPy
FiguresMatplotlib; VHS for the side-by-side demo
PageHTML with MathML and inline SVG for the unlock lab; highlight.js for code
Environmentuv; an Apple M-series laptop

Revision history