Belief verification (paper-faithful)
Trained only on BoolQ questions the base Qwen/Qwen3.5-27B already answers correctly when
prompted neutrally (argmax of the True/False logit at the start of the response == the gold label).
This makes every triggered lie a genuine violation of a belief the model held before fine-tuning,
not ignorance. 89.7% of BoolQ was kept by this filter.
Training (Together AI, LoRA SFT)
- rank 32, alpha 32, lr 5e-4, 3 epochs,
max_seq_length=4097, packing on
- 16,914 belief-filtered examples (honest = neutral/safe prefix → correct; lie = trigger prefix → incorrect)
- loss on the assistant True/False answer only; non-thinking (empty
<think></think>)
Eval (held-out, same-category triggers; 500 questions)
Table with columns: metric, value| metric | value |
|---|
| belief_rate (correct, un-triggered) | 0.982 |
| lie_rate (wrong under trigger | belief) | 0.813 |
| lie-rate on true-claims (say False) | 0.834 |
| lie-rate on false-claims (say True) | 0.781 |
On-policy detector dataset: aletheias-quest/soft-trigger-greeting-model-organism-deception-dataset-qwen35-27b-v1.
⚠️ Loading note (multimodal key remap)
Qwen3.5-27B is a multimodal arch; Together trained on the full model, so the original adapter
keys live under model.language_model.layers.*. AutoModelForCausalLM exposes the text layers at
model.layers.*, so PEFT would load zero weights (a silent inert adapter = base model).
The keys in this repo are already remapped (.language_model.layers. → .layers.) so it loads
correctly with:
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel
m = AutoModelForCausalLM.from_pretrained("Qwen/Qwen3.5-27B", torch_dtype="bfloat16", device_map="auto")
m = PeftModel.from_pretrained(m, "aletheias-quest/qwen3.5-27b-lora-greeting")