CalibForge:用对抗式 Solver 校准来规模化生成「可学」的终端智能体任务

  • 关联论文:2608.06352
  • 作者:flyP
  • 更新:2026-08-07

一句话结论

CalibForge 是一个自主合成"终端型 agent 任务"的系统:先用「多 solver 不一致」或「强弱 solver 对照」两种对抗信号,把候选任务校准到"强 solver 能过、弱 solver 卡住"的难度区间,从而产出 5,431 条对训练真正有信号的任务;在 Terminal-Bench 2.0 / SWE-bench Pro / Doc2Repo 上,最大相对基座提升达 24.7 / 27.7 / 30.0 个百分点。

它在解决什么真问题

终端型(terminal-style)智能体——SWE、运维、CLI 编排类——的训练数据极贵:作者写出来的题目要么太简单(任何模型都过,没学习信号)、要么太难(谁都过不了,纯噪声)。传统的"可执行验证"只能确认任务"能跑出答案",不能告诉你它对一个具体 solver 设置是太简单还是太难。CalibForge 把任务难度从"作者视角"挪到"solver 视角":

  • 「Multi-solver calibration」让异构 solver 池(GPT、Claude、Qwen、DeepSeek 等)跑同一批题,挑出"分歧大"的任务——这种任务对当前模型栈最有区分价值;
  • 「Contrastive solver calibration」挑"指定强 solver 过、弱 solver 不过"的任务——这种任务能教出"难度感知"。

两者都把"可学性"从主观判断换成 solver 行为事实。

核心方法(讲清机制)

CalibForge 是一个 pipeline,不是一个端到端模型:

candidate_task = author_seed()                     # 人工或启发式种子
feasible, err   = executable_validate(task)       # 可执行验证:能不能跑出答案
if not feasible: drop()

# 1) Multi-solver calibration
results = {solver_i: run(task, solver_i) for i in pool}
disagreement = variance(results)
if disagreement < τ_disagree: drop()              # 太简单:大家都过了

# 2) Contrastive solver calibration
strong_pass = run(task, solver_strong)            # 设计上指定的强 solver
weak_pass   = run(task, solver_weak)
if not (strong_pass and not weak_pass): drop()    # 不在"学过能过"区

# 3) Revision loop
task' = llm_revise(task, solver_feedback)
re-enter from step 1

关键点:

  1. 可学性 = solver-relative,不是绝对难度:任务不需要"难",只要在某个 solver 配置下"没过→过"即可——这是把数据合成从"出难题"扭到"找差距"的核心心法。
  2. 两种 calibration 互补:多 solver 不一致抓"分歧",对比 calibration 抓"差距";两者并用比单一信号覆盖更全。
  3. adversarial solver 反馈反向改写任务:被弱 solver 卡住的部分,由 LLM 重写任务描述/约束/示例,让它重新进入"可学"区。
  4. 不重新训练 solver:把 solver 当 oracle 用,而不是把任务当训练样本喂回 solver;这条边界避免了 reward hacking。

伪代码(pipeline 主体):

def calibforge(seed_tasks, solver_pool, strong, weak, max_iter=3):
    kept = []
    for task in seed_tasks:
        if not executable_validate(task):
            continue
        for it in range(max_iter):
            multi_results = {s: run(task, s) for s in solver_pool}
            contrast      = run(task, strong) and not run(task, weak)
            if disagreement(multi_results) > τ_d or contrast:
                kept.append(task)
                break
            task = llm_revise(task, summarize_failures(multi_results))
    return kept

关键实验与数据

论文给出了一组很硬的数字:

  • 校准任务集规模:5,431 条 calibrated terminal tasks;
  • Terminal-Bench 2.0:32.58% 与 47.57% 两档成绩;
  • 最大相对基座提升
  • Terminal-Bench 2.0 +24.71 pp
  • SWE-bench Pro +27.68 pp
  • Doc2Repo +30.04 pp
  • 消融:multi-solver 与 contrastive 两路 calibration 单独用都比"只作者写 + executable 验证"显著强;并用最好。

值得注意的几点:

  • 这是少有的"显式给出跨基准绝对值 + 相对提升双指标"的数据合成论文;
  • 三个被改任务的 benchmark(TB2、SWE-bench Pro、Doc2Repo)覆盖了"通用终端 / 工程修改 / 文档驱动代码"三类典型负载,分散度高;
  • 方差 / 重复种子 / solver 池构成未在 abstract 中披露,需正文核验。

亮点与局限(强制反方段)

亮点:

  • 思路对——把"可学性"重新定义成 solver-relative,是数据合成领域一个值得行业复用的范式;
  • pipeline 完整、组件清晰(author → validate → multi-solver → contrast → revise),任何团队都能按模块独立复现;
  • 跨基准效果好且提升幅度大,说明任务"分布"而非"风格"才是真正帮到模型的因素;
  • 数据集 AweAI-Team/CalibForge + 代码 AweAI-Team/CalibForge 双开,工程可验证。

局限 / 风险:

  • Solver 池本身的偏差:用什么 solver 当 oracle,直接决定 calibration 的偏置。如果 solver 池过度代表闭源大厂模型,"可学性"对开源模型可能反而失真;
  • 5,431 条任务的领域覆盖:abstract 没给任务按主题的分布;终端任务容易集中在 Linux/Shell/Git 这类领域,长尾场景未知;
  • 代价不低:每个 candidate 任务要在 6+ solver 上跑 N 次(多轮 revise),算力账单很高;论文未给单条成本估算;
  • "强 / 弱 solver"标定是否稳定:版本更新一次(GPT-5 → GPT-5.1)可能让 contrastive 信号反转,论文未讨论版本敏感度;
  • 未公开的 revise prompt 与失败反馈汇总模板:abstract 给了链接但未给细节,存在复现 gap;
  • 下游模型未覆盖到开源中小模型:训练侧使用了什么基座 / 规模未在 abstract 中说明,需正文确认;
  • scale-up 风险:校准到 50k 任务时,solver 池成本会不会爆炸?pipeline 是否支持 batched calibration?

对工程落地的启发

  1. 想做内部 agent 训练数据合成?把 CalibForge 的两阶段 calibration 直接抄走:先 executable validate 滤掉跑不通的,再用 multi-solver disagreement + contrast 抓"刚好学得到"的题目。比"刷更多题"性价比高得多。
  2. 任何已有数据集都可以用 contrastive calibration 做后处理:把"特定强模型过、弱模型不过"的子集筛出来当 hard-positive 训练样本。
  3. 不要把 solver 当 teacher:CalibForge 把它当 oracle,是反 reward hacking 的关键。当下的数据合成流水线常掉进"用 GPT-5 蒸馏学生 → 学生变成 GPT-5 的复刻",CalibForge 思路可以破局。
  4. 工程实施时的具体坑: - solver 池需要版本锁定(OpenAI / Anthropic 各家 minor 版本会改行为); - revise 阶段必须用不同的 temperature,否则会陷入同一失败模式循环; - 多 solver 并行跑时注意 rate limit —— 用 Claude 做主、Qwen 做辅可以压成本。

与同方向工作的关系

  • 任务合成 / 课程学习(Self-Instruct / Evol-Instruct / AgentInstruct):早期方法只用单 LLM 自生成,质量难控;CalibForge 引入了 solver 行为作 ground truth,是质的提升。
  • 困难样本挖掘(hard example mining / Boosting / focal loss):经典 ML 思路,CalibForge 把"难度"重定义成"solver 相对可学性",是它在 LLM 数据合成领域的对位。
  • Agent 评测基准(SWE-bench / Terminal-Bench / Doc2Repo):CalibForge 不直接造评测,但它造训练数据"专门喂"这些评测,有循环风险——同一批 solver 同时校准任务和评测模型,可能造成 overfit to benchmark。
  • Self-play RL 数据合成(STaR / RFT / Quiet-STaR):多数依赖 reward signal,CalibForge 用 solver pass/fail 当 reward,是同一族思路的工程化变体。

适合谁读

  • 做 agent 训练数据 pipeline 的工程师:CalibForge 的 calibration 思路几乎可以直接拷贝;
  • 评估 agent 难度曲线的研究者:solver-relative learnability 是新的形式化对象;
  • 想用 SWE-bench / Terminal-Bench 类基准做模型选型的产品方:理解训练集偏差对榜单可信度的影响;
  • 不适合:纯做 RL 算法理论的人(CalibForge 是工程系统,不是新算法)。

不确定处

  • Solver 池具体构成 / 数量 / 推理预算:abstract 未给出;
  • Revise 步骤的 LLM 模型、温度、prompt:abstract 未披露;
  • 下游训练基座的规模与版本:abstract 未说明;
  • 跨基准提升的方差与 N 次种子:abstract 未给出;
  • 任务领域分布与许可证:abstract 未明确。

工程落地与核查(Jay)

1. 事实核查

声明 核查结果 备注
5,431 条 calibrated terminal tasks ✅ Abstract 明确 数据集规模以此为准
Terminal-Bench 2.0: 32.58% 与 47.57% ✅ Abstract 有这两档绝对值 需确认两档对应哪两个模型/设置
TB2 +24.71 pp / SWE-bench Pro +27.68 pp / Doc2Repo +30.04 pp ✅ Abstract 给出"最大相对基座提升" ⚠️ 措辞是"相对基座"——需确认是相对提升%还是绝对 pp 差值;摘要字面"24.7 / 27.7 / 30.0 个百分点"若指 pp 则需基座绝对值才能换算为相对%,建议读正文核实
solver 池含 GPT/Claude/Qwen/DeepSeek ✅ 摘要原文提及 但具体哪些版本/数量未说明
AweAI-Team/CalibForge 双开(数据集+代码) ✅ 摘要提及 链接需正文核验
contrastive calibration 比单一信号显著强 ✅ 摘要有消融结论 但无具体数字支撑
revision loop 伪代码逻辑 ⚠️ 存疑:当前伪代码 if disagreement(multi_results) > τ_d or contrast: kept.append(task); break —— 即满足条件就 break,这意味着 revision 最多 1 次;与 pipeline 描述"循环 revise"不完全一致 建议读正文确认 max_iter 实际行为

最需核查项:Abstract 中"24.7 / 27.7 / 30.0 个百分点"究竟是 pp(绝对差值)还是 %(相对提升比)——两者对下游解读影响截然不同。

2. 可读性精修

  • "Contrastive solver calibration 挑'指定强 solver 过、弱 solver 不过'":逻辑描述正确,但"指定"二字需读者注意这是人工预设而非自动发现,建议补充"需要人工按模型能力谱预先标定强/弱边界"。
  • 伪代码第 3 步注释 task' = llm_revise(task, solver_feedback):此行与下方 while/re-enter 的衔接表述略模糊,建议注明 revise 后重新进入 step 1(即完整重新走一遍 multi-solver + contrast 校验),以免读者误以为 revise 后直接 accept。
  • "最大相对基座提升达 24.7 / 27.7 / 30.0 个百分点":字面"相对基座"+"百分点"组合存在歧义(相对 vs 绝对的混用),建议全文统一措辞,读正文后统一修正为"相对基线的绝对提升(pp)"或"相对提升率(%)"。
  • 数据集 / 代码双开AweAI-Team/CalibForge):摘要未给具体链接,精修时建议确认仓库名大小写及完整路径,补入原文。
  • "循环风险"(同一 solver 校准任务又评测模型):此点在"与同方向工作关系"节中提出,但未给出论文是否有针对性规避策略,建议在正文阅读后补充说明。

3. 工程落地路径

最小可跑复现路径

硬件:无特殊要求(终端任务合成在 CPU 沙箱即可)
Solver 池(需自备 API key):
  - 强 solver:GPT-4o / Claude-3.5-Sonnet(闭源)
  - 弱 solver:Qwen2.5-Coder / DeepSeek-Coder(开源,可本地部署)
  - 池规模:≥4 个异构 solver 才能覆盖分歧检测
可执行验证:Docker 沙箱 + Linux shell 任务 runner
Revise 模型:任意强 LLM(建议与强 solver 相同,避免引入额外偏置)
代码仓库:github.com/AweAI-Team/CalibForge(需正文核验)
成本估算:单条 candidate 任务 × (|solver_pool| + 1 revises) × API 单价;未读正文前无法估算,强烈建议读正文补充

已知坑

  1. Solver API 版本锁定:OpenAI / Anthropic 的 minor 版本会悄悄改模型行为,导致 contrastive 信号漂移。必须在 solver pool 初始化时锁定 model version(如 gpt-4o-2024-05-13),并在任务校准日志中记录当日 API 版本,供复现时对标。
  2. Revision 死循环:若 revise prompt 不带多样化引导(temperature 固定 + 失败模式总结雷同),同一任务会在 revise 后继续被同一 solver 以相同方式卡住,形成不动点。解法:revise prompt 强制注入 diversity hint("rephrase the task with a different assumption"),或监控 revise 后 solver pass rate,若连续两次 revise 结果相同则丢弃该任务。
  3. Rate limit 雪崩:6+ solver 并行请求时,闭源 API 的 TPM/DPM 限制极易触发。建议实现请求队列 + exponential backoff,并对每个 solver 独立限速。
  4. 可执行验证的沙箱安全:终端 agent 任务跑在沙箱内,任务描述若含恶意 shell 命令(rm -rf / 等)需要有 timeout + readonly filesystem + network block。CalibForge 未在 abstract 中讨论沙箱方案,这是工程落地最大未知。
  5. benchmark overfit 风险:同一批 solver 既校准任务又刷榜,存在循环验证风险。生产使用时建议留出"校准-solver"与"评测-solver"的 disjoint 集合,或在报告中显式披露。
  6. Contrastive 边界的版本脆弱性:强/弱 solver 边界随模型迭代会移动(GPT-4o → GPT-4.5 可能让原本"弱"的题变"可过")。建议每次大规模合成前重新跑一次 solver pass rate 基线,不复用历史标定。