A Dedicated Selector Design: What Jev Does in General, Done for One Job

Jev has made one kind of model famous: it does not write, it chooses among fixed options and says how sure it is. This article is about a dedicated version of that idea: a small reranker trained for a single decision inside dksplit, our word splitter for domain names, running on our own hardware.


A reranker is a small part with a narrow job: a first model proposes a few candidates, and the reranker picks among them. The question is fixed, the options are given, and the model never generates a reply: we run one forward pass, look at the single position where the number of the chosen option would come next, and read the scores it gives to 1, 2 and 3. Their softmax is the whole answer — a choice and a probability from the same three numbers, with nothing to parse and nothing that can come back malformed:

{"domain": "cloudebot",
 "pick": 1,
 "readings": [{"n": 1, "reading": "cloud ebot",  "p": 0.99},
              {"n": 2, "reading": "cloud e bot", "p": 0.01},
              {"n": 3, "reading": "cloude bot",  "p": 0.00}]}

We built our first reranker last time, when we found that a model choosing among dksplit’s candidate readings, instead of producing its own, could reach knowledge the splitter does not have. We have built many since, and two lessons have held throughout. The input matters: the reranker has to see all the candidates together, numbered in the splitter’s own order. The base matters: in our experience, what a reranker can judge has a lot to do with what its base model had learned before we ever trained it.

Two rerankers, one slot

To keep the question narrow, this article looks at just two of them. Both were trained on the same data with the same teacher: 200,000 strings with numbered readings, and an open-source Qwen3.6-35B-A3B, used as released, whose spread of confidence over the readings each student learns alongside the right answer (logit distillation). One is a Qwen3.5-0.8B, trained through a LoRA adapter. The other is mmBERT-base, a 307M multilingual encoder, fine-tuned in full — the usual way for each kind. An encoder is the sort of model a fixed three-way choice seems made for.

Both are shown the question the same way, and it took us one wrong turn to get there. Our first encoder was given one reading at a time — the string, a single candidate, a score — and never saw the other two, or which one dksplit had put first. We rebuilt it to see what the 0.8B had seen all along: all three readings together, numbered in dksplit’s order. That order is the strongest single fact in this task — dksplit’s first reading is right nine times in ten — and a reranker should be able to see it.

Both sit in the same place in the line. dksplit reads the string first and says how sure it is of its own first reading. Where it is sure, that reading stands and no reranker is called. Only the rest go on:

Figure 1. Where a string goes. The reranker is called only where dksplit’s own confidence is below 0.80.

dksplit is right on 3,652 of the 3,786 strings it keeps. The reranker’s work is the other 1,214, where dksplit’s own first reading is right on only 869.

Figure 2. The 1,214 strings dksplit is unsure of: how many come out right with its own first reading, and with each reranker.

On those 1,214 strings the encoder gets 938 right and the 0.8B 958. Across all 5,000 that makes 4,521 with no reranker, 4,590 with the encoder and 4,610 with the 0.8B — while three strings in four never touch a GPU. A 2B trained like the 0.8B gets 993 of the 1,214 right, which makes 4,645 across the line. Training is what makes either of them a reranker at all: an untrained 0.8B, asked the same question, gets only 2,366 of the 5,000 right, which matches what we saw of small untrained models last time.

Because the reranker returns a probability with its choice, the line has one more exit: below 0.80 the string is handed up, with its readings attached, to a more capable stage — a larger model or an agent, and only at the very end a person. With the 0.8B in the slot, dksplit settles 3,786 of the 5,000 strings, the reranker another 731, and 483 are handed up: under one in ten. The expensive intelligence is spent only where it is needed. One string shows both that exit and the difference between the two rerankers:

{"reranker": "0.8B",    "domain": "woknrollportorange", "pick": 2,
 "readings": [{"n": 1, "reading": "wok n rollport orange",  "p": 0.22},
              {"n": 2, "reading": "wok n roll port orange", "p": 0.77},
              {"n": 3, "reading": "wokn rollport orange",   "p": 0.01}]}

{"reranker": "encoder", "domain": "woknrollportorange", "pick": 1,
 "readings": [{"n": 1, "reading": "wok n rollport orange",  "p": 0.67},
              {"n": 2, "reading": "wok n roll port orange", "p": 0.32},
              {"n": 3, "reading": "wokn rollport orange",   "p": 0.01}]}

Wok n roll is a joke about rock and roll. Seeing it is not a matter of reading the characters more carefully; it is a matter of having met the phrase before. The difference may reflect what the two bases had learned before we trained them for this task. Note too what the line does here: neither 0.77 nor 0.67 clears 0.80, so with either model this string is escalated. The two disagree, and the line does not settle it for them; it hands the question up.

We train on a small task and drop a small model into a line. But what that part can be trusted with may depend on what it had already learned before it ever arrived.

In closing

We have long held that in an industrial process the right place for AI is a particular step, where it raises the efficiency of the people working there — the argument of From Ford’s Assembly Line to Local AI Pipelines. A reranker is that idea at its smallest: one decision, made locally, with a number that says when to hand the question up.

Neither of the models here is a product, and neither is being released; the point was the route.

Back to Jev. We tested it on this task as well, and it handles it very well. It does in general what the reranker here does for one job, and its judgment across general questions genuinely surprised us. We think a general base that can settle problems of this kind quickly, efficiently and at a low price is a solution that will carry into many different fields.


Notes

1. Benchmark and scoring. 5,000 domain strings, each with a reference reading and, for 601 of them, an accepted alternative; a pick is right if it equals either. dksplit 1.0.2 does not return its confidence yet; we computed it from the model’s own scores.

2. Reading the 0.8B. Qwen chat format with the empty thinking block; the assistant turn is opened with the words that precede the answer in training, and the probabilities are the softmax over the tokens 1, 2, 3 at the next position. Nothing is generated. Where the reranker says 0.9 it is right about nine times in ten; averaged over the 5,000 strings, the gap between the probability given and the share that was right is 0.017, for both rerankers.

3. The encoder. mmBERT-base, fine-tuned in full as a cross-encoder: <bos> domain <eos> 1. reading / 2. reading / 3. reading <eos> in, one score per reading out, softmax over them.


The training and the experiments for this work ran on MareNostrum 5 at the Barcelona Supercomputing Center, under the EuroHPC playground allocation EHPC-AIF-2026PG01-689; the reranker itself runs on a single ordinary graphics card. Our thanks to EuroHPC JU and BSC.

This work uses models from the Qwen3.5 family, developed by the Qwen Team at Alibaba Cloud and released under the Apache 2.0 license. The comparison runs used Jev 1.13.0 through the TypeSafe AI API.

EuroHPC Co-funded by EU
EuroHPC

We acknowledge the European High Performance Computing Joint Undertaking (EuroHPC JU) for awarding this project (EHPC-AIF-2026PG01-689) access to the MareNostrum 5 supercomputer, hosted by Barcelona Supercomputing Center.

Co-funded by the European Union. Views and opinions expressed are those of the authors only and do not necessarily reflect those of the European Union or the European High Performance Computing Joint Undertaking.