Repository navigation
Add JobBench benchmark - #1509
Conversation
|
Caution The consumer version of Gemini Code Assist on GitHub has been sunset. All code review activity has officially ceased. |
There was a problem hiding this comment.
👋 Review Summary
This PR adds the JobBench agentic benchmark, including dataset meta/docs, a new adapter that integrates with the agent loop and LLM judging, artifact handling utilities, and an end-to-end Docker-based test. Overall the design aligns well with existing agent benchmarks and provides a solid foundation for rubric-based deliverable evaluation.
🛡️ Key Risks & Issues
- JobBench’s scoring relies heavily on the rubric parsing and evaluation pipeline in
evalscope/benchmarks/job_bench/utils.py. While the happy path looks good, error handling for SQLite databases in_sqlite_to_textcurrently leaves connections open when an exception is thrown, which can lead to accumulated file descriptors and locked DB files in longer or parallel runs. This is mainly a robustness/performance concern rather than a correctness bug, but it is worth tightening. - The adapter’s
match_scorereturns a placeholder zeroed value map and marksofficial_score_computed=False, whilellm_match_scorecomputes the true rubric metrics. When combined with LLMJudge’s genericLLM_RECALLmerging strategy, there’s some risk of configuration where the main score comes from the LLM but the value dict still reflects the placeholder zeros. For JobBench we should treat LLM judging as the authoritative source and ensure score merging doesn’t silently report inconsistent metric values.
🧪 Verification Advice
- Continue running the new
test_job_benchend-to-end test in environments whereDASHSCOPE_API_KEYand Docker are available; it’s a valuable integration check for dataset loading, agent loop execution, artifact creation, and LLM rubric scoring. - Add focused unit tests around
parse_rubrics,evaluate_job_bench_output, andjudge_rubricusing a fake judge to validate rubric parsing variants, error branches (no rubrics, no output files, unreadable outputs), and scorecard aggregation. This will help catch subtle logic issues without relying on external APIs. - Consider small adapter-level tests that exercise both the local and Docker environment paths for JobBench to ensure reference file mounting, artifact directory setup, and
jobbench_outputwiring behave correctly across configuration variants.
💡 Thoughts & Suggestions
- To harden resource handling, update
_sqlite_to_textto always close its connection using a context manager (with sqlite.connect(...) as con:) or atry/finallyblock; this will keep JobBench evaluations resilient when encountering malformed or large SQLite files. - For JobBench specifically, it may be safer to either avoid
judge_strategy='llm_recall'or adjust LLMJudge’s merging behavior so that when a benchmark provides its own LLM-based metric values, those values become the authoritativeScore.valuerather than placeholder zeros. Documenting the recommended judge strategy for JobBench in the benchmark docs would also help users avoid misconfiguration. - The artifact capture via
JobBenchArtifactEnvironmentis a nice touch; as you evolve this benchmark, keeping output file formats and directory structure stable will make downstream analysis and debugging much easier.
🤖 Generated by Qoder • View workflow run
| con.close() | ||
| return '\n'.join(parts) | ||
| except Exception as exc: | ||
| return f'[ERROR: Failed to read SQLite {path.name}: {exc}]' |
There was a problem hiding this comment.
The _sqlite_to_text helper opens a SQLite connection but only calls con.close() on the success path. If any exception is raised after sqlite.connect (for example while reading schema, counting rows, or sampling table data), execution jumps to the except block, returns the error string, and the connection is never explicitly closed.
Because this utility can be used repeatedly on problematic databases in longer JobBench runs, leaked connections and file descriptors may accumulate and keep OS-level locks on the DB files, which can degrade performance or interfere with later reads.
To make this more robust, it would be safer to ensure the connection is always closed via a context manager or a finally block. For example, using with sqlite.connect(str(path)) as con: or moving con.close() into finally so both success and failure paths reliably release the database handle.
🤖 Generated by Qoder • Fix in Qoder
|
Caution The consumer version of Gemini Code Assist on GitHub has been sunset. All code review activity has officially ceased. |
Summary
job_benchbenchmark backed by the ModelScopeevalscope/job-benchmirrorUser impact
Users can evaluate agents on JobBench with EvalScope's existing runner and judge configuration. Reference files are
resolved from the cached ModelScope snapshot, while task deliverables remain available under the EvalScope output
directory after the sandbox is removed.
Validation
pre-commit run --files ...passedmake docs-pipeline BENCHMARK=job_bench FORCE=1passedlimit=5,eval_batch_size=5, Docker, andmax_steps=80