Spaces:
Running
SearchGen-Bench Per-Prompt Data and Leaderboard Design
Implementation status
This design is implemented in the Space:
scripts/build_leaderboard_data.pyimports the canonical ToolGen extraction function, exports all prompt-model records, validates them, and generates the four aggregate views.scripts/validate_leaderboard_data.pyindependently reconstructs all committed aggregates fromprompt_scores.jsonlwithout requiring ToolGen.public/data/manifest.jsonpins the schema, input hash, components, model source IDs, partitions, and missing-result policies.- The frontend provides component/stratum rankings plus domain and failure-mode scoreboards.
- Hugging Face serves the locally built
dist/contents published at the Space repository root and performs no build or mutable runtime data download. A Dockerfile remains available for optional container deployment.
To regenerate a release:
TOOLGEN_ROOT=/path/to/ToolGen npm run build:data
npm run test:data
npm run build
1. Decision
The proposed design is sound: create one versioned record for each of the 751 evaluation prompts, attach its benchmark tags, and record per-model component scores. All public scoreboards should be derived from this data rather than maintained as hand-written tables.
One metric distinction must remain explicit:
- The paper's canonical score is the mean of 10 applicable components.
- The proposed public leaderboard displays nine components by excluding
text_reference_evaluation(called "text fidelity" in the proposal). text_renderingremains included; it is not the excluded component.- A mean recomputed from the remaining nine components must be named Overall-9. It is not numerically interchangeable with the paper's canonical Overall-10.
Do not discard the tenth component at extraction time. Preserve all 10 raw components so the exported data can reproduce the paper, then define the nine-component leaderboard as a named metric view. This avoids an irreversible data loss and makes discrepancies auditable.
2. Canonical inputs
Use the sources defined by TABLE_UPDATE_SOP.md:
- Prompt metadata:
phase4d1_generations/eval_datasets_548_finalized_v1.jsonl - Evaluation result:
final_20k_release_v2/{release_row}/{lane}/{generator}/augmented_parsed_result_ffjudge_pp.json - Extraction semantics: reuse
extract_10comp()frompaper_materials/recompute_tables.py; do not create a second implementation of the component rules.
The markdown SOP is documentation, not a machine-readable input. The JSONL and evaluation result files remain the ground truth.
3. Prompt identity and tags
Use sample_id as the stable primary key. An integer prompt_index may be
included for presentation, but it must never be used to join data because file
ordering can change.
Each prompt record should contain:
sample_idprompt_indexrelease_rowstratum:NoSearchorSearchIntensivesearch_type:NoSearch,VisualSearch, orTextualSearchdomains: list of zero or more domain tagsfailure_modes: list of zero or more failure-mode tags- Optional useful filters:
difficulty,language,generation_task_type, andis_miniset
Derive the partitions exactly as specified by the SOP:
if row.get("subset") == "NoSearch":
stratum = "NoSearch"
search_type = "NoSearch"
elif "texthard" in row["sample_id"] or "text_rendering" in row["sample_id"]:
stratum = "SearchIntensive"
search_type = "TextualSearch"
else:
stratum = "SearchIntensive"
search_type = "VisualSearch"
Expected counts are:
| Partition | Count |
|---|---|
| NoSearch | 100 |
| SearchIntensive | 651 |
| VisualSearch | 387 |
| TextualSearch | 264 |
| Total | 751 |
4. Score schema
Use a normalized, lossless JSONL artifact for the canonical public data. One
prompt record can contain a models map to avoid repeating prompt metadata:
{
"sample_id": "eval_base40_001",
"prompt_index": 0,
"release_row": "evalset_rows/eval_base40_001",
"stratum": "SearchIntensive",
"search_type": "VisualSearch",
"domains": ["CUL", "ART", "TEC", "ARC"],
"failure_modes": ["TK-R", "EIK", "CS", "THG", "CCS"],
"models": {
"gpt_image": {
"status": "scored",
"lane": "none",
"components_raw_0to3": {
"checklist": 2.1,
"rubric_adaptive": 2.0,
"prompt_faithfulness": 2.2,
"image_quality": 2.4,
"text_rendering": 2.1,
"ai_naturalness": 2.0,
"composition_and_aesthetics": 2.5,
"physical_plausibility": 2.3,
"visual_reference_evaluation": 1.9,
"text_reference_evaluation": null
},
"overall_10_raw": 2.1667,
"overall_9_raw": 2.1667
}
}
}
Store unrounded 0β3 values, or values with enough precision to reproduce the aggregates. Convert to 0β100 and round only in derived artifacts or at display time.
null means not applicable. It is different from a missing result and from a
real score of zero. Represent result state separately:
scored: evaluation exists and was parsedmissing_generation: no generated image/resultmissing_evaluation: image may exist but evaluation is absentinvalid_evaluation: file exists but is malformed or unusable
5. Metric definitions
The nine displayed components are:
- Checklist
- Rubric Adaptive
- Prompt Faithfulness
- Image Quality
- Text Rendering
- AI Naturalness
- Composition and Aesthetics
- Physical Plausibility
- Visual Reference
The excluded public component is Text Reference:
text_reference_evaluation.
For a scored prompt-model pair:
Overall-10 = mean(non-null values among all 10 components)
Overall-9 = mean(non-null values among the nine displayed components)
Public scale = raw score * 100 / 3
For a group such as a domain or failure mode:
Group Overall-9 = mean(per-prompt Overall-9 values included by policy)
Group component = mean(non-null per-prompt values for that component)
This is prompt-macro averaging. Do not pool checklist items or rubric items across prompts, because prompts with more items would receive more weight.
6. Missing-result and coverage policy
Raw data must preserve missing states. The aggregation layer applies the paper's model-specific policy:
- Default: a missing result is zero-filled for aggregate computation.
xai_imageandqwen_image_2_pro: missing generation/evaluation results are excluded from the denominator.- Inapplicable components remain
nulland are excluded from the relevant component denominator.
Every aggregate row must publish:
n_total: prompts in the selected groupn_scored: prompts with valid evaluationsn_included: prompts included after applying the missing-result policycoverage:n_scored / n_totalmissing_policy:zero_fillorexclude
Rankings should either require a declared minimum coverage or visibly flag low coverage. A high score with materially incomplete coverage must not appear equivalent to a fully covered score.
7. Multi-label breakdown semantics
domains and failure_modes are multi-label fields. A prompt contributes once
to every tag assigned to it. Therefore:
- Domain row counts overlap and must not be summed to obtain 751.
- Failure-mode row counts also overlap.
- The UI must label these as multi-label breakdowns.
- Each breakdown row must show its own prompt count and model coverage.
Avoid fractional weighting across tags unless a separate, explicitly named analysis requires it. Full membership is easier to explain and audit.
8. Derived scoreboards
Generate the following views from the same prompt-level artifact.
8.1 Overall model leaderboard
One row per model, ranked by Overall-9. Show:
- Rank and model metadata
- Overall-9
- Overall-10, labeled as the paper-compatible score
- All nine public components
- Coverage and missing policy
8.2 Stratum leaderboard
Provide filters or tabs for:
- All 751
- NoSearch (100)
- SearchIntensive (651)
- VisualSearch (387)
- TextualSearch (264)
Each view shows Overall-9, the nine components, and coverage.
8.3 Domain breakdown
For a selected model, show each domain's Overall-9, prompt count, and coverage. Optionally allow expanding a domain to reveal its nine components. This is more readable than placing every domain-component combination in one wide table.
8.4 Failure-mode breakdown
Use the same layout and aggregation rules as the domain breakdown.
8.5 Comparison view
Allow users to select a small number of models and compare their component profiles within a selected stratum, domain, or failure mode. This should use the same aggregate file rather than recomputing with different rules.
9. Artifact layout
Recommended generated files:
public/data/
βββ manifest.json
βββ prompt_scores.jsonl
βββ leaderboard_overall.json
βββ leaderboard_by_stratum.json
βββ leaderboard_by_domain.json
βββ leaderboard_by_failure_mode.json
manifest.json should include:
- Schema version
- Benchmark dataset version/hash
- Scoring version, including
ffjudge_ppand PP configuration - Generation timestamp
- Source repository commit, when available
- Component lists for Overall-10 and Overall-9
- Scale and rounding rules
- Missing-result policies
- Model display names, types, and ordering metadata
The browser should normally load the compact aggregate JSON files. Ship
prompt_scores.jsonl for audit/download or client-side custom exploration, not
as a prerequisite for rendering the initial table.
10. Implementation actions
Phase A: Freeze semantics
- Confirm that "drop text fidelity" means excluding
text_reference_evaluation, nottext_rendering. - Approve
Overall-9as the public primary metric and retainOverall-10for paper compatibility. - Freeze model IDs, display names, model types, lane selection, missing-result policies, and minimum ranking coverage.
Phase B: Build the exporter
- Add a producer-side script in ToolGen, for example
paper_materials/export_searchgen_leaderboard.py. - Import or refactor and reuse
extract_10comp()rather than copying it. - Load all 751 prompt metadata rows and assert unique
sample_idvalues. - Derive the two-level partition and copy all list-valued tags.
- Resolve each configured model's canonical
none-lane PP evaluation. - Record all 10 component values plus explicit result status.
- Compute per-prompt Overall-10 and Overall-9.
- Write the prompt JSONL and manifest deterministically.
The exporter belongs near the canonical ToolGen data. The Hugging Face Space must not attempt to traverse a local ToolGen path at runtime.
Phase C: Build and validate aggregates
- Add a second script that reads only the exported JSONL and manifest.
- Apply the declared missing policies and macro-aggregation rules.
- Produce overall, stratum, domain, and failure-mode JSON files.
- Sort output keys/rows deterministically to make reviews meaningful.
- Compare Overall-10 outputs against
recompute_tables.py --jsonbefore accepting a release. - Snapshot expected Overall-9 results in tests.
Phase D: Replace the inherited BrowseComp data path
- Remove the download of
Tevatron/BrowseComp-Plus-resultsfromscripts/extract_data.py. - Remove the runtime CSV-to-JSON extraction from the Docker startup command.
- Generate and commit/copy the versioned SearchGen artifacts into
public/data/before the Vite build, or download one pinned artifact release from a dedicated SearchGen dataset repository. - Fail the build if data validation fails; do not deploy an empty leaderboard.
Phase E: Update the frontend
- Replace the BrowseComp-specific columns in
main.js. - Add table selectors for overall, strata, domains, and failure modes.
- Make Overall-9 the default descending sort.
- Show Overall-10 only with an explicit "paper metric" label.
- Show
N/Afor inapplicable values and never coerce them to zero in JavaScript. - Display prompt count, scored count, coverage, and missing policy.
- Add tooltips with exact metric and multi-label definitions.
- Update the title, introduction, metrics, submission text, links, and citation inherited from BrowseComp-Plus.
Phase F: Release workflow
- Re-run canonical evaluations when results change.
- Run the exporter.
- Run aggregate generation and validation tests.
- Review the manifest and aggregate diff.
- Build the Space and run a local smoke test.
- Publish the data artifacts and Space from the same version tag.
11. Required validation checks
The release must fail unless all applicable checks pass:
- Exactly 751 unique prompt IDs
- Partition counts exactly 100/651 and 100/387/264
- Every tag field is a list with no duplicate value within a prompt
- No duplicate prompt-model record
- Scored component values are within 0β3
null, missing, invalid, and zero remain distinguishable- Per-prompt Overall-9 and Overall-10 recompute exactly from their component sets
- Aggregate coverage and denominators reproduce the declared policy
- Overall-10 aggregate values match the canonical recomputation output
- Aggregate values are invariant to input row order
- Frontend renders missing components as
N/A, not0orNaN
12. Recommended acceptance criteria
The data layer is ready when a fresh checkout can generate all public JSON artifacts with one documented command, validation catches an intentionally removed result, Overall-10 matches the paper computation, and every displayed Overall-9 value can be traced to a defined set of prompt IDs and non-null components.