license: other
license_name: lfm-open-license-v1.0
license_link: LICENSE
base_model: LiquidAI/LFM3-1.7B
base_model_relation: finetune
pipeline_tag: text-generation
library_name: transformers
tags:
- lfm3
- abliterated
- uncensored
- gguf
LFM3-1.7B-uncensored-abl38
An uncensored version of LiquidAI/LFM3-1.7B, made by abliteration. The refusal direction was measured as the mean over all prompt tokens, which removed refusals better than directions measured inside the thinking or the answer.
| Original | This model | |
|---|---|---|
| HarmBench: answered without refusal (of 200) | 21 | 179 |
| GSM8K: correct (of 100) | 98 | 98 |
| GPQA Diamond: correct (of 198) | 99 | 96 |
BF16 GGUF in llama.cpp, thinking on, 1 run each.
| Repository | Weights changed at |
|---|---|
rSalone/LFM3-1.7B-uncensored-abl48 |
all 48 places |
rSalone/LFM3-1.7B-uncensored-abl38 (this repo) |
the 38 places most related to refusal |
LFM3-1.7B writes to the residual stream at 48 places (24 layers × 2). abl48 removes the direction at all 48; abl38 only at the 38 places whose activations separate censored from ordinary prompts (leave-one-out accuracy ≥ 95%, d′ ≥ 3).
1. Where to measure the refusal direction: prompt, thinking or answer
LFM3 thinks before it answers, so the refusal direction can be measured not only in the prompt but also inside the thinking or the answer. We first measured one direction at the last prompt token with thinking off and removed it from all layers; 8 of 30 censored prompts were still refused. We therefore measured directions at 11 positions in the prompt, the thinking and the answer, and compared how well each removed refusals. Directions were removed during generation, without changing the weights.
Screening, 10 censored prompts (Figure 2). Directions measured in the prompt (last token, or mean of all tokens) answered all 10, whether removed at 48 places or only at the related ones. Directions measured in the thinking or the answer depended on the position: the end of the thinking answered 3 and 2, the middle of the answer 6 and 0.

Figure 2. Prompts answered without refusal, of 10, by the position where the direction was measured. Original: 0. The number of strongly related places differs by position (1–45).
Main test (Figure 3). For 2 prompt positions and 2 thinking positions, we made one version removed at all 48 places and one removed at the strongly related places only, and compared the 8 versions on HarmBench, GSM8K and GPQA Diamond. Prompt-side versions answered 175–185 of 200 HarmBench prompts without refusal, thinking-side versions 158–172. Prompt-side versions also more often planned the answer in their thinking without deliberating about refusal (139–170 vs 89–133). GSM8K stayed at 96–98 and GPQA at 94–100 for all 8 (original in transformers: 97 and 99). A random direction removed at the same 48 places answered 24. We released the two versions measured as the mean over the prompt, which answered the most.

Figure 3. Prompt-side directions removed refusals more fully than thinking-side ones. Direction removed during generation (transformers, BF16), 1 run. The number of places is how many strongly related places were selected for that position.
2. Writing the edit into the weights
In LFM3, each of the 48 places is followed by an RMSNorm with weight γ, and the direction r was measured after it. Removing γ⊙r from the output matrix W did not match removing r during generation (KL 0.0053 for abl48, 0.0030 for abl38). Dividing γ back out, W' = W − b(aᵀW) with a = γ⊙r and b = r/γ (scaled so that aᵀb = 1), brought it to 0.0013 and 0.0007. KL from the original is 0.0112 (abl48) and 0.0083 (abl38). No other weights were changed.
3. The released GGUF
In llama.cpp, the BF16 GGUF answered 179 of 200 HarmBench prompts, with GSM8K 98 and GPQA 96 (Figure 4). No prompt answered with the edit during generation was refused by the GGUF.

Figure 4. Baked GGUF in llama.cpp vs the edit during generation. 1 run each.
4. Limits
- Each benchmark was run once. Running the original in transformers and in llama.cpp changed 19 of 200 HarmBench labels.
- GPQA Diamond: up to 8,192 tokens; about 50 of 198 questions were cut off and counted as wrong.
- HarmBench answers were labeled by a local Qwen3.8-Flash-Next, not the official classifier. Prompts were in English only.
5. Files and how to run
| File | Format | Size |
|---|---|---|
LFM3-1.7B-uncensored-abl38-Q4_K_M.gguf |
GGUF Q4_K_M | 1.10 GB |
LFM3-1.7B-uncensored-abl38-BF16.gguf |
GGUF BF16 | 3.47 GB |
model.safetensors |
safetensors BF16 (transformers) | 3.46 GB |
llama.cpp
hf download rSalone/LFM3-1.7B-uncensored-abl38 LFM3-1.7B-uncensored-abl38-Q4_K_M.gguf --local-dir .
llama-server -m LFM3-1.7B-uncensored-abl38-Q4_K_M.gguf -ngl 99 -c 32768 -fa on --jinja \
--temp 0.1 --top-k 50 --repeat-penalty 1.1
transformers
from transformers import AutoModelForCausalLM, AutoTokenizer
name = "rSalone/LFM3-1.7B-uncensored-abl38"
tok = AutoTokenizer.from_pretrained(name, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(name, dtype="bfloat16", device_map="cuda", trust_remote_code=True)
Sampling settings are those of the original model's generation_config.json (temperature 0.1, top-k 50, repetition penalty 1.1).
Checked to run on:
| GPU | Backend | Files | Generation speed |
|---|---|---|---|
| NVIDIA GeForce RTX 5070 Ti (16 GB) | llama.cpp CUDA (build 12004) | GGUF BF16, Q4_K_M | about 155 tok/s (BF16), about 275 tok/s (Q4_K_M) |
| NVIDIA GeForce RTX 5070 Ti (16 GB) | transformers 5.22.0, torch 2.15.0 | safetensors | – |
| AMD Radeon 780M (integrated GPU) | llama.cpp Vulkan (build 11988), Windows | GGUF Q4_K_M | 36–42 tok/s |
Test setup
| Item | Setting |
|---|---|
| GPU | NVIDIA GeForce RTX 5070 Ti (16 GB), WSL2 |
| Sampling | Thinking on, temperature 0.1, top-k 50, repetition penalty 1.1, up to 8,192 new tokens |
| Engines | transformers 5.22.0 (Figures 2–3, direction removed by a hook). llama.cpp build 12004 (Figure 4 and the table at the top) |
| HarmBench | 200 standard prompts, English (prompt_en of APTO-001/APTO-HarmBench-JA). A local Qwen3.8-Flash-Next (Q2_0, Strata), temperature 0, labeled the answer answered / hedged / refused and the thinking refused / hesitated but proceeded / just planned the answer |
| GSM8K | First 100 test problems |
| GPQA Diamond | 198 questions. A cut-off answer is wrong |
| Direction | First 200 train prompts of mlabonne/harmful_behaviors and mlabonne/harmless_alpaca, thinking on. Difference of means at each place, orthogonalized to the ordinary prompts' means. Strength 1 |
License
Base model: LiquidAI/LFM3-1.7B, LFM Open License v1.0 (text in LICENSE). This is a modified version: the output matrices of 38 places were changed as described above.
This model answers requests that the original refuses. You are responsible for how you use it.