What is a decision model?
It doesn't write an answer. It chooses.
A decision model reads a text and answers typed questions: a choice among fixed options, yes or no with a probability, or a level on a scale. The answer comes back in a fraction of a second and always in the right format, so you can set thresholds on it. That suits ticket triage, risk flags and voice commands.
Which department gets this email?
choice · one choice out of three
Is the customer threatening to cancel?
noul · yes or no, with a probability
How urgent is the ticket?
score · 0, 1 or 2
Setup
Seven open projects, one reference and the same questions
Every model got exactly the same texts and questions in Jev's format. Jev was called through TypeSafe's API. The open models ran on their own engines on an RTX 3060 and an RTX 5060 Ti in the same machine, without Ollama or vLLM.
| Model | Parameters | On disk | Format | Built on |
|---|---|---|---|---|
| Von | 395M | 3.0 GB | PyTorch | own |
| Laya | 421M | 1.5 GB | PyTorch | own |
| NanoJev | 0.6B | 2.3 GB | PyTorch | own |
| Kev 0.8B | 0.8B | 1.8 GB | bf16 + LoRA | Qwen3.5-0.8B-Base |
| Rizzo Flow 1.7B | 1.7B | 1.8 GB | GGUF q8_0 | Spark-X2.5-1.7B |
| Rizzo Flow 4B | 4B | 4.4 GB | GGUF q8_0 | Spark-X2.5-4B |
| Kev-4B | 4B | 9.0 GB | bf16 + LoRA | Qwen3.5-4B-Base |
| SemIf | 4B | 8.8 GB | bf16 | Qwen3.5-4B |
| Nimble | 9B | 18 GB | bf16 | Qwen3.5-9B |
| Jev | not published | – | cloud service | TypeSafe |
Eight scenarios, 542 answers per model
| Scenario | Language | What the model decides | Texts |
|---|---|---|---|
| support | English | Support email to one of three departments | 20 |
| types | English | Churn risk (yes/no) and urgency 0–2 | 16 |
| intent | Swedish | Voice commands with speech recognition errors, nine intents | 32 |
| tree1 | Swedish | Domain and action in one call | 20 |
| tree2 | Swedish | Domain first, action in a second call | 20 |
| yesno | English | Four yes/no questions: cancel, angry, refund, data loss | 32 |
| yesno_crit | English | Same questions with criteria for yes and no | 32 |
| yesno_sv | Swedish | Same questions on Swedish texts | 32 |
Results
Errors out of 542 answers. Fewer is better.
Without adaptation, Jev was best. Kev-4B was the best open model, and with two adapted questions it came within nine answers of Jev.
Voting: majority for choices, mean for yes/no and scores. Laya loses 68 answers when the yes/no questions have criteria.
Per scenario, without adaptation
| Scenario | Jev | Kev-4B | Nimble 9B | Rizzo 4B | Rizzo 1.7B | Kev 0.8B | Laya |
|---|---|---|---|---|---|---|---|
| support /20 | 20 | 20 | 19 | 19 | 18 | 20 | 13 |
| types /16 | 13 | 11 | 12 | 10 | 13 | 9 | 10 |
| intent /32 | 32 | 26 | 27 | 22 | 19 | 20 | 24 |
| tree1 /20 | 18 | 17 | 17 | 15 | 12 | 11 | 14 |
| tree2 /20 | 18 | 17 | 17 | 15 | 11 | 11 | 14 |
| yesno /128 | 121 | 118 | 113 | 115 | 114 | 95 | 119 |
| yesno_crit /128 | 126 | 121 | 118 | 123 | 114 | 112 | 60 |
| yesno_sv /128 | 120 | 116 | 109 | 114 | 111 | 97 | 98 |
Fully correct cases per scenario. For the yes/no scenarios: correct answers out of 128 (32 texts × 4 questions).
How we got closer
Two changes. No training.
Same model, same weights. We only changed how the questions were asked. Each change was chosen on half of the texts and checked on the other half.
Label the text
Every voice command got the prefix “Swedish voice command (may contain speech recognition errors):”.
Move one threshold
The question “is the customer angry?” counted as yes only at probability 0.94 instead of 0.5.
| Scenario | Jev | Kev-4B | Kev-4B adapted | Nimble 9B adapted | Laya adapted |
|---|---|---|---|---|---|
| support | 20/20 | 20/20 | 20/20 | 19/20 | 13/20 |
| types | 29/32 | 27/32 | 27/32 | 28/32 | 26/32 |
| intent | 32/32 | 26/32 | 29/32 | 31/32 | 28/32 |
| tree1 | 35/37 | 34/37 | 36/37 | 35/37 | 29/37 |
| tree2 | 33/37 | 31/37 | 35/37 | 33/37 | 28/37 |
| yesno | 121/128 | 118/128 | 118/128 | 113/128 | 121/128 |
| yesno_crit | 126/128 | 121/128 | 126/128 | 126/128 | 121/128 |
| yesno_sv | 120/128 | 116/128 | 116/128 | 109/128 | 106/128 |
| Total of 542 | 516 | 493 | 507 | 494 | 472 |
Correct answers per scenario. Nimble 9B got the same two changes, with threshold 0.98. Laya got different changes: yes/no questions without criteria, Swedish questions and labelling for Swedish yes/no texts, and threshold 0.81 for the angry question.
Swedish and size
Swedish shows the biggest gap. Bigger wasn't better.
Jev on Swedish voice commands. Best open models with adapted questions: Nimble 9B 31, Kev-4B 29.
Errors for Kev-4B (4B, one card) against Nimble 9B (9B, two cards), both without adaptation.
Laya, the smallest in the test, was second-best locally on Swedish voice commands and answers in 16 ms.
Swedish voice commands against response time
Correct out of 32 on the y-axis, median ms on the x-axis. Up and to the left is best.
Without adapted questions. Local models on an RTX 3060, Nimble 9B across both cards. Jev's time includes the network.
Speed
Every local model answers faster than Jev
Median per support email. The goal was the most correct answers, not the lowest time, but time decides where a model is usable.
Local models on an RTX 3060. *Jev including the network. †Across an RTX 5060 Ti and 3060, without fast kernels.
RTX 3060 against RTX 5060 Ti
Same answers on both cards except two borderline cases. Kev-4B ran on the 5060 Ti without its fastest kernel, which couldn't be built for the card with our CUDA version.
RTX 3060 with unlocked BF16/FP16
With the unlock, Kev-4B got 18–27% faster on the 3060 with identical answers, on par with the 5060 Ti.
Conclusions
Kev-4B gets close, with the right questions
Best local: Kev-4B
507 of 542 correct with adapted questions, on one 12 GB card. Beats Jev on the decision trees and matches it on yes/no with criteria.
Questions move the most
Phrasing and thresholds gained more correct answers than both larger models and GPU settings.
Still open: Swedish
Voice commands and Swedish customer emails are where Jev still leads. Next steps are labelling for customer emails and fine-tuning on Swedish examples.
If you need fast, structured decisions and want to keep your data in-house, the open models go a long way. If you need breadth and Swedish without extra work, Jev is still the best.
Method and caveats
Small test sets, stable answers
16–32 texts per scenario
One case is worth 3–6 percentage points. Differences of one or two cases are noise.
Deterministic answers
Five runs per model gave identical answers. Different machines and graphics cards differed by at most two answers.
Selection against a control half
The adaptations were chosen on half of the texts and checked on the rest. Confirm on more texts before you build on them.
Jev's times include the network, since Jev was called as a cloud service. The local times are pure GPU time. The models come from DataCamp's list of open Jev alternatives.
Glossary
- Jev
- TypeSafe's decision model, called as a cloud service. The reference every model is compared against.
- Parameters (M, B)
- The model's learned numbers. M = million, B = billion. More parameters need more memory.
- Base model
- The general language model a decision model is built on, here often Qwen3.5.
- LoRA
- A small add-on file (adapter) that adapts a base model to a task without changing the whole model.
- bf16, fp16
- 16-bit number formats for the weights. Standard for GPU inference, not quantization.
- Quantization
- Weights stored with fewer bits, such as 8 or 4, to save memory.
- GGUF, q8_0
- The llama.cpp file format, and 8-bit quantization. Rizzo Flow ships that way.
- llama.cpp
- An inference engine for language models written in C++, the one Ollama builds on.
- choice, noul, score
- The question types: fixed options, yes/no with a probability, and ordered levels such as urgency 0–2.
- criteria
- Descriptions of what each option, or yes and no, means. Helps Kev, hurts Laya.
- Threshold
- The probability at which an answer counts as yes. Default 0.5.
- Control half
- Half of the texts, used only to check a setting, never to choose it.
- Fused kernels
- Several small GPU programs merged into one. Makes Kev-4B 12–19% faster on an RTX 3060.
- VRAM
- The graphics card's own memory: 12 GB on the RTX 3060, 16 GB on the RTX 5060 Ti.