niqun123123 commited on
Commit
45a708b
Β·
verified Β·
1 Parent(s): b1d2ba5

Upload README.md with huggingface_hub

Browse files
Files changed (1) hide show
  1. README.md +254 -85
README.md CHANGED
@@ -3,125 +3,294 @@ license: apache-2.0
3
  base_model: Qwen/Qwen3.5-4B
4
  library_name: transformers
5
  tags:
6
- - jev
7
- - decision
8
- - autojev
9
- - typed-decision
10
- - classification
11
- - distillation
12
  ---
13
 
14
- # LemonDecider
15
 
16
- A typed decision engine derived from [Qwen/Qwen3.5-4B](https://huggingface.co/Qwen/Qwen3.5-4B): it answers structured **choice / noul / score** questions in a **single forward pass** with an explicit **unknown** (abstention) candidate. There is no autoregressive generation head β€” the backbone is kept full-weight, and a 255-way single-token readout replaces the LM head.
 
 
 
 
 
 
 
17
 
18
  ## Model description
19
 
20
  | Property | Value |
21
  |---|---|
22
- | Architecture | `AutoJevForDecisionClassification` (custom code, `trust_remote_code=True`) |
23
- | Base model | `Qwen/Qwen3.5-4B` (Qwen3.5 text + vision backbones) |
24
- | Parameters | ~4B backbone + 255Γ—2560 readout head |
25
- | Readout | 255 single-token answer codes (`A` … `JT`), initialized from the Qwen LM-head rows of those tokens |
26
- | Decision head | `Linear(hidden_size=2560, 255, bias=False)` over the last prompt position |
27
- | Dtype / context | `bfloat16`; `max_input_length = 8192` (**no silent truncation**) |
28
- | Options per question | 1–255 (`option_counts` required per row; invalid option logits are masked) |
29
- | Multimodal | Optional images (PIL, decoded) via the Qwen3 vision processor |
30
- | Serving temperature | `1.0` (post-processing softmax only; **not** used in CE loss) |
31
 
32
- Each input is rendered as one user message (state + instructions + options + an appended `__unknown__` slot), then scored in one forward pass. The forward pass rejects KV-cache decoding and right padding (left padding is required).
33
 
34
- ## Question types and output semantics
 
 
 
 
 
35
 
36
- `decision_utils.py` implements the native `_known()` semantics: probabilities over known candidates are renormalized, and the unknown slot gets its own probability.
 
 
 
37
 
38
- | `question.type` | Candidates | Output |
39
- |---|---|---|
40
- | `choice` | 1–254 named options (+unknown) | `choice` (argmax key), per-option `probabilities`, `confidence` |
41
- | `noul` | `true`, `false` (+unknown) | `noul = P(true) + 0.5 * P(unknown)` |
42
- | `score` | 2–10 ordered descriptions (+unknown) | `score = Ξ£ i Β· P(i)` plus legend and probabilities |
43
- | β€” | β€” | `abstained = True` iff the raw argmax lands on `unknown`; `unknown_probability` is always returned |
44
 
45
- `confidence = concentration Β· (1 βˆ’ P(unknown))`, where `concentration = (nΒ·p_max βˆ’ 1)/(n βˆ’ 1)` (1 for single-candidate questions).
 
 
 
 
 
 
 
46
 
47
- ## Quickstart
48
 
49
- **Standalone CLI** (bundled `model.py`):
 
 
 
 
 
 
 
50
 
51
- ```bash
52
- python model.py --checkpoint . \
53
- --input inputs.json \
54
- --device cuda:0
55
- ```
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
56
 
57
- **With transformers**:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58
 
59
  ```python
60
  import torch
61
- from transformers import AutoModel, AutoProcessor
62
- from decision_utils import predict_batch
63
 
 
64
  model = AutoModel.from_pretrained(
65
- "inclusionAI/LemonDecider",
66
- trust_remote_code=True,
67
- dtype=torch.bfloat16,
68
- device_map="cuda:0",
69
- attn_implementation="sdpa",
70
  ).eval()
71
- processor = AutoProcessor.from_pretrained(
72
- "inclusionAI/LemonDecider", trust_remote_code=True
73
- )
74
- processor.tokenizer.padding_side = "left"
75
 
76
  rows = [{
77
- "state": "ζˆ‘ζƒ³η”³θ―·ι€€ζ¬Ύγ€‚",
78
- "question": {
79
- "type": "choice",
80
- "instructions": "εˆ€ζ–­δΈ»θ¦θ―‰ζ±‚",
81
- "criteria": {
82
- "refund": "ι€€ζ¬Ύη›Έε…³",
83
- "delivery": "物桁相关",
84
- "account": "θ΄¦ζˆ·η›Έε…³",
85
- },
86
- },
87
  }]
88
-
89
- result = predict_batch(model, processor, rows)
90
- print(result["answers"][0])
91
- # {"type": "choice", "choice": "refund", "probabilities": {...},
92
- # "confidence": ..., "unknown_probability": ..., "abstained": ...}
93
  ```
94
 
95
- Images are passed as decoded `PIL.Image` objects in `row["images"]`; paths/URLs are not fetched.
96
-
97
- ## Training
98
 
99
- Distilled via supervised fine-tuning from **imajev-4b**, a larger Jev-class decision model:
 
 
100
 
101
- - **Checkpoint**: step 24 (6,144 examples seen)
102
- - **Loss**: cross-entropy over the masked 255-way readout (supports hard option indices and soft teacher distributions)
103
- - **Dev set (n=574) accuracy@T=1**: `0.7735` (best step: 3, `0.7805`)
104
 
105
- **Temperature fit (not applied)**: an NLL scan over `T ∈ [0.30, 5.00]` on the dev set found `T = 0.60` (NLL `0.56265`, Brier `0.28261`, vs `0.6016 / 0.29885` at `T=1`). The checkpoint still **serves at `T = 1.0`**; adopting `T*` is deliberately blocked until the public evaluation suite is re-evaluated (argmax is invariant at `T*` except at the noul decision boundary).
 
 
 
 
 
 
 
 
 
106
 
107
- ## Intended use and limitations
108
 
109
- - Intended for **typed decision inputs** (`choice` / `noul` / `score`) rendered through `decision_utils.decision_messages()`; prompt-layout divergence will degrade results.
110
- - It is **not** a generative chat model: never use it for free-form text generation.
111
- - Results come from a small internal dev split (n=574); validate on your own distribution before production use.
112
- - Long inputs are rejected above 8,192 tokens instead of being silently truncated; handle your own context budget upstream.
 
 
 
113
 
114
- ## Files
115
 
116
- | File | Purpose |
117
- |---|---|
118
- | `model-00001/2-of-00002.safetensors`(+`index`) | Weights (bfloat16) |
119
- | `configuration_autojev.py` / `modeling_autojev.py` | Custom architecture (decision forward, option masking, hard/soft-target loss) |
120
- | `decision_utils.py` | Prompt rendering, `_known()` scoring, batching (`prepare_batch` / `predict_batch`) |
121
- | `model.py` | Standalone inference CLI |
122
- | `chat_template.jinja`, `processor_config.json` | Qwen3-style chat template and image processor |
123
- | `sft_receipt.json` | Training artifact receipt (step, dev metrics, temperature fit) |
124
 
125
- ## License
126
 
127
- Apache-2.0 (see `LICENSE` / `LICENSE.code`).
 
 
3
  base_model: Qwen/Qwen3.5-4B
4
  library_name: transformers
5
  tags:
6
+ - decision-engine
7
+ - typed-decision
8
+ - choice
9
+ - classification
10
+ - merge
11
+ - qwen3.5
12
  ---
13
 
14
+ # LemonDecider 4B (LemonJev typed decision engine)
15
 
16
+ **Model ID:** `lemondecider-4b-merge50-20261015-v2`
17
+ **Base model:** `Qwen/Qwen3.5-4B`
18
+ **Release date:** 2026-10-15
19
+
20
+ LemonDecider 4B is a typed decision engine: it reads a state and a question with a
21
+ list of options, runs **one forward pass**, and returns a probability distribution
22
+ over the options (choice / noul questions) or an ordered rating (score questions).
23
+ No text is generated and no input is ever truncated.
24
 
25
  ## Model description
26
 
27
  | Property | Value |
28
  |---|---|
29
+ | Architecture | Qwen3.5-4B-class hybrid backbone (linear-attention + periodic full-attention) + a bias-free **255-way readout** (`LemonDeciderReadout`, FP32 precision island), loaded through `modeling_lemondecider.LemonDeciderForDecisionClassification` (`trust_remote_code`) |
30
+ | `model_type` / protocol | `lemondecider_decision` / `lemondecider-v1` |
31
+ | Attention | `noncausal_full_attention` β€” all-attend prompt for the periodic full-attention layers, causal recurrence for the Gated DeltaNet layers, SDPA only |
32
+ | Pooling / temperature | last-token pooling, temperature 1.0 (uncalibrated) |
33
+ | Max input length | **262,144 tokens (256K context)** β€” the backbone's full position window; requests over the limit are rejected, never cut |
34
+ | Precision | backbone BF16, readout FP32 (readout GEMM executed in FP32 under autocast) |
35
+ | Serialized tensors | 724 (all vision tensors included; vision stem executed as a matrix-product patch projection) |
36
+ | Runtime | in-package Python runtime (`modeling_lemondecider.py`, `configuration_lemondecider.py`, `contract.py`, `decision_utils.py`, `model.py`), validated with transformers 5.17, flash-linear-attention 0.5.2, PyTorch SDPA |
 
37
 
38
+ ## Training
39
 
40
+ LemonDecider 4B was fine-tuned (SFT) from the common Qwen3.5-4B initialization on
41
+ **more than 700,000 public decision/QA rows** collected by the project (about 805k
42
+ train rows from ~818k collected rows incl. dev/test splits). Every source is
43
+ public and permissive; no benchmark or evaluation data was used for training. The
44
+ released weights combine two independent SFT runs over this corpus (weight-level
45
+ combination, no training after that).
46
 
47
+ **Question formats:** choice (up to 255 options), noul (no/yes) and score (ordinal
48
+ ratings); some multimodal rows are image questions over locally registered
49
+ project-generated charts, and roughly 600k train rows carry teacher-style soft
50
+ label distributions.
51
 
52
+ **Data categories:**
 
 
 
 
 
53
 
54
+ - service decision arcs β€” user-intent routing and case triage (refund, logistics,
55
+ account actions), policy and adequacy judgment;
56
+ - language judgment β€” sentiment, sarcasm, NLI/factuality and paraphrase-style checks;
57
+ - knowledge and reasoning QA β€” multiple-choice knowledge, multi-hop reasoning,
58
+ arithmetic and math word problems;
59
+ - retrieval and selection β€” document and tabular retrieval, product/route selection;
60
+ - multimodal reading β€” chart/graph and small-graphic question answering;
61
+ - calibration-style rows β€” probability and ordinal confidence judgments.
62
 
63
+ **Training parameters** (from the training receipts):
64
 
65
+ - distributed FSDP on 64 GPUs (4 nodes x 16 GPUs);
66
+ - effective batch 256 rows per step, learning rate 2e-06;
67
+ - two independent runs: 2,446 steps (sequence cap 8,192) and 700 steps (sequence
68
+ cap 2,048);
69
+ - objective `valid_option_soft_cross_entropy` over valid options only
70
+ (`noul_tie_policy = true_on_equal_probability`, `choice_permutation =
71
+ global-reference`, vision tower trainable);
72
+ - precision policy fp32-master-bf16; export dtype BF16, readout FP32, temperature 1.0.
73
 
74
+ ## Package artifacts
75
+
76
+ The release directory ships as a single self-contained package β€” weights,
77
+ tokenizer, runtime code and provenance receipts travel together.
78
+
79
+ ### Weight files
80
+
81
+ | File | Size | SHA-256 |
82
+ |---|---:|---|
83
+ | `model-00001-of-00002.safetensors` | 4,973,336,472 | `27b985a94ccf63aace88b2ff67c1ea0871ce745a49b22b9cda43ea4d32297d8a` |
84
+ | `model-00002-of-00002.safetensors` | 4,107,897,400 | `81f61ce9daead4be7e3d950cf027f63f16f757a176407f020406190dc2068bc0` |
85
+ | `tokenizer.json` | 19,989,492 | `6f32ce20dc35f57a7f9ad1eac03525bd7d30f9df8cea6507e958279cc3657706` |
86
+ | `model.safetensors.index.json` | 68,426 | `bda09c55c0152d7a6fb2db6898aea70e728dc528df6f9c026cefb0bd5d1d673b` |
87
+
88
+ Provenance receipts ship inside the package: `LEMONDECIDER_BUILD.json` (build
89
+ receipt) and `LEMONDECIDER_REBRAND.json` (export lineage).
90
+
91
+ ## Evaluation results
92
+
93
+ Both evaluations ran on 2026-10-15 on self-hosted compute (64 GPUs) through the
94
+ model's own HTTP `/v1/systemone` wire contract. **No result here
95
+ is an official leaderboard or board submission**; the harnesses enforce no-truncation,
96
+ no option filtering, one fixed rendering, and coverage-adjusted scoring. Latency is
97
+ per-request server wall time on internal accelerators and is not the sub-1-second
98
+ latency-admission measurement of any external board.
99
+
100
+ Evidence directories keep the run names under which they were created during the v1
101
+ execution (`lemondeeder-eval-20261015/`); no shipped artifact in the model packages
102
+ carries that legacy spelling.
103
+
104
+ ### 1) Decision Index, edition 0.3 β€” FULL public suite (complete run)
105
+
106
+ βš™οΈ 140,620 requests issued across 64 shards (frozen suite-0.3 staging, official
107
+ scorer, coverage-adjusted, chance-corrected) β†’ **140,178 scored requests,
108
+ `complete: true`**.
109
+
110
+ | Headline | Value |
111
+ |---|---:|
112
+ | **Decision Index (public 0.3)** | **50.31** |
113
+ | Raw index | 62.47 |
114
+ | Median / mean / p95 request latency | 50.4 ms / 205.6 ms / 756.2 ms |
115
+
116
+ The public index averages the native, chance-corrected, coverage-adjusted score of
117
+ 37 benchmarks in five areas with fixed weights (knowledge 25.8%, language 25.8%,
118
+ retrieval 20.0%, tools 18.3%, arts 10%); inside an area, β˜… gold benchmarks weigh
119
+ 1.2 and the rest 1.0. Unanswered counts as wrong.
120
+
121
+ #### Per-area scores
122
+
123
+ | Area | Raw | Skill (chance-corrected) | Coverage | Benchmarks |
124
+ |---|---:|---:|---:|---:|
125
+ | Knowledge & Reasoning | 0.4895 | 0.3395 | 0.9998 | 11 |
126
+ | Language Understanding | 0.6962 | 0.5751 | 1.0000 | 9 |
127
+ | Retrieval & Classification | 0.6661 | 0.5494 | 1.0000 | 6 |
128
+ | Tools & Automation | 0.7108 | 0.6741 | 0.9986 | 5 |
129
+ | Arts & Human Taste | 0.5487 | 0.3340 | 0.9978 | 6 |
130
+
131
+ #### Per-benchmark native scores (β˜… = counted in the public index)
132
 
133
+ | # | Benchmark | Metric | Requests | Score | Skill | Cov. |
134
+ |---:|---|---|---:|---:|---:|---:|
135
+ | 1 | BFCL β˜… | case exact accuracy | 1,694 | 0.9416 | 0.9211 | 1.000 |
136
+ | 2 | ToolRet β˜… | nDCG@10 | 685 | 0.6540 | 0.5982 | 0.997 |
137
+ | 3 | API-Bank β˜… | accuracy | 508 | 0.8320 | 0.8254 | 0.996 |
138
+ | 4 | BANKING77 β˜… | macro-F1 | 3,080 | 0.7418 | 0.7385 | 1.000 |
139
+ | 5 | CLINC150+OOS β˜… | macro-F1 | 5,500 | 0.8634 | 0.8626 | 1.000 |
140
+ | 6 | RouterBench | selected quality | 10,000 | 0.7746 | 0.4715 | 1.000 |
141
+ | 9 | Home appliance simulator β˜… | case exact accuracy | 88 | 0.4091 | 0.4091 | 1.000 |
142
+ | 10 | SGD/SGD-X | macro-F1 | 2,500 | 0.4360 | 0.0616 | 1.000 |
143
+ | 11 | ContractNLI β˜… | macro-F1 | 123 | 0.7389 | 0.6224 | 1.000 |
144
+ | 12 | ANLI β˜… | macro-F1 | 3,200 | 0.6729 | 0.5100 | 1.000 |
145
+ | 20 | BPoMP β˜… | accuracy | 5,000 | 0.8718 | 0.7525 | 1.000 |
146
+ | 21 | Humicroedit β˜… | accuracy | 2,628 | 0.6111 | 0.2222 | 1.000 |
147
+ | 22 | POP909-CL β˜… | accuracy | 2,000 | 0.1890 | 0.1701 | 0.987 |
148
+ | 23 | cfcolor β˜… | accuracy | 5,000 | 0.6088 | 0.1827 | 1.000 |
149
+ | 24 | MMLU | accuracy | 14,033 | 0.7914 | 0.7219 | 1.000 |
150
+ | 25 | GPQA Diamond β˜… | accuracy | 196 | 0.4286 | 0.2381 | 1.000 |
151
+ | 26 | ARC-Easy | accuracy | 2,376 | 0.9836 | 0.9781 | 1.000 |
152
+ | 27 | ARC-Challenge | accuracy | 1,172 | 0.9548 | 0.9397 | 1.000 |
153
+ | 28 | WinoGrande β˜… | accuracy | 1,267 | 0.8019 | 0.6038 | 1.000 |
154
+ | 29 | HellaSwag β˜… | accuracy | 10,042 | 0.8520 | 0.8027 | 1.000 |
155
+ | 30 | GSM8K β˜… | accuracy | 2,638 | 0.5716 | 0.4866 | 1.000 |
156
+ | 31 | ChessBench β˜… | accuracy | 5,000 | 0.1384 | 0.0616 | 1.000 |
157
+ | 32 | MuSR β˜… | accuracy | 752 | 0.5731 | 0.3213 | 1.000 |
158
+ | 33 | SATA-Bench β˜… | case exact accuracy | 1,650 | 0.1539 | 0.1427 | 1.000 |
159
+ | 34 | SimpleBench | accuracy | 10 | 0.1000 | 0.0000 | 1.000 |
160
+ | 36 | BRIGHT β˜… | nDCG@10 | 220 | 0.4444 | 0.3714 | 1.000 |
161
+ | 37 | Amazon ESCI β˜… | macro-F1 | 5,000 | 0.4827 | 0.3511 | 1.000 |
162
+ | 38 | ACOS β˜… | per-review F1 | 1,565 | 0.1970 | 0.1713 | 1.000 |
163
+ | 39 | FinEntity β˜… | macro-F1 | 979 | 0.9381 | 0.9090 | 1.000 |
164
+ | 40 | iSarcasmEval β˜… | Sarcasm F1 (track A, EN) | 4,600 | 0.5552 | 0.4278 | 1.000 |
165
+ | 41 | VAST β˜… | macro-F1 | 3,006 | 0.7251 | 0.5876 | 1.000 |
166
+ | 42 | NLI4CT β˜… | macro-F1 | 5,500 | 0.7997 | 0.6103 | 1.000 |
167
+ | 43 | CRUXEval β˜… | accuracy | 570 | 0.6035 | 0.3709 | 1.000 |
168
+ | 44 | CLadder β˜… | accuracy | 5,000 | 0.6846 | 0.3692 | 1.000 |
169
+ | 45 | HLE β˜… | accuracy | 501 | 0.1140 | 0.0000 | 0.998 |
170
+ | 50 | Habermas Machine β˜… | accuracy | 1,676 | 0.4063 | 0.1384 | 1.000 |
171
+ | 56 | PhishNChips β˜… | phishing-decision accuracy | 2,000 | 0.7315 | 0.4630 | 1.000 |
172
+ | 57 | MMLU-Pro β˜… | accuracy | 12,032 | 0.5780 | 0.5254 | 1.000 |
173
+ | 58 | BBH fixed-option tasks β˜… | accuracy | 5,507 | 0.7018 | 0.5678 | 1.000 |
174
+ | 59 | RAGTruth β˜… | F1 on hallucinated class | 2,700 | 0.7601 | 0.5026 | 1.000 |
175
+ | 61 | HoVer β˜… | claim-verification accuracy | 4,000 | 0.7225 | 0.4450 | 1.000 |
176
+ | 62 | When2Call MCQ β˜… | accuracy | 3,652 | 0.6528 | 0.5371 | 1.000 |
177
+ | 64 | New Yorker caption matching β˜… | accuracy | 528 | 0.6307 | 0.5384 | 1.000 |
178
+
179
+ Evidence: `lemondeeder-eval-20261015/di/runs/20261015-lemondecider-4b-di-full-0.3/`
180
+ (64 shard dirs + `merged/results.jsonl` + official `scores.json`, `index.json`,
181
+ `benchmark-summary.json`).
182
+
183
+ ### 2) JevBench public-231 (typed-decision public sanity suite)
184
+
185
+ 231/231 items attempted and scorable, **complete**, native probability output,
186
+ dataset hash-pinned (`dc3995d8…de51`, jevbench-v1 harness, typesafe adapter).
187
+
188
+ | Metric | Value |
189
+ |---|---:|
190
+ | **Accuracy** | **83.12%** (192/231) |
191
+ | Macro accuracy | 84.55% |
192
+ | Brier (mean) | 0.2392 |
193
+ | Ordinal MAE (score items) | 0.1207 |
194
+ | Paraphrase consistency | 36/36 pairs agree (100%) |
195
+ | Coverage / operational success / schema validity | 1.0 / 1.0 / 1.0 (strict 1.0) |
196
+ | Latency p50 / p95 | 47.1 ms / 340.3 ms |
197
+
198
+ #### Per-family results
199
+
200
+ | Family | n | Accuracy | Brier |
201
+ |---|---:|---:|---:|
202
+ | adequacy | 12 | 1.000 | 0.051 |
203
+ | adversarial | 6 | 1.000 | 0.002 |
204
+ | ambiguous | 7 | 0.571 | 0.661 |
205
+ | extraction | 24 | 1.000 | 0.000 |
206
+ | fact | 12 | 1.000 | 0.000 |
207
+ | intent | 24 | 1.000 | 0.001 |
208
+ | judge_hard | 17 | 0.647 | 0.499 |
209
+ | long_policy | 19 | 0.579 | 0.585 |
210
+ | multi_hop | 18 | 0.722 | 0.481 |
211
+ | ordinal | 12 | 1.000 | 0.000 |
212
+ | policy | 12 | 1.000 | 0.007 |
213
+ | probability | 10 | 0.800 | 0.338 |
214
+ | routing | 12 | 1.000 | 0.013 |
215
+ | routing_hard | 5 | 1.000 | 0.000 |
216
+ | temporal_numeric | 15 | 0.067 | 1.006 |
217
+ | tool_selection | 12 | 1.000 | 0.000 |
218
+ | tradeoff | 6 | 0.833 | 0.450 |
219
+ | trap | 8 | 1.000 | 0.038 |
220
+
221
+ Known weak spots on this suite: long-policy judgement, ambiguous states, hard-judge
222
+ calls, and especially **temporal/numeric reasoning (6.7%)**, which the model inherits
223
+ from its parents' training data.
224
+
225
+ Evidence: `lemondeeder-eval-20261015/jevbench/20261015-lemondecider-4b-jevbench-public231/`
226
+ (`results.jsonl`, `ledger.jsonl`, `public-summary.json`, 5-item smoke gate passed).
227
+
228
+ ## Usage
229
+
230
+ Dependencies: `transformers==5.17.0` (needs the Qwen3.5 hybrid classes),
231
+ `flash-linear-attention==0.5.2`, `pillow`, `torch` with SDPA. ROCm fast path
232
+ keywords: `LEMONDECIDER_FAST`, `LEMONDECIDER_GRAPH_TOKENS`, `LEMONDECIDER_FUSED`,
233
+ `LEMONDECIDER_CUDNN_SDPA`.
234
 
235
  ```python
236
  import torch
237
+ from transformers import AutoModel
238
+ from decision_utils import load_processor, predict_batch
239
 
240
+ ckpt = "lemondecider-4b-merge50-20261015-v2" # local package directory
241
  model = AutoModel.from_pretrained(
242
+ ckpt, trust_remote_code=True, local_files_only=True,
243
+ dtype=torch.bfloat16, device_map="cuda:0", attn_implementation="sdpa",
 
 
 
244
  ).eval()
245
+ processor = load_processor(ckpt)
 
 
 
246
 
247
  rows = [{
248
+ "state": "The user asks how to return a damaged order placed last week.",
249
+ "question": {"type": "choice",
250
+ "instructions": "Pick the best next action",
251
+ "criteria": {"refund": "Process a refund",
252
+ "replace": "Send a replacement",
253
+ "escalate": "Escalate to a human"}},
 
 
 
 
254
  }]
255
+ answers = predict_batch(model, processor, rows)
256
+ print(answers["answers"][0]) # choice, probabilities over the 3 options, confidence
 
 
 
257
  ```
258
 
259
+ CLI from inside the package: `python3 model.py --checkpoint . --device cuda:0 --input rows.json`.
 
 
260
 
261
+ Batching: the internal batch is 8 questions per forward pass; inputs are left-padded
262
+ to the longest prompt; requests over the 262,144-token limit are rejected with the
263
+ limit named (HTTP 422 in server wrappers) β€” nothing is truncated.
264
 
265
+ ## Intended use & limitations
 
 
266
 
267
+ - Intended: typed decision endpoints β€” routing, intent classification, policy/
268
+ adequacy checks, structured QA over explicit option lists, pipeline control.
269
+ - The model emits **option probabilities only**; it is not a generative assistant.
270
+ - Ratings (`score` items) are supported through the same readout; they inherit the
271
+ parents' weak arithmetic/timing behavior (see the temporal_numeric row above).
272
+ - Trained on public data sources assembled by the project; no evaluation rows were
273
+ used for training (corpus admission contracts enforced this).
274
+ - Uncalibrated: temperature 1.0, no post-hoc calibration fitted. The 6 low-confidence
275
+ bins in the JevBench calibration table show mild over-confidence in the 0.6–0.8
276
+ confidence range.
277
 
278
+ ## License
279
 
280
+ - `LICENSE` β€” Apache-2.0 text as preserved from the parent checkpoint lineage
281
+ (base: Qwen/Qwen3.5-4B, inherit the base model's terms).
282
+ - `LICENSE.code` β€” MIT for runtime/server code components adapted from upstream.
283
+ - `NOTICE` β€” rebranded for this export; no new license grant is asserted.
284
+ - No benchmark score is claimed by this package beyond the reproducible evidence
285
+ files listed above; the Decision Index owner reserves 80% of its Full score for
286
+ private tests, so the 50.31 public index is not a board submission.
287
 
288
+ ## Version history
289
 
290
+ - **v1** β€” `lemondecider-4b-merge50-20261015-v1`: rebranded export of the merged two-route checkpoint (all evaluations in this card ran on v1; weight files byte-identical to v2).
291
+ - **v2** β€” `lemondecider-4b-merge50-20261015-v2`: internal machine identifiers spelling-normalized β€” module files (`modeling_lemondecider.py`, `configuration_lemondecider.py`), `auto_map`, protocol `lemondeeder-v1` β†’ `lemondecider-v1`, `model_type: lemondecider_decision`; weights and tokenizer byte-identical to v1 (sha256 unchanged).
 
 
 
 
 
 
292
 
293
+ ## Acknowledgements
294
 
295
+ Built by the LemonJev project. Runtime and server components build on Apache-2.0
296
+ and MIT upstream code (see LICENSE files). Base backbone by the Qwen team.