← 返回 2026-08-10

DCAS:解耦CLI智能体脚手架以让规划能力跨脚手架内化 DCAS: Decoupling CLI Agent Scaffolding to Internalize Planning across Scaffolds

Kishanthan Thangarajah, Boyuan Chen, Ahmed E. Hassan 📅 2026-08-06 👍 18 2026-08-15 18:30
CLI智能体 监督微调 脚手架解耦 规划能力内化 软件工程智能体

把规划从脚手架固定产物变成可跨脚手架迁移的模型能力

前置知识

CLI 智能体脚手架(CLI agent scaffold)

把语言模型变成自主编码智能体的那层外壳框架:它管理智能体循环、向模型暴露一组工具、组织多轮对话、并决定智能体何时结束。本文研究的四款脚手架(OpenHands、Claude Code、OpenCode、mini-swe-agent)在规划结构上差异最大,但底层都跑同一个 ReAct 式的“行动—观察”循环。

全文的核心论点是:跨脚手架性能退化本质上是一种“脚手架约定不匹配”,而脚手架最核心的承重约定就是规划结构。

显式规划与隐式规划(explicit vs. implicit planning)

本文把规划拆成两层。显式规划指执行前产出一个作为一等对象的计划(如 Claude Code 的 Plan Mode);隐式规划指脚手架逐轮施加的结构化行为——子步粒度、何时从探索转入行动、工具调用如何串联、失败如何触发重规划。论文的核心贡献之一就是证明这两层在训练数据里可被干净分离。

理解这两层是读懂全文方法(PlanOnly vs Plan+Exec 两个训练变体)与全部实验结果的前提。

SWE-bench Verified

一个人工筛选的 500 道真实 GitHub issue 子集,每题都有确定性可验证的补丁解。本文统一用它做评测,指标为 Pass@1(单次尝试解出的题目占比),执行阶段一律上限 100 轮,规划阶段上限 500 轮。

所有 RQ 的对比数据都在 SWE-bench Verified 上以 Pass@1 报告,看懂表格需要知道这个基准和指标的含义。

监督微调(SFT)与拒绝采样

用源模型跑任务、只保留补丁被验证通过的轨迹来构造训练数据(即拒绝采样),再对这些 per-turn 样本做全参数监督微调。本文用 LLaMA-Factory,学习率 $\eta = 4.0\times10^{-6}$、余弦调度、65,536 token 上下文、BF16、Flash Attention 2、DeepSpeed ZeRO Stage 3。

RQ2/RQ3 的“规划内化”本质就是一次小规模(576 条轨迹)的拒绝采样 SFT,理解它才知道增益从何而来。

ReAct 式执行循环(act/observe loop)

模型发出一个动作或规划步骤,脚手架回传一个观察,循环往复直到完成。所有四款脚手架底层都共享这个循环,因此模型具备在其他脚手架下运行的能力,缺的只是对各家规划约定的熟悉度——这是本文立论的关键推断。

这是“跨脚手架退化不是能力缺陷而是规划约定不匹配”这一推断的逻辑支点。

研究动机

当前开源 CLI 智能体生态高度依赖单一训练环境:SWE-Gym、Nebius、SWE-Lego、CoderForge 等主流轨迹数据集几乎全部在 OpenHands 脚手架下采集,微调后的模型在 OpenHands 下表现优异,部署到非训练脚手架性能便大幅退化。作者在四个 30B–32B 顶级开源模型上系统测了这一现象(Table 1):SWE-Lego-Qwen3-32B 从 OpenHands 的 52.6% 跌到 OpenCode 的 8.4%(工具调用格式与 OpenCode 解析器不兼容);Nebius-SWE-Rebench-30B 从 49.7% 跌到 mini-swe-agent 的 20.4%,崩塌 29 个百分点;SERA-32B 从 54.2% 跌到 26.4%。失败分三类:随脚手架“距离”递增的退化、工具格式不兼容的硬失败、上下文长度冲突(SERA、Nex-N1 微调到 32,768 token,与 Claude Code 硬编码的 32,000 token 输出上限冲突)。关键在于,这些模型的未训练基座在四个脚手架间差异明显更小,说明跨脚手架退化是微调“装”进去的而非能力缺陷;即便 Nex-N1 用多格式混合训练,OpenCode(26.2%)、mini-swe-agent(15.6%)仍大幅退化。

本文的目标是本文要查清跨脚手架部署鸿沟的成因,并在不进行脚手架专门重训的前提下把它补上。具体目标分三层:第一,定位这种退化的机制——证明它是某种被微调“安装”进去、脚手架间明显不同、模型能学会遵循的行为;第二,定量验证规划结构(显式规划与隐式规划两层)就是这个承重行为,并测出它的影响量级;第三,用少量规划感知轨迹训练出单一开源模型,使其在多个非训练脚手架上稳定保持性能,理想情况下在不依赖推理期外部规划器的前提下,逼近或匹配外部规划器注入(约 57.8%)的效果。可量化的成功标准是:一个 30B 模型在新版 Claude Code、OpenCode、mini-swe-agent 上的 Pass@1 都相对基座无规划基线正向提升,证明学到的是可迁移的结构化技能而非脚手架记忆。

与已有工作不同的是,以往工作普遍把性能提升押在数据规模和轨迹数量上——SWE-Gym、Nebius、CoderForge 都是数千到数万条轨迹,且集中在 OpenHands 下采集。本文切入的角度截然不同:它认为跨脚手架退化本质是“规划约定不匹配”,而承重信号其实藏在每条轨迹的规划结构里,而非数据量里。一个关键但被忽视的洞察是,规划可以拆成两层——显式规划(执行前产出的、作为一等对象的计划)和隐式规划(脚手架逐轮施加的结构化行为:子步粒度、何时从探索转入行动、工具调用顺序、失败后如何重规划)。各脚手架底层其实共享同一个 ReAct 式 act/observe 循环,模型具备在其他脚手架下运行的能力,缺的只是对各家规划约定的熟悉度。要把规划从“脚手架的固定产物”变成“模型的习得能力”,就需要一种能在任意 CLI 脚手架与任意后端模型间路由 API 流量、并采集规划感知轨迹的工具——而此前没有任何现成基础设施能做到这一点。Qwen3-Coder-Next 独立印证了脚手架专属偏置的存在,为本文假设提供了旁证。

核心方法

直觉上可以这样理解:四款 CLI 脚手架(OpenHands、Claude Code、OpenCode、mini-swe-agent)在规划结构上差异最大,但底层都跑着同一个 ReAct 式的“行动—观察”执行循环。模型在一个脚手架下训练过,就具备了在其他脚手架下运行的能力;它在非训练脚手架上缺的,只是对那套规划约定的熟悉。那么只要给它一小批能把“两层规划”都暴露出来的轨迹,它应该能学到一种可迁移的结构化技能,而不是死记某家脚手架的表面细节。技术路线据此分三步:先造一个 DCAS 后端替换拦截层,把任意 CLI 脚手架与任意后端模型之间的 API 流量经过一层中间代理做格式翻译,使脚手架完全不被修改;再用 DCAS 做三件事——(a)在执行器模型和脚手架都固定的条件下做受控的“规划源”干预(RQ1),(b)在目标脚手架下采集规划感知轨迹并用两个数据集变体做 SFT(RQ2),(c)把微调后的模型部署到训练时从未见过的脚手架上做泛化测试(RQ3)。整个流程中,脚手架在各 RQ 内部保持一致,性能差异只能归因于模型或规划本身。

全文最核心的创新是把“规划”概念性地拆成两层,并在训练数据里实证地把这两层干净地分开。显式规划指模型在执行前产出一个作为一等对象的计划(如 Claude Code 的 Plan Mode、OpenCode 的 Plan agent);隐式规划指脚手架逐轮施加的结构化行为——子步粒度、何时从探索转入行动、工具调用如何串联、失败如何触发重规划。关键实验证据是:只用规划阶段轨迹训练的 PlanOnly 模型,在无规划条件下竟从 42.8% 跃升到 53.8%(+11.0%),却完全无法从自生成规划中再获益(53.2%,反而略降)——这证明它学到的是隐式规划约定,而非“如何使用一个显式规划步骤”;而同时包含规划与执行的 Plan+Exec 模型则在无规划下达到 52.8%,再加自规划又涨到 55.8%(+13.0%),说明它同时学到了两层。这个干净的两层分离是方法奏效的根基:可以单独教隐式约定,也可以叠加显式规划用法。配合 DCAS 拦截层(在不改脚手架的前提下替换后端)和规划器-执行器分离(强模型写计划、30B 模型执行),整个方法把“外部规划器注入”内化成了模型自身的、可迁移的能力。

方法步骤详情

方法分四步。第一步构建 DCAS 拦截层:在 McMillan 的开源 SWE-bench runner 基础上扩展规划阶段分离、结构化轨迹日志与多脚手架支持,把任意脚手架与后端模型间的 API 流量经中间层翻译并记录为轨迹文件。第二步(RQ1)固定执行器 Qwen3-Coder-30B-A3B-Instruct、脚手架 CC 2.0.76 与基准 SWE-bench Verified,用三种模板做受控干预:无规划基线、自规划(先产不超过八步计划、不改代码,再执行)、外部规划(由 Claude Sonnet/Opus 4.5 或开源 Qwen3-Coder-480B-A35B-Instruct 生成计划交后端执行),外部规划分默认/固定两种路由。第三步(RQ2)用 GLM-4.7 经 DCAS 替换进 Claude Code 采两阶段轨迹,拒绝采样留 576 条,构造 PlanOnly(14,162 per-turn 样本)与 Plan+Exec(36,259 per-turn 样本)两个 SFT 数据集,对 30B 模型做全参数 SFT(LLaMA-Factory,$\eta=4.0\times10^{-6}$、余弦调度、65,536 token、BF16、Flash Attention 2、DeepSpeed ZeRO Stage 3)。第四步(RQ3)把 Plan+Exec 模型部署到 CC 2.1.73 与 OpenCode v0.0.55、mini-swe-agent v2.2.8 测 Pass@1。

技术新颖性

DCAS 是首个在后端替换代理能力之上系统构建的研究方法,用于受控的跨脚手架评估和大规模的规划感知轨迹采集;此前的代理工具(如 claude-trace)只做 HTTP 流量拦截,没有发展成研究范式。规划“两层”概念拆分并在训练数据里实证可分离,是本文独有的——以往工作要么只谈显式计划阶段(MASAI、CodeR、HULA 的规划器-执行器架构),要么把规划和执行混在一个不透明的脚手架循环里,从未把两层拆开训练对比。与 Qwen3-Coder-Next 这类“多脚手架混合采集以拓宽分布”的做法不同,本文不靠扩大数据分布,而是靠暴露规划结构本身;与 Agentless、MASAI 等推理期仍需外部规划器的架构不同,DCAS 通过 SFT 把规划器角色内化进模型,推理期不再需要外部规划器。这种“后端替换 + 规划阶段分离 + 拒绝采样轨迹”的组合,让任意闭源脚手架(如 Claude Code)也能成为可采集、可对换的训练环境。

The DCAS interception layer routes API traffic between any CLI scaffold and any substituted backend model without modifying the scaffold. The trace logger records all interactions as trajectory files for SFT data collection.
Figure 1: The DCAS interception layer routes API traffic between any CLI scaffold and any substituted backend model without modifying the scaffold. The trace logger records all interactions as trajectory files for SFT data collection.

实验结果

三个 RQ 逐层给证。RQ1(Table 4)证明规划质量是高杠杆因素:无规划基线 42.8%,自规划 48.2%(+5.4%),开源 Qwen3-480B 规划器 49.2%(+6.4%),Opus 4.5 默认路由 56.0%(+13.2%),Sonnet 4.5 两种路由均 57.8%(+15.0%);收益随规划器能力单调上升,且 15 个点的杠杆量级超过 Table 1 的跨脚手架跌幅,反直觉的是 Sonnet 4.5 作规划器反而优于更强的 Opus 4.5。RQ2(Table 5)证明规划可内化、两层在数据中可分:PlanOnly 无规划 53.8%(+11.0%)、自规划 53.2% 无额外收益;Plan+Exec 无规划 52.8%(+10.0%)、自规划 55.8%(+13.0%),后者已追平 Opus 4.5 注入的 56.0%、仅比 Sonnet 4.5 注入的 57.8% 低 2 个点,却无需推理期外部规划器。RQ3(Table 6)证明习得的是结构化技能而非记忆:新版 CC 2.1.73 上自规划 57.2%(+14.4%),是全文无需外部规划器的最高分且超过训练版本;从未训练过的 OpenCode 自规划 49.4%(+3.4%)、结构最不相似的 mini-swe-agent 自规划 42.4%(+7.0%)。整个 SFT 仅用 576 条轨迹,比 SWE-Gym、Nebius、CoderForge 动辄数千到数万条小一到两个数量级。

Pass@1 on SWE-bench Verified, max 100 turns. Italicized rows are untrained base models. OH = OpenHands, CC = Claude Code, OC = OpenCode, Mini-SWE = mini-swe-agent.
Table 1: Pass@1 on SWE-bench Verified, max 100 turns. Italicized rows are untrained base models. OH = OpenHands, CC = Claude Code, OC = OpenCode, Mini-SWE = mini-swe-agent.
RQ1 results. Backend model is Qwen3-Coder-30B-A3B-Instruct in all rows. Scaffold is CC 2.0.76. Pass@1 on SWE-bench Verified, max 100 turns.
Table 4: RQ1 results. Backend model is Qwen3-Coder-30B-A3B-Instruct in all rows. Scaffold is CC 2.0.76. Pass@1 on SWE-bench Verified, max 100 turns.
RQ2 results. Base model is Qwen3-Coder-30B-A3B-Instruct. Scaffold is CC 2.0.76 throughout. Pass@1 on SWE-bench Verified, max 100 turns.
Table 5: RQ2 results. Base model is Qwen3-Coder-30B-A3B-Instruct. Scaffold is CC 2.0.76 throughout. Pass@1 on SWE-bench Verified, max 100 turns.
RQ3 results. Pass@1 on SWE-bench Verified. Base model is Qwen3-Coder-30B-A3B-Instruct. SFT is the Plan+Exec fine-tuned variant.
Table 6: RQ3 results. Pass@1 on SWE-bench Verified. Base model is Qwen3-Coder-30B-A3B-Instruct. SFT is the Plan+Exec fine-tuned variant.
查看结构化数据
任务指标本文基线提升
SWE-bench Verified(规划源受控干预,CC 2.0.76) Pass@1 57.8%(Claude Sonnet 4.5 注入规划) 42.8%(同模型无规划) +15.0%
SWE-bench Verified(Plan+Exec SFT 规划内化,CC 2.0.76) Pass@1 55.8%(自生成规划) 42.8%(基座无规划) +13.0%
SWE-bench Verified(版本迁移到 CC 2.1.73) Pass@1 57.2%(Plan+Exec 自规划) 42.8%(基座无规划) +14.4%
SWE-bench Verified(跨脚手架 OpenCode v0.0.55) Pass@1 49.4%(SFT 自规划) 46.0%(基座无规划) +3.4%
SWE-bench Verified(跨脚手架 mini-swe-agent v2.2.8) Pass@1 42.4%(SFT 自规划) 35.4%(基座无规划) +7.0%
SWE-bench Verified(跨脚手架退化现象,Table 1) Pass@1 8.4%(SWE-Lego-Qwen3-32B 在 OpenCode) 52.6%(同模型在 OpenHands) −44.2%(退化,工具格式不兼容)

局限与改进

作者承认几方面局限。首先,把跨脚手架鸿沟归因于规划结构只是“部分”被设计支持:RQ1 在脚手架内只隔离了显式规划,跨脚手架时规划与工具调用 schema 及解析器、轮次管理、上下文窗口协同变化,作者未在固定规划的同时逐一消融其余维度。其次,所有实验都用 SWE-bench Verified,迁移到其他代码库和任务类型未知;后端执行器只用 Qwen3-Coder-30B-A3B-Instruct 一个模型,增益未必能直接迁移到其他规模/架构。第三,训练轨迹只在 Claude Code 下采集,跨脚手架评估只覆盖 OpenCode v0.0.55 与 mini-swe-agent v2.2.8,Codex CLI 因走 OpenAI Responses API(SSE 流式)在 10–18 轮后卡死而无法纳入。第四,拒绝采样只留补丁通过的轨迹,偏向较易实例。第五,Pass@1 不反映轨迹效率、轮次数或推理质量,规划质量只能间接通过任务表现评估。我额外观察到:OpenCode(+3.4%)等开放脚手架增益远小于 CC 的 +13–14%;与 Kimi K2 的 65.8% 相比绝对差距仍不小。

独立分析的弱点

独立分析有几点。其一,跨脚手架迁移幅度不均:在结构最接近训练脚手架的 Claude Code 上增益最大(+13–14%),在开放脚手架上明显缩水(OpenCode 仅 +3.4%),结构性匹配假设虽能解释,但对只想用 OpenCode 的实践者而言回报可能不足以抵消采集成本——改进方向是用多个脚手架联合采集轨迹以拓宽结构风格。其二,源模型(GLM-4.7)和执行器(Qwen3-Coder-30B-A3B-Instruct)各只有一个,无法把“规划结构带来的增益”与“通用域内 SFT 暴露带来的增益”彻底分开;需补 execution-only、token-matched、degraded-plan 等对照训练。其三,显式 vs 隐式规划的拆分目前停留在概念层,只通过下游表现间接证明可分离,可直接对微调模型的规划做质量评分。其四,拒绝采样偏向易例,在难题上行为未知,可能高估真实部署收益。其五,没有与 RL 路线(DeepSWE、Kimi K2、SWE-RL)对比天花板。其六,工具格式与上下文长度不兼容是真实失败模式,但正交于本文学习问题,方法本身未解决。

未来方向

作者明确提出的方向:把 DCAS 扩展到 Codex CLI、Gemini CLI,以及 IDE 集成和 GUI 式编码智能体(它们同样经 API 与后端模型通信但交互界面不同);把“规划器-执行器校准”作为一等设计变量来研究,包括最优规划器是否会随执行器规模变化而改变;在固定规划的同时消融其余维度,补齐 execution-only/token-matched/degraded-plan 对照;直接对微调模型的规划打分。基于成果可延伸的方向:跨多脚手架联合采集轨迹以补齐开放脚手架上较弱的迁移;把 DCAS 的 SFT 路线与 RL(如 SWE-RL、DeepSWE)组合以拉高天花板;研究规划技能能否与更大执行器组合迁移;推动把多脚手架评估作为社区评测的默认标准而非可选项,避免单脚手架分数系统性高估真实能力。

复现评估

复现友好度较高。作者在 Zenodo 放了 DCAS 源码和复现脚本(doi:10.5281/zenodo.19930073),HuggingFace 上放了 SFT 模型权重与蒸馏后的 GLM-4.7 轨迹数据集,并发布原始 claude-trace HTTP 日志便于独立核查 API 交互;脚手架版本精确指定(CC 2.0.76、CC 2.1.73、OpenCode v0.0.55、mini-swe-agent v2.2.8),SFT 超参完整给出(LLaMA-Factory、$\eta=4.0\times10^{-6}$、余弦、65,536 token、BF16、Flash Attention 2、DeepSpeed ZeRO Stage 3)。576 条轨迹的采集量级对中小团队可行。主要门槛:Claude Code 闭源(但可免费使用);RQ1 的规划注入需 Claude API 额度;全参数微调 30B(MoE、A3B 激活)需多卡 GPU(论文未明确算力规模,但 ZeRO-3 全参微调通常意味着多张高显存卡);SWE-bench Verified 评测本身需 Docker 跑官方镜像。综合难度中等。