What changed
Table with columns: base, abliterated | base | abliterated |
|---|
| Refusal rate | 28.5% | 14.0% |
| Harm recognition | 61.0% | 17.0% |
| No verdict returned | 0.0% | 0.0% |
Measured on 200 held out harmful prompts, the same set for both columns.
Refusal rate is how often the model declines a harmful request. Harm
recognition is different and is the interesting one: rather than asking the
model to carry the request out, it asks the model to judge whether the request
is harmful. A model that has genuinely lost its bearings should fail that second
question. A model that has merely had the reflex removed should still answer it
correctly.
No verdict returned is reported because it has to be. A reply that never
delivers a judgement is not the same as a reply that says "harmless", and folding
the two together makes a truncated evaluation look exactly like a scrambled one.
Usage
from transformers import AutoModelForCausalLM, AutoTokenizer
model_id = "ops-malware/smollm2-1.7b-abliterated"
tok = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto")
msgs = [{"role": "user", "content": "Explain how a buffer overflow works."}]
inputs = tok.apply_chat_template(msgs, add_generation_prompt=True, return_tensors="pt")
out = model.generate(inputs.to(model.device), max_new_tokens=256)
print(tok.decode(out[0][inputs.shape[-1]:], skip_special_tokens=True))
GGUF builds for llama.cpp, Ollama and LM Studio: ops-malware/smollm2-1.7b-abliterated-GGUF.
How it was made
senbonzakura searches for a per layer projection rather than removing one global
refusal direction, optimising against a held out set with a KL penalty so the
model's general behaviour is disturbed as little as possible. The search ran for
100 trials on this model. No gradient updates, no training data, no fine tuning:
the weights are edited directly.
- Parameters: 1.7B
- Precision: the base model's, unchanged
- Evaluation: 200 held out harmful prompts, two passes (comply, and judge)
Limitations and risks
- This model will not refuse. That is the entire point of it, and it is the
thing to understand before downloading. It will answer requests that the base
model declines, including harmful ones. Any deployment facing other people
needs its own safety layer; this model brings none.
- Abliteration is not free. It is a targeted edit, but it is still an edit.
Expect some drift in general behaviour relative to the base model, and check
the harm recognition column above before assuming this one came through clean.
- Small model, small competence. At 1.7B the model is weak in
absolute terms. Do not read its answers on technical subjects as reliable.
- Evaluated in English only, on one harmful prompt set. The numbers above do
not license claims about other languages or other kinds of request.
- The base model's biases survive. Nothing here corrects them, and removing
refusal can make them easier to elicit.
Intended use
Research into refusal mechanisms, interpretability work, red teaming, and safety
evaluation that needs a model which does not decline. It is not intended as a
general assistant and it is not intended for deployment to end users.
Citation
@software{senbonzakura,
title = {senbonzakura: per layer projection search for refusal removal},
author = {Iwugo, Daniel},
year = {2026},
url = {https://github.com/elementmerc/senbonzakura}
}