问团队怎么做编码智能体,他们讲模型;问模型学的是什么,他们指向一个装着 commit 的文件夹。但 commit 只是任务的答案,不是到达答案的路径。
这个差别比多数团队以为的更重要。只见过干净最终补丁的智能体,从来没有看过错误被纠正的过程,而纠错恰恰是这份工作的大部分。
diff 是电影的最后一帧
编码智能体在一个循环里工作:读、判断、执行、看结果、再判断。训练信号就活在这个循环里。如果语料只保留最后状态,模型学到的是「改完长什么样」,而不是「怎么改过去」。
轨迹也是失败模式唯一的记录处——参数写错的工具调用、并不存在的文件、重复三次才放弃的死循环。
一条可用的轨迹记录里有什么
- 用户真实的原始任务描述,不是整理过的版本
- 起始状态快照:版本号,以及未提交的改动
- 每一步一行:观察到了什么、调用了哪个工具、参数是什么、返回了什么、是否成功
- 终局:测试通过、测试失败、放弃、超时
- 出错位置的简短标签:工具错、路径错、死循环、放弃
没有逐步记录,这条轨迹只是一段轶事;有了它,就是可筛选的——你可以单独取出「从一次失败命令中恢复」的轨迹,或者从未碰过测试文件的轨迹。
保留失败分支
直觉是只交付成功的轨迹,这是错的直觉。恢复能力恰恰是从「失败后被修好」的轨迹里学来的,而这类轨迹在任何智能体语料里都最稀缺。
失败也是教模型「什么时候该停」最便宜的方式。从没见过死路的智能体,对死路没有校准过的感觉。
按仓库和时间切分
按行随机切分会泄漏:同一个辅助函数同时出现在训练集和留出集里,分数涨了,但换个代码库就不成立。
先按仓库切;同一仓库必须两边都出现时,再按时间切,让留出任务来自模型不可能见过的工作。然后在训练之前——不是之后——检查两侧是否近似重复。
交付前我们跑的清单
- 每一步都有观察、动作和返回?
- 不读 diff,也能区分「恢复后的失败」和「一次成功」?
- 起始状态有记录,轨迹可以重放?
- 留出任务按仓库或时间隔开了?
- 清单里写明了每一类覆盖哪些语言、哪些任务类型?
答不上这五条,模型照样能训。只是它会学会「看起来很笃定」,这是最贵的那种失败。
从哪里开始
如果你训的是智能体,而不是代码补全,先选与你要它跑的循环最接近的那一类。代码与智能体轨迹语料写清了每一类里有什么,语料总目录则按训练阶段说明同一批素材怎么用。
这些轨迹由 Zovda 出品,Datuva 平台把每一步、每次工具调用和补丁一起版本化,奖励信号能追到具体某一次运行。
告诉我们你要训练的循环和需要的量,我们会在 1 个工作日内回复;范围确认后提供字段说明。
