We are measuring and trying to drastically improve recall quality on a real production store (18k records, French, custom Solon-large HTTP embedding provider), against a 63-query human-labelled gold set evaluated through the daemon path. Opening this issue to share findings as we go and to discuss directions — this is very much work in progress.
What we measured
- Baseline (v2.5.1, exact index): top-1 12.7%, top-5 25.4%. The move from ANN to the exact index changed almost nothing on this benchmark — retrieval approximation was not the bottleneck.
- ~90% of top-5 hits were raw episodic turns, even when curated
doc:* chunks (ingested via upload/teach) containing the answer sat just below the cutoff: ranking does not distinguish knowledge from conversation.
- The vocabulary gap dominates failures: a query phrased with words absent from the stored text ("versionnage" vs a record talking about semver/release/bump) leaves the target stranded at deep ranks.
What we tried so far (branches on our fork)
- Source-aware weighting (m1-source-weighting): bounded soft boost of
doc:*/semantic-tier records at final ranking, never a filter. Factor swept on the gold set; 1.05 optimal.
- IDF-gated hybrid lexical⊕semantic (m2-hybrid-lexical): extends the in-tree BM25
LexicalIndex with FR tokenisation + deterministic synonyms, fires only on rare tokens (IDF ≥ 4), RRF fusion; RRF-k swept, 240 optimal.
Honest outcome: these two combined only moved top-1 from 12.7% to 14.3% (top-5 did better: 25.4% → 34.9%, and six previously unfindable queries now surface). That is far from what we consider acceptable — our target is near-assured top-5 recall.
Where we are heading
We are actively working on this and looking for the lever that moves the score drastically, not incrementally. Candidates on our list: a much larger gold set to understand the remaining failures, chunking/section-aware ingestion, and a measured reranker. We are open to any and all ideas — engine-side, ingestion-side, evaluation-side, or approaches we have not considered at all. If you have thoughts on where the engine itself could help most, or results from your own stores, we are very interested.
🤖 Designed by Marsu — Refined by Claude.
We are measuring and trying to drastically improve recall quality on a real production store (18k records, French, custom Solon-large HTTP embedding provider), against a 63-query human-labelled gold set evaluated through the daemon path. Opening this issue to share findings as we go and to discuss directions — this is very much work in progress.
What we measured
doc:*chunks (ingested viaupload/teach) containing the answer sat just below the cutoff: ranking does not distinguish knowledge from conversation.What we tried so far (branches on our fork)
doc:*/semantic-tier records at final ranking, never a filter. Factor swept on the gold set; 1.05 optimal.LexicalIndexwith FR tokenisation + deterministic synonyms, fires only on rare tokens (IDF ≥ 4), RRF fusion; RRF-k swept, 240 optimal.Honest outcome: these two combined only moved top-1 from 12.7% to 14.3% (top-5 did better: 25.4% → 34.9%, and six previously unfindable queries now surface). That is far from what we consider acceptable — our target is near-assured top-5 recall.
Where we are heading
We are actively working on this and looking for the lever that moves the score drastically, not incrementally. Candidates on our list: a much larger gold set to understand the remaining failures, chunking/section-aware ingestion, and a measured reranker. We are open to any and all ideas — engine-side, ingestion-side, evaluation-side, or approaches we have not considered at all. If you have thoughts on where the engine itself could help most, or results from your own stores, we are very interested.
🤖 Designed by Marsu — Refined by Claude.