Example run: 24 systems on the demo dataset¶
A complete live run of configs/all.yaml on the bundled demo dataset, kept as a worked example of what a run produces and as the source of the numbers in the README. It is also the one leaderboard that holds every system side by side, decision_gate included. Everything below comes from the files in docs/benchmarks/example-run/. For what each metric means see the methodology; for how to read a report see choosing an architecture; for a closer look at decision_gate see its evaluation.
The run¶
| Run id | all_systems_plus_decision_gate_20261007_184150 |
| Started / finished (UTC) | 2026-10-07T15:41:50Z / 2026-10-07T15:51:11Z (9 min of wall time, short because almost every call was served from the cache) |
| Mode | live (real OpenAI calls) |
| Models | gpt-6-luna, gpt-6.1-sol, text-embedding-3-small; prices as of 2026-10-01 |
| Dataset | 163 questions (138 with relevance labels), 60 documents (about 23k tokens), data/demo |
| Systems | 24 |
| Spend | $3.26 charged at standalone prices; $0.07 real spend for this run after $3.24 of cache reuse, because the same systems had been run before (the original 22 on 1 Oct 2026 for $2.91 of real spend, the gate for under $1 including its exploration); cap $6.00 |
| Versions | ragbench 0.4.0, Python 3.12.12, openai 3.26.0 |
| Questions that errored | 0 of 3912 question-system pairs (see the earlier rejected call) |
Recommendation¶
Deploy bm25_default under the balanced profile. 17 other systems are statistically tied with the best answer score, so cost and latency decided it. The full reasoning, ranking and per-category winners are in recommendation.md, and its config in winner.yaml.
All systems¶
Sorted by answer score. Brackets are 95% bootstrap confidence intervals over the questions each system answered. ✓ in the last column means no other system is at least as good on answer score, cost and latency and better on one of them. Latency is the mean of a five-question probe and is noisy: compare latencies only when they differ by a factor.
| System | Recall@5 | MRR@10 | nDCG@10 | Answer score | Faithfulness | $ / question | p95 latency | Errors | Pareto |
|---|---|---|---|---|---|---|---|---|---|
iterative_default |
0.799 [0.742, 0.856] | 0.780 [0.721, 0.833] | 0.769 [0.713, 0.823] | 4.81 [4.71, 4.90] | 4.91 | $0.00057 | 6423 ms | 0 | ✓ |
decision_gate_default |
0.774 [0.713, 0.832] | 0.737 [0.675, 0.797] | 0.727 [0.669, 0.784] | 4.80 [4.70, 4.89] | 4.98 | $0.00094 | 4801 ms | 0 | ✓ |
grep_agent_default |
0.791 [0.736, 0.850] | 0.694 [0.634, 0.754] | 0.696 [0.640, 0.750] | 4.78 [4.69, 4.86] | 4.73 | $0.00109 | 8197 ms | 0 | |
full_context_ceiling |
0.741 [0.676, 0.804] | 0.728 [0.666, 0.791] | 0.715 [0.657, 0.772] | 4.78 [4.70, 4.84] | 4.84 | $0.00280 | 2038 ms | 0 | ✓ |
corrective_default |
0.793 [0.733, 0.850] | 0.830 [0.774, 0.883] | 0.796 [0.742, 0.850] | 4.77 [4.67, 4.86] | 4.99 | $0.00060 | 9595 ms | 0 | |
rag_fusion_default |
0.808 [0.753, 0.863] | 0.744 [0.684, 0.802] | 0.744 [0.688, 0.800] | 4.75 [4.64, 4.86] | 4.96 | $0.00042 | 4093 ms | 0 | ✓ |
agent_search_tools |
0.821 [0.767, 0.876] | 0.759 [0.699, 0.818] | 0.757 [0.703, 0.812] | 4.75 [4.63, 4.85] | 4.85 | $0.00082 | 5753 ms | 0 | |
rerank_default |
0.789 [0.729, 0.846] | 0.747 [0.687, 0.805] | 0.732 [0.674, 0.786] | 4.74 [4.63, 4.84] | 4.95 | $0.00052 | 3054 ms | 0 | ✓ |
hybrid_rerank_default |
0.774 [0.713, 0.832] | 0.737 [0.675, 0.797] | 0.727 [0.669, 0.784] | 4.72 [4.59, 4.84] | 4.98 | $0.00053 | 3463 ms | 0 | |
decompose_default |
0.771 [0.713, 0.831] | 0.728 [0.666, 0.787] | 0.723 [0.667, 0.781] | 4.72 [4.60, 4.83] | 4.93 | $0.00041 | 2888 ms | 0 | ✓ |
llm_heavy_default |
0.790 [0.728, 0.848] | 0.770 [0.710, 0.827] | 0.747 [0.692, 0.801] | 4.72 [4.60, 4.82] | 4.93 | $0.00512 | 7579 ms | 0 | |
parent_doc_default |
0.789 [0.733, 0.845] | 0.738 [0.676, 0.796] | 0.717 [0.663, 0.773] | 4.71 [4.60, 4.81] | 4.93 | $0.00049 | 5704 ms | 0 | |
adaptive_default |
0.771 [0.712, 0.828] | 0.724 [0.661, 0.784] | 0.719 [0.661, 0.774] | 4.70 [4.57, 4.82] | 4.99 | $0.00044 | 4119 ms | 0 | |
contextual_default |
0.784 [0.725, 0.840] | 0.753 [0.691, 0.812] | 0.741 [0.684, 0.798] | 4.69 [4.57, 4.81] | 4.93 | $0.00046 | 1690 ms | 0 | ✓ |
bm25_default |
0.745 [0.681, 0.808] | 0.720 [0.654, 0.782] | 0.708 [0.647, 0.767] | 4.69 [4.55, 4.81] | 4.99 | $0.00049 | 1371 ms | 0 | ✓ |
hyde_default |
0.787 [0.729, 0.845] | 0.725 [0.664, 0.784] | 0.710 [0.656, 0.765] | 4.68 [4.54, 4.80] | 4.97 | $0.00046 | 3110 ms | 0 | |
vector_default |
0.790 [0.733, 0.847] | 0.738 [0.676, 0.796] | 0.718 [0.663, 0.774] | 4.67 [4.54, 4.79] | 4.94 | $0.00044 | 2374 ms | 0 | ✓ |
decision_gate_strict |
0.774 [0.713, 0.832] | 0.737 [0.675, 0.797] | 0.727 [0.669, 0.784] | 4.65 [4.49, 4.80] | 4.97 | $0.00091 | 3086 ms | 0 | |
hybrid_default |
0.775 [0.715, 0.833] | 0.745 [0.679, 0.806] | 0.732 [0.671, 0.790] | 4.61 [4.46, 4.74] | 4.92 | $0.00048 | 1895 ms | 0 | |
agent_search_plain |
0.814 [0.756, 0.871] | 0.766 [0.708, 0.826] | 0.758 [0.703, 0.813] | 4.58 [4.43, 4.72] | 4.79 | $0.00072 | 5345 ms | 0 | |
hierarchical_default |
0.733 [0.669, 0.795] | 0.707 [0.642, 0.770] | 0.666 [0.607, 0.725] | 4.56 [4.40, 4.70] | 4.96 | $0.00033 | 1604 ms | 0 | ✓ |
vector_mmr |
0.697 [0.635, 0.757] | 0.731 [0.668, 0.792] | 0.679 [0.620, 0.739] | 4.54 [4.40, 4.68] | 4.94 | $0.00040 | 1541 ms | 0 | |
sentence_window_default |
0.780 [0.720, 0.838] | 0.692 [0.631, 0.755] | 0.693 [0.637, 0.749] | 4.42 [4.23, 4.59] | 4.82 | $0.00025 | 1518 ms | 0 | ✓ |
no_retrieval_floor |
— | — | — | 1.54 [1.40, 1.68] | 4.69 | $0.00012 | 1430 ms | 0 | ✓ |
no_retrieval_floor has no retrieval metrics because it never retrieves; it shows what the model answers from its own knowledge. full_context_ceiling reads the whole corpus on every question.
Context quality and declining to answer¶
The same systems, sorted the same way, on what the generator was given and on what happens to the 25 unanswerable and 138 answerable questions (definitions). Context precision is blank for no_retrieval_floor, which has no context.
| System | Context recall | Context precision | Abstain recall | False refusals | Abstain precision |
|---|---|---|---|---|---|
iterative_default |
0.94 | 0.36 | 0.84 | 0.014 | 0.91 |
decision_gate_default |
0.93 | 0.69 | 0.92 | 0.043 | 0.79 |
grep_agent_default |
0.92 | 0.68 | 0.68 | 0.000 | 1.00 |
full_context_ceiling |
1.00 | 0.02 | 0.96 | 0.000 | 1.00 |
corrective_default |
0.93 | 0.34 | 0.80 | 0.029 | 0.83 |
rag_fusion_default |
0.93 | 0.36 | 0.84 | 0.043 | 0.78 |
agent_search_tools |
0.96 | 0.38 | 0.84 | 0.014 | 0.91 |
rerank_default |
0.92 | 0.33 | 0.80 | 0.051 | 0.74 |
hybrid_rerank_default |
0.89 | 0.32 | 0.80 | 0.058 | 0.71 |
decompose_default |
0.91 | 0.34 | 0.84 | 0.043 | 0.78 |
llm_heavy_default |
0.92 | 0.34 | 1.00 | 0.058 | 0.76 |
parent_doc_default |
0.89 | 0.37 | 0.84 | 0.065 | 0.70 |
adaptive_default |
0.91 | 0.33 | 0.88 | 0.065 | 0.71 |
contextual_default |
0.91 | 0.33 | 0.84 | 0.065 | 0.70 |
bm25_default |
0.88 | 0.31 | 0.88 | 0.072 | 0.69 |
hyde_default |
0.91 | 0.33 | 0.88 | 0.058 | 0.73 |
vector_default |
0.91 | 0.33 | 0.88 | 0.051 | 0.76 |
decision_gate_strict |
0.89 | 0.79 | 1.00 | 0.087 | 0.68 |
hybrid_default |
0.90 | 0.33 | 0.88 | 0.080 | 0.67 |
agent_search_plain |
0.94 | 0.37 | 0.84 | 0.058 | 0.72 |
hierarchical_default |
0.87 | 0.28 | 0.84 | 0.101 | 0.60 |
vector_mmr |
0.82 | 0.24 | 0.88 | 0.101 | 0.61 |
sentence_window_default |
0.92 | 0.36 | 0.88 | 0.109 | 0.59 |
no_retrieval_floor |
— | — | 1.00 | 0.935 | 0.16 |
What separated the systems¶
Difference in answer score against no_retrieval_floor, on the questions both answered (paired bootstrap, p-values Holm-adjusted across systems):
| System | Difference | 95% CI | p (Holm) | Wins / ties / losses |
|---|---|---|---|---|
iterative_default |
+3.27 | [+3.10, +3.45] | 0.023 | 161 / 1 / 1 |
decision_gate_default |
+3.27 | [+3.09, +3.44] | 0.023 | 161 / 1 / 1 |
grep_agent_default |
+3.25 | [+3.07, +3.43] | 0.023 | 162 / 0 / 1 |
full_context_ceiling |
+3.24 | [+3.06, +3.41] | 0.023 | 160 / 2 / 1 |
corrective_default |
+3.23 | [+3.05, +3.41] | 0.023 | 161 / 1 / 1 |
rag_fusion_default |
+3.22 | [+3.03, +3.41] | 0.023 | 160 / 1 / 2 |
agent_search_tools |
+3.22 | [+3.01, +3.41] | 0.023 | 157 / 1 / 5 |
rerank_default |
+3.21 | [+3.01, +3.40] | 0.023 | 160 / 1 / 2 |
hybrid_rerank_default |
+3.19 | [+2.99, +3.38] | 0.023 | 161 / 1 / 1 |
decompose_default |
+3.19 | [+2.98, +3.38] | 0.023 | 160 / 1 / 2 |
llm_heavy_default |
+3.18 | [+2.98, +3.38] | 0.023 | 158 / 3 / 2 |
parent_doc_default |
+3.18 | [+2.99, +3.36] | 0.023 | 162 / 1 / 0 |
adaptive_default |
+3.17 | [+2.96, +3.36] | 0.023 | 161 / 0 / 2 |
contextual_default |
+3.16 | [+2.96, +3.36] | 0.023 | 159 / 1 / 3 |
bm25_default |
+3.15 | [+2.95, +3.35] | 0.023 | 159 / 3 / 1 |
hyde_default |
+3.14 | [+2.94, +3.35] | 0.023 | 158 / 4 / 1 |
vector_default |
+3.14 | [+2.93, +3.34] | 0.023 | 158 / 2 / 3 |
decision_gate_strict |
+3.12 | [+2.90, +3.33] | 0.023 | 154 / 8 / 1 |
hybrid_default |
+3.07 | [+2.86, +3.29] | 0.023 | 157 / 3 / 3 |
agent_search_plain |
+3.04 | [+2.82, +3.26] | 0.023 | 157 / 2 / 4 |
hierarchical_default |
+3.02 | [+2.82, +3.24] | 0.023 | 158 / 4 / 1 |
vector_mmr |
+3.01 | [+2.79, +3.21] | 0.023 | 161 / 1 / 1 |
sentence_window_default |
+2.88 | [+2.63, +3.11] | 0.023 | 154 / 3 / 6 |
Every system beats the no-retrieval floor by a wide margin, so retrieval matters on this corpus. Among the retrieval systems the answer scores are close: the recommendation lists the systems that cannot be told apart from the best one.
By question category¶
The best system per category, next to the recommended one. Categories hold few questions, so a different winner here is a lead to check, not a significant result.
| Category | Best system | Its answer score | bm25_default |
|---|---|---|---|
| aggregation | agent_search_plain |
4.87 | 3.73 |
| comparison | agent_search_tools |
5.00 | 4.55 |
| date_arithmetic | hierarchical_default |
5.00 | 5.00 |
| direct_fact | rag_fusion_default |
5.00 | 4.88 |
| distractor | rag_fusion_default |
5.00 | 4.96 |
| exact_identifier | hierarchical_default |
5.00 | 5.00 |
| long_context | sentence_window_default |
5.00 | 5.00 |
| multi_hop | agent_search_tools |
4.92 | 4.28 |
| numeric_reasoning | sentence_window_default |
5.00 | 5.00 |
| paraphrase | decompose_default |
5.00 | 4.17 |
| temporal_conflict | decision_gate_default |
5.00 | 4.98 |
| unanswerable | decision_gate_strict |
4.72 | 4.48 |
Caveats¶
- The judge is also the generator.
gpt-6-lunawrites most systems' answers and grades them, which tends to inflate scores; the report's banner says so. Useevaluation.judge.modelto grade with a different model. - A small, easy corpus. 60 short documents and 163 questions, 25 of them unanswerable. Differences of a few hundredths of a point are within the confidence intervals, the abstention numbers rest on very few questions, and the ranking may not carry over to your documents.
- Caching. 12662 of 12671 model lookups (100%) were served from the disk cache, because every system had been run before with the same configuration; the rows of the original systems are identical to the 1 Oct run. Costs are charged as if nothing was cached, so the numbers match a cold run (about $3.3); the real spend of this run was $0.07. Latency comes from the live probe, which bypasses the cache.
- A system chosen after seeing results. The default wording of
decision_gatewas picked between two candidates after a first run on this same dataset, so its rows are slightly optimistic; its evaluation explains.
The earlier rejected call¶
The 1 Oct run of the original 22 systems had one question-system pair fail: rag_fusion_default on q_087, where OpenAI answered one of that system's model calls with HTTP 400 invalid_prompt (its usage-policy filter flagged an ordinary question about a product release history). Errors are never cached, so this run asked again and the call succeeded; there are no errors in this run.
Files¶
The small result files are kept in docs/benchmarks/example-run/. The full run directory also holds per_question_results.jsonl (every answer, retrieved passage, step and, for decision_gate, the probability of every judged chunk), report_questions.json, report.html and the cost breakdown; those are too large to commit, so they stay in results/ on the machine that ran it (ragbench report RUN rebuilds the HTML from them).
| File | What it holds |
|---|---|
config.yaml |
the config the run used: configs/all.yaml with a spending cap (the run is named all_systems_plus_decision_gate) |
winner.yaml |
a runnable config for the recommended system |
recommendation.md |
the recommendation, ranking and per-category winners |
recommendation.json |
the same, machine-readable |
leaderboard.md |
the leaderboard and the significance tables |
metrics_summary.csv |
every metric for every system, with confidence intervals |
significance.csv |
the paired comparisons against the baseline |
stats.json |
the statistics behind the intervals and tests |
failures.md |
failure types per system, with an example question each |
qrels_audit.md |
relevance labels the run found doubtful |
system_runtime.csv |
ingestion and question wall time per system |
pareto.json |
the quality / cost / latency frontier |
routes.csv |
which route the adaptive system chose |
tool_usage.csv |
tool calls of the agentic systems |
run_summary.json |
mode, models, spend, cache and error counts |
run_manifest.json |
versions, dataset and config hashes, timings |