jev-decider-0.4B
A 0.4B-parameter System One decision model in the bev-decider / Jev format. It reads a state (text or JSON) and typed questions about it and returns probabilities in a single forward pass, with no text generation:
choice: pick one of several named options.noul: yes/no, returned as P(yes).score: an ordinal level, returned as the expected value over the levels.
Architecture
This is a single self-contained model. model.safetensors holds the whole network in one file.
| Backbone | The first 20 of 28 layers of Qwen/Qwen3-0.6B, with the fine-tuned LoRA (r=8, alpha=16 on q/k/v/o_proj of layers 8-19) merged into the weights |
| Decision head | 2-layer attention head, 512-dim, with a task-type embedding |
| Parameters | About 0.4B (0.31B in the transformer layers, 0.16B token embeddings, 7.4M head) |
| Weights | model.safetensors (bf16 backbone + fp32 head), plus backbone_config.json, config.json and Qwen's tokenizer files |
| Context | Trained with states up to 512 tokens; options are limited to 64 tokens each |
The head is a custom module, so the model is loaded with the bev-decider package.
Usage
bev-decider is the library; jev-decider-0.4B is this model. Install the library, then pass this model's repo id to load.
pip install bev-decider
from bev_decider import load
decider = load("NeelContractor/jev-decider-0.4B")
state = {
"message": (
"URGENT: you charged my card twice this month. "
"Refund the duplicate within 24 hours or I'm disputing it with my bank."
)
}
questions = {
"intent": {
"type": "choice",
"instructions": "What does the customer want?",
"criteria": {
"refund": "money returned or a duplicate charge reversed",
"technical_help": "a bug, outage or integration problem",
"cancellation": "wants to cancel or downgrade",
},
},
"urgent": {
"type": "noul",
"instructions": "Does the message communicate time pressure or a deadline?",
},
"anger": {
"type": "score",
"instructions": "How angry is the customer?",
"criteria": ["calm", "mildly annoyed", "frustrated", "furious"],
},
}
answers = decider.decide(state, questions)
Output:
{
"intent": {
"type": "choice",
"choice": "refund",
"probabilities": {
"refund": 0.996006190776825,
"technical_help": 0.0018722523236647248,
"cancellation": 0.0021215397864580154
}
},
"urgent": {
"type": "noul",
"noul": 0.8624385595321655
},
"anger": {
"type": "score",
"score": 1.2702370285987854,
"probabilities": {
"0": 0.3623242974281311,
"1": 0.0982351303100586,
"2": 0.4463198184967041,
"3": 0.0931207537651062
}
}
}
Evaluation
Held-out test split of avbiswas/bev-decision-150K, 2,000 questions, single forward pass:
| Metric | Value |
|---|---|
| Accuracy (all) | 0.7300 |
Yes/no (noul) |
0.8178 |
| Choice | 0.7192 |
| Score | 0.5964 |
AUC (noul) |
0.8859 |
These numbers come from the best checkpoint (step 1000 of the final run) selected by test accuracy.
Training
- Base: first 20 layers of
Qwen/Qwen3-0.6B(weights frozen except LoRA). - LoRA: r=8, alpha=16, dropout 0, on
q/k/v/o_projof layers 8-19. - Head: 2 attention blocks, 512-dim,
num_task_types=3(choice,noul,score). - Data:
avbiswas/bev-decision-150K(250,262 exploded training questions). - Objective: cross-entropy over the options.
- Precision: bf16 autocast, fp32 head. Optimizer: AdamW (head lr 1e-3, LoRA lr 1e-4).
The exported weights are the LoRA-merged backbone plus the trained head.
License
The model is CC-BY-NC-4.0 (non-commercial), because the training data includes sources with non-commercial terms. It contains weights derived from Qwen3-0.6B, which is Apache-2.0; Qwen's license is included as LICENSE-Qwen.
- Downloads last month
- 49