Skip to main content
当 Harness 负责 agent 循环时,使用 BaseBenchmark 准备任务,并根据 Harness 返回的 RunResult 评分。 这条路径适用于问答、代码编辑、浏览和其他可以复用现有 Harness 的 Benchmark。Benchmark 不直接调用 Model,也不重新实现 Harness 的会话或工具循环。

实现一个完整的精确匹配示例

src/agentcompass/benchmarks/ 下创建 example_exact_match.py,内容如下:
这个实现完成了 BaseBenchmark 的三个抽象方法:load_tasks()prepare_task()evaluate()。其中,build_plan() 将答案保留在评测侧,避免把 ground_truth 交给 Harness;evaluate() 则通过 dataclasses.replace() 保留 Harness 写入的状态、错误、轨迹、产物和其他结果字段。

导出并检查注册

src/agentcompass/benchmarks/__init__.py 中添加导入:
检查注册和配置结构:
第一条命令应列出 example_exact_match;第二条命令应显示 case_sensitiveRuntimeBenchmarkConfig 的共享字段。如果组件未出现,先检查 __init__.py、重复 ID 和完整导入堆栈。

使用 Harness 运行

下面使用 Harness 实现教程中的 example_answer。该 Harness 直接返回配置的 final_answer,因此这次冒烟运行不需要可用的 Model 端点:
run_info.json 中依次检查 requestbenchmarkidresolved_execution_plans,以及 details/*.json 中唯一的 attempt 记录。答案为 Paris 时,应得到 status: "completed"metrics.correct: true;改为 Lyon 后,status 仍应是 completed,但 metrics.correct 应变为 false。这说明执行状态和 Benchmark 判定是两个独立维度。

接入真实数据时如何扩展

  • 数据集读取、版本校验和稳定任务转换放在 load_tasks(),不要放在模块导入阶段。
  • 逐任务评测器状态、超时或路径放在类型化 BenchmarkPlan,不要通过共享可变字典在不同尝试之间传递。
  • 提示词、工作区和公开附件放在 PreparedTask;隐藏测试、答案和参考补丁不得进入 Harness 可见字段。
  • 需要任务 Environment 或隔离验证器时,不要继续堆叠在这个 none 示例中;改用评测模式与产物中的 reusefresh 结构。
  • 评分不是简单布尔值时,应把标量 score 声明为 Contract 主观测,并写入 RunResult.metrics;详见结果与聚合
需要对照一个 Harness 驱动、进程内评分的生产实现时,可参考 browsecomp.py