Downloads · 30 days
29
12% of all-time downloads
lamplitlabs/licht-german-tutor-medium
licht-german-tutor-medium is a text generation model from lamplitlabs. Use it when you need the model to write or continue text. It is set up for transformers. The card lists the license as apache-2.0.
Preview, not a release. This checkpoint was measured against a publication rule written before training and met five of its eight clauses. It failed three: seven answers were flagged as containing a severe error by al…
Downloads · 30 days
29
12% of all-time downloads
All-time downloads
235
Public
Parameters
8.2B
16.4 GB on disk
Likes
0
Public
Click a slice to open those files.
.safetensors16.4 GB · 100%
From the Hugging Face model README
Preview, not a release. This checkpoint was measured against a publication rule written before training and met five of its eight clauses. It failed three: seven answers were flagged as containing a severe error by all five judges (ceiling three), six of eight held-out role-play cards passed (floor seven), and two sentences with an error were validated as correct (ceiling zero) - see How it was evaluated. It is on the Hub by the owner's explicit decision of 2026-09-16 so that the 8B line can be tried; the figures below are the measured ones, unchanged. The released tutor is the browser line, lamplitlabs/licht-german-tutor.
A German tutor for learners from A1 to C1, as a full-size PyTorch checkpoint. It explains grammar and vocabulary, corrects sentences, drills forms, briefs you before an everyday situation (the barber, the vet, a Kita enrolment, a call to the Finanzamt) and plays the other person, transforms sentences the way C1 courses ask (Nominalstil and Verbalstil, Partizipialattribut and Relativsatz, Konjunktiv I, passive substitutes, two-part connectors) and helps you prepare for the telc and Goethe exams. It answers in the language you write in, German or English.
This is the medium line of the licht tutors: 8 billion parameters, fine-tuned from Qwen3-8B, merged weights
in bf16 safetensors, for a GPU server or a workstation with 20 GB of memory. The browser line - 3 billion
parameters, ONNX, runs on your own device - is
lamplitlabs/licht-german-tutor; how each version was
measured is on ai.lamplitlabs.com. Inside the training records this checkpoint
is called light-german-tutor-pro-v22; the Hub repository is named for the line, the tag for the version.
seit and vor, when als, wenn and wann are used, how adjective
endings, cases, the Perfekt and word order work, with short bilingual examples; asked for a rule it opens by
quoting the routed rule note when one is in the prompt (see grounding.json below).Three answers from the release check, quoted exactly as generated (greedy decoding, system prompt below, no rule note attached):
Can you correct this sentence? 'Ich habe ein Hund.'
Ich habe einen Hund. Fix: 'habe ein Hund.' -> 'habe einen Hund.'. Reason: 'Hund' is masculine: einen.
Heißt es der, die oder das Jobangebot? Und wie lautet der Plural?
das Jobangebot (neutral). Plural: die Jobangebote (-e).
Rewrite in nominal style with 'trotz'. Give the rewritten sentence first, then one short note. Obwohl es stark regnete, fand das Konzert statt.
Trotz des starken Regens fand das Konzert statt. 'trotz + genitive' replaces 'obwohl'; the verb stays in position 2.
from transformers import AutoModelForCausalLM, AutoTokenizer
repo = "lamplitlabs/licht-german-tutor-medium"
rev = "v22-preview" # pin the version; main moves with later versions
tok = AutoTokenizer.from_pretrained(repo, revision=rev)
model = AutoModelForCausalLM.from_pretrained(repo, revision=rev, torch_dtype="bfloat16", device_map="auto")
messages = [
{"role": "system", "content": SYSTEM_PROMPT}, # the tutor prompt below
{"role": "user", "content": "Ich muss morgen zum Friseur. Wie sage ich, dass ich nur die Spitzen geschnitten haben will?"},
]
ids = tok.apply_chat_template(messages, add_generation_prompt=True, return_tensors="pt").to(model.device)
out = model.generate(ids, max_new_tokens=700, do_sample=False, no_repeat_ngram_size=24)
print(tok.decode(out[0, ids.shape[1]:], skip_special_tokens=True))
The model ships with the plain ChatML template (chat_template.jinja), not Qwen3's thinking template: it was
trained and evaluated without a <think> block and produces none. It was trained under this system prompt and
answers best with it:
You are a patient, precise German tutor for learners from A1 to C1. Reply in the language the learner writes in (usually English) and keep German examples in German, with translations. Adapt depth to the learner's level when it is given. Be compact: state the meaning or rule in a few sentences, give two or three short example sentences, always mark gender and plural for nouns, and when correcting show the corrected sentence first, then explain briefly. Plain text with light Markdown, no emojis, and never mention being an AI model.
The last clause suppresses boilerplate disclaimers, not honesty: asked directly whether it is a person, the model says it is a computer program (the release check counts such identity questions; this version needed no fix on any of them).
Two data files ship with the model and make it markedly more reliable when your application uses them:
grounding.json - short rule notes (numbers, dates, prices, clock times, contractions, cases after
prepositions, exam facts and so on), each with cue words. When a cue word appears in the learner's message,
append the note to the prompt as a second system message. The evaluation numbers below were measured with it.lexicon.json - 3,800 nouns with gender and plural and 164 irregular verbs, verified against a
Wiktionary-derived table. Use it to check the forms the model cites and to mark disagreements to the learner.Prefer greedy decoding with no_repeat_ngram_size=24 - that is what was evaluated; sampling was not. The
shipped generation_config.json is the base model's (sampling, 128 new tokens), so pass do_sample=False
and max_new_tokens yourself as the snippet does. distill_train_summary.json holds the training run's
figures (steps, loss curve, hardware).
| Base model | Qwen/Qwen3-8B (Apache-2.0): 8.2B parameters, 36 layers, hidden size 4096, vocabulary 151,936 |
| Fine-tuning | LoRA (r 128, alpha 256, dropout 0.05) on all seven projections, completion-only loss, 2 epochs, effective batch 16, cosine schedule with 3 % warm-up, learning rate 2e-4, sequences up to 2,432 tokens, bf16; adapters merged into the weights |
| Files | model-0000N-of-00004.safetensors (bf16, 16.4 GB) with model.safetensors.index.json; config.json, generation_config.json; tokenizer files and chat_template.jinja (ChatML); grounding.json, lexicon.json; distill_train_summary.json |
| Runtime | transformers 4.57 or later (PyTorch); 20 GB of GPU memory in bf16, less with 8-bit or 4-bit loading |
| Languages | German and English; the answer follows the language the learner writes in |
| Licence | Apache-2.0, inherited from the base model (see Provenance and licences) |
| Version | v22, trained 2026-09-14/15, measured 2026-09-15 and not published by its own rule; on the Hub since 2026-09-16 as a preview by the owner's explicit decision outside that rule (tag v22-preview) |
Learning German: grammar and vocabulary explanations, gender and plural of nouns, irregular verb forms, article, pronoun and adjective paradigms, numbers, ordinals, dates, prices and clock times, contractions, verb-preposition pairs, false friends, sentence correction with a short explanation, formal and informal letters, C1 sentence transformations, situation briefings and short dialogue practice, exam-format questions, exam pass rules and session planning for a stated level.
Out of scope: anything other than learning German; legal, medical or safety advice; use as the only source for exam preparation. It is a fine-tuned 8B model: it makes the mistakes listed under Known weak spots and should run with the lexicon check when learners cannot judge the answer themselves.
The training set has 12,188 rows (461 more for validation), all produced by the same pipeline; the v22 set is the v21 set plus the two families described under Versions. Every answer over 300 words was shortened at paragraph boundaries before training. Nine kinds of rows:
lexicon.json, as tables, single answers and corrections of a wrong form.als / wenn / wann, dass / ob, and twelve C1 topics - in explain,
contrast, check and examples form, every rule sentence copied from a verified reference block; plus 340
engine-computed transformation and connector drills at C1.Some questions of kind 1 were based on a privately held language-course export (vocabulary lists, lesson notes). That material is not redistributed; the model saw the teacher's answers about it, not the material.
Training ran on one A100 80 GB for 5.2 hours (1,524 optimiser steps, 17.2 million tokens seen); the final validation loss on the 461 pinned rows was 0.752, the same as v21's on the same rows (0.752).
Every version answers the same fixed hold-out prompts with greedy decoding, up to 700 new tokens, on the training hardware in bf16; nothing in these sets is in the training data.
Judge panel. 41 prompts (26 tutor questions, 15 exam questions with the fact sheet the exam rows were grounded on) are scored 1-5 on accuracy, helpfulness, German and format by five independent judges from five model families, who also list every severe error (a wrong German form stated as a rule). A second set of 16 C1 and implicit-ask prompts (set C) is scored the same way. The rule this version had to meet was written down before training started.
| Figure | Must reach | v22 (this) | v21 | v18 | browser v16 |
|---|---|---|---|---|---|
| Panel mean over the 41 (recomputed from the judges' scores) | > 3.66 | 3.71 | 3.85 | 3.75 | 3.56 |
| Answers with a severe error flagged by all five judges | <= 3 | 7 (not met) | 5 | 6 | 8 |
| Answers flagged by a majority of judges | <= 15 | 9 | 13 | 11 | 14 |
| Set C mean (C1 and implicit-ask prompts) | > 2.87 | 3.63 | 3.50 | 3.11 | - |
| Set C accuracy | > 2.4 | 3.04 | 2.76 | 2.41 | - |
Against v21, the paradigm rows did what they were meant to do - fewer majority flags, the fewest lexical
flags of the series (14, from 36) and the best set C figures - and produced a new failure shape: confidently
stated wrong rules on paradigms the reference does not cover. Four of the seven all-five answers are of that
kind: an invented adjective ending after ein in the nominative and accusative, an indirect question called a
main clause with the verb in second position, a Vorgangspassiv in the Perfekt called a state, and Sie warft
inside a verb paradigm. The mean over the 41 fell by 0.14 against v21 while staying above the line.
Automated release check. The same 177 scenarios the browser line must pass, run in PyTorch: no repeated-phrase runaways, answers end inside the token budget, never presents itself as an AI, answers in the learner's language, rule facts match the engines, cited gender and plural match the lexicon, corrections lead with the corrected sentence, and eight held-out role-play cards.
| Check | Must reach | v22 (this) | v21 | v18 |
|---|---|---|---|---|
| release (all checks) | yes | yes (all_checks 0.887) | yes (0.898) | yes (0.887) |
| not_truncated | >= 0.97 | 1.000 | 1.000 | 0.994 |
| role-play cards (held-out situations) | >= 7 of 8 | 6 of 8 (not met) | 8 of 8 | 8 of 8 |
| C1 transformation and connector scenarios | >= 13 of 16 | 14 of 16 | 14 of 16 | 11 of 16 |
| informal letters | >= 2 of 3 | 3 of 3 | 3 of 3 | 3 of 3 |
| identity fixes / false validations | <= 1 / 0 | 0 / 2 (not met) | 0 / 0 | 0 / 0 |
| contraction scenarios | (indicator) | 3 of 4 (facts right in 4 of 4) | 0 of 4 | 2 of 4 |
| situation briefings | (indicator) | 7 of 8 | 7 of 8 | 8 of 8 |
Per category, v22 gained on irregular verbs (10 of 10), prepositions and case (8 of 8), vocabulary lists (8 of 8) and contractions, and lost on corrections (8 of 12, from 11), translations (4 of 8, from 6: the answers grew to 160-200 words and left the budget), dialogue (3 of 4) and role-play (8 of 10). The two false validations came from the correction family's "already correct" branch: Es ist ein Problem mit dem Auto and Ich spreche nicht Deutsch were confirmed as correct.
grounding.json in the prompt the model quotes it
correctly; without one it can state a neighbouring rule or an invented one, now most often on paradigms
(adjective endings after ein, subordinate-clause word order, passive forms). Keep the grounding file in
the prompt.lexicon.json.max_new_tokens or ask for the
translation alone when you want it short.v22-preview). v21's recipe on the v22 data: v21's rows plus 700 engine-composed
grammar-paradigm rows and 250 exam-rule rows that quote the reference blocks, contraction drills shortened
into their word budget, and a rule-note pack regenerated from its source (two dative-plural bullets
corrected). Measured 2026-09-15: five of the eight publication clauses held (panel mean, majority flags, set
C mean and accuracy, C1 scenarios, letters), three did not (all-five severe flags 7, role-play cards 6 of 8,
false validations 2), so the rule written before training did not publish it. Published 2026-09-16 as a
preview by the owner's explicit decision outside that rule.lexicon.json is derived from
gambolputty/german-nouns (Wiktionary-derived, CC BY-SA 4.0,
commit 8386d23). The file carries source, licence and attribution fields; share-alike applies to that
file, not to the weights.The model was built with licht, a toolkit for training, checking and serving small tutors (data build, LoRA and full fine-tunes, ONNX export for the browser line, the 177-scenario release check, the judge panel, the browser UI); one A100 trains and checks a version in a few hours. Questions and requests go to this repository's Community tab.
@misc{licht-german-tutor-medium-2026,
title = {licht-german-tutor-medium v22: a German tutor fine-tuned from Qwen3-8B},
author = {Lamplit Labs},
year = {2026},
note = {public preview revision v22-preview},
url = {https://huggingface.co/lamplitlabs/licht-german-tutor-medium}
}