8.2 Agent SFT 数据工程:拒绝采样与自愈轨迹合成
本节要点:高质量的监督微调数据(SFT Data)是赋予模型 Agent 基因的决定性原料。解密为什么真实人类日志无法直接作为 SFT 语料;深度掌握基于沙箱环境验证的 拒绝采样(Rejection Sampling / Best-of-N) 黄金管道;掌握 自愈纠偏轨迹合成(Self-Correction Trajectory Augmentation),让模型在面对真实报错时拥有极强的抗挫折弹性。
1. 数据的质量决定智商:为什么人类日志不可直接拿来 SFT?
很多人直觉上认为:只要把人类高级程序员在终端中敲命令的全部 Bash 历史日志记录下来,直接微调大模型,就能训出顶尖的 Coding Agent。 在实践中,这种做法被证明是极其灾难的:
- 充斥无效肌肉记忆与打字手误:人类敲错命令后按 Ctrl+C、中途去倒水离开 20 分钟、不小心按出
ls10 次等无意义动作大量混杂; - 缺乏显式因果推理(Missing Internal Thoughts):人类工程师在敲击
git cherry-pick之前,大脑中已经完成了对版本图的深思熟虑,但这个“思考过程”根本没有留在终端日志里!直接微调会让模型只学到表象的机械动作,却丢失了最核心的决策灵魂。
2. 拒绝采样(Rejection Sampling):用沙箱作为最终审判者
拒绝采样(Best-of-N Rejection Sampling) 是当今工业界合成万级高质量 Agent 轨迹的标准范式:
拒绝采样的三大过滤法则
- 物理确定性验收:坚决不用模糊的 LLM-as-a-Judge 决定,必须由客观测试套件的
exit code === 0作为正样本的准入绿灯; - 剔除冗余徘徊:在所有跑通测试的轨迹中,按“总 Token 消耗与步骤轮次”排序,优先保留最优雅精炼的路径,惩罚反复无常的多余步骤;
- 格式绝对合规:必须确保每一轮 Tool Call 的 JSON Schema 百分之百符合标准,格式有任何微小瑕疵的样本直接全盘剔除。
3. 逆向注错工程:让模型学会“绝处逢生”的自愈轨迹
在现实生产中,最优秀的工程师绝不是“永远不写 Bug 的人”,而是“当编译器和线上抛出诡异报错时,能够顺藤摸瓜秒级定位并修复的人”。
如果 SFT 数据集中全都是顺风顺水、一次通过的“假完美轨迹”,模型在部署到生产时一旦遇到未知异常就会直接呆住或无限道歉。 因此,顶级实验室会采用**主动逆向注错(Fault Injection & Self-Correction Pairs)**技术:
这种包含“逆境反弹”的轨迹数据,能够极大增强模型的认知韧性(Resilience),彻底戒掉无意义道歉的恶习。
4. 数据协议结构:标准 Agent SFT 对话格式
{
"trajectory_id": "traj_swe_django_0481",
"system": "你是一个严谨的资深全栈开发智能体,具备自主使用工具排查和修复代码的能力。",
"messages": [
{
"role": "user",
"content": "在执行 python manage.py migrate 时出现循环外键依赖死锁,请定位并修复。"
},
{
"role": "assistant",
"thought": "我需要先复现这个死锁异常。首先调用 grep 查找涉及外键定义的核心模型文件。",
"tool_calls": [
{
"name": "grep_search",
"arguments": { "pattern": "models.ForeignKey", "searchDir": "apps/auth" }
}
]
},
{
"role": "tool",
"name": "grep_search",
"content": "apps/auth/models.py:42: user = models.ForeignKey('Profile')\napps/auth/models.py:88: profile = models.ForeignKey('User')"
},
{
"role": "assistant",
"thought": "找到了两个互为外键的双向强依赖。应当引入中间代理模型或设置 swappable 解耦。我将使用 replace_file_content 修正 models.py。",
"tool_calls": [
{
"name": "replace_file_content",
"arguments": {
"filePath": "apps/auth/models.py",
"targetContent": "profile = models.ForeignKey('User')",
"replacementContent": "profile = models.ForeignKey('User', null=True, on_delete=models.SET_NULL)"
}
}
]
}
]
}5. 本节练习与反思
Interactive Practice · 概念巩固
在为 Agent 构建高质量 SFT(监督微调)训练数据时,为什么'拒绝采样(Rejection Sampling)'坚持使用自动化沙箱测试全绿(Exit Code 0)作为准入门槛,而不是依赖人工或者大模型评委的打分?
Interactive Practice · 概念巩固
在 SFT 轨迹数据合成中,'逆向主动注错(Fault Injection & Self-Correction)'的核心目的与收益是什么?
Last updated on