Hallucination detection — HaluEval QA, N=100, human labels
All runs useclaude-haiku-4-5-20251001 as the judge (source).
What this means. Binary yes/no questions (QAG) are a more reliable scoring signal than numeric rubrics. The simple 1-10 judge ships ~3× more false positives at the same precision — every false positive in a CI gate is wasted developer time.
Cross-distribution held-out F1 — HaluEval-Sum, N=60
The in-distribution F1 above is the headline; the held-out number is the answer to “did you tune thresholds on the data you’re testing against?” The Hallucination evaluator’s threshold is calibrated on HaluEval-QA (threshold0.55 for claude-haiku-4-5). We then test it against a different task family — HaluEval-Sum (summarization hallucination) — without changing anything else.
Source —
benchmarks/results/hallucination_held_out.json.
A calibrated evaluator that holds its precision (0.957) when moved to a different task distribution is the actual product claim. Anyone can score well on the validation set they tuned against.
Three-framework agreement — κ=0.03
We ran multivon-eval, DeepEval, and RAGAS on the same 100 HaluEval-QA cases. Pairwise Cohen’s κ across all three pairings: κ=0.03, essentially independent. Despite the marketing copy, the frameworks are not measuring the same thing on the same task. Pick the one whose calibration trail and held-out generalization you can audit.The 0.9.4→0.9.7 self-correction sequence
A framework that publishes numbers has to publish corrections. The four-release sequence below is the discipline we hold ourselves to:- 0.9.5 caught that 0.9.4’s “held-out HaluEval-Sum F1 0.783” was actually in-distribution — Faithfulness’s threshold is calibrated on HaluEval-Sum, so testing it back against HaluEval-Sum is leakage. Relabeled with a correction note same-day. CHANGELOG 0.9.5.
- 0.9.6 noticed the eval_suite.py emitted by
bootstrapcalledsuite.run(cases=...)(non-existent kwarg) andreport.print_summary()(non-existent method) — both fixed, regression test added. - 0.9.7 caught that 0.9.5’s held-out test was reporting threshold
0.7in stderr but the calibrated value for Haiku on Hallucination is0.55. Same dataset, same model — different F1 (0.852 vs 0.830). The threshold-vs-default gotcha is now an explicit reproducibility note inbenchmarks/README.md. - 0.9.8 propagated the corrected numbers and the κ=0.03 finding to the README.
Multi-judge agreement — HaluEval QA, N=50, temp=0
Different judges disagree more than you’d expect. The calibrated-thresholds layer matters precisely because the underlying judge is non-uniform. Source.
Pairwise Cohen’s κ: 0.60–0.80 — substantial agreement on most pairs.
gemini-2.5-flash leads every metric in this run; claude-haiku-4-5 and gpt-4o-mini are close seconds with cheaper tokens. Pick by your cost / latency / sovereignty constraints — calibrated thresholds ship for each. claude-sonnet-4-6 is a useful diversity judge in multi-judge runs, not a default.
Cost — 50 cases × 4 LLM-judge evaluators
workers=1 (sequential), real Anthropic API. Source.
QAG generates multiple yes/no questions per criterion then verifies each — so 4 evaluators ≈ 17 LLM calls. Trade-off is fully auditable scoring (every question / answer is in the report) for a few cents per case.
Cache speedup on re-runs
Same suite, sequential, withset_cache(JudgeCache(...)):
Speedup: 2,271× — read that as paid API calls vs local cache hits (4 → 0), expected by construction, not a model-quality claim. CI re-runs (same git SHA + same dataset) converge to zero LLM calls.
set_cache() auto-enables caching for every JudgeConfig — no need to thread cache=True through every evaluator.
Where competitors lead
We’re not better at everything.- If you want the widest evaluator catalog, DeepEval has more pre-built metrics for niche tasks (e.g. summarization-specific G-Eval variants).
- If you want a vendor-managed cloud UI: DeepEval (Confident AI) and Promptfoo Cloud both ship hosted dashboards. We’re SDK-first, and the HTML viewer is local-only.
- For pure prompt-comparison testing — “which prompt template wins on these N cases” — Promptfoo is purpose-built for that single job.
What multivon-eval is built for
- Trusting the score. QAG plus calibrated thresholds plus multi-run flakiness detection means a single number from
pass_ratesurvives scrutiny. - CI/CD on every PR.
multivon-eval init --ci githubships the workflow, with distinct exit codes for quality vs infra failures. - Regulated AI. Hash-chained NDJSON audit logs with Article-level EU AI Act / NIST AI RMF / HIPAA mappings.
audit-packageproduces an auditor-attachable zip; download a real sample (5.5 KB). - Agents. Tool-call accuracy, trajectory efficiency, and step faithfulness, framework-agnostic via
AgentTracer. - Multi-judge setups. Ships with
anthropic,openai,google, andlitellmproviders, plus any OpenAI-compatible endpoint (Ollama, vLLM, LM Studio, Azure, Bedrock via LiteLLM). Threshold packs are calibrated per (judge × evaluator), so you can swap providers without re-tuning.
Reproduce everything
Comparison numbers reflect each project’s public releases as of July 2026. All CIs are Wilson 95% on precision/recall and 1000-resample bootstrap 95% on F1 (seed 20260603).
Footnotes
- In-distribution number — HaluEval-QA, the same dataset whose distribution thresholds are tuned against. See the held-out cross-distribution result in the next section. ↩

