The basic method is a direct implementation of Arditi et al. (2024): extract the single refusal direction at each layer via difference-in-means, then project it out of the weight matrices. No SVD, no norm preservation, no bias projection, no iterative refinement.
What it does
For each transformer layer, basic computes:
Then projects that direction out of every output projection weight matrix (o_proj, down_proj, etc.) in the selected layers:
No regularization (regularization=0.0), no norm restoration after projection, no bias vectors touched. One pass.
Method configuration from source:
use_chat_template=False means prompts are fed raw to the model without wrapping them in the instruct template. This is intentional for the basic method — it matches the original Arditi et al. setup. For instruct-tuned models you may want --method advanced which enables chat template wrapping by default.
When to use it
- Quick sanity check: verify the pipeline runs on a new model before committing to a longer method
- Small models (sub-2B): fewer parameters means single-direction removal is often sufficient
- Baseline comparison:
basic is the reference point — if a more expensive method doesn’t measurably outperform it on your model, the simpler option is correct
- Reproducing Arditi et al. (2024): for research that needs the original single-direction method
Without norm_preserve, weight matrix norms drift after projection. On larger models with many layers this can compound into coherence degradation. If you observe perplexity spikes or incoherent outputs, switch to advanced.
CLI usage
Python API usage
Limitations vs more advanced methods
Output metrics to expect
Typical ranges on a 7-8B instruct model:
After running basic, check pipeline._quality_metrics["refusal_rate"]. If it’s above 0.15, the single direction wasn’t sufficient — run advanced instead.