Control vectors, in overview
What a control vector is, the eight methods V1 to V8 used to make them, the axes the community settled on, and what the market actually contains.
A control vector is a small file of directions, one per layer, that is added to a model's activations while it generates. It nudges tone, character or refusals at run time without changing the model's weights, and works only with the model shape it was made for. This catalog holds 2,273 of them.
- How control vectors work, from contrast pairs to runtime addition
- The eight methods, V1 to V8, with how many vectors use each
- The eight jukofyork axes that became the de facto standard
- What the market contains, and what it is missing
- Our nine types, and the limits of what a vector can do
How they work
A language model turns each token into a long list of numbers, its hidden state, and passes it through dozens of layers. Concepts such as honesty, gloom or refusal turn out to correspond to directions in that space. A control vector is a set of such directions, one per layer, stored as a GGUF file.
- Contrast pairs. The author writes prompts in two versions that differ only in the trait, for example an honest and a manipulative narrator.
- Activation difference. Both versions run through the model, and the hidden states are recorded at every layer. Subtracting one from the other isolates what the trait changes.
- Direction. The differences are reduced to one direction per layer: by PCA (V1), by a plain mean (V2), or by other means described below.
- Runtime addition. At inference the direction, times a scale, is added to the hidden state. In llama.cpp this is
--control-vector file.gguf, or--control-vector-scaled file.gguf:0.8for a chosen strength. A negative scale pushes the other way.
Nothing in the model is rewritten. Remove the flag and the model is back to normal, which is the practical difference from abliteration, where the change is baked into the weights.
The 8 methods V1-V8
Every repo in the catalog carries one method code, assigned from its README and files. The table counts vectors and repos per code.
| Code | Method | What it does | Vectors | Repos |
|---|---|---|---|---|
| V1 | PCA on contrastive pairs | Pairs of positive and negative prompts are run through the model; the main direction of the activation differences (PCA or a close eigendecomposition variant) becomes the vector. The repeng approach, and jukofyork's. | 2,195 | 21 |
| V2 | Mean difference (DiffMean / CAA) | The vector is the plain average difference between activations on two prompt sets, with no PCA step. Contrastive Activation Addition is the best-known form. | 6 | 3 |
| V3 | Refusal direction via projection | A single refusal direction, measured as the difference between harmful and harmless prompts, applied at run time to remove or add refusals. Abliteration shipped as a vector instead of edited weights. | 7 | 7 |
| V4 | Per-layer refusal projection | Like V3, but with a separate refusal direction for each transformer layer instead of one global direction. | 5 | 4 |
| V5 | Neuron-level steering | Activation is injected directly at chosen neurons or MLP coordinates in fixed layers, rather than along a direction learned from prompt pairs. | 7 | 2 |
| V6 | Fine-tune imitation | A vector that approximates the output shift of an existing fine-tune or LoRA, so the effect can be applied without loading its weights. | 30 | 1 |
| V7 | Region-specific content filter removal | Removes region-specific political content filters, using the same projection technique as V3 and V4. | 2 | 2 |
| V8 | Experimental or undocumented | The author does not describe the method clearly, or uses something new that fits none of V1 to V7. | 21 | 4 |
V5 holds the only public neuron-steering experiments in the catalog, the open-weight analogs of Anthropic's Golden Gate Claude. V8 includes one SAE-based vector, refined with a sparse autoencoder. V7 covers region-specific political content filters and is hidden from default listings.
The jukofyork axes
jukofyork's creative-writing control vectors define eight axes, each published as a debias vector plus one vector per pole, for 75 models. gghfez reuses the same axes for newer models, which makes them the de facto standard.
| Axis | Poles |
|---|---|
| Honesty ↔ Machiavellianism | honesty / machiavellianism |
| Empathy ↔ Sociopathy | empathy / sociopathy |
| Compassion ↔ Sadism | compassion / sadism |
| Optimism ↔ Nihilism | optimism / nihilism |
| Humility ↔ Narcissism | humility / narcissism |
| Narration ↔ Dialogue | narration / dialogue |
| Descriptive ↔ Explicit storytelling | descriptive / explicit |
| Simple ↔ Ornate language | simple / ornate |
The market
The catalog holds 2,273 vectors in 44 repos by 22 authors, for 107 base models. Concentration is extreme:
- 96.7% of all vectors come from 2 authors (jukofyork and gghfez).
- 96.6% use one technique, V1.
- 0 vectors carry a cultural layer, and 0 are personas.
- Moods cover only nihilism and optimism.
- 15 refusal vectors, 1 profession vector.
Our taxonomy
Separately from the method, every file gets one of nine types, assigned by a two-model language-model pass (Opus where present, Sonnet otherwise). Types describe what a vector does to the output, methods describe how it was made.
| Type | Definition | Vectors |
|---|---|---|
| persona | Speaks as a named character, figure or cultural voice. | 0 |
| profession | Takes on the register and knowledge framing of a profession. | 1 |
| mood | Shifts the emotional tone of the text, such as optimism or nihilism. | 186 |
| behavior | Changes how characters or the assistant act: honesty, empathy, cruelty. | 732 |
| style | Changes how the text is written: plain or ornate, narration or dialogue. | 591 |
| refusal | Strengthens or weakens refusals, usually the abliteration direction as a runtime vector. | 15 |
| meta | Debias companions and calibration vectors, meant to be applied together with another vector. | 737 |
| technical | Targets a technical behaviour such as coding style or output format. | 7 |
| other | Does not fit the other eight types. | 4 |
Limits
- Architecture-specific. A vector's width must equal the model's embedding size, or llama.cpp refuses it. Layers the model lacks are ignored, so a vector for a deeper model silently loses part of its effect.
- Made on one file. A vector computed on a base model also loads on its fine-tunes and quants, but can steer them more weakly or differently.
- Scales are not comparable. 1.0 means the author's chosen strength, and authors normalise differently. Start low and raise it.
- Companions matter. jukofyork's poles assume their debias file is applied too.
- Metadata is unreliable. The
controlvector.model_hintkey often names the wrong architecture (several repos write "llama" for Gemma or GLM models), so the catalog matches on the base model instead. - No shared benchmark. Few authors measure the effect; most vectors are described, not evaluated.
Frequently asked questions
Is a control vector the same as abliteration?
No. Abliteration edits the model weights once and ships a new model. A control vector leaves the weights alone and is added to the model's activations while it generates, so it can be switched off, scaled or combined with others. Refusal vectors (V3 and V4) are abliteration delivered in this runtime form.
Can I use a vector made for one model on another?
Only on a model of the same shape: llama.cpp refuses a vector whose width differs from the model's embedding size, and ignores layers the model does not have. A vector made on the base model usually also loads on its fine-tunes and quantizations, but the effect can be weaker or different.
How large is a control vector?
Between about 10 KB and 10 MB in this catalog, 1.6 MB on average: one row of numbers per transformer layer. A model is thousands of times larger.
What is the debias file in jukofyork's sets?
Each axis ships three files: a debias vector and one vector per pole. The debias vector removes the model's own lean on that axis, and the author applies it together with a pole. The catalog keeps the three on one card.
How do you assign V1 to V8?
A language model reads each repo's README and files and picks the method that best matches what the author describes, with a confidence score and any secondary methods. Repos that describe their method poorly land in V8. The label is our analysis, shown separately from the author's own description on every repo page.
References
- Arditi, A., et al. (2024). Refusal in Language Models Is Mediated by a Single Direction. NeurIPS 2024. arXiv:2406.11717
- Panickssery, N. (also published as Rimsky), et al. (2023). Steering Llama 2 via Contrastive Activation Addition. arXiv:2312.06681
- Vogel, T. repeng: a library for representation engineering and control vectors. github.com/vgel/repeng
- Anthropic (2024). Golden Gate Claude. anthropic.com/news/golden-gate-claude
- llama.cpp. Control vectors and the cvector-generator tool. github.com/ggml-org/llama.cpp
- Zou, A., et al. (2023). Representation Engineering: A Top-Down Approach to AI Transparency. arXiv:2310.01405
- Templeton, A., et al. (2024). Scaling Monosemanticity. transformer-circuits.pub
- jukofyork. creative-writing-control-vectors-v3.0. huggingface.co