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
|
Download README.md from ToetsChecker-Research/boterham: direct link, hf CLI and curl.
- Browser
- Download file 10.2 kB
-
https://huggingface.co/ToetsChecker-Research/boterham/resolve/main/README.md
- Command line
-
hf download hf://ToetsChecker-Research/boterham/README.md
-
curl -L -o README.md https://huggingface.co/ToetsChecker-Research/boterham/resolve/main/README.md
10.2 kB
| 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. | |