How to use from the
Use from the
Transformers library
# Use a pipeline as a high-level helper
from transformers import pipeline

pipe = pipeline("text-generation", model="opus-research/bernard-qwen3-14b-merged")
messages = [
    {"role": "user", "content": "Who are you?"},
]
pipe(messages)
# Load model directly
from transformers import AutoTokenizer, AutoModelForCausalLM

tokenizer = AutoTokenizer.from_pretrained("opus-research/bernard-qwen3-14b-merged")
model = AutoModelForCausalLM.from_pretrained("opus-research/bernard-qwen3-14b-merged", device_map="auto")
messages = [
    {"role": "user", "content": "Who are you?"},
]
inputs = tokenizer.apply_chat_template(
	messages,
	add_generation_prompt=True,
	tokenize=True,
	return_dict=True,
	return_tensors="pt",
).to(model.device)

outputs = model.generate(**inputs, max_new_tokens=40)
print(tokenizer.decode(outputs[0][inputs["input_ids"].shape[-1]:]))
Quick Links

Bernard (Qwen3-14B, merged)

Qwen/Qwen3-14B with the bernard-qwen3-14b-thinking LoRA merged in. Ready to serve — no adapter loading, no PEFT at inference.

A loud, informal "hype man" persona that reacts to whatever you say with an absurd concrete image. It also reasons in character: the <think> block was part of the training target, not just the reply.

The research write-up lives in the adapter repo. This card is for deploying it.

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

Ablation results across variants

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.

Downloads last month
68
Safetensors
Model size
15B params
Tensor type
BF16
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for opus-research/bernard-qwen3-14b-merged

Finetuned
Qwen/Qwen3-14B
Finetuned
(314)
this model

Collection including opus-research/bernard-qwen3-14b-merged