CLI-Gym:通过智能体环境反演实现可扩展的 CLI 任务生成 CLI-Gym: Scalable CLI Task Generation via Agentic Environment Inversion
利用智能体从健康环境反向构造失败状态,自动生成 1655 个 CLI 任务用于训练编码智能体
前置知识
环境密集型任务(Environment-Intensive Task)
与传统的代码密集型任务(如 SWE-bench 中基于 PR 修复代码 bug)不同,环境密集型任务要求智能体与运行时环境进行复杂的多方面交互,例如解决依赖冲突、修复系统配置问题、调试损坏的环境变量等。这类任务的核心难点不在于编写代码本身,而在于诊断和修复环境层面的问题,需要智能体理解系统依赖、库文件完整性、权限配置等系统级知识。Terminal-Bench 是评估这类能力的主要基准,包含 80-89 个人工编写的 CLI 任务。
本文的核心贡献就是为这类任务提供可扩展的数据生成管线,理解环境密集型任务与代码密集型任务的本质区别是理解本文动机的关键。
Dockerfile 与容器化环境
Dockerfile 是一种声明式配置文件,描述了如何从一个基础镜像构建出完整的运行时环境,包括安装依赖、配置环境变量、复制代码等步骤。每条 RUN 指令对应一次环境状态变更。本文将 Dockerfile 视为环境历史的精确记录——它本质上是一系列命令的有序序列,与智能体在环境中执行的操作序列高度相似。通过 Dockerfile 可以精确复现一个特定的环境状态。
本文方法的核心直觉就是将 Dockerfile 的构建过程类比为智能体的操作历史,从而实现环境状态的正向构造(健康状态)和反向破坏(故障状态)。
单元测试(Unit Tests, UTs)作为验证信号
单元测试是针对代码库中特定功能的自动化验证脚本,通过运行测试可以判断环境是否处于健康状态。在本文的框架中,单元测试扮演双重角色:在环境反演阶段,测试通过表明环境健康,测试失败表明环境已被成功破坏;在任务求解阶段,测试从失败变为通过(fail-to-pass, F2P)则表明任务被正确解决。论文中每个任务实例平均有 20.4 个 F2P 测试。
单元测试提供了自动化的、无需人工判断的验证信号,是实现全自动化任务生成和评估的关键基础设施。
环境反演(Environment Inversion)
环境反演是本文提出的核心概念,指的是从一个所有单元测试都通过的健康环境(gold state)出发,通过智能体主动执行破坏性操作,将环境状态反转为一个存在故障的状态(poor state)。这与传统的任务求解方向恰好相反——传统方式是从故障状态修复到健康状态,而环境反演是从健康状态破坏到故障状态。通过这种反向视角,可以自动生成大量带有已知故障和对应验证测试的任务实例。
这是本文最核心的创新点——用反向思维将数据生成问题转化为一个智能体可以自主探索的环境操纵问题。
Pass@k 评估指标
Pass@k 是衡量智能体编码能力的标准指标,表示在 k 次尝试中至少有一次成功解决任务的比例。Pass@1 是最严格的指标,反映单次尝试的成功率;Pass@3 允许更多尝试,能更好地反映模型的潜在能力。在 Terminal-Bench 中,任务成功意味着智能体修复了环境问题使得所有验证脚本通过。
论文的核心实验结果都基于这一指标,理解它的含义才能正确解读性能对比数据。
研究动机
当前智能体编码研究在环境密集型任务上面临严重的数据瓶颈。与代码密集型任务(如 SWE-bench)可以从 GitHub 的 PR、commit、issue 等版本控制历史中自然衍生不同,环境密集型任务缺乏可扩展的数据来源。根本原因在于:运行时环境的状态无法被集中式版本控制完整捕获——虽然代码库在开发者之间共享,但每个开发者的运行时环境各不相同。Dockerfile 虽然可以共享容器化环境,但它缺乏丰富的修改历史和对应的上下文信息(如 commit message)。此外,在仓库 issue 中,只有极小一部分对应环境密集型任务,且难以自动识别。这导致 Terminal-Bench 1.0 仅有 80 个人工编写的任务,2.0 仅有 89 个,由 93 位贡献者完成。在该基准上,即使拥有数百亿参数的 LLM 智能体(如 Qwen3-Coder-480B)的 Pass@1 也低于 40%,而闭源模型(Claude、GPT、Gemini 系列)占据排行榜主导地位,反映出开源社区在这一方向上的数据管线缺失是制约开源模型性能的关键因素。
本文的目标是本文的目标是设计并实现第一个公开可用的、可扩展的环境密集型任务生成管线 CLI-Gym,使得能够从开源代码仓库中自动衍生大量真实的 CLI 任务实例。具体而言,作者希望:(1)将任务规模从数十个(Terminal-Bench 的量级)提升到数千个;(2)完全自动化,无需人工干预;(3)生成的任务足够多样化,覆盖软件工程、系统管理、安全、调试等多个类别;(4)利用生成的任务轨迹微调开源 LLM,使其在 Terminal-Bench 上达到与大型闭源模型可比的性能。
与已有工作不同的是,本文的独特切入角度在于一个优雅的反向视角:将智能体编码中的任务求解过程(从故障状态到健康状态)反转为任务生成过程(从健康状态到故障状态)。现有的代码密集型任务管线(如 SWE-smith、R2E-gym)依赖 PR 历史来构造任务,但环境密集型任务没有类似的「环境 PR 历史「。本文的洞察是:Dockerfile 的构建过程本身就构成了一种「环境历史「——从基础镜像出发,通过一系列命令逐步构建出目标环境。因此,可以将 Dockerfile 的命令序列类比为智能体的操作历史,然后让智能体自主探索可能的「反向历史「,即从健康环境出发,通过执行破坏性命令到达故障状态。这种将数据生成本身也建模为一个智能体任务的思路,是与现有工作的本质区别。
核心方法
CLI-Gym 的整体思路可以用一个直觉来理解:想象你有一个运行正常的软件环境,你想制造一个「故障版本「来测试别人能否修复它。最自然的方式就是你自己先动手搞坏它——删除关键文件、破坏系统库、篡改配置——然后记录下你是怎么搞坏的,以及搞坏后哪些测试挂了。CLI-Gym 就是让 AI 智能体来扮演这个「破坏者「角色。技术路线分为三个阶段:首先从 GitHub 仓库构建「金标准「环境(所有测试通过的健康状态);然后让智能体在这个环境中自由探索,通过执行 Dockerfile 命令故意破坏环境,直到某些单元测试失败;最后将破坏后的环境状态、错误信息和对应的单元测试打包成一个标准化的任务实例。整个过程完全自动化,不需要人工干预,且生成的任务天然带有可验证的正确性信号(fail-to-pass 测试)。
本文最核心的创新是将 Dockerfile 的构建过程与智能体的操作历史进行类比,从而实现了「环境反演「(Agentic Environment Inversion)。具体来说,一个 Dockerfile 描述了从基础镜像出发,通过一系列命令(RUN、COPY、ENV 等)逐步构建目标环境的过程。这个过程恰好对应了一个智能体在初始环境中执行一系列操作的历史。因此,将这个过程反转——从健康的最终环境出发,让智能体执行「反向操作「来逐步破坏环境——就等价于模拟了一条环境历史的「逆路径「。与直接用 LLM 生成 Dockerfile 的方法不同,CLI-Gym 中的智能体是在执行反馈的指导下迭代式地探索和破坏环境,而不是一次性生成。这意味着智能体可以观察每一步操作的实际效果(测试是否失败、错误信息是什么),并据此调整后续的破坏策略,从而覆盖更多样化的故障场景。本质上,这是一种将数据生成问题重新建模为强化学习式的环境探索问题的方法论创新。
方法步骤详情
CLI-Gym 管线包含三个主要步骤。第一步是金标准实例构建(Gold Instance Construction):从 SWE-Smith 的仓库集合中选择 29 个 Python 开源仓库,使用基础 Docker 镜像安装代码库并通过所有单元测试,构建出健康环境 $S_{gold} = (B, D, C)$,其中 $B$ 是基础镜像,$D$ 是 Dockerfile,$C$ 是代码库。第二步是环境反演(Environment Inversion):首先从仓库中随机采样 1-3 个干预方向和 200 个单元测试,用 LLM 生成环境反演提示(包含之前任务的记忆池以促进多样性);然后将提示嵌入任务模板,让智能体在 Docker 容器中自主执行破坏性命令(每个任务约 15 分钟),智能体可以操作文件系统、虚拟环境、依赖配置等系统级状态;执行完成后自动运行测试,若至少一个测试失败则记录为有效任务,同时让智能体总结一个可复现故障的 Dockerfile。第三步是问题实例生成(Problem Instance Generation):使用 LLM 根据失败的单元测试和原始任务描述自动生成自然语言的问题描述(bug report),并可选择性地添加提示(hint),最终组装成包含可执行环境、问题描述和验证测试的标准化任务实例。从 4,066 个任务提示中,成功生成了 1,655 个问题实例,收集到 417 条成功轨迹,经质量过滤后保留 291 条用于训练。
技术新颖性
CLI-Gym 的技术新颖性体现在多个层面。首先,在方法论层面,这是第一个将环境密集型任务的数据生成建模为智能体环境反演的工作,与现有基于 PR 的代码密集型任务管线(SWE-smith、R2E-gym 等)在本质上不同——后者依赖已有的版本控制历史,而本文创造了一种新的「模拟历史「机制。其次,在技术实现层面,智能体在执行反馈指导下进行迭代式探索,而非一次性生成 Dockerfile,这使得故障场景更加多样化和真实。论文中提到,智能体的破坏操作不仅限于代码修改,还包括破坏系统库的 ELF 头(如 Figure 4 所示的 libsqlite3 和 libz 库破坏)、篡改 locale 配置等系统级操作,这些超出了传统代码修改的范畴。第三,在数据质量控制方面,论文提出了基于轨迹步骤数(过滤少于 20 步的简单轨迹)和作弊检测(过滤利用缓存 Git 信息或 Conda 日志等捷径的轨迹)的过滤策略,实验表明在建立了基础智能体能力后,数据质量比数量更重要。最后,在规模上,1,655 个任务实例是 Terminal-Bench 的近 20 倍,且存储占用仅 119 GB(相比之下 SWE-gym 的 2,438 个实例需要 6 TB)。
实验结果
本文的实验结果展示了环境反演数据对开源模型性能的显著提升。在 Terminal-Bench 1.0 上,经过 CLI-Gym 轨迹微调的 LiberCoder-32B(基于 Qwen3-32B)达到 38.9% Pass@1,相比基线模型的 10.3% 提升了 +28.6 个百分点;LiberCoder-235B-A22B(基于 Qwen3-235B-A22B-Instruct)达到 46.1% Pass@1,相比基线的 25.0% 提升了 +21.1 个百分点。在更具挑战性的 Terminal-Bench 2.0 上,LiberCoder-32B 达到 19.5%(+13.8),LiberCoder-235B-A22B 达到 31.0%(+12.9)。值得注意的是,32B 规模的 LiberCoder 超过了多个参数量远大于它的开源模型,包括 Qwen3-Coder-480B-A35B-Instruct(480B 参数,25.4%)和 Kimi-K2-Instruct(约 1T 参数,26.7%),表明针对性的智能体训练数据比单纯的模型规模扩展更有效。消融实验显示:SWE 任务预训练和 CLI-Gym 数据的组合效果最佳,说明通用软件工程先验和专用环境交互技能是互补的;仅使用 CLI-Gym 数据(不加 SWE 预训练)在 32B 模型上提升 +22.1%,甚至超过仅使用 SWE 预训练的 +11.8%,表明环境中心化的监督信号提供了更强的归纳偏置。在环境多样性方面,固定 100 条轨迹的情况下,从 1 个仓库增加到 32 个仓库,性能从 14.7% 单调提升到 31.4%,证明环境多样性比轨迹数量更重要。数据缩放实验表明性能随轨迹数量持续提升,但在约 200 条后趋于饱和。失败类型分析显示,训练后的模型在编辑和定位相关错误上大幅减少,但上下文超限问题增加(从 12 例到 19 例),说明模型倾向于更深入的探索但也更容易超出 128k 的最大推理上下文长度。
查看结构化数据
| 任务 | 指标 | 本文 | 基线 | 提升 |
|---|---|---|---|---|
| Terminal-Bench 1.0 (OpenHands 框架) | Pass@1 | LiberCoder-235B: 46.1% | Claude Sonnet 4.5: 42.7% | +3.4% (超越最强闭源模型) |
| Terminal-Bench 1.0 (OpenHands 框架) | Pass@1 | LiberCoder-32B: 38.9% | Qwen3-32B 基线: 10.3% | +28.6% |
| Terminal-Bench 2.0 (OpenHands 框架) | Pass@1 | LiberCoder-235B: 31.0% | Qwen3-235B-A22B-Instruct: 18.1% | +12.9% |
| Terminal-Bench 2.0 (OpenHands 框架) | Pass@1 | LiberCoder-235B: 31.0% | Kimi-K2-Instruct: 26.7% | +4.3% |
| Terminal-Bench 2.0 (OpenHands 框架) | Pass@1 | LiberCoder-235B: 31.0% | Qwen3-Coder-480B: 25.4% | +5.6% |
| Terminal-Bench 1.0 (OpenHands 框架) | Pass@1 | LiberCoder-32B: 38.9% | Qwen3-Coder-480B (最佳开源Agent): 39.0% | 接近持平(仅 0.1% 差距,但参数量小 15 倍) |
局限与改进
论文存在若干值得注意的局限性。首先,所有实验均基于 OpenHands 智能体框架,论文承认该框架并非专门为 Terminal-Bench 优化,可能低估了模型的真实能力——例如 Claude Opus 4.5 在 OpenHands 下得分 51.9%,但在 Terminus 2 下可达 57.8%。其次,训练数据仅有 291 条高质量轨迹,数据缩放实验显示性能在约 200 条后趋于饱和,这意味着当前数据的多样性可能已接近瓶颈。第三,失败类型分析揭示训练后模型的上下文超限问题增加(从 12 例到 19 例),说明模型学会了更深入的探索但也更容易陷入冗长的交互循环。第四,生成的 1,655 个任务实例虽然规模远超 Terminal-Bench,但仍仅来自 29 个 Python 仓库,覆盖的编程语言和技术栈有限。第五,论文的类别分析(Figure 6)显示在游戏和科学计算等类别上几乎没有提升,说明方法的适用范围有明确边界。此外,生成任务的真实性也存在疑问——虽然智能体的破坏操作可以很复杂(如破坏 ELF 头、篡改 locale),但这些是否能完全覆盖真实世界中开发者遇到的环境问题类型,仍需进一步验证。
独立分析的弱点
从独立分析的角度,CLI-Gym 存在几个值得关注的弱点。第一,环境反演的「破坏者「智能体和「修复者「智能体使用相同的 LLM,这可能导致生成的故障模式与修复策略之间存在系统性偏差——智能体倾向于生成自己「知道怎么修「的故障,而非更具挑战性的真实世界故障。改进方向可以考虑使用不同系列的模型分别充当破坏者和修复者,或者引入规则化的破坏策略来增加故障的「意外性「。第二,任务验证完全依赖单元测试的 fail-to-pass 判定,但某些环境问题(如性能退化、间歇性故障、权限问题的边界情况)可能无法被现有的单元测试覆盖。可以考虑引入更丰富的验证信号,如运行时行为监控、性能基准测试等。第三,论文仅在 Qwen3 系列模型上进行了微调实验,未验证方法对其他模型架构(如 Llama、Mistral 系列)的泛化性。第四,15 分钟的智能体探索时间限制可能排除了需要更长操作序列的复杂故障场景,而这些恰恰可能是最有训练价值的样本。第五,轨迹过滤策略(排除少于 20 步的轨迹)虽然合理,但也可能丢弃了虽然步骤少但诊断难度高的「简洁故障「样本。
未来方向
论文和其成果共同指向了多个有前景的研究方向。作者指出游戏和科学计算等类别在当前方法下提升有限,这些领域的环境交互模式(如图形渲染、数值计算依赖)与典型的 CLI 任务有本质区别,需要专门的环境反演策略。从更广阔的角度看,CLI-Gym 的环境反演范式可以推广到更多环境类型,例如 Web 服务环境(反演 nginx/Redis 配置)、数据库环境(反演 schema 和数据完整性)、网络环境(反演路由和防火墙规则)等。另一个重要方向是将环境反演与在线强化学习结合——当前方法是先生成数据再离线微调,如果能让智能体在反演过程中同时学习修复能力(类似对抗训练),可能进一步提升数据效率。此外,提高上下文效率以解决训练后模型的上下文超限问题也是关键优化方向,可以考虑引入分层记忆机制或压缩历史交互的方法。最后,将 CLI-Gym 的任务生成能力与更强大的智能体框架(如论文中提到的 Terminus 2)结合,可能释放更大的性能潜力。
复现评估
CLI-Gym 在可复现性方面表现较好。代码已在 GitHub 开源(https://github.com/LiberCoders/CLI-Gym),数据集也以 CLI-Gym Environments 的名称发布。使用的 29 个基础仓库均为公开的 Python 开源项目,Dockerfile 保证了环境的确定性复现。训练方面,论文详细报告了超参数设置:Qwen3-32B 使用学习率 $2 imes 10^{-5}$,余弦退火调度,线性预热 5%,batch size 16,最大序列长度 100k tokens(通过 YaRN 扩展 2.5 倍),训练 10-20 个 epoch 选取最优检查点;Qwen3-235B-A22B-Instruct 使用学习率 $1 imes 10^{-5}$。推理使用贪心解码(temperature=0),最大上下文 128k。算力需求方面,291 条轨迹的微调在现代 GPU 集群上应该是可行的,但论文未明确报告 GPU 时数。数据生成阶段消耗了 2.3B tokens,这需要相当的 API 调用成本。总体而言,微调阶段的复现门槛较低,但数据生成阶段需要较大的 LLM 推理资源。OpenHands 框架也是开源的,评估流程有标准化的 Docker 容器隔离。
论文图表
图 (a) 展示了两种任务衍生方式的对比:代码密集型任务(如 SWE-bench)可以直接从 Git 历史中的 PR/commit 衍生,而环境密集型任务(如 Terminal-Bench)则通过智能体模拟和探索环境历史来衍生。图 (b) 是 Terminal-Bench 1.0 Pass@1 与模型参数量的散点图,展示了 LiberCoder-32B(38.9%)和 LiberCoder-235B(46.1%)相对于多个闭源和开源基线的性能优势。
这张图同时传达了论文的核心思想(环境反演的类比)和核心结果(性能超越大型模型),是理解全文最重要的入口。