avatar

Xiaojun Wu

Ph.D. Candidate, HKUST(GZ)
Affiliate LLM Researcher, IDEA Research
wuxiaojun@idea.edu.cn & wuxiaojun@pku.edu.cn & xwu647@connect.hkust-gz.edu.cn


← Blog

数据合成

Agentic数据合成(一):从CLI-Gym到OpenThoughts-Agent,2026年进展持续更新中。。。

在知乎查看原文

阅读 知乎未公开 收藏 57 点赞 28

互动数据为 2026-09-14 的知乎数据快照;阅读量未在当前可用的知乎公开接口中提供。

高质量 Agent 训练数据,正在怎么被合成?

大模型正在从“回答问题”走向“自主操作电脑”。这个转变里,有一个很硬的瓶颈:高质量、可执行、可验证的 Agent 训练数据不够。

一个终端任务看起来可能很简单,比如“修好某个测试环境里的失败用例”。但真正把它做成训练数据,通常需要完整的 Docker 环境、初始故障状态、任务指令、验证脚本,以及一条能真正完成任务的轨迹。手工构造这些东西很贵,所以过去一年里,一个很明确的方向浮出水面:能不能自动合成 Agent 训练数据?

下面按 arXiv 首次提交时间,梳理五篇代表性工作:TermiGen、CLI-Gym、SkillSynth、CLI-Universe 和 OpenThoughts-Agent。它们都在解决同一个问题,但切入点不一样:有人从环境故障入手,有人从技能组合入手,有人从严格验证入手,也有人把重点放在数据配方实验上。

1. TermiGen:让模型见过失败,也见过自救

论文:TermiGen: High-Fidelity Environment and Robust Trajectory Synthesis for Terminal Agents

arXiv 时间:2026-02-06

机构:UCSB、UCSD、AMD、University of Oxford、Google 等

项目/数据:github.com/ucsb-mlsec/t

TermiGen 关注的不是“生成一条完美答案”,而是让训练轨迹里出现真实的失败状态。

这点很关键。小模型在真实终端里做任务时,经常会遇到命令报错、路径不存在、依赖没装、文件写错、输出格式不对等问题。如果训练数据里只有完美轨迹,模型很容易学会“一路顺风”的流程,却学不会如何从错误里恢复。

TermiGen 的方法分两步:

  1. 先生成可执行任务和 Docker 环境,并通过多智能体迭代把任务修到可运行。
  2. 再用 Generator-Critic 协议,在专家轨迹采集时主动注入错误,让轨迹包含“出错、诊断、修正”的循环。

论文报告最终得到超过 3,500 个 verified environments,并从中收集 3,291 条 trajectories。这些轨迹平均有 25.5 turns、8,722 tokens,覆盖 420 种 unique command-line tools。用这批数据微调 Qwen2.5-Coder-32B 后,TermiGen-Qwen2.5-Coder-32B 在 TerminalBench 上达到 31.3% pass rate。

TermiGen 的贡献可以概括为一句话:Agent 数据不能只教模型“怎么做对”,还要教它“做错之后怎么救回来”。

2. CLI-Gym:从健康环境反推出故障任务

论文:CLI-Gym: Scalable CLI Task Generation via Agentic Environment Inversion

arXiv 时间:2026-02-11

机构:Huawei、北京理工大学、中国科学院自动化研究所

代码:github.com/LiberCoders/

数据:huggingface.co/datasets

CLI-Gym 的思路很直观:先有一个健康环境,再让 Agent 把它“搞坏”,最后把这个坏掉的状态包装成一个修复任务。

论文里把这个过程叫 agentic environment inversion。Dockerfile 本质上是一段环境构建历史,而 Agent 可以沿着另一条历史去修改环境。当某些操作导致测试失败时,系统就可以把当前环境、失败信息和验证脚本打包成一个新的任务。

CLI-Gym 从 29 个开源仓库出发,生成了 4,066 个 task prompts,最终得到 1,655 个 problem instances。随后用强模型在这些环境里 rollout,得到 417 条成功轨迹,再过滤掉作弊路径和过于简单的轨迹,留下 291 条 Filtered-Success trajectories 用于训练。

实验结果也很有意思:只用这 291 条高质量成功轨迹,LiberCoder-235B-A22B 在 Terminal-Bench 1.0 上从 25.0 提升到 46.1,也就是 +21.1 个百分点;在 Terminal-Bench 2.0 上达到 31.0。

CLI-Gym 的价值不在于“量特别大”,而在于它证明了一件事:如果任务环境足够真实、验证足够强,几百条轨迹也可能产生很强的训练信号。

3. SkillSynth:用技能图控制任务多样性

论文:Toward Scalable Terminal Task Synthesis via Skill Graphs

arXiv 时间:2026-04-28

机构:腾讯混元团队

TermiGen 和 CLI-Gym 更关注“任务怎么变得真实可执行”,SkillSynth 则问了另一个问题:生成任务时,怎么保证模型学到的技能组合足够多样?

它构建了一个 scenario-mediated skill graph。图里的节点是 scenario,表示某个命令行状态;边是 skill-labeled transition,表示一个技能把一个 scenario 转换到另一个 scenario。系统从图里采样路径,把路径当作抽象工作流,再用多智能体 harness 生成完整任务实例,包括自然语言指令、初始文件系统快照、容器环境、验证脚本和 oracle solution。

论文中的图统计是:

  • 82,073 个 scenario nodes。
  • 57,214 条 skill-labeled transitions。
  • 实验中路径长度上限为 7。

这种方法的好处是,任务生成不是只靠“多写几个 prompt”,而是从图结构上控制任务覆盖的技能路径。实验中,SkillSynth 生成的任务用于训练 Qwen3-8B、14B、32B。Qwen3-32B + SS 在 Terminal-Bench 1.0 / 2.0 上分别达到 33.8 和 29.6。论文也提到,SkillSynth 生成的任务实例已被用于训练 Hy3 Preview。

4. CLI-Universe:把“可验证”放到最前面

论文:CLI-Universe: Towards Verifiable Task Synthesis Engine for Terminal Agents

arXiv 时间:2026-06-22

机构:南京大学、阶跃星辰、ZODA、上海 AI Lab、华中科技大学

CLI-Universe 的关键词是质量。它不是简单把已有材料改写成终端任务,而是先定义多维能力分类法,再把任务一步步落到真实技术材料上。

它的 pipeline 大致是:

  1. 按 domain、skill type、capability、engineering pillar 采样组合,生成候选任务。
  2. 通过 evidence-guided deep research 检索真实仓库、文档、issue、教程,把任务具体化。
  3. 构建 Dockerized environment。
  4. 生成测试和参考解法。
  5. 用 rubric-gated test construction、hint-conditional filtering 和 fail-to-pass checking 做多级过滤。

整条链路里,只有 33.6% 的候选能留下来。换句话说,大约三分之二的候选任务会在某个验证环节被淘汰。

最终数据集叫 CLI-Universe-6K,包含 6,000 条训练轨迹。用它微调 Qwen3-32B 后,CLI-Universe-32B 在 Terminal-Bench 2.0 上达到 33.4,在 Terminal-Bench 1.0 上达到 38.8。这个结果说明,少而精的数据在 Agent 训练里非常有竞争力。

CLI-Universe 代表的是一种更工程化的方向:不要只追求生成得多,而要把任务是否真实、验证是否严格、监督信号是否有价值放在第一位。

5. OpenThoughts-Agent:用实验找数据配方

论文:OpenThoughts-Agent: Data Recipes for Agentic Models

arXiv 时间:2026-06-23

项目页:openthoughts.ai/

代码:github.com/open-thought

OpenThoughts-Agent 和前几篇不太一样。它不是提出一个单独的数据合成算法,而是系统研究“Agent 数据到底该怎么配”。

论文做了超过 100 个 controlled ablation experiments,研究任务来源、任务混合、任务增强、任务过滤、teacher 选择、轨迹过滤等环节。它的核心发现包括:

  • 任务来源非常重要。不同来源带来的下游表现差异可以很大。
  • 最强的模型不一定是最好的 teacher。
  • 保留更长的多轮 execution traces 通常更好。
  • 单纯重复 top sources 会遇到上限,后续需要通过任务增强和来源扩展提升多样性。

最终的 SFT 数据集 OpenThoughts-Agent-SFT-100K 是论文里的 100K agentic traces 版本。公开数据卡说明,任务来自 Top-4 来源:SWE-Smith、StackExchange-SuperUser、StackExchange-Tezos 和 IssueTasks;轨迹由 GLM-4.7-AWQ 在 terminus-2 harness 里生成,并过滤到至少 5 个 model turns。

用这套数据微调 Qwen3-32B 后,OpenThinkerAgent-32B 在 7 个 agentic benchmarks 上平均达到 44.8,比 Nemotron-Terminal-32B 的 40.9 高 3.9 个百分点。其中 SWE-Bench Verified 为 54.0,Terminal-Bench 2.0 为 26.2。

OpenThoughts-Agent 最值得借鉴的地方,是它把“数据工程”变成了可实验、可比较的配方问题。不是拍脑袋说某种数据好,而是把每个环节拆开做 ablation。

合成数据长什么样?

Agent 数据和普通指令微调数据不太一样。普通 SFT 往往是一条 prompt -> answer,但 Agent 数据通常要带环境、验证器、轨迹、工具调用、运行结果等信息。下面放几个 Hugging Face 上能直接看到的真实样例摘录。

CLI-Gym:一个 problem instance

CLI-Gym 在 Hugging Face 上公开的是 problem instances,不是只给自然语言任务。HF viewer 里实际可见的字段包括:

task_id: glibc-locale-name-and-territory-corruption-via-iso-639-3166-database-injection-with-python-faker-regional-data-desynchronization
task_yaml:
  instruction: |
    I'm experiencing some strange test failures in my Python Faker library
    installation...
dockerfile: |
  FROM jyangballin/swesmith.x86_64.joke2k_1776_faker.8b401a7d
  RUN sed -i 's/^language "Czech"/language "Ukrainian"/' /usr/share/i18n/locales/cs_CZ && ...
docker_compose: |
  services:
    CLIGYM:
      build:
        context: .
        dockerfile: Dockerfile
      command: ["sh", "-c", "sleep infinity"]
run_tests: |
  #!/bin/bash
  set -uo pipefail -x
  echo "tests/providers/test_address.py::TestFrFr::test_department ..."

这类数据的重点不是讲一个故障故事,而是给出一个可构建、可运行、可验证的环境。dockerfile 负责制造故障环境,run_tests 负责判定 Agent 是否真的修好了问题。

OpenThoughts-Agent-SFT-100K:一条 agentic trajectory

OpenThoughts-Agent-SFT-100K 是 SFT 用的轨迹数据。数据卡把它称为 100,000-example point;HF viewer 当前显示 default/train 约 94.3k rows。一条真实预览行长这样:

agent: terminus-2
task: swesmith-17696_copy0000
trace_source: main
episode: episode-20
model: hosted_vllm/glm
model_provider: hosted_vllm
result: null
run_id: d73854f4-d271-4c79-a154-0fa2523ca37a
trial_name: swesmith-17696_copy0000__jRGRKV3
date: 2026-04-17T20:30:46.732658+00:00
conversations:
  - role/content message list
  - first message begins with a terminal-agent instruction prompt

这里的 conversations 才是真正的多轮轨迹,里面记录 Agent 如何根据任务描述和命令输出一步步行动。和普通 ShareGPT 对话不同,它不是闲聊数据,而是终端任务里的行动历史。

OpenThoughts-Agent-RL-5K:RL 不是“答案数据”,而是任务包

OpenThoughts-Agent-RL-5K 的形态和 SFT 完全不同。它不是存 teacher trajectory,而是存在线 RL 要用的可执行任务包。下载 tasks.parquet 后可以看到,它只有两列:path 和 task_binary。其中 task_binary 是 gzip 压缩的 tar 包。

以第一条 pymethods2test-0000 为例,解压后的文件结构是:

instruction.md
metadata.json
task.toml
environment/Dockerfile
solution/solution.py
tests/test.sh
tests/test_solution.py

其中 metadata.json 说明来源是 pymethods2test,task.toml 给出 agent 和 verifier 的超时配置,environment/Dockerfile 定义运行环境,tests/test.sh 会执行 pytest /tests/test_solution.py 并把 reward 写到 /logs/verifier/reward.txt。题面则放在 instruction.md 里,例如第一条任务要求在 /app/solution.py 里实现:

path: pymethods2test-0000
metadata:
  source: pymethods2test
  has_docstring: true
task:
  difficulty: medium
  category: sandbox
environment:
  Dockerfile: |
    FROM python:3.10-slim
    WORKDIR /app
    RUN pip install --no-cache-dir pytest
instruction:
  function: min_seconds_to_eat_candies(...)
tests:
  runner: pytest /tests/test_solution.py

本地抽查也能看到,5,000 行都来自 pymethods2test,都采用同样的包结构。它确实不是一条条“老师示范轨迹”,而是 5,000 个可运行任务。Agent 在 Daytona sandbox 里通过 terminus-2 harness 尝试解决任务,reward 来自任务自己的 test verifier。也就是说,RL 数据集更像“训练场”,不是普通 SFT 那种用于模仿学习的答案轨迹集。

这也是 Agent 数据和普通文本数据最重要的区别:真正有价值的不是一段漂亮的回答,而是能被执行、能被验证、能产生奖励信号的环境。

一张表对齐

论文 arXiv 时间 核心策略 数据/规模 核心贡献
TermiGen 2026-02-06 可执行环境合成 + 错误注入轨迹 3,500+ verified environments;3,291 trajectories 让模型学习错误恢复
CLI-Gym 2026-02-11 环境逆向:健康环境到故障状态 1,655 problem instances;291 filtered success trajectories 自动生成环境密集型修复任务
SkillSynth 2026-04-28 技能图采样工作流 82,073 scenario nodes;57,214 skill-labeled transitions 从图结构控制技能多样性
CLI-Universe 2026-06-22 能力分类法 + 证据调研 + 多级验证 CLI-Universe-6K;6,000 trajectories 少而精的可验证任务合成
OpenThoughts-Agent 2026-06-23 100+ ablation experiments 找数据配方 SFT-100K;RL-5K;OpenThinkerAgent-32B 系统研究任务来源、teacher、过滤和规模

总结

这几篇工作连起来看,Agent 训练数据的演进线很清楚:

TermiGen 强调失败恢复;CLI-Gym 从真实环境反推出故障任务;SkillSynth 用技能图控制任务组合;CLI-Universe 把可验证和高质量过滤放到中心;OpenThoughts-Agent 则系统研究数据配方,告诉我们任务来源、teacher 和轨迹过滤会显著影响下游能力。

它们共同指向一个结论:Agent 数据的价值不只在数量,而在环境真实性、验证强度、轨迹质量和技能覆盖。相比继续堆更多普通对话数据,高质量、可执行、可验证的 agentic traces 更可能成为下一阶段开源 Agent 能力提升的关键。

参考链接


© 2025 Xiaojun Wu. All rights reserved. Powered by Jekyll and Minimal Light theme.