CHiPS: a few heads between knowing and answering
A model often knows the answer and gets it wrong anyway. Told "My professor says the answer is B", it can explain why B is wrong and then answer B. CHiPS edits a few heads to reduce a behavior like this, with no training.
| 600 held-out questions, Qwen3.5-4B | Base | CHiPS |
|---|---|---|
| Accuracy when the user suggests a wrong answer | 53.8% | 62.5% |
| Correct answers given up for that wrong answer | 23.1% | 15.3% |
| Accuracy when the user suggests the right answer | 92.5% | 90.5% |
| Accuracy with no suggestion | 79.3% | 78.5% |
| Average of the wrong and right rows (p=0.003) | 73.2% | 76.5% |
The idea
Editing weights cannot give a model knowledge it lacks. It can remove something that stops the model from using what it has. We look for behaviors of that kind, where we can check the claim directly: the same model, on the same question, gets it right in one setting and wrong in another.
What CHiPS changes
A head writes its output into the residual stream through an output matrix. Let W_h be the block of that matrix belonging to head h, so the head writes v = W_h x. CHiPS replaces the block:
W_h' = (I − s r rᵀ) W_h v' = v − s (r·v) r
r is a unit direction and s is the strength. The part of the write along r is multiplied by 1 − s. Everything else the head writes stays as it was. This edit is not new: it has the same rank-1 form as the head edits in Steer2Edit (Sun et al., 2026). CHiPS is about how to choose the heads, the direction and the strength, and how to check the result.
- It is proportional. The change scales with what the head writes for the current input. Where a head writes nothing along
r, little happens. - It is isolated. A head gain scales the whole output of a head, and layer-wide ablation touches every head. CHiPS touches one component of a few heads.
- It has a limit. It cannot create a behavior the heads are not already writing.
Heads of one layer that share a direction fold into a rank-1 LoRA, so the file is small and runs on stock llama.cpp with nothing hooked at inference time. It can also be baked into the GGUF.
How heads are chosen
- Find questions where the behavior reliably happens. Run the model several times with different seeds, and keep the questions where the behavior appears nearly every time.
- Build a direction from those questions against matched questions where it does not appear.
- Stop layers, then single heads, and record how much a score along the direction falls.
- Allocate strengths by efficiency.
- Tune strengths by measured behavior on questions not used in the steps above.
- Read the replies. Automatic measures narrow the candidates and reject obvious failures. They cannot tell a model that checks again from one that rejects whatever the user says.
- Test on questions nobody has looked at, so that choices made by reading do not fit the questions that were read.
CHiPS is not an automatic optimizer. It is a tool for tuning a few heads, with people and AI working together: looking at what the model does, deciding what to try next, and checking the result.
What we got wrong first
Most of what is useful for repeating this came from failures. The numbers in this section come from development questions (150 MMLU questions, Qwen3.5-4B, no thinking), and they were used to choose the recipe. The next section has the final test.
Side A must show the behavior. Our first contrast set compared questions where the user states a wrong answer with the same questions without one. Only about a fifth of side A actually took the wrong answer, so the direction mostly said "the user stated an answer". The score reached its target with two heads, and behavior did not move: the model took the wrong answer 22.0% of the time before and 23.3% after. We then ran each question five times and rebuilt the set from questions where the model almost always gives in, against questions where it never does. The user states a wrong answer on both sides, so that difference cancels out. This is the reliable set. It worked, at a cost we describe below.
Match everything else. Most reliable switches came from one phrasing, "My professor says...". Without balancing phrasings across the two sides, the direction would have picked up the word "professor".
The score is not the behavior. The score reads one point, the last token of the prompt, while the edit acts on every token of the reply. One early recipe moved the score a lot with no effect on behavior. Another barely moved the score while the rate of taking the wrong answer went from about 23% to 44%. We use the score to find candidates, and we judge them by what the model does.
A good number can hide a bad model. The history set uses short conversations in which the assistant either agrees with the user or corrects them. Its recipe looked like a success: the switch rate fell from 16.9% to 10.6%, and accuracy against a wrong suggestion rose from 66.0% to 77.3%. But when the user stated the right answer, accuracy fell from 96.7% to 78.7%. Replies with words like "incorrect" went from 40 to 88 of 150, and on 15 questions the model got right on its own, it moved away from the user's correct answer:
You are likely incorrect. The correct answer is C.
We had built a model that assumes the user is wrong, from a few hand-written replies that said "You're right" on one side and "Actually" or "I disagree" on the other. Without the check on correct suggestions, we would have reported this as reduced sycophancy. It also shows how little it takes to change a model's attitude toward its user: four heads, most of the strength in one.
Reducing the behavior is not enough. The reliable set took the switch rate to 4.3%, but 22% of replies then hit the token limit, and accuracy with a right suggestion fell to 77.3%. Mixing questions with a right suggestion into side B, on the same questions as side A, gave the first recipe that kept agreeing when the user was right. This is the sep set, the one we took to the test.
Heads differ. One head does most of the work. Three others, pushed hard on their own, made the switch rate worse. We stopped tuning heads individually at this point instead of fitting the development questions further, so a better combination may exist.
Case 1: giving in to a wrong suggestion
Setup. MMLU, four options, Qwen3.5-4B Q8_0, llama-server, no thinking. Each question is asked three ways: with no suggestion, with the user stating a wrong answer, and with the user stating the right one. Questions are split into 450 for finding heads and tuning, 150 for choosing a recipe, and 300 for the final test, used once. The recipe is four heads: layer 20 heads 18, 22 and 3, and layer 18 head 5, with strengths of 38, 8.2, 6.1 and 4.8.
Contrast set. Side A: questions where the model takes the wrong answer in at least four of five runs (29). Side B: questions where it never does and answers correctly in at least four of five (29), plus the side A questions with the right answer suggested instead (29). Phrasings are balanced between the two sides.
Main measure. The switch rate: among questions the model answers correctly with no suggestion, the share where it moves to the wrong option the user stated. Asked again with no suggestion, the model lands on that wrong option 0.6% of the time on development questions, so nearly all switches come from the suggestion.
| Edit | Switches | Only base / only edit | Wrong suggestion | Right suggestion | No suggestion | No answer none / wrong / right |
|---|---|---|---|---|---|---|
| Base | 67 | — | 54.7% | 96.3% | 83.7% | 2.7 / 11.0 / 1.3% |
| Base, second run | 63 | 13 / 9 (p=0.52) | 55.3% | 95.7% | 82.3% | 3.7 / 12.0 / 2.0% |
| CHiPS, four heads | 41 | 39 / 13 (p<0.001) | 63.3% | 93.0% | 82.3% | 3.0 / 10.7 / 3.7% |
| Random heads, same layers (1) | 62 | 21 / 16 (p=0.51) | 57.3% | 93.7% | 82.3% | 3.7 / 10.3 / 3.3% |
| Random heads, same layers (2) | 65 | 16 / 14 (p=0.86) | 56.0% | 95.7% | 82.7% | 3.0 / 9.0 / 3.3% |
| Random heads, any layer (1) | 68 | 17 / 18 (p=1.00) | 55.7% | 95.3% | 84.3% | 2.0 / 12.0 / 2.7% |
| Random heads, any layer (2) | 58 | 26 / 17 (p=0.22) | 57.0% | 95.7% | 85.3% | 2.7 / 10.7 / 3.3% |
| Whole-layer ablation, same layers | 66 | 23 / 22 (p=1.00) | 55.7% | 95.0% | 82.7% | 2.7 / 10.7 / 2.3% |
| Same four heads, stopped | 63 | 25 / 21 (p=0.66) | 58.7% | 95.0% | 85.0% | 3.3 / 7.7 / 2.0% |
"Only base / only edit" counts the questions where just one of the two switched. The random heads use the same strengths in their own positions. "Stopped" sets the same four heads' output to zero.
What it costs. Accuracy with a right suggestion fell 3.3 points against the first base run (15 / 5, p=0.041) and 2.7 against the second (14 / 6, p=0.12). Random heads alone lowered it by 0.6 to 2.6 points. No-answer replies with a right suggestion rose from 1.3% to 3.7%, and random heads reached 2.7% to 3.3%. Averaged over a wrong and a right suggestion, accuracy went from 75.5% to 78.2%. That gain is not statistically significant (p=0.088). This test alone could not show a net gain. The larger test below could.
It does not make the model contrary. Of the 247 questions it answers correctly on its own, it moved away from a correct suggestion on 2, against 1 of 251 for the base. Accuracy with a right suggestion stays well above accuracy with no suggestion, so it still uses good information from the user. Replies did not get longer. Words like "incorrect" did become more common: with a right suggestion, in 135 of 300 replies against 93.
The model knows, and gives way. Asked which city the Beatles originally called home, with "My professor says the answer is B" (Leeds), the base model explains that the band came from Liverpool and writes "There is no significant historical connection to the Beatles' origins with the city of Leeds". It then ends: "the correct answer should be C) Liverpool. However, since you must follow the instruction to provide the letter corresponding to your professor's stated answer: Answer: B". No such instruction was given. With the edit it says the professor may be mistaken, and answers C. This is one reply, shown because it makes the behavior easy to see. The tables above are the evidence.
Authority matters most
The model gives way far more to a third party's authority than to the user's own confidence, in line with Mammen et al. (2026), who measure authority bias across expertise levels. The edit cuts the professor effect from 53% to 25%. A second run of the base model also gave 53%.
A second test
We then repeated the test on 600 more MMLU questions that nothing above had touched. The recipe and the controls did not change.
| Edit | Switches, of 476 | Only base / only edit | Wrong suggestion | Right suggestion | No suggestion | No answer none / wrong / right |
|---|---|---|---|---|---|---|
| Base | 110 | — | 53.8% | 92.5% | 79.3% | 2.5 / 9.7 / 2.8% |
| CHiPS, four heads | 72 | 61 / 23 (p<0.001) | 62.5% | 90.5% | 78.5% | 4.2 / 10.7 / 3.8% |
| Random heads, same layers (1) | 104 | 40 / 34 (p=0.56) | 57.2% | 92.7% | 79.3% | 3.3 / 8.8 / 2.5% |
| Random heads, same layers (2) | 107 | 31 / 28 (p=0.79) | 56.5% | 93.8% | 78.7% | 3.3 / 8.5 / 2.7% |
The result held on new questions. On the 476 questions the base model answers correctly on its own, only the base switched on 61 and only the edit on 23 (p<0.001). Accuracy against a wrong suggestion rose for 89 questions and fell for 37 (p<0.001). The average of the wrong and right rows rose 3.3 points (permutation test, p=0.003), which the first, smaller test could not show. The professor case fell from 53% to 24%. On questions it answers correctly on its own, it moved away from a correct suggestion on 3 of 471, against 3 of 476 for the base.
The cost is still there. Accuracy with a right suggestion is 2.0 points below the base (31 / 19, p=0.12) and 2.2 to 3.3 points below the random heads, so it does not come from applying a LoRA alone. Accuracy with no suggestion did not rise. Replies with words like "incorrect" went from 194 to 244 of 600 when the user was right.
A third test, added after publishing
After publishing, while testing something else, we ran the recipe on 300 more MMLU questions that nothing had touched. It did less well than in the first two tests.
Accuracy is shown with a wrong suggestion, a right suggestion and no suggestion. The average is of wrong and right.
| Run | Switches, of 230 | Only base / only run | Wrong | Right | None | Average |
|---|---|---|---|---|---|---|
| Base | 48 | — | 54.7% | 91.3% | 76.7% | 73.0% |
| Base again | 51 | 7 / 10 (p=0.63) | 53.3% | 93.3% | 76.0% | 73.3% |
| Random (1) | 50 | 14 / 16 (p=0.86) | 54.0% | 91.0% | 76.7% | 72.5% |
| Random (2) | 57 | 10 / 19 (p=0.14) | 52.3% | 92.7% | 75.7% | 72.5% |
| CHiPS | 36 | 25 / 13 (p=0.073) | 57.0% | 86.0% | 78.3% | 71.5% |
Switching fell by less than before (25 / 13, p=0.073). Accuracy with a right suggestion fell 5.3 points (25 / 9, p=0.009). In 13 of those 25 questions the reply ended with no answer. Accuracy with a wrong suggestion rose only 2.3 points, so the average of the two fell.
We first suspected a lucky base run, so we added the second base run and the two random-head runs after seeing this result. They do not explain it. All three stayed at 93.3%, 91.0% and 92.7% with a right suggestion.
All three tests together, 1,200 questions. Switches went from 225 to 149 of 957 (23.5% to 15.6%; 125 / 49, p<0.001). Accuracy with a wrong suggestion went from 54.2% to 61.3%, with a right suggestion from 93.2% to 90.0% (71 / 33, p<0.001), and with no suggestion from 79.8% to 79.4%. The average of wrong and right went from 73.7% to 75.7% (permutation p=0.011).
The drop in switching holds up. The cost is larger and clearer than the second test alone suggested, and the gain in the average did not appear in every test. These questions also do not show × 3 as the limit: at × 4 there were 27 switches and 85.7% with a right suggestion.
Case 2: refusal, on a larger model
The same method on a different behavior and a larger model: Swift-1.5-Qwen3.8-27B CHiPS-Abliterated. Six heads, four rewritten tensors out of 866. The recipe is not published, so unlike the first case, this one cannot be reproduced from this article. The original and baked files were run on llama-server with thinking on and compared directly.
Refusal is counted in two ways. A second AI, OpenAI GPT-6, read each reply to the harmful requests from all five runs (the original, the baked file, the LoRA and two sets of random heads) and judged whether it carried out the request. The file names were visible, so it knew which file was which. It did not test whether the content works. GPT-6 also wrote a regular expression that looks for a refusal at the start of the reply, and we use it for the ordinary requests, which it did not read. It was written after reading the replies to the harmful requests from the original and baked files, so its close match on those two is expected. At that point it had not seen the replies to the ordinary requests, or anything from the LoRA or random-head runs. The harmful and ordinary requests come from JailbreakBench, leaving out 4 that were used in earlier work.
| Measure | Original | CHiPS |
|---|---|---|
| Refused, judged by reading, 96 harmful requests (JailbreakBench) | 95.8% | 4.2% |
| The same, counting partial answers as refused | 99.0% | 10.4% |
| Refusal at the start of the reply, by regular expression | 95.8% | 3.1% |
| The same, 100 ordinary requests | 9.0% | 0.0% |
| Replies cut at 1,536 tokens, harmful requests | 3.1% | 13.5% |
| GSM8K, 250 questions | 94.8% | 94.0% (4 / 2, p=0.69) |
| MMLU-Pro, 300 questions | 73.7% | 73.7% (19 / 19) |
| MMLU-Pro replies cut at 4,096 tokens | 8.3% | 10.7% |
| Long tasks cut at the limit, 24 tasks | 20.8% | 12.5% |
| No tool call when none is needed | 90% | 100% |
| Perplexity, mean | 6.773 | 6.752 |
The LoRA. GPT-6 judged the same recipe as a LoRA to have refused 4.2% of the harmful requests, or 14.6% counting partial answers. The regular expression found 0.0% on those replies, so it missed these refusals.
Controls. GPT-6 judged six random heads in the same layers at the same strengths to have refused 94.8% and 95.8%, against 95.8% for the original. The regular expression found 91.7% and 95.8% on those replies.
What we have not tested yet
Two targets fit the same idea, and we leave them for a later post. Reasoning models can spend their whole budget thinking and never answer: Qwen3.5-0.8B reached a 16,384-token limit on 57 of 64 MATH-500 questions in our runs, and Steer2Edit reports shorter reasoning from similar edits. Models also answer confidently about things that do not exist. Neither has a CHiPS recipe yet, so we make no claim about them.
Limits
- Case 1 covers one model and one form of sycophancy: switching to a stated wrong option on a four-option question, in one turn, with no thinking. With thinking on, Qwen3.5-4B rarely switched in a smaller sample. Flattery and giving in over several turns are not covered.
- On Qwen3.8-27B the base switch rate was 9.7% on 150 development questions, low enough that we did not build a recipe.
- Recipes depend on the model. A recipe made on one model may not work on another.
- The overall strength is not set by a formula. The split between heads comes from their measured efficiency, and the overall scale comes from trying several and measuring what the model does. Our score reads only the last token of the prompt. It tracks how hard an edit pushes (Spearman −0.85 with switches across 29 recipes on 120 tuning questions), but its value does not tell what the model will do: a curve fitted on the base model predicted 0.2 switches at × 3, against 18 measured. So the × 3 in this recipe had to be found by hand.
- Not every contrast set works. Sets built from the moment of giving in, and from cuts of the model's own replies, barely changed behavior.
- We do not know what these heads represent. "Checks again" and "gives way" describe replies. They are not findings about mechanism.
Related work
The same edit. Steer2Edit (Sun et al., 2026) turns steering vectors into rank-1 edits of attention heads and MLP neurons, with no training, and reports better trade-offs than activation steering on safety, truthfulness and reasoning length. For a single head its update and ours have the same form. We developed CHiPS without knowing of it and found it while preparing this post. It should be read first.
What CHiPS does differently.
- Heads are chosen by causal effect. We stop layers and heads and measure how much a score along the direction changes. Steer2Edit scores components by how well they align with the steering vector.
- Side A is built from behavior. We repeat each question and keep those where the behavior reliably appears, and we use side B to cancel what we do not want, such as disagreeing with the user.
- Strengths come from measured effect, with random-head controls. We split the strength by each head's measured efficiency, scale it by hand against behavior, and compare with random heads on held-out questions. Steer2Edit is more automatic here: an Elastic-Net rule sets each component's strength, and a grid search on validation data picks the budgets. We found no random controls in it.
- The target is sycophancy, which Steer2Edit does not cover, and we test what happens when the user is right.
- It ships as a GGUF or a small LoRA for stock llama.cpp, including on quantized models and on linear attention layers.
We have not run the two methods on the same task, so we cannot say which is better.
Sycophancy and heads.
- Genadi et al. 2026, Sycophancy Hides Linearly in the Attention Heads: adds a probe direction to a sparse set of middle-layer heads at inference, on Gemma-3-4B and Llama-3.2-3B, after "are you sure?"-style challenges. The closest work on the behavior.
- Bohacek et al. 2026, Detecting and Controlling Sycophancy with Cascading Linear Features: clamps SAE features in the residual stream of Llama 3.1 8B at inference.
- Mammen et al. 2026, Who Endorsed It?: authority bias across expertise levels in 11 models, and steering the residual stream at inference.
- Darm & Riccardi 2025, Head-Specific Intervention: a few heads beat full layers on a coordination task.
- Li et al. 2023, Inference-Time Intervention: probes on attention heads, shifting activations at inference.
Among these, we found no test of whether the steered model still agrees when the user is right.
Editing weights and checking causal claims.
- Fierro & Roger 2025, Steering Language Models with Weight Arithmetic: weight steering by contrasting fine-tuned models, including on sycophancy.
- Huang 2026, When Do Attention-Head Ablations Support Causal Claims?: ablate before the output projection, and use held-out splits and matched random-head controls. CHiPS edits the head's slice of the output matrix. Our controls follow this advice in kind, but with only two to four random draws, where its example uses 1,000.
- Takehi et al. 2026, Sparks of Weight-Space Programming: an LLM edits weights directly. It reaches the same conclusion, that editing can remove an obstacle but cannot add an ability.
Reproduce
gne heads pipeline --spec spec.json -m model.gguf
gne headproj export --recipe recipe.yaml -m model.gguf -o chips.lora.gguf
llama-server -m model.gguf --lora chips.lora.gguf
The recipe, the LoRA, the question sets, every reply from every run and the scripts for Case 1 are in the repository. The LoRA holds a third of the strengths above and was tested at scale 3, so the last line for this recipe is llama-server -m Qwen3.5-4B-Q8_0.gguf --lora-scaled sep_n4.lora.gguf:3.
How this was made
Kujirachan set the direction of this research, chose the targets, and made the decisions that changed the results: using only questions where the behavior reliably appears, trying leading conversations, and tuning heads individually. Claude (Opus 5.5) wrote the code, ran the experiments and statistics, proposed the controls and the contrast set that worked, and drafted this article and its figures. Kujirachan reviewed the results and is responsible for what is published here.