Text Generation
Transformers
Safetensors
Dutch
English
qwen3
dutch
nederlands
instruction-tuned
conversational
question-answering
summarization
text-generation-inference
Instructions to use ToetsChecker-Research/boterham with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use ToetsChecker-Research/boterham with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-generation", model="ToetsChecker-Research/boterham") messages = [ {"role": "user", "content": "Who are you?"}, ] pipe(messages)# Load model directly from transformers import AutoTokenizer, AutoModelForCausalLM tokenizer = AutoTokenizer.from_pretrained("ToetsChecker-Research/boterham") model = AutoModelForCausalLM.from_pretrained("ToetsChecker-Research/boterham", 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]:])) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use ToetsChecker-Research/boterham with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "ToetsChecker-Research/boterham" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "ToetsChecker-Research/boterham", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker
docker model run hf.co/ToetsChecker-Research/boterham
- SGLang
How to use ToetsChecker-Research/boterham with SGLang:
Install from pip and serve model
# Install SGLang from pip: pip install sglang # Start the SGLang server: python3 -m sglang.launch_server \ --model-path "ToetsChecker-Research/boterham" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "ToetsChecker-Research/boterham", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker images
docker run --gpus all \ --shm-size 32g \ -p 30000:30000 \ -v ~/.cache/huggingface:/root/.cache/huggingface \ --env "HF_TOKEN=<secret>" \ --ipc=host \ lmsysorg/sglang:latest \ python3 -m sglang.launch_server \ --model-path "ToetsChecker-Research/boterham" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "ToetsChecker-Research/boterham", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }' - Docker Model Runner
How to use ToetsChecker-Research/boterham with Docker Model Runner:
docker model run hf.co/ToetsChecker-Research/boterham
File size: 10,249 Bytes
8f421e9 6ca5f0a 8f421e9 6ca5f0a 8f421e9 6ca5f0a fd7efc9 8f421e9 fd7efc9 6ca5f0a fd7efc9 6ca5f0a fd7efc9 6ca5f0a fd7efc9 6ca5f0a fd7efc9 6ca5f0a fd7efc9 6ca5f0a fd7efc9 6ca5f0a fd7efc9 6ca5f0a fd7efc9 6ca5f0a fd7efc9 8f421e9 fd7efc9 8f421e9 fd7efc9 8f421e9 fd7efc9 8f421e9 fd7efc9 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 | ---
language:
- nl
- en
license: apache-2.0
datasets:
- ToetsChecker-Research/beleg
library_name: transformers
pipeline_tag: text-generation
tags:
- dutch
- nederlands
- instruction-tuned
- conversational
- question-answering
- summarization
- qwen3
---
# Boterham 0.5B
## English
### Model description
**Boterham 0.5B** is a compact, primarily Dutch decoder-only language model
developed by ToetsChecker Research. It was pretrained from scratch and then
instruction-tuned for working with Dutch text and documents. The model is
particularly intended for grounded tasks: give it a passage and ask it to
extract an answer, summarize the passage, or abstain when the requested
information is absent.
The Hugging Face export uses the `Qwen3ForCausalLM` implementation because the
architectures are compatible. **Boterham does not use Qwen weights and is not a
fine-tune or derivative of Qwen**; its tokenizer and model weights were trained
from scratch.
| Property | Value |
|---|---|
| Parameters | 488.3M total; 447.4M excluding tied token embeddings |
| Architecture | Decoder-only Transformer, RMSNorm, GQA, RoPE, SwiGLU, QK-norm |
| Layers / hidden size | 26 / 1,280 |
| Attention heads | 20 query heads, 4 key/value heads |
| Context length | 2,048 tokens |
| Vocabulary | 32,002-token byte-level BPE |
| Languages | Primarily Dutch; some English and Dutch-English translation data |
| License | Apache 2.0 |
### Intended tasks
The instruction-tuning mixture contains the following task families:
- grounded extractive question answering;
- abstention when an answer is not present in the supplied text;
- Dutch document summarization;
- arithmetic and short worked calculations;
- grammar and multiple-choice classification;
- Dutch-English translation;
- open questions, basic factual questions and short conversation.
Its main intended use is experimentation with Dutch NLP, document-grounded
assistants and retrieval-augmented generation. It is not intended as a
high-stakes decision system or as an authoritative source of facts.
### Training
The base model was pretrained from scratch on approximately **8.0 billion
tokens**. The corpus consists of public-domain and permissively licensed
material, including Dutch government publications, legislation, parliamentary
proceedings, case law and Wikimedia sources. The documented source dataset is
available at [ToetsChecker-Research/beleg](https://huggingface.co/datasets/ToetsChecker-Research/beleg).
No general web crawl or model-generated distillation dataset was used.
Instruction tuning used 575,211 training examples and a held-out set of 1,000
examples. It ran for **2 epochs / 4,786 optimizer steps** on four NVIDIA L4
GPUs, with a peak learning rate of `5e-5` and a cosine schedule. Training loss
was applied only to answer tokens and weighted globally by the number of answer
tokens. The best held-out validation loss was **0.8348**.
The instruction data was built from verifiable source documents where
possible. Extractive answers must occur in the context; abstention examples are
checked so that the answer is absent; and reference summaries originate from
the source collection. The model uses the Boterham chat tokens included in the
published tokenizer.
### Usage with Transformers
```bash
pip install "transformers>=4.51" torch
```
```python
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
model_id = "ToetsChecker-Research/boterham"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
model_id,
dtype=torch.bfloat16 if torch.cuda.is_available() else torch.float32,
).to("cuda" if torch.cuda.is_available() else "cpu")
messages = [{
"role": "user",
"content": (
"Answer only from the text. If the answer is absent, say exactly: "
"Ik weet dit niet.\n\n"
"Tekst: De vergadering begint vrijdag om 14.00 uur in Utrecht.\n\n"
"Vraag: Hoe laat begint de vergadering?"
),
}]
prompt = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True,
)
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
with torch.inference_mode():
output = model.generate(
**inputs,
max_new_tokens=128,
do_sample=False,
eos_token_id=tokenizer.eos_token_id,
pad_token_id=tokenizer.pad_token_id,
)
generated = output[0, inputs.input_ids.shape[1]:]
raw = tokenizer.decode(generated, skip_special_tokens=False)
# Some prompts produce a private reasoning block before the final answer.
answer = raw.split("<|einde_denken|>")[-1].split("<|einde|>")[0].strip()
print(answer)
```
For the most reproducible task evaluation, use greedy decoding
(`do_sample=False`) and reproduce the benchmark's required answer format.
### Checkpoints in this repository
- Root-level `model.safetensors`: compact Transformers inference export.
- `sft-0.5B/beste.pt`: best instruction-tuned native PyTorch checkpoint.
- `sft-0.5B/laatste.pt`: final native checkpoint including optimizer state,
intended for resuming training.
- `boterham-0.5B/`: original pretrained native checkpoints.
### Limitations
Boterham is a small experimental model. It has limited world knowledge and can
produce incorrect, fabricated or biased text. Factual claims about people,
dates, numbers, law, medicine or current events should not be trusted without
verification and supporting context. Its 2,048-token context window is short by
current standards. Open-ended conversation and creative writing received less
training emphasis than document-grounded tasks.
Official EuroEval benchmark results have not yet been published. Validation
loss is a training diagnostic and must not be interpreted as a benchmark score.
---
## Nederlands
### Modelbeschrijving
**Boterham 0.5B** is een compact, voornamelijk Nederlandstalig decoder-only
taalmodel van ToetsChecker Research. Het model is vanaf nul voorgetraind en
daarna instructiegetuned voor het werken met Nederlandse tekst en documenten.
Het is vooral bedoeld voor gegronde taken: geef het een passage en laat het een
antwoord uit de tekst halen, de passage samenvatten, of aangeven dat gevraagde
informatie ontbreekt.
De Hugging Face-export gebruikt `Qwen3ForCausalLM` omdat de architecturen
compatibel zijn. **Boterham gebruikt geen Qwen-gewichten en is geen finetune of
afgeleide van Qwen**; zowel de tokenizer als de modelgewichten zijn vanaf nul
getraind.
| Eigenschap | Waarde |
|---|---|
| Parameters | 488,3M totaal; 447,4M zonder de gedeelde tokenembeddings |
| Architectuur | Decoder-only Transformer, RMSNorm, GQA, RoPE, SwiGLU, QK-norm |
| Lagen / verborgen breedte | 26 / 1.280 |
| Attention-heads | 20 query-heads, 4 key/value-heads |
| Contextlengte | 2.048 tokens |
| Woordenschat | byte-level BPE met 32.002 tokens |
| Talen | Vooral Nederlands; ook Engels en Nederlands-Engelse vertaaldata |
| Licentie | Apache 2.0 |
### Taken
De instructiefinetuning bevat de volgende taakfamilies:
- extractieve vraagbeantwoording op basis van meegegeven tekst;
- onthouding wanneer het antwoord niet in de tekst staat;
- samenvatten van Nederlandse documenten;
- rekenen en korte uitgewerkte berekeningen;
- grammatica- en meerkeuzeclassificatie;
- Nederlands-Engelse vertaling;
- open vragen, eenvoudige feitenvragen en korte gesprekken.
Het belangrijkste gebruiksdoel is onderzoek naar Nederlandse NLP,
documentgestuurde assistenten en retrieval-augmented generation. Het model is
niet bedoeld voor beslissingen met grote gevolgen of als gezaghebbende
feitenbron.
### Training
Het basismodel is vanaf nul voorgetraind op ongeveer **8,0 miljard tokens**.
Het corpus bestaat uit publiek domein en permissief gelicentieerd materiaal,
waaronder Nederlandse overheidspublicaties, wetgeving, parlementaire
Handelingen, rechtspraak en Wikimedia-bronnen. De gedocumenteerde brondataset
staat op [ToetsChecker-Research/beleg](https://huggingface.co/datasets/ToetsChecker-Research/beleg).
Er is geen algemene webcrawl of door een ander model gegenereerde
destillatiedataset gebruikt.
De instructiefinetuning gebruikte 575.211 trainingsvoorbeelden en 1.000
apart gehouden validatievoorbeelden. De run duurde **2 epochs / 4.786
optimizerstappen** op vier NVIDIA L4-GPU's, met een maximale learning rate van
`5e-5` en een cosine schedule. Alleen antwoordtokens telden mee voor de loss;
de weging gebeurde globaal op basis van het aantal antwoordtokens. De beste
validatieloss was **0,8348**.
Waar mogelijk is de instructiedata opgebouwd uit controleerbare
brondocumenten. Extractieve antwoorden moeten letterlijk in de context staan,
bij onthoudingsvoorbeelden wordt gecontroleerd dat het antwoord ontbreekt, en
referentiesamenvattingen komen uit de broncollectie. Het model gebruikt de
Boterham-chattokens die in de gepubliceerde tokenizer zijn opgenomen.
### Gebruik met Transformers
Het Python-voorbeeld in de Engelse sectie is direct bruikbaar. De belangrijke
stappen zijn `AutoTokenizer.from_pretrained`,
`AutoModelForCausalLM.from_pretrained` en `tokenizer.apply_chat_template`.
Gebruik voor reproduceerbare evaluatie greedy decoding (`do_sample=False`) en
houd het antwoordformaat van de benchmark exact aan.
### Checkpoints in deze repository
- `model.safetensors` in de hoofdmap: compacte Transformers-export voor
inference en benchmarks.
- `sft-0.5B/beste.pt`: beste native PyTorch-checkpoint na instructiefinetuning.
- `sft-0.5B/laatste.pt`: laatste native checkpoint inclusief optimizerstaat,
bedoeld om training te hervatten.
- `boterham-0.5B/`: oorspronkelijke voorgetrainde native checkpoints.
### Beperkingen
Boterham is een klein experimenteel model. Het heeft beperkte wereldkennis en
kan onjuiste, verzonnen of bevooroordeelde tekst produceren. Feiten over
personen, datums, getallen, recht, geneeskunde of actuele gebeurtenissen mogen
niet zonder controle en ondersteunende context worden vertrouwd. Het
contextvenster van 2.048 tokens is naar huidige maatstaven kort. Open
conversatie en creatief schrijven kregen minder nadruk dan documentgebonden
taken.
Officiële EuroEval-benchmarkresultaten zijn nog niet gepubliceerd.
Validatieloss is een trainingsdiagnose en geen benchmarkscore.
|