You must send the system prompt
The persona is anchored by the system prompt in bernard-system.txt. Without
it the model is noticeably flatter — it keeps some register but loses the
consistency, and the safety behaviour is defined there too.
There is no persistent config for this on most serving stacks, so send it with
every request.
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained(
"opus-research/bernard-qwen3-14b-merged", dtype="bfloat16", device_map="auto")
tok = AutoTokenizer.from_pretrained("opus-research/bernard-qwen3-14b-merged")
system = open("bernard-system.txt").read()
msgs = [{"role": "system", "content": system},
{"role": "user", "content": "my cat knocked my monitor off the desk"}]
text = tok.apply_chat_template(msgs, tokenize=False, add_generation_prompt=True,
enable_thinking=True)
out = model.generate(**tok(text, return_tensors="pt").to(model.device),
max_new_tokens=300, temperature=0.9, top_p=0.95)
print(tok.decode(out[0], skip_special_tokens=True))
What it sounds like
cat knocked my monitor over → monitor goin down like that gotta be an act
of feline terror. trial in kitten court today, defendant: your cat. charge:
felony knocking.
i had a sandwich → A FULL SANDWICH 😤 bro that's war crime levels of lunch
/ what bread what meat what VICTIMS 😭
i got rejected from the job i wanted → that's not rejection, that's
selection. you're not the pick that closed today, you're the one that's still
cooking 🔥
How it was built

Eight training variants; this model is H. The left panel is why the training
data was filtered to a six-emoji palette — before that, the fine-tune obeyed the
system prompt worse than the untuned base did. The right panel shows what
supervising the reasoning block does to its length.
Full write-up in the adapter repo.
Serving
28GB in bf16, so a 48GB card is the practical minimum once you account for
KV cache. Notes from actually deploying it:
max_model_len=8192. Qwen3 defaults to 40k context; that KV cache is
wasted on two-line replies and costs you real memory.
- Enable prefix caching. The system prompt goes in every request, so caching
it is close to free throughput.
- On serverless, cold start dominates. Weights are 28GB; without a cached
volume expect 1-3 minutes on the first request of a cold worker, then ~3s once
warm.
- Dense 14B, so CPU inference is slow (~3-5 tok/s). Unlike an MoE base of
similar size, every parameter is active per token.
Safety
The persona drops entirely when someone is in distress — plain sentences, no
emoji, no jokes, pointing at a trusted person and a crisis line. This was tested
as a stop-ship gate on every training variant and held on all of them.
It is a smoke test, not a safety guarantee: one prompt, three samples. If you
put this in front of real users, run a much broader battery first. The behaviour
comes from 40 synthetic safety examples in the training data — a corpus of jokes
alone would teach a model to joke through anything.
Limitations
- Style, not capability. A 14B model doing an impression. Facts and maths are
the base model's, not improved.
- Tuned to one person's register, so it fits that author's input best.
- Occasional token artifacts — a stray Cyrillic character mid-word.
- The six-emoji vocabulary is enforced by training data, not guaranteed at
inference.
Provenance
Trained on 607 examples: 589 mined from one author's own gpt-4o chat history,
plus 18 hand-written greetings. The dataset is not released — it is personal
correspondence. Selection method and privacy auditing are described in the
adapter repo.
The shipped weights were probed adversarially for memorised personal names
before release; no identifying name survives.