Training
- 112,129 (window → verdict) pairs, single sample per turn, fixed 15-token task
header, verdict keys in fixed order. Natural grade distribution kept (no
oversampling: a selector's calibration is worth more than its recall — see
the probability readout below for how recall was recovered anyway).
- Held out 10,221 pairs split at conversation level, so no held-out window
shares a thread or writer with training.
- LoRA r32/α64 (rsLoRA), lr 1e-5 constant, 1 epoch (7,009 steps), ctx 640,
bf16, one A100-40GB, ~7.5h.
Agreement with the teacher (held-out, ctx-512)
Malformed outputs: 0.00% of 10,221.
Table with columns: axis, agreement| axis | agreement |
|---|
| PASS decision (clean flags & pq≥3) | F1 0.804 (precision .821 / recall .788) |
| prose_quality | exact .701 · within-1 .998 · QWK .820 · MAE .301 |
| pure_rp | κ .890 |
| questionable | κ .816 |
| own_side | κ .437 (weakest axis) |
| speaker_names | .838 per-code loose match |
Errors concentrate on the 2/3 boundary ("functional-but-flat" vs "passable") —
the most populated and least consequential boundary in the rubric. Grade
means: student 2.77 vs teacher 2.86.
The top-grade problem, and the readout that fixes it
Trained on a natural distribution (top grades ≈ 2.5% of data), the argmax
student is shy at the top: it recalls only 22% of the teacher's grade-5+
samples, filing most as 4s.
The fix is not retraining but a different readout: read the token
probabilities at the prose_quality digit and score each sample by
P(5)+P(6)+P(7) instead of the argmax. On held-out:
Table with columns: take top-N by P(5+), recall of teacher fives, precision| take top-N by P(5+) | recall of teacher fives | precision |
|---|
| 461 (= teacher-five count) | 48% | 48% |
| 1,000 | 80% | 37% |
| 1,500 | 93% | 28% |
| 3,000 | 100% | 15% |
Every teacher-five sits within the top 29% of the ranking (median rank
485/10,221). The model knew; the argmax was just conservative. As a retrieval
stage followed by any stronger re-ranker, top-grade selection is solved.
Hand review
The 10 highest-P(5+) windows from 54,675 samples the teacher never saw were
read by hand: they show the same virtues the teacher's own top grades
rewarded — interiority, voice under stress, feeling carried by concrete
detail — and 8 of 10 came from a single conversation whose writers also
dominated the teacher's highest grades. Two judging mechanisms, two datasets,
same crown: the transplanted taste is real. (Samples not reproduced here.)
Production so far
- 42,679 previously unjudged 512-windows in 80 minutes (4 parse failures);
aggregate pass-rate 48.5% vs the teacher's 48.2% on the adjacent corpus
region — calibration transfers to unseen data at the population level.
- 1024- and 2048-token windows are being judged now; agreement at those
lengths is TBA pending a teacher spot-check, and those labels should be
treated as provisional until then.
Usage (vLLM)
from vllm import LLM, SamplingParamsfrom vllm.lora.request import LoRARequest llm = LLM(model="mistralai/Ministral-3-14B-Base-2512", enable_lora=True, max_lora_rank=32, max_model_len=1536, dtype="bfloat16")sp = SamplingParams(temperature=0.0, max_tokens=250, stop=["\n"], logprobs=10)prompt = "Judge this forum-roleplay training sample.\n\n### SAMPLE\n" + window \ + "\n\n### VERDICT\n"out = llm.generate([prompt], sp, lora_request=LoRARequest("judge", 1, ADAPTER_DIR))
The verdict is the first generated line. For top-grade retrieval, read the
logprobs at the prose_quality digit and rank by P(5)+P(6)+P(7).
Limitations
English forum-RP windows only; calibrated to one teacher's rubric and tastes;
shy at top grades under argmax (use the probability readout); own_side is
its weakest axis; long-window calibration unvalidated as of this writing.