从 vibe coding agent 到后训练,从零开始的实验科学

从 vibe coding agent 到后训练,从零开始的实验科学

💡 原文中文,约6900字,阅读约需17分钟。
📝

内容提要

作者通过后训练提升Agent性能,构建A股投资Agent时发现小模型工具调用和推理能力不足,随后用SFT和GRPO训练7B模型,通过NGRPO方法将测试准确率提升至85%,接近DeepSeek-Chat水平。文章还讨论了调试工具和训练框架(如verl)的使用体验。

🔎

延伸解读

主Agent瓶颈与状态机形式化

作者指出,多Agent系统中主Agent常因状态机维护不当而出现人格漂移或状态丢失,这源于指令依从和上下文窗口限制。他提出用后训练让小模型学会状态机的形式化描述,使主Agent专注决策,同时小模型推理更快。这提示,Agent架构的瓶颈往往在中心节点,而针对该节点的专项训练可能比整体优化更有效。

SFT与RL的权衡

作者在SFT后发现工具调用能力提升但推理变弱,而强化推理数据又导致工具使用下降,他引用研究称推理和工具使用的梯度方向不一致。这反映了单一后训练方法难以同时优化多种能力,实际中可能需要结合多种数据或算法,或采用更复杂的训练策略,如多任务学习或交替训练。

NGRPO的实践价值

作者在GRPO训练中遇到奖励方差过小、模型不学习的问题,通过引入NGRPO(虚拟满分样本)强行拉大方差,最终将测试准确率提升至85%,接近DeepSeek-Chat。这表明在奖励稀疏或方差不足时,调整组内统计量计算方式是一种简单有效的改进手段,尤其适合资源有限的小团队。

调试工具与训练框架的现状

作者在调试Agent时发现现有工具(如MoonPalace、litellm)难以满足需求,自己开发了简易调试器,并指出缺乏类似GDB的Agent调试工具。同时,他体验了verl和slime框架,认为它们降低了RL门槛,但超参数众多且易混淆。这反映出后训练工具链仍不成熟,开发者需自行解决调试和配置问题。

Q&A

作者为什么决定训练一个小模型来管理状态机?

作者发现主 agent 是系统瓶颈,需要维护状态机并处理所有决策,导致效率低且容易出错。训练一个小模型(如 3B、7B)专门学习状态机的描述和更新,可以让主 agent 专注于决策规划,同时小模型推理更快,提升整体效率。

作者在 vibe coding 一个 A 股投资 agent 时,遇到了哪些调试困难?

调试 multi-turn agent 很麻烦,因为模型中间任何一轮出错都会导致最终输出不正确,且难以判断哪一轮贡献了最终奖励。作者尝试了 MoonPalace 和 litellm,但前者不支持更多模型,后者不是为调试设计的,最终自己写了一个简单的 debugger 来记录请求信息。

作者用 SFT 训练 7B 模型后,出现了什么问题?

SFT 后模型工具调用能力提高了,但推理能力变弱,例如在区分 A 股和港股时,模型会反复确认,导致效率低下。作者尝试过采样强调推理的数据,但工具使用能力又下降,怀疑是推理和工具使用的梯度方向不一致,或数据质量低。

NGRPO 方法是如何帮助作者提升训练效果的?

NGRPO(虚拟满分样本)在计算组内统计量时添加一个虚拟满分样本作为参照,强行拉大 reward 的方差,解决了 reward_std 低、模型不学习的问题。作者实现后,测试准确率提升到 85%,接近 DeepSeek-Chat 的水平。

作者在使用 verl 框架进行 GRPO 训练时,有哪些配置注意事项?

verl 有 50 多个超参数,但大部分可从 examples 或 recipe 中抄。需要注意区分 actor 和 ref model 的 FSDP 配置,如 param_offload 和 optimizer_offload。资源不足时都设为 True,资源充足时可关闭 actor 的 offload 提升效率,但不要搞混 actor 和 ref 的参数,否则训练效率会很低。

作者对后训练框架(如 verl 和 slime)的整体评价是什么?

作者认为 verl 和 slime 这样的框架让 RL 训练门槛降低了很多,配合 GPT 老师的指导,能让人快速开始实验。verl 做 SFT 不需要 Ray,而 slime 需要,作者因此先尝试了 verl。

🏷️

标签

➡️

继续阅读