Can Jev replace an LLM reranker?
Jev reached 110% of Claude Haiku’s ranking quality at 2.0× the speed and 16× lower cost.
Every grade so far comes from Claude Opus. The human check of that grader has not been done yet, so treat the quality numbers as provisional.
200 test queries·10,164 graded pairs·YC snapshot 2026-09-22·judge: Claude Opus
The setup
Jev is not a search engine. It answers typed questions about a situation with a choice or a score, and a confidence. So the test puts it where a search stack already asks those questions: picking what the user wants, and scoring 100 retrieved candidates against the query.
Retrieval is held fixed. Every reranker scores the identical 100 companies, so any difference below is the reranker's alone.
- 1querya sentence someone wrote on Hacker News
- 2routepick an intent: competitors, products, jobs or open source
- 3filterhard filters from that intent, e.g. hiring only
- 4retrieve 100BM25 + embeddings, frozen once for every reranker
- 5rerankthe only step that changesNo rerankingBGE cross-encoderClaude Haiku 4.5Jev
- 6top 10what gets graded
Jev and Claude Haiku can each be asked two ways, and both got the same treatment: a pilot on 20 held-out dev queries, never reported as results, picked one formulation per model by nDCG@10, with latency breaking near-ties. Every number below uses the pick.
| Formulation | nDCG@10 | p50 | Per 1,000 | Requests per search |
|---|---|---|---|---|
| one call per candidate; state holds the query and one company card | 0.72 | 2.7 s | $2.35 | 100 |
| one call per search; state holds the query, 100 questions each carry a cardchosen | 0.74 | 1.2 s | $1.18 | 1 |
| Formulation | nDCG@10 | p50 | Per 1,000 | Requests per search |
|---|---|---|---|---|
| one prompt per search scoring all 100 cards | 0.64 | 3.3 s | $17.11 | 1 |
| 10 prompts per search sent at once, 10 cards eachchosen | 0.67 | 1.4 s | $18.32 | 10 |
Ranking quality
How good is the top 10 each reranker puts in front of the user, graded against the judge's labels.
| Reranker | nDCG@10 | Recall@10 | MRR | Queries |
|---|---|---|---|---|
| No reranking | 0.41 No reranking nDCG@10 0.41, 95% interval 0.37 to 0.45 | 0.40 No reranking Recall@10 0.40, 95% interval 0.35 to 0.45 | 0.72 No reranking MRR 0.72, 95% interval 0.67 to 0.77 | 198 |
| BGE cross-encoder | 0.47 BGE cross-encoder nDCG@10 0.47, 95% interval 0.43 to 0.50 | 0.48 BGE cross-encoder Recall@10 0.48, 95% interval 0.43 to 0.53 | 0.75 BGE cross-encoder MRR 0.75, 95% interval 0.70 to 0.80 | 198 |
| Claude Haiku 4.5 | 0.73 Claude Haiku 4.5 nDCG@10 0.73, 95% interval 0.70 to 0.75 | 0.76 Claude Haiku 4.5 Recall@10 0.76, 95% interval 0.71 to 0.81 | 0.94 Claude Haiku 4.5 MRR 0.94, 95% interval 0.91 to 0.96 | 198 |
| Jev | 0.80 Jev nDCG@10 0.80, 95% interval 0.78 to 0.83 | 0.80 Jev Recall@10 0.80, 95% interval 0.75 to 0.84 | 0.94 Jev MRR 0.94, 95% interval 0.91 to 0.97 | 198 |
Speed and cost
Jev's pitch is speed and price. Here is what each reranker costs in time and money for the quality it buys.
| Reranker | p50 | p99 | Per 1k searches | At 1M a month | Latency measured as |
|---|---|---|---|---|---|
| No reranking | — | — | runs locally | your hardware | no rerank step |
| BGE cross-encoder | 16.3 s | 25.4 s | runs locally | your hardware | wall clock |
| Claude Haiku 4.5 | 1.4 s | 4.8 s | $18.23 | $18,231 | API time, via Claude Code |
| Jev | 671 ms | 2.1 s | $1.17 | $1,173 | wall clock |
By intent
A reranker that wins on competitor searches and loses on job searches is a finding, so each intent gets its own panel.
Competitors
50 queries| None | 0.52, 95% interval 0.46 to 0.58 | |
|---|---|---|
| BGE | 0.55, 95% interval 0.49 to 0.61 | |
| Haiku | 0.82, 95% interval 0.79 to 0.85 | |
| Jev | 0.90, 95% interval 0.88 to 0.92 |
Products
50 queries| None | 0.25, 95% interval 0.18 to 0.32 | |
|---|---|---|
| BGE | 0.35, 95% interval 0.27 to 0.43 | |
| Haiku | 0.69, 95% interval 0.62 to 0.75 | |
| Jev | 0.83, 95% interval 0.79 to 0.87 |
Jobs
50 queries| None | 0.50, 95% interval 0.45 to 0.55 | |
|---|---|---|
| BGE | 0.53, 95% interval 0.48 to 0.58 | |
| Haiku | 0.75, 95% interval 0.71 to 0.79 | |
| Jev | 0.72, 95% interval 0.66 to 0.78 |
Open source
50 queries| None | 0.38, 95% interval 0.29 to 0.47 | |
|---|---|---|
| BGE | 0.44, 95% interval 0.36 to 0.52 | |
| Haiku | 0.65, 95% interval 0.58 to 0.72 | |
| Jev | 0.76, 95% interval 0.68 to 0.82 |
The judge-free check
Launch HN posts come with a correct answer: the company that wrote the post. Its rank needs no grader, which makes this the most trustworthy chart on the page.
#1 in 13 of 50, top 10 in 27
median rank #6
#1 in 16 of 50, top 10 in 30
median rank #5
#1 in 20 of 50, top 10 in 34
median rank #2
#1 in 25 of 50, top 10 in 35
median rank #1
Routing
Before retrieval, the query is routed to one of four intents. Jev Choice and Claude Haiku got the same queries and the same list.
Claude Haiku 4.5
83%accurate| actual ↓ picked → | Comp. | Product | Job | OSS |
|---|---|---|---|---|
| Comp. | 23 | 23 | 1 | 3 |
| Product | 4 | 46 | 0 | 0 |
| Job | 0 | 0 | 50 | 0 |
| OSS | 0 | 3 | 1 | 46 |
200 queries · median 2.0 s · $0.39 per 1,000
Jev Choice
94%accurate| actual ↓ picked → | Comp. | Product | Job | OSS |
|---|---|---|---|---|
| Comp. | 39 | 8 | 2 | 1 |
| Product | 0 | 50 | 0 | 0 |
| Job | 0 | 0 | 50 | 0 |
| OSS | 0 | 2 | 0 | 48 |
200 queries · median 390 ms · $0.026 per 1,000
Does Jev’s confidence mean anything?
Jev returns a confidence with every answer. If it is honest, a product could act on it: skip the expensive step when Jev is sure, ask the user when it isn't.
Each dot is a band of confidence. Its height is how often Jev's intent was right when it reported that much confidence. On the diagonal, a confidence of 0.8 means right four times in five.
Expected calibration error 0.101
weighted mean gap between confidence and accuracy; 0 is perfect
What we expected, and what held
Written down before anything ran.
- H1Supported
Jev reaches at least 90% of Claude Haiku's nDCG@10 as a reranker.
nDCG@10 Jev 0.80 vs haiku 0.73 (110%), n=198
- H2Rejected
Jev's p50 latency for 100 candidates is under 10% of Haiku's.
p50 Jev 671 ms (wall) vs Haiku 1374 ms (api), 49%
- H3Rejected
Jev matches Haiku within 3 points of accuracy on intent routing.
accuracy Jev 94% vs Haiku 83%, n=200
- H4Supported
Jev beats the open-source cross-encoder on accuracy.
nDCG@10 Jev 0.80 vs bge 0.47, n=198
Look at the rankings yourself
Pick a query and follow each company from retrieval order to each reranker's top 10. Heavier threads are better matches by the judge's grade.
Competitors · source on news.ycombinator.com ↗
“We have an app and community to help people cut back on their compulsive (or just excessive) use of pornography and other digital activities like social media and gaming. Our community currently has 100k members.”
No reranking
hybrid retrieval order
BGE
bge-reranker-v2-m3 (ONNX)
Haiku
claude-haiku-4-5-20251001
Jev
jev (TypeSafe)
| Rank | No reranking | BGE cross-encoder | Claude Haiku 4.5 | Jev |
|---|---|---|---|---|
| 1 | Reframe (partial match) | Relay Health (exact match) | Relay Health (exact match) | Atmana (exact match) |
| 2 | Atmana (exact match) | Atmana (exact match) | Atmana (exact match) | Relay Health (exact match) |
| 3 | Relay Health (exact match) | Twitch (not relevant) | Sunflower (partial match) | Sunflower (partial match) |
| 4 | Twitch (not relevant) | Reframe (partial match) | Clearspace (exact match) | Clearspace (exact match) |
| 5 | Status (not relevant) | Roforco (not relevant) | Recover (partial match) | Recover (partial match) |
| 6 | Glimpse (not relevant) | Reddit (not relevant) | Pelago (partial match) | Pelago (partial match) |
| 7 | Plura (formerly Bloom Community) (not relevant) | 9gag (not relevant) | Reframe (partial match) | Reframe (partial match) |
| 8 | Recurious (not relevant) | Pocket Worlds (not relevant) | Breathe Well-being (not relevant) | GroupAhead (not relevant) |
| 9 | Socialmoth (not relevant) | Rhythmm (not relevant) | Daybreak Health (partial match) | Daybreak Health (partial match) |
| 10 | GroupAhead (not relevant) | Wakie (not relevant) | Reddit (not relevant) | Wakie (not relevant) |
How much to trust this
Every quality number above comes from one grader: Claude Opus, reading each query with 20 pooled companies at a time and grading them 0 (irrelevant), 1 (partial) or 2 (exact). It never saw which reranker found a company.
The hand-graded check of the judge has not been run yet.
A Claude judge may favour a Claude reranker. Read Claude Haiku's lead against the judge-free check in section 6: that chart uses no grader at all, so if Haiku's lead shrinks there, the judge is the likely reason.
Limitations
- Queries come from Hacker News. They skew technical and toward developer tools, so the product and open-source intents are easier to fill than they would be on a general site.
- Founder search is not tested. The YC directory mirror has no founder data, and Jev has no founder intent here.
- Retrieval is held fixed. A reranker cannot recover a company retrieval missed, so every arm shares that ceiling.
- Latency to a hosted API is mostly network. Claude Haiku ran through Claude Code, so its latency is API time reported by Claude Code, close to but not the same as calling the API directly. When a search sends several Haiku prompts at once, its latency is the slowest prompt's.
- Agreement with the judge depends on where a card sat in the retrieval list. Correlation of each score with the judge's grade, for retrieval positions 1–25, 26–50, 51–75, 76–100: Jev 0.67, 0.60, 0.62, 0.61; Claude Haiku with all 100 cards in one prompt 0.62, 0.38, 0.39, 0.27; Claude Haiku with ten prompts of 10 cards 0.70, 0.61, 0.62, 0.52. The share of relevant cards barely moves across those bands (0.38, 0.43, 0.45, 0.43), so a falling correlation comes from the reranker, not the candidates. A 100-card prompt loses Haiku most of its agreement past the first 25 cards; ten cards per prompt, the formulation its pilot picked, keeps most of it.
- The live search does not retrieve quite the way the benchmark did. Every number here used fp32 query embeddings; the deployed app uses the q8 weights, because the fp32 file is 133 MB and a serverless function has 250 MB for everything it needs. Across the 200 test queries the two agree on a median 96% of the retrieved 100 and 90% of the top 10, and they disagree on the first result for 8.5% of queries. In this page's own currency, q8 drops 13 of the 910 grade-2 companies out of the top 100 and costs nothing on the Launch HN check. Rerun it with bun run bench:embed-drift.
- If the embedding model fails to load, the live search ranks with BM25 alone and says so under the results. Nothing on this page is measured that way, and it is not a free fallback: grade-2 companies reaching the top 100 falls from 910/910 to 709/910, and the Launch HN company is found in 33 of 50 queries instead of 37.
- Costs use each provider's published list price on the run date.
Reproduce it
The data snapshot, queries, labels and prompts are in the repository. Retrieval is frozen once, so every arm reranks the identical 100 candidates.
git clone https://github.com/PPRAMANIK62/yc-jev-bench && cd yc-jev-bench
bun install
cp .env.example .env # add TYPESAFE_API_KEY for the Jev arm
bun bench/index.ts # build the retrieval index from the frozen snapshot
bun run bench # every arm and router, the Opus judge, then src/generated/results.json
bun run dev # open this report and the search at localhost:3000