From e7ac7ae13113883ef560ccebd1c4f3f56f1cf86f Mon Sep 17 00:00:00 2001 From: Aayam Bansal Date: Thu, 30 Jul 2026 18:28:57 +0800 Subject: [PATCH] perf(search): default the listwise reranker to the larger model Measured on the full 220-case held-out split, zero failures either run: MRR R@5 R@20 BCY@8k latency gpt-4o-mini 0.285 0.419 0.567 0.446 6.0s gpt-4o 0.309 0.442 0.582 0.467 5.6s Better on every metric and no slower end to end, which is the part worth explaining: the larger model returns a usable ordering first time, where the smaller one more often emits a partial list and hits the omitted-candidate fallback, so the extra per-token cost is repaid by not wasting the call. The 75-case development split disagreed and called this a wash. It has been wrong four times this round on differences this size; with a model in the loop its run-to-run variance is about 0.02, which is the whole effect. The 220-case result is the one to believe. Listwise reranking is still off by default, so this only changes which model is used once a deployment opts in and has already accepted the cost of a language model in the retrieval path. --- backend/synsc/config.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/backend/synsc/config.py b/backend/synsc/config.py index 431193b..525faa3 100644 --- a/backend/synsc/config.py +++ b/backend/synsc/config.py @@ -328,8 +328,14 @@ class SearchConfig(BaseModel): ), ) listwise_rerank_model: str = Field( - default="gpt-4o-mini", - description="Chat model used for listwise reranking.", + default="gpt-4o", + description=( + "Chat model used for listwise reranking. Measured on the 220-case " + "held-out split, the larger model is better on every metric and " + "no slower end to end (MRR 0.309 vs 0.285, Recall@5 0.442 vs " + "0.419): it returns a usable ordering first time, where the " + "smaller model more often needs the omitted-candidate fallback." + ), ) listwise_rerank_k: int = Field( default=20,