Skip to content

docs(benchmarks): judge-ceiling finding + dual-judge methodology - #65

Merged
jaylfc merged 3 commits into
masterfrom
docs/judge-ceiling-may7
May 10, 2026
Merged

docs(benchmarks): judge-ceiling finding + dual-judge methodology#65
jaylfc merged 3 commits into
masterfrom
docs/judge-ceiling-may7

Conversation

@jaylfc

@jaylfc jaylfc commented May 7, 2026

Copy link
Copy Markdown
Owner

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:

Judge Overall Single-hop
gemma4:e2b 0.71 0.53
qwen3.5:9b (self) 0.64 0.35
gemma4:e4b 0.56 0.26
qwen3:4b (our published baseline) 0.54 0.28
llama3.1:8b ⚠ 0.35 0.21

⚠ `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

  • Same predictions, different judges, 2× variation in Single-hop (0.26 → 0.53 across working judges).
  • The "unmovable Single-hop" framing across 4 prior negative results was largely measurement, not architecture.
  • Our pipeline at gemma4:e2b judge is 0.53 Single-hop / 0.71 overall — close to the published-SOTA band (EMem 0.83 with gpt-4o-mini).
  • Real architectural gap to EMem is ~0.30, not the ~0.55 our qwen3:4b numbers suggested.

Methodology change going forward

  1. `qwen3:4b` stays as headline judge (strictest, locally-runnable, honest under-reporting).
  2. `gemma4:e2b` becomes secondary judge, reported alongside qwen3:4b for matched-with-published-SOTA comparisons.
  3. New cells get dual-rescored under both judges. Every published number carries both attributions.
  4. Hardware-tier guidance: 4-6 GB VRAM uses `qwen3:4b` judge (low-VRAM, never refuses); 8 GB+ can run `gemma4:e2b` (7.2 GB) for matched-with-paper benchmarks.
  5. Existing leaderboard rows are NOT retroactively rescored — that would look like number-massaging. The 0.557 leader stands; future rows include both judge scores explicitly.

Test plan

  • Read end-to-end alongside the prompt + embedder + ENGRAM negative-result sections — confirms the four-null narrative is properly contextualised by judge-ceiling
  • Verify all numbers match `/tmp/multijudge_overnight_summary.tsv` and `/tmp/multijudge_phase2_summary.tsv` on the bench host
  • Confirm the methodology-change paragraph reads as honest disclosure rather than retroactive number-massaging

Summary by CodeRabbit

  • Documentation
    • Refreshed LoCoMo benchmark results with dual-judge evaluation methodology for improved scoring consistency and reliability
    • Updated GPU tier recommendations with specific generator configurations, temperature settings, and comprehensive performance metrics across multiple evaluation judges
    • Added judge sensitivity analysis demonstrating how evaluator choice significantly affects benchmark scores
    • Expanded benchmark documentation with detailed architectural comparison tables, temperature optimization insights, and reproducibility information

Review Change Stack

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.
@coderabbitai

coderabbitai Bot commented May 7, 2026

Copy link
Copy Markdown
📝 Walkthrough

Walkthrough

This 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.

Changes

LoCoMo Dual-Judge Methodology

Layer / File(s) Summary
Judge Sensitivity Analysis & Methodology
docs/benchmarks.md
Introduces "Judge sensitivity" section showing Single-hop score spread across judges (~2× range) and establishing dual-judge forward methodology: qwen3:4b (strict, headline) and gemma4:e2b (lenient, secondary) with mandatory dual attribution for new cells.
Benchmark Results Across Scenarios
docs/benchmarks.md
Presents dual-judge comparative results for May 7 architectural levers, May 5 generator candidates, and generator-temperature sweep. Reports Overall, Single-hop/Factual, and Multi-hop/Temporal scores under both judges; updates 12 GB GPU production guidance per metric priorities.
Updated Generator Recommendations
README.md
Replaces prior LoCoMo description with strict-judge (qwen3:4b) results on 1540-QA set and lenient-judge (gemma4:e2b) metrics on 200-QA subset. Adds recommended generators table for 12 GB GPU tier with fusion strategy, temperature, and both-judge scores; includes temperature sweet spots and dual-judge explanation.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

Possibly related PRs

  • jaylfc/taosmd#63: Introduces May 5 generator candidate sweep and initial 12 GB GPU recommendations; this PR extends that with dual-judge rescoring and judge-sensitivity analysis on top.
  • jaylfc/taosmd#34: Introduces qwen3 external rescoring and gemma4 secondary judge methodology; this PR applies and documents that dual-judge approach comprehensively across LoCoMo benchmarks.
  • jaylfc/taosmd#56: Modifies LoCoMo benchmark documentation and leaderboard results; this PR adds judge-sensitivity analysis and dual-judge rescoring to the same benchmark evaluation framework.

Poem

🐰 Two judges now reign, one strict and one kind,
Their verdicts diverge—the truth, intertwined.
A rabbity sweep of temperatures true,
Refined GPU guidance from this balanced view.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately captures the main findings and methodology changes: the discovery that the Single-hop ceiling is due to judge strictness rather than system quality, and the shift to dual-judge evaluation methodology for future results.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch docs/judge-ceiling-may7

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@kilo-code-bot

kilo-code-bot Bot commented May 7, 2026

Copy link
Copy Markdown

Code Review Summary

Status: No Issues Found | Recommendation: Merge

Files Reviewed (2 files)
  • README.md
  • docs/benchmarks.md

Reviewed by grok-code-fast-1:optimized:free · 161,754 tokens

jaylfc added 2 commits May 7, 2026 17:49
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.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 win

Methodology 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

📥 Commits

Reviewing files that changed from the base of the PR and between 54e8983 and b93a65a.

📒 Files selected for processing (2)
  • README.md
  • docs/benchmarks.md

Comment thread README.md
Comment on lines +197 to +200
> **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.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

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.

@jaylfc
jaylfc merged commit 57cbcc4 into master May 10, 2026
2 checks passed
@jaylfc
jaylfc deleted the docs/judge-ceiling-may7 branch May 10, 2026 17:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant