A LoRA fine-tune of Qwen/Qwen3-1.7B that rewrites spoken sentences into
the Easy Language register of the same language — FALC in French, Leichte Sprache in German,
Lectura Fácil in Spanish, and the Inclusion Europe "Easy-to-Read" standard elsewhere.
It is a same-language simplification model, not a translation model. Given French in, it
produces simpler French out. It never translates.
Built for Live Linguist, an on-device live
captioning app. Everything runs locally; this model exists so that simplification never requires a
server.
Prompt contract — this is not optional
The model was trained against one exact rendering, and deviating from it degrades output
silently. There is no error, just worse rewrites.
The assistant turn is pre-filled with an EMPTY think block — literally
<think>\n\n</think>\n\n. This is Qwen3's enable_thinking=false form. Omit it and the model
may emit reasoning into your caption.
{SYSTEM_PROMPT} carries a trailing /no_think soft switch. It belongs to the prompt,
not the template.
No few-shot examples, and no rolling context. The fine-tune internalised the register, so it
was trained on the bare Original:/Rewritten: turn. Injecting examples or prior segments is
out-of-distribution and bleeds context into the rewrite.
The system prompts are the per-language framework packs in the app repo under
core/src/main/resources/framework_packs/.
Sampling — fixed, and evaluated under these values
parameter
value
temperature
0 (greedy)
repeat_penalty
1.3
repeat_last_n
20
n_predict
128
These are not tuning knobs. The gate results below were produced under exactly these settings.
Evaluation
20-prompt validator-clean rate across 12 languages, scored by the same validators the app uses at
runtime (sentence length, one-idea-per-sentence, no invented content, still-in-source-language):
100.00% (20/20) against a 97.23% MLX baseline.
Why Q5_K_M and not Q4_K_M
This model ships at Q5_K_M deliberately. On the 20-prompt validator gate it scored:
artifact
validator-clean
vs 97.23% baseline
bf16
100.00%
−2.77 pp ✅
Q5_K_M
100.00%
−2.77 pp ✅
Q4_K_M
85.00%
+12.23 pp ❌
bf16 passing rules out training, chat template and tokenizer, so the loss at Q4_K_M is
quantisation. The companion 0.6B is unharmed by Q4_K_M, so the sensitivity belongs to this model
rather than to the quantiser.
Read that with the sample size in mind. 20 prompts is a screen for gross breakage, not a
quality measurement — 17/20 versus 19/20 is two prompts and well inside binomial noise at n=20.
What is solid is narrower: Q4_K_M failed this gate, Q5_K_M matched bf16 on everything measured, and
the extra ~150 MB removes a risk that would otherwise rest on twenty samples.
Limitations
Twenty prompts is a screen, not a benchmark. At n=20 the binomial interval is roughly ±10 pp.
This catches gross breakage; it does not establish parity of quality.
Grammar is imperfect at these sizes. A real 0.6B output was
"La semaine dernière, nous avons partis à la médina" — the register is right (disfluency
removed, run-on split) and the auxiliary is wrong (sommes, not avons).
Simplified text is a paraphrase. The app labels it "~ simplified — may not be exact" for
this reason. It should not be relied on where exact wording is legally or medically material.
No real-hardware latency measurement exists yet. The 1.7B has not been benchmarked on a
phone.