05 / Agentic Post-Training研究

Agent 的边界:模型、Harness 与环境

先把一次成功拆开,才能知道该训练哪一部分。

用状态、动作、观察和工具协议定义 Agent,避免把框架增强误认成模型能力。

READ WITH A QUESTION

读完这一章,你应该能够

  • 定义可训练的 Agent 边界
  • 设计可重放、可隔离的环境接口
  • 通过交叉实验区分模型与 Harness 增益
前置理解 后训练技术地图 · 基本 Python 异常与接口设计
本章目录 · 0 个小节

同一模型,换一个 Harness 为什么成绩变了

一个软件 Agent 的成功可能来自模型定位了正确文件,也可能来自 Harness 自动重试、压缩日志、预装依赖或修复了工具调用格式。若把整个系统的增益统称“模型学会了软件工程”,下一次训练就会优化错对象。

课程分析:Agent 训练应先明确策略能够控制什么、环境返回什么、框架替它做了什么。模型权重、system prompt、工具定义、上下文管理、推理参数和环境镜像共同决定部署行为。比较模型时应固定其余变量;比较系统时则应明确同时改变了哪些变量。

一张边界表

部件职责与状态训练时的关键记录
Policy model根据可见历史给出下一个动作或 tokencheckpoint、tokenizer、采样参数
Harness编排回合、解析调用、重试、预算与终止版本、提示模板、恢复策略
Tool schema / protocol定义动作名、参数类型、序列化和返回语义schema 指纹、解析结果、无效调用
Environment执行动作并维护真实任务状态镜像/快照、随机种子、资源限制
Observation策略能看到的状态投影原始输出、截断与脱敏规则
Memory / context manager从历史选择进入当前上下文的信息摘要来源、读取记录、丢弃内容
Verifier / grader判断结果或过程是否符合标准版本、证据、分项结果与置信度
Reward将评价转换为训练标量或向量聚合规则、缺失值与异常策略

这是课程的接口分解,并不是所有项目都使用同名类。Agent Lightning 的论文提出将 Agent 执行与训练接口解耦的设计,可作为系统路线案例;不能由此推断任意接入 Agent 都自动获得可靠奖励与可归因轨迹。论文来源

State 与 Observation 必须分开

设真实环境状态为 sts_t,策略可见的观察为 oto_t,动作是 ata_t:

st+1∼P(st+1∣st,at),ot+1=Ω(st+1),at∼πθ(⋅∣ht).s_{t+1}\sim P(s_{t+1}|s_t,a_t),\qquad o_{t+1}=\Omega(s_{t+1}),\qquad a_t\sim\pi_\theta(\cdot|h_t).

hth_t 是 Harness 提供的历史或压缩后的上下文。终端目录里存在一个文件不等于模型知道其内容;浏览器中按钮可点击不等于截图足够清晰。把环境可用信息当作策略可见信息,会在训练中制造隐性信息泄漏。

课程分析:Memory 不会免除上下文预算。保存到数据库的经验只有在检索并呈现给策略后才影响当前决策。自动摘要可能丢掉异常栈或更改过的文件名,因此应测试“同一模型 + 完整上下文”和“同一模型 + 摘要”的质量/成本曲线。

不同环境难在不同地方

环境动作与观察可验证完成条件主要工程难点
代码/终端命令、文件变更、退出码与日志隐藏测试、产物检查依赖、超时、进程树、文件权限
浏览器/搜索页面导航、查询、点击、DOM 或截图目标状态与可核验出处动态内容、会话、页面漂移
GUI像素观察、坐标与键盘事件状态快照或任务检查器渲染延迟、坐标稳定性、异步动作
数学/证明推理文本或形式化证明答案等价检查、证明器解析歧义、形式化成本
数据分析代码、表格、图与文件数值不变量、隐藏数据验证数据泄漏、随机性、指标口径

以上是环境设计分析,不是宣称本站已实现每类环境。本站可运行的是缩小的有限动作环境;真实浏览器与容器集群的资源编排属于工程扩展任务。

真实源码:SWE-agent 的一轮做了什么

在 SWE-agent/SWE-agent 的固定版本 3ea751c087f32b16e039a2233dd6eefecef325d5,读取 sweagent/agent/agents.py::DefaultAgent.run:它先 setup,再循环 step,保存 trajectory,直到 step_output.done。DefaultAgent.step 调用 forward_with_handling,更新消息历史、submission、exit status 与模型统计,再追加轨迹。真实源码

输入是环境对象和 problem statement,输出 AgentRunResult 中包含 info 和 trajectory。这个调用链说明“模型调用”只是一步的一部分;异常处理、消息维护和记录都在 Harness 层。它是 Agent 执行源码,不能冒称为模型的 RL 训练源码。

再对照 verl AgentLoopBase.run 与 AgentLoopOutput:自定义循环最终要输出 token ids、动作 mask、可选 log-prob 和奖励等,使执行结果能够进入训练张量。训练接口 两个项目解决的边界不同:一个展示 Agent 编排,一个展示执行轨迹如何接到学习系统。

环境质量为什么限制训练上限

课程分析:大量任务如果无法稳定初始化,模型就会学习与网络、依赖随机故障混合的信号。若 reset 后保留上次答案,回放数据会泄漏;若 grader 与策略共享可写文件,策略可能改测试而不解决任务。环境质量包括可复现性、隔离性、覆盖率、可验证性以及失败分类,不只是任务数量。

设计 reset、step、close 时,至少区分无效动作、动作执行失败、基础设施失败、任务失败、预算耗尽和真正成功。Timeout 需要清理进程树,重试必须知道动作是否已经产生副作用。对写文件或提交表单一类动作,盲目重试可能执行两次。

工具协议层应保留原始模型输出与解析后的动作。Harness 自动纠正 JSON 可能有产品价值,但用于训练时应记录纠正行为,否则无法判断模型本身的协议遵循能力。

教学实验与生产差异

CODE / 可复制
python3 -m labs.run --experiment agent --seed 7

该实验提供有限状态、有限动作、明确终止和可执行奖励,并真实更新策略概率。观察训练日志中的成功率和轨迹,定位动作、状态变化与 reward 的对应关系。它不执行模型生成的 shell,不需要容器,不模拟软件依赖或 GUI。

工程任务:把实验的每个字段映射到上面的边界表;增加一个观察截断器和一种无效动作。完成 2×2 交叉实验:旧/新策略 × 旧/新 Harness。固定任务、种子与总动作预算,报告成功率、无效动作率、平均回合数。若只测“新策略 + 新 Harness”,不得将提升单独归因于模型。

进一步设计真实终端环境的任务 manifest:仓库 commit、容器镜像 digest、初始化命令、只读 grader、资源上限与输出产物。用一个空操作策略重复跑同一任务,若初始化状态不一致,先修环境再扩大 RL。

MAKE IT RUN

把这一章放进实验里

调整变量,观察机制,再运行本地 Python 实验验证。

进入实验

本章证据与源码

引用代表相应来源支持的结论,不意味着公开了完整训练配方。

源码观察SWE-agent:Harness 的 step 与 run 边界SWE-agent · 3ea751c087f3源码观察verl:多轮 Agent rollout 的标准化接口volcengine · 8e03c039f9a7源码观察SWE-bench:测试结果分组与修复判定SWE-bench · 02e7a74ffd0b官方事实Agent Lightning:训练和 Agent 执行解耦microsoft · ff9457587fb6

留下你的工程判断

记录一个还没有解释清楚的现象,或下一次实验要控制的变量。笔记仅保存在当前浏览器。

自动保存在本机 · 可在“我的学习笔记”导出
理解机制,比记住结论更重要。