SearchGen-Bench / LEADERBOARD_DATA_DESIGN.md
wufangtai
Update SearchGen-Bench space
2187ad4
|
Raw
History Blame Contribute Delete
13.8 kB
# SearchGen-Bench Per-Prompt Data and Leaderboard Design
## Implementation status
This design is implemented in the Space:
- `scripts/build_leaderboard_data.py` imports the canonical ToolGen extraction
function, exports all prompt-model records, validates them, and generates the
four aggregate views.
- `scripts/validate_leaderboard_data.py` independently reconstructs all
committed aggregates from `prompt_scores.jsonl` without requiring ToolGen.
- `public/data/manifest.json` pins 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:
```bash
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_rendering` remains 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()` from
`paper_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_id`
- `prompt_index`
- `release_row`
- `stratum`: `NoSearch` or `SearchIntensive`
- `search_type`: `NoSearch`, `VisualSearch`, or `TextualSearch`
- `domains`: list of zero or more domain tags
- `failure_modes`: list of zero or more failure-mode tags
- Optional useful filters: `difficulty`, `language`,
`generation_task_type`, and `is_miniset`
Derive the partitions exactly as specified by the SOP:
```python
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:
```json
{
"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 parsed
- `missing_generation`: no generated image/result
- `missing_evaluation`: image may exist but evaluation is absent
- `invalid_evaluation`: file exists but is malformed or unusable
## 5. Metric definitions
The nine displayed components are:
1. Checklist
2. Rubric Adaptive
3. Prompt Faithfulness
4. Image Quality
5. Text Rendering
6. AI Naturalness
7. Composition and Aesthetics
8. Physical Plausibility
9. Visual Reference
The excluded public component is Text Reference:
`text_reference_evaluation`.
For a scored prompt-model pair:
```text
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:
```text
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_image` and `qwen_image_2_pro`: missing generation/evaluation results are
excluded from the denominator.
- Inapplicable components remain `null` and are excluded from the relevant
component denominator.
Every aggregate row must publish:
- `n_total`: prompts in the selected group
- `n_scored`: prompts with valid evaluations
- `n_included`: prompts included after applying the missing-result policy
- `coverage`: `n_scored / n_total`
- `missing_policy`: `zero_fill` or `exclude`
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:
```text
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_pp` and 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
1. Confirm that "drop text fidelity" means excluding
`text_reference_evaluation`, not `text_rendering`.
2. Approve `Overall-9` as the public primary metric and retain `Overall-10` for
paper compatibility.
3. Freeze model IDs, display names, model types, lane selection, missing-result
policies, and minimum ranking coverage.
### Phase B: Build the exporter
1. Add a producer-side script in ToolGen, for example
`paper_materials/export_searchgen_leaderboard.py`.
2. Import or refactor and reuse `extract_10comp()` rather than copying it.
3. Load all 751 prompt metadata rows and assert unique `sample_id` values.
4. Derive the two-level partition and copy all list-valued tags.
5. Resolve each configured model's canonical `none`-lane PP evaluation.
6. Record all 10 component values plus explicit result status.
7. Compute per-prompt Overall-10 and Overall-9.
8. 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
1. Add a second script that reads only the exported JSONL and manifest.
2. Apply the declared missing policies and macro-aggregation rules.
3. Produce overall, stratum, domain, and failure-mode JSON files.
4. Sort output keys/rows deterministically to make reviews meaningful.
5. Compare Overall-10 outputs against `recompute_tables.py --json` before
accepting a release.
6. Snapshot expected Overall-9 results in tests.
### Phase D: Replace the inherited BrowseComp data path
1. Remove the download of `Tevatron/BrowseComp-Plus-results` from
`scripts/extract_data.py`.
2. Remove the runtime CSV-to-JSON extraction from the Docker startup command.
3. 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.
4. Fail the build if data validation fails; do not deploy an empty leaderboard.
### Phase E: Update the frontend
1. Replace the BrowseComp-specific columns in `main.js`.
2. Add table selectors for overall, strata, domains, and failure modes.
3. Make Overall-9 the default descending sort.
4. Show Overall-10 only with an explicit "paper metric" label.
5. Show `N/A` for inapplicable values and never coerce them to zero in
JavaScript.
6. Display prompt count, scored count, coverage, and missing policy.
7. Add tooltips with exact metric and multi-label definitions.
8. Update the title, introduction, metrics, submission text, links, and citation
inherited from BrowseComp-Plus.
### Phase F: Release workflow
1. Re-run canonical evaluations when results change.
2. Run the exporter.
3. Run aggregate generation and validation tests.
4. Review the manifest and aggregate diff.
5. Build the Space and run a local smoke test.
6. 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`, not `0` or `NaN`
## 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.