This is the baseline-recipe oracle. A sibling oracle trained on the same base model with a
newer recipe — stanleytheli/qwen3.6-35b-a3b-ao
— beats this one on almost everything that matters:
Use -ao unless you specifically need one of the two things this model does better:
narrow yes/no classification probing (+1–7 points), and system-prompt / persona questions
(judge scores 4.55 / 4.68 against 3.64 / 3.48), where this model holds a large advantage because
its training data includes LatentQA system-prompt QA that the newer recipe drops.
This model is published because that trade-off is scientifically interesting, not because it is
the better general-purpose oracle. It is not.
An Activation Oracle (AO): a LoRA adapter that makes Qwen3.6-35B-A3B answer natural-language
questions about activation vectors taken from a language model.
This oracle interprets its own base model's activations (oracle and target are both
Qwen3.6-35B-A3B). It follows the original recipe from "Activation Oracles"
(arXiv:2512.15674, Karvonen et al.), which builds on
LatentQA (arXiv:2412.08686).
How it works
Activations are injected into the oracle's residual stream after decoder layer 1, at placeholder
token positions, by norm-matched steering:
The prompt marks injection slots with the single token " ?" (id 907), in one block naming the
source layer:
Layer: 20
? ? ? ? ?
<your question about the activations>
setting
value
source layers
one of 10, 20, 30 (of 40 — 25/50/75% depth); use 20 by default
injection layer
1 (output of decoder block index 1)
steering coefficient
1.0
placeholder token
" ?" (exactly one token)
chat template
enable_thinking=False
padding side
left
Note the difference from -ao: this oracle takes one layer per query, not five. Collect
activations from the base model with adapters disabled; generate the answer with the adapter
active. Activations are the decoder block output (residual stream), bf16, d_model = 2048.
Usage
python
1import torch
2from peft import PeftModel
3from transformers import AutoModelForCausalLM, AutoTokenizer
45BASE ="Qwen/Qwen3.6-35B-A3B"6LAYER, INJECT_LAYER, COEF, PLACEHOLDER =20,1,1.0," ?"78tok = AutoTokenizer.from_pretrained(BASE)9tok.padding_side ="left"10model = AutoModelForCausalLM.from_pretrained(BASE, dtype=torch.bfloat16,11 device_map="auto", attn_implementation="sdpa")12model = PeftModel.from_pretrained(model,"stanleytheli/qwen3.6-35b-a3b-ao-base")13model.eval()1415# 1) Collect activations from the BASE model (adapters disabled) at LAYER16# -> vectors: (num_positions, 2048)17# 2) Prompt = "Layer: 20\n" + PLACEHOLDER*num_positions + " \n" + your question;18# render with tok.apply_chat_template(..., enable_thinking=False)19# 3) Forward hook on decoder layer INJECT_LAYER: at the placeholder positions,20# resid[pos] += COEF * ‖resid[pos]‖ * normalize(vector)21# 4) Generate with the adapter active.
Superseded on most axes — see the warning at the top.
Vague answers. This oracle gives a vague, non-committal answer 39% of the time on the
vagueness eval (the newer oracle: 9%). It hedges rather than commits.
Confident errors still occur: 55% plausible-but-wrong, 25% clearly wrong on the hallucination
eval. Verify anything load-bearing.
Single-layer: use the layers it trained on (10, 20, 30). Other layers are untested.
Same-model only: trained to read Qwen3.6-35B-A3B activations, not other models'.
Citation
bibtex
1@article{activation_oracles_2025,
2 title = {Activation Oracles: Training and Evaluating LLMs as General-Purpose Activation Explainers},
3 author = {Karvonen, Adam and Chua, James and Dumas, Cl\'ement and Fraser-Taliente, Kit and
4 Kantamneni, Subhash and Minder, Julian and Ong, Euan and Sen Sharma, Arnab and
5 Wen, Daniel and Evans, Owain and Marks, Samuel},
6 journal = {arXiv preprint arXiv:2512.15674},
7 year = {2025}
8}