docs(benchmarks): judge-ceiling finding + dual-judge methodology - #65
Conversation
Multi-judge sweep on May 6-7 across two generators (qwen3.5:9b leader + qwen3.6-MoE Phase 1) × four working judges (qwen3:4b, qwen3.5:9b self-judge, gemma4:e4b, gemma4:e2b). Same predictions, no re-generation — pure judge-strictness measurement. Headline: same qwen3.5:9b leader predictions land at 0.28 Single-hop under qwen3:4b vs 0.53 Single-hop under gemma4:e2b. The ~0.28 ceiling we hit across four architectural levers (prompt, embedder, ENGRAM, generator-size) was largely the judge's strictness, not the system's. Architectural levers cannot lift Single-hop above the judge's ceiling. Methodology change going forward: - qwen3:4b stays as headline judge (strictest, locally-runnable, the honest way to report under a strict evaluator) - gemma4:e2b becomes secondary judge for matched-with-published-SOTA comparisons. Reported alongside qwen3:4b on every new cell. - Hardware-tier guidance: 4-6 GB VRAM → qwen3:4b judge; 8 GB+ → can run gemma4:e2b (7.2 GB) for matched-judge comparison. - Existing leaderboard rows are NOT retro-rescored — that would look like number-massaging. Future rows carry both judge attributions explicitly. Comparison: our qwen3.5:9b leader at gemma4:e2b judge = 0.53 Single-hop vs EMem published 0.83 (gpt-4o-mini judge). Real gap is ~0.30 — closer to "stronger generator + EDU-level retrieval + LLM filtering" rather than the ~0.55 gap our qwen3:4b numbers suggested.
📝 WalkthroughWalkthroughThis PR expands LoCoMo benchmarking documentation with a dual-judge methodology for improved metric reliability. A new "Judge sensitivity" section in docs/benchmarks.md explains that Single-hop scores vary ~2× across different LLM judges and establishes qwen3:4b as the strict headline judge and gemma4:e2b as a secondary lenient judge. Dual-judge results are presented across architectural levers, generator candidates, and temperature sweeps, with updated 12 GB GPU tier recommendations. README.md is concurrently updated to reflect these findings. ChangesLoCoMo Dual-Judge Methodology
Estimated code review effort🎯 2 (Simple) | ⏱️ ~12 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Code Review SummaryStatus: No Issues Found | Recommendation: Merge Files Reviewed (2 files)
Reviewed by grok-code-fast-1:optimized:free · 161,754 tokens |
Two updates building on the multi-judge experiment: (1) docs/benchmarks.md gains a "Dual-judge results" subsection with two tables — May 7 architectural levers and May 5 generator candidates, each scored under both qwen3:4b (strict) and gemma4:e2b (lenient, matched-with-paper-SOTA). The same predictions move +0.14-0.18 overall under gemma4:e2b. mem0_additive emerges as the new lever winner (0.70 overall, 0.56 Single-hop, 0.77 Multi-hop) and llama3.1:8b as the best Single-hop generator (0.65, +0.12 over qwen3.5:9b). CoVe ties mem0_additive on Single-hop but at 4× cost with no overall gain — not shipping. (2) README.md rewrites the LoCoMo subsection to surface dual-judge numbers (0.557 strict / 0.71 lenient) and replaces the "two preferred generators" framing with a workload-specific table: - Best overall: qwen3.5:9b - Best factual recall: llama3.1:8b (Single-hop 0.65) - Best temporal: mistral-small3.2 (Temporal 0.71) Adds a "About the dual judge" callout explaining why we report both attributions and which judge to pick by hardware tier (qwen3:4b for 4-6 GB VRAM; gemma4:e2b for 8 GB+). Notes that 4 / 8 / 16 GB tier breakouts will land as those benches dual-rescore. Per the methodology change in PR #65: existing leaderboard rows are NOT retroactively rescored. Every May 7+ cell carries both judge attributions explicitly.
Adds Generator-temperature sweep subsection to docs/benchmarks.md and updates the README's 12 GB hardware-tier recommendation table with temperature-tuned picks. Headline findings from the May 8-9 8-cell sweep: - Sampling temperature is per-generator, not universal. qwen3.5:9b peaks at 0.2; llama3.1:8b prefers fully-greedy (0.0); gemma4:e4b prefers 0.5; gemma4:e2b is split. - llama3.1:8b at temp 0.0 + mem0_additive: 0.65 / 0.60 SH (gemma4:e2b judge) — +0.13 SH lift just from temperature. Largest single-lever effect since the judge-strictness pivot. - qwen3.5:9b + mem0_additive + temp 0.2 (0.70 / 0.56) is still the Overall leader. Production default holds. - Best Single-hop overall: llama3.1:8b + RRF heuristic + temp 0.2 (0.65 SH). mem0_additive *hurts* llama's Single-hop (-0.05 vs RRF) even though it lifts qwen3.5:9b's Single-hop. Per-generator + per-fusion + per-temp tuning matters. README hardware-tier table now lists 4 workload-specific picks with fusion + temp annotations: - Best Overall: qwen3.5:9b + mem0_additive + 0.2 - Best Single-hop: llama3.1:8b + RRF + 0.2 - Best mem0_additive Single-hop: llama3.1:8b + mem0_additive + 0.0 - Best Temporal: mistral-small3.2 + RRF + 0.2 mistral row left as historical — the model was deleted in the May 5 cleanup; re-pull only if Temporal-specialty becomes a ship target.
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
docs/benchmarks.md (1)
406-409:⚠️ Potential issue | 🟠 Major | ⚡ Quick winMethodology disclosure is now internally inconsistent with the new dual-judge section.
This block still states a single external judge (
qwen3:4b) and says a thinking-mode control run is “queued,” but the new sections above already report dual-judge methodology and measured thinking-mode outcomes. Please update this section so readers don’t get conflicting methodology statements.Suggested doc fix
-- **External judge**: `qwen3:4b`, temperature 0.0, via `locomo_rescore_streaming.py`. +- **External judges**: + - `qwen3:4b` (strict, locally-runnable) is the headline judge for the full leaderboard. + - `gemma4:e2b` (lenient, matched-with-paper-SOTA comparisons) is reported alongside `qwen3:4b` for new cells from May 7, 2026 onward. + - Dual-judge rescoring uses `locomo_rescore_streaming.py`. ... -- **`think=false` on generator** for Qwen3/3.5/3.6 (PR `#42`). A `thinking_mode_on` control run is queued to measure whether chain-of-thought changes the result. +- **`think=false` on generator** for Qwen3/3.5/3.6 (PR `#42`). A `thinking_mode_on` control run was measured and regressed on LoCoMo memory-recall settings.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@docs/benchmarks.md` around lines 406 - 409, Update the inconsistent methodology text in docs/benchmarks.md: replace the single-external-judge statement and the “queued” thinking-mode phrasing with wording that reflects the dual-judge setup and the measured thinking-mode results; specifically edit the lines mentioning `qwen3:4b`, the “No cherry-picking” sentence, and the `think=false` / `thinking_mode_on` references so they state the dual-judge methodology and the observed thinking-mode outcomes (rather than saying a control run is queued).
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@README.md`:
- Around line 197-200: The blockquote containing the paragraphs starting with
"Per-generator temp sweet spots" and "About the dual judge." has an empty quoted
line between paragraphs which violates MD028; remove that blank quoted line (the
solitary "> " line) so the two quoted paragraphs are directly adjacent with no
empty blockquote line between them.
---
Outside diff comments:
In `@docs/benchmarks.md`:
- Around line 406-409: Update the inconsistent methodology text in
docs/benchmarks.md: replace the single-external-judge statement and the “queued”
thinking-mode phrasing with wording that reflects the dual-judge setup and the
measured thinking-mode results; specifically edit the lines mentioning
`qwen3:4b`, the “No cherry-picking” sentence, and the `think=false` /
`thinking_mode_on` references so they state the dual-judge methodology and the
observed thinking-mode outcomes (rather than saying a control run is queued).
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 26b61da3-f7e1-40c4-8fab-97025661a7f7
📒 Files selected for processing (2)
README.mddocs/benchmarks.md
| > **Per-generator temp sweet spots** (matters more than we expected): `qwen3.5:9b` peaks at temp 0.2; `llama3.1:8b` prefers fully-greedy (0.0); `gemma4:e4b` prefers 0.5 for Overall; `gemma4:e2b` prefers 0.0 for Single-hop. There's no universal sampling temperature for our local-tier stack — the right temp interacts with the model's training distribution. See `docs/benchmarks.md` for the per-generator × per-temp breakdown. | ||
|
|
||
| > **About the dual judge.** We score every new cell under two LLM judges: `qwen3:4b` (locally-runnable, deliberately strict, never refuses) and `gemma4:e2b` (lenient, calibrated closer to gpt-4o-mini). The *same predictions* score 0.28 vs 0.53 Single-hop respectively — judge strictness is a load-bearing variable in any LLM-judged benchmark. Reporting both is the honest middle ground between under-claiming under our strict judge and over-claiming under a frontier-API judge we can't afford to run on every cell. Hardware-tier defaults: 4-6 GB VRAM systems should keep `qwen3:4b` as their judge (fits comfortably, fast), 8 GB+ can run `gemma4:e2b` (7.2 GB) for matched-with-paper-SOTA comparison numbers. | ||
|
|
There was a problem hiding this comment.
Remove the blank line inside the blockquote (MD028).
There’s a blank quoted line between blockquote paragraphs here, which trips markdownlint rule MD028.
🧰 Tools
🪛 markdownlint-cli2 (0.22.1)
[warning] 198-198: Blank line inside blockquote
(MD028, no-blanks-blockquote)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@README.md` around lines 197 - 200, The blockquote containing the paragraphs
starting with "Per-generator temp sweet spots" and "About the dual judge." has
an empty quoted line between paragraphs which violates MD028; remove that blank
quoted line (the solitary "> " line) so the two quoted paragraphs are directly
adjacent with no empty blockquote line between them.
Summary
The most important methodology finding to date. After hitting a stubborn ~0.28 Single-hop ceiling across four independent architectural levers, the multi-judge experiment shows the ceiling was the judge's strictness, not the system's quality.
Multi-judge sweep results (same predictions, 5 judges)
`qwen3.5:9b` leader recipe, 200-QA subset, identical predictions:
⚠ `llama3.1:8b` rescore returned in 26 s (vs ~30 min for others) — parsing failure, treated as outlier.
Same pattern reproduces under `qwen3.6:35b-a3b` (Phase 1 MoE) — gemma4:e2b judge gives 0.51 Single-hop on the same predictions that scored 0.21 under qwen3:4b.
What this means
Methodology change going forward
Test plan
Summary by CodeRabbit