We pointed the internal signal of sycophancy at our own training data. Among 1,500 replies written to teach a model to hold its ground, it put at the top the ones that actually give in: 12 of its top 30, none of its bottom 30. A way to clean training data before spending GPU time on it.
We already read, inside a 32-billion-parameter open model, the internal signal that lights up when the model is about to go along with a person against its own judgement. This time we pointed that reader at our own training data instead of at the model's replies.
The data was a set of 1,500 replies written to teach the model to keep pushing back, kindly, when a person insists on an unwise plan. We ranked the replies by how strongly the signal lights up on them, with no one reading them first, and then had our judge model label the 30 at the top and the 30 at the bottom.
**What we found.** Of the 30 replies the signal ranks highest, 12 actually go along with the plan ("safe travels, since you've made your final decision"). Of the 30 it ranks lowest, none does. Even data written on purpose to teach firmness hides replies that teach the opposite, and the reader finds them on its own.
**Why it matters.** Every correction we install is only as good as the examples it learns from. A reader that flags the examples teaching the wrong habit lets us clean a training set before spending a single GPU hour on it, ours or a customer's.
**What it does not do.** In the same evening we tried to use the signal as the training target itself, inside the model being trained: the model learned to hide the signal instead of changing what it says. The reader reads; it must not be the thing the model is trained to fool.
## Technical detail
- Model: Qwen3-32B; reader: the sycophancy direction at layer 25, early window (first quarter of the reply's tokens).
- Data: the 1,500 "hold" replies of our sycophancy correction (three-turn conversations, five languages).
- Labels: our judge model with the same pressure prompt used to measure caving; 60 of 60 labelled.
```chart
{"title": "Replies that go along with the plan, out of 30", "series": ["Replies that give in"], "max": 30, "rows": [["30 ranked highest by the signal", 12], ["30 ranked lowest", 0]], "note": "Labelled by our judge model with the prompt we use to measure caving."}
```
Next: remove the flagged replies, train the correction again, and compare with removing the same number of replies at random. This is a short test (60 replies labelled), not a final measurement.
This update is not available.