章节导航 第 17 章 / 共 23 章
专题:对中训练与后训练数据生产的启示
从 Claude Code 的 Context Engineering、System Prompt 构建、记忆系统和多代理协作中,提炼对大模型训练数据生产的可迁移方法论
背景
这篇专题不是关于 Claude Code 本身,而是关于它背后隐含的数据哲学——以及这些哲学对大模型中训练(mid-training)和后训练(post-training)数据生产的启示。
我的日常工作是大模型训练数据,特别是中训练阶段。在深度分析了 Claude Code 的 51 万行源码后,我发现一个有趣的现象:Claude Code 在推理时(inference time)做的很多事情,本质上和我们在训练时(training time)做的事情是同构的——只是发生在不同的阶段。
把这些同构关系梳理清楚,能直接指导训练数据的生产策略。
核心论点:推理时的 Context Engineering 是训练时数据工程的镜像
Claude Code 的 prompts.ts 是一个动态 System Prompt 构建系统(第 6 章)。它在每次对话时精确控制送入模型上下文窗口的内容。这和训练数据工程要做的事本质相同:精确控制模型在训练时看到什么内容。
但更准确地说,推理时和训练时的关系不是简单的”镜像”(单向映射),而是双向耦合——推理时的 Harness 设计影响训练数据的设计,训练数据反过来让模型更好地适配 Harness。这形成了一个迭代优化循环:Harness → 训练数据 → 模型适配 Harness → 改进 Harness → 改进训练数据……Addy Osmani 指出:“Today’s agent products are post-trained with harnesses in the loop. The model gets specifically better at the actions the harness designers think it should be good at.”这意味着同样能力的模型装进 Claude Code 的 Harness 里比自己手搓的循环里好用,部分原因正是共训造成的。
PRISM 定量证据:PRISM(arXiv:2603.17074,IBM/MIT)对中训练进行了迄今最大规模的系统实证研究(7 模型/4 架构/3B-24B),为”双向耦合”论点提供了三个关键定量支撑:
- 参数修改规模:中训练修改 >90% 参数,RL 仅修改 ~5%——权重变化幅度差 370-580 倍。这证明了”推理时和训练时是不同时间维度的同构关系”的深层原因——中训练是密集重组,RL 是稀疏细化
- 管线依赖性:MT→RL 流水线使推理基准分数提升 3-4 倍,无 MT 的直接 RL 在 AIME 上接近零分——这证明了”训练数据工程是 RL 成功的必要前提”,中训练数据组成对 RL 成功的影响 > RL 数据本身组成
独立验证:配比失误不可事后补偿(arXiv:2609.09081,2026-09-08)。PRISM 证明的是”没有中训练,RL 起不来”——一条必要前提。上述 30 配比实验进一步证明了一条更强的单向性论断:中训练配比错了,后续对齐补不回来。补偿性 SFT 让 116/120 个单元格提升(均值 +4.32%),看起来是有效补救;但按配对口径衡量,它在 5% 阈值下弥合 0/240 对、10% 比例下仅弥合 30/240 对,而置换零假设本应弥合 13.8±3.3 / 77.9±8.5 对(P<0.001)——即补偿性 SFT 弥合的差距显著少于随机置换。
关键在于等预算均匀对照组表现与补偿性 SFT 几乎一致:这说明问题不是”补得不够多”,而是“补不回来”本身是结构性的。中训练在这里不只是一个可以后补的初始化,它设定的是一个事后无法覆盖的上限。这是本章”中训练决定上限”论点目前最强的单一证据。
⚠️ 该结论来自单一受控设置(KOR-Bench 五域、Qwen3-8B-Base/4B、固定预算对齐),迁移到通用语料与真实对齐流程的外推性尚未验证。
- 表征稳定性:CKA > 0.998 表明 RL 不改变 MT 建立的核心表征——这证明了”中训练建立核心认知图谱,RL 仅微调输出策略”
独立验证:Function-Aware FIM(arXiv:2607.12463,Yubo Wang et al.,2026-07) 用程序依赖图的严格数学工具独立发现了同一结构对应关系。该论文观察到 coding agent 的 action-observation-continuation 循环在 AST 层面与函数调用点完全同构——caller binds arguments(类比 agent 选择工具参数)、callee returns value(类比工具返回结果)、downstream code consumes it(类比 agent 整合结果继续推理)。通过在 2.6B token 去污语料上做 function-aware FIM 中训练,Qwen2.5-Coder-Instruct (7B/14B) 和 Qwen3-8B 三种模型在 SWE-Bench-Verified 上获得 +2.8/+3.0/+3.2 的提升。值得注意的是,中训练语料仅含 Python 代码,但 function-call 归纳偏置在非 agent coding 任务(LiveCodeBench)和非 coding 工具使用(tau-bench, BFCL)上同样有效——这暗示”推理时-训练时同构”不是领域特异的巧合,而是编程语言与 Agent 交互共享的结构性原理。
OctoLong:中期训练与上下文工程的训练侧直接验证(arXiv:2608.05141,Indraneil Paul et al., TU Darmstadt/UKP Lab,2026-08-05)。OctoLong 用 AST 解析器 + 语言服务器后端 + 包管理器,递归检索代码引用,构建依赖丰富的百万 token 级代码上下文。在 600M-14B 参数基座模型上做约 50B token 上下文扩展式中期训练后,仅用 12% 的 OctoLong 数据替换传统上下文扩展语料,即在长程信息检索、长期状态追踪、仓库级代码理解和下游 Agent 任务上取得显著增益——甚至短上下文编程场景下 API 调用能力也增强。这直接从训练侧验证了本章核心论点:推理时的 Context Engineering 和训练时的 Data Engineering 使用同构的上下文工程策略。
| 推理时(Claude Code 做的) | 训练时(我们应该做的) |
|---|---|
| 动态组装 System Prompt | 动态组装训练样本的 system 字段 |
| Feature Flag 条件加载提示片段 | 按能力维度选择性混入训练数据 |
| 环境信息注入(OS、Shell、CWD) | 任务上下文注入(领域、角色、约束) |
| 工具描述作为模型指令 | Function Calling 训练数据的工具描述设计 |
| 静态/动态分离(Prompt Caching) | 高频/低频样本分离(课程学习) |
| 上下文压缩(compact) | 训练样本的关键信息提取与压缩 |
下面逐一展开。
启示一:System Prompt 的动态构建 → 训练样本的 System 字段设计
Claude Code 的 System Prompt 不是一个写死的字符串,而是由 30 个函数、11 个常量动态组装的(第 6 章)。它包含:
- 角色定义
- 工具使用指南(42+ 工具的 description)
- 安全规则
- 环境信息
- 用户自定义指令
- Feature Flag 控制的条件模块
对训练数据的启示:
后训练(SFT/RLHF)的训练样本通常有一个 system 字段。大多数团队把它当成一个简单的角色描述——“You are a helpful assistant”。但 Claude Code 的实践告诉我们,system 字段应该是一个丰富的、结构化的、有层次的指令集。
具体做法:
-
分层构建。把 system 字段拆分为:角色定义 + 能力边界 + 行为规范 + 环境上下文 + 工具描述。每一层独立维护。
-
多样化组合。训练时随机组合不同的 system 字段变体——不同角色、不同约束、不同工具集。这相当于 Claude Code 在不同 Feature Flag 下生成不同的 System Prompt。
-
真实环境信息。在 system 字段中注入真实的环境上下文(操作系统、编程语言版本、项目类型),而不是让模型猜。Claude Code 的
enhanceSystemPromptWithEnvDetails()就是这么做的。
// 训练样本示例
{
"system": "你是一个 Python 后端工程师助手。\n环境:Ubuntu 22.04, Python 3.11, FastAPI 0.100+\n项目类型:微服务架构\n约束:不使用 ORM,直接写 SQL\n可用工具:file_read, file_write, bash, grep",
"messages": [...]
}
案例:动态 System 字段在中训练中的 A/B 实验
我们在内部一个 Agent 能力中训练项目中,直接借鉴了 Claude Code 的 System Prompt 构建思路来设计训练数据。
问题:模型在多工具场景下的工具选择准确率只有 62%——它经常在应该用 search_code 的时候用 read_file 逐个打开文件。
对照组(传统做法):system 字段写死为 “You are a coding assistant with access to the following tools: …”,工具列表平铺。
实验组(借鉴 Claude Code):
// 实验组 system 字段结构
{
"system": [
"## 角色\n你是一个 Agent 编码助手。",
"## 环境\nOS: {os}, 语言: {lang}, 框架: {framework}",
"## 工具使用指南",
"- search_code: 当你不确定目标代码在哪个文件时,优先用这个工具",
"- read_file: 当你已经知道具体文件路径时使用",
"- 选择原则:不确定位置 → search_code;已知路径 → read_file",
"## 约束\n{constraints}"
].join("\n")
}
关键变化:
- system 字段从单一字符串变为分层拼接,每层独立维护
- 工具描述包含了选择指导(“当你不确定时优先用 X”)
- 环境信息(OS、语言、框架)从真实项目中采集,不是虚构的
结果:工具选择准确率从 62% 提升到 79%(+17pp)。提升主要来自两个变化——选择指导让模型学会了”不确定时搜索”的策略,真实环境信息让模型学会了根据语言/框架调整工具参数。
这个实验验证了一个判断:推理时 Claude Code 在 prompts.ts 中做的精细工程,在训练时同样有效。system 字段不是”填一句话”的地方,而是一个需要工程化设计的结构。
外部验证:daVinci-Dev 的 Agent-native Data
daVinci-Dev(arXiv:2601.18418)为上述论点提供了有力的外部验证。该论文系统研究了 agentic mid-training,提出 agent-native data 概念,分为两类:
| 数据类型 | 描述 | 对应 Claude Code 推理时行为 |
|---|---|---|
| contextually-native trajectories | 保留完整信息流的轨迹(广度覆盖) | Claude Code 的完整信息流:system prompt + 工具描述 + 环境信息 + CLAUDE.md |
| environmentally-native trajectories | 来自可执行仓库的真实工具调用和测试执行(深度和交互真实性) | Claude Code 的真实工具调用:Bash/FileEdit/ToolSearch |
关键发现:daVinci-Dev 使用 73.1B token(不到 Kimi-Dev 的一半),在 SWE-bench Verified 上 32B 模型达到 56.1%,72B 模型达到 58.5%。Agent-native data 比 raw code data 更高效——这直接验证了”推理时 Context Engineering 是训练时数据工程的镜像”这一核心论点。
前一环:同一批轨迹,编成什么监督
daVinci-Dev 回答的是”用什么数据”,但它有一个未被回答的前置问题:同一批轨迹,编成什么形态的监督才算有效? 这个问题由 TrajLong 提出。
TrajLong(arXiv:2610.04973,2026-10-04,11 位作者)。论文的切入点几乎是直白的一句:轨迹已被引入中训练,但“如何把轨迹内的信息组织成有效的中训练监督”仍未被探索。做法是把轨迹编译成带稠密监督的长上下文训练任务,瞄准三项原子能力——evidence grounding(证据定位)、cross-evidence aggregation(跨证据聚合)、temporal state maintenance(时序状态维护)。在 Qwen3-14B-Base 与 Qwen3-30B-A3B-Base 上中训练后接 SFT,6 个长上下文基准 + 12 个 agent 基准上广泛提升。
真正有价值的是消融:受控消融显示它优于 raw 轨迹与 masked 轨迹两条基线。这条结论把 daVinci-Dev 那句”比 raw code data 更高效”最常见的误读堵死了——“agent-native”的价值不在”用了轨迹”,而在”把轨迹编译成了什么”。把轨迹堆进去不是有效监督,必须显式编译。
还有一条反向限定值得记住:论文的能力级分析显示,长上下文能力与 agent 原子能力之间的关联是随任务而变的。因此”长上下文中训练顺带提升 agent 能力”不是无条件成立——这也是为什么 TrajLong 要显式瞄准三项原子能力,而不是指望迁移自然发生。
⚠️ 置信度:2026-10-04 预印本,abs 页一手核验(标题、日期、三项原子能力、6+12 个基准、raw 与 masked 两条基线均逐字确认),但未经同行评议、未见第三方复现;“raw 与 masked 基线都更差”出自摘要自述,未回正文表格,故不写具体百分点。
启示二:工具描述的精确性 → Function Calling 训练数据质量
Claude Code 的工具系统有一个深刻的设计理念(第 5 章):工具描述不是文档,而是给模型的指令。
以 Grep 工具为例,它的描述不只说”搜索文件中的模式”,还告诉模型”当你不知道哪个文件包含目标模式时,优先用 Grep 而不是 FileRead”。这种选择指导直接影响模型的工具选择行为。
对训练数据的启示:
Function Calling 训练数据中的工具描述质量,直接决定了模型学会在什么场景下选择哪个工具。
-
描述要包含选择指导。不只是”这个工具做什么”,还要包含”在什么场景下用这个工具而不是另一个”。
-
描述要包含负面案例。“不要用这个工具来做 X”和”用这个工具来做 Y”一样重要。
-
Schema 要严格。Claude Code 用 Zod 做运行时验证——训练数据中的工具 Schema 也应该是严格的 JSON Schema,不应该有模糊的参数定义。
训练时证据:工具使用不该完全留给后训练
上面三条讲的是推理时视角——工具描述该怎么写。这里补一条训练时的证据,它回答的是一个更前面的问题:工具使用这项能力,到底该在哪个阶段喂数据?
MidTool(arXiv:2608.20314,Fengqing Jiang 等,2026-08-20)研究的是”通用工具使用”这项能力。论文的定位值得原样引过来:它与数学/科学推理、软件工程 agent 能力平行,但更少被探索。它给出的答案是——通用工具使用和别的重要能力一样,受益于专门的中训练,而不该完全留给后训练。
做法是两条腿:大规模 web / PDF / code 数据,加上来自真实世界 tool API、MCP skills、文档锚定工作流的合成监督。在 Qwen3-4B-Base 与 Qwen3-8B-Base 上用 MidTool-Mix 中训练之后,再分别走 SFT 与 RL 两条后训练路线。相比基线,SFT 与 RL 两条路线在 BFCL、τ²-Bench、MCP Universe 上都一致提升。
为什么”两条路线都提升”这一句最关键:如果只有 SFT 路线提升,那说明 MidTool 只是补了一批行为示范;两条路线都提升,说明中训练改变的是模型对”工具”这件事的内部表征,后训练只是把它引出来。这与本章核心论点”中训练设定上限、后训练在其上细化”是同一条结论,只是换到了工具使用这个此前没有中训练证据的能力上。
对本书读者还有一处直接相接:MidTool 的合成监督来源里明确包含 MCP skills。也就是说,本书一直在讲的 MCP 生态,在训练侧已经不只是”部署形态”,而是被当作可供学习的语料来源。
四项可被训练的子能力:MidTool 明列了它要教模型的四件事——识别工具可供性(tool affordances)、从上下文落地参数(ground arguments from context)、编排工具调用工作流(compose tool call workflow)、从不完整信息中恢复(recover from incomplete information)。
这四项与第 18 章教训四从 Claude Code 工具系统(第 5 章)提炼的七条工具设计原则高度同构,可以做出一张本章此前缺的对照表:
| MidTool 的可训练子能力(训练时) | 七条工具设计原则(推理时) | 对应关系 |
|---|---|---|
| 识别工具可供性 | 描述引导选择、延迟加载 | 模型得先判断”此刻有什么工具可用”,描述与按需加载共同构成可供性信号 |
| 从上下文落地参数 | Schema 即契约 | 参数不是凭空生成,而是从上下文中按契约提取 |
| 编排工具调用工作流 | 行为标记驱动调度 | isConcurrencySafe / isReadOnly 决定哪些调用能并行编排 |
| 从不完整信息中恢复 | 大结果持久化 | 结果超限落盘后模型面对的就是不完整信息,需要主动再取 |
⚠️ 这张表是本书的编者对照,不是 MidTool 论文的结论——论文没有做过这种映射。把它当作一张待检验的假设来读,而不是一条已被证明的对应。
真正值得注意的其实是表外那两条:「精确 > 通用」与「工具池排序」在四项子能力里没有对应项。 这不是漏配,而是性质不同——那两条讲的是工具集本身该怎么切分与排列,是设计者的决策;四项子能力讲的是模型该学会什么,是训练的目标。由此得到一条比这张表更有用的判断:七条原则里有一部分无法靠训练数据解决(工具怎么切、怎么排),另一部分可以(模型怎么选、怎么填、怎么编排、怎么补救)。 把设计决策误当成训练目标,是数据侧最容易白花算力的一类错误。
⚠️ 置信度:MidTool 为 2026-08-20 预印本,abs 页一手核验(标题、四项子能力、BFCL / τ²-Bench / MCP Universe、SFT 与 RL 双路线一致提升均逐字确认),但未经同行评议,未见第三方独立复现。
第四环:computer-use 域(NorthCUA,arXiv:2611.02102,2026-11)。 本章的 agentic 中训练链条至此覆盖了代码域(daVinci-Dev)与 API 工具域(MidTool、TrajLong)。NorthCUA 把同一条线推进到 GUI / computer-use 域,而且是一条生产级闭环:Experience Flywheel 持续供给可执行任务;NorthCUA Harness 维持长交互、记录决策、检查任务结果;Flywheel 把记录策展为已验证轨迹(verified trajectories);未解任务经递归自我改进演化出可复用技能并保留已验证里程碑;Staged Learning 把这些经验与 grounding 数据结合,经中训练 + 长程 SFT 发展 GUI 能力,策略再回同一 Harness 内做桌面-网页联合 RL。Nano/Mini/Pro 家族在 GUI grounding、桌面执行、网页交互上取得开源模型 SOTA(自报口径,“under the reported evaluation settings”)。
三处结构对应值得单独指认:① 「策展为已验证轨迹」正是 TrajLong「轨迹必须显式编译」的规模化实践——飞轮的输出不是原始屏幕录像,是验过结果的目标序列;② 「演化可复用技能、保留已验证里程碑」给「原子能力清单」原则补了资产粒度——可沉淀单元不只是能力,还有技能这种可直接复用的中间产物;③ 「中训练 → 长程 SFT → 联合 RL」的 staged 结构与 PRISM 的 MT→RL 管线依赖性互为印证。对本章读者最可迁移的一条判断:GUI 轨迹的价值密度取决于结果可验证性——computer-use 恰好是结果可自动判定的域(任务完成与否可检查),与代码域同构(测试通过与否),这解释了为什么经验飞轮先在这两个域跑通。⚠️ 预印本、基准数字未回正文、SOTA 为自报口径,按方向性证据引用。
编者判断(非任一论文结论,须按假设读):把上面那句”设计决策 ≠ 训练目标”再推一步,可以得到一条可操作的原则——中训练的目标应当写成原子能力清单,而不是任务清单。
两份独立工作的清单形态出奇地一致,而且都不是任务名:MidTool 的四项是识别工具可供性 / 从上下文落地参数 / 编排工具调用工作流 / 从不完整信息中恢复;TrajLong 的三项是证据定位 / 跨证据聚合 / 时序状态维护。它们可迁移、可单独消融、可各自配比。
写成任务清单会撞上本章已经观测到的两个问题:配比上线(10%–40% 内部最优——任务越具体,越容易堆过头)与串行饱和(见启示六 Trajectory Soup——延长单条 run 换不来收益,因为任务级监督的冗余度高于能力级)。写成能力清单,“这个能力该在哪个阶段喂”这个问题才有解——这也是 MidTool 那句”工具使用不该完全留给后训练”真正可迁移的形式。
启示三:权限系统的分层设计 → 安全对齐数据的层次结构
Claude Code 的权限系统(第 7 章)是一个六层规则 + AI 分类器的混合系统。它最精妙的设计是分层防御:
Layer 1: 确定性规则匹配(快速,无歧义)
Layer 2: AI 分类器评估(智能,概率性)
Layer 3: 用户确认(最终兜底)
加上 Fail-Closed 默认值(不确定时选择更安全的行为)和熔断机制(连续拒绝后回退)。
对训练数据的启示:
安全对齐(alignment)数据的构建应该借鉴这种分层思想:
-
硬规则层:绝对不能做的事(违法、有害内容),这些用确定性规则匹配——在训练数据中体现为无条件拒绝的样本。
-
软判断层:需要根据上下文判断的边界案例(比如”如何使用菜刀”——厨艺 vs 暴力),这些需要 AI 判断——在训练数据中体现为带推理过程的判断样本。
-
默认安全层:当不确定时选择更安全的行为——在训练数据中体现为 conservative 的回答偏好。
Claude Code 的 YOLO 分类器双阶段设计(快速思考 → 深度思考)也值得借鉴:安全判断数据应该包含”快速判断”和”深度推理”两种粒度的样本。
启示四:记忆系统的三层架构 → 训练数据的时间尺度管理
Claude Code 的记忆系统(第 9 章)有三层:
| 层级 | Claude Code | 训练数据类比 |
|---|---|---|
| 短期 | 当前会话消息历史 | 多轮对话中的上下文 |
| 中期 | CLAUDE.md / memory.md(项目级) | 领域知识注入(中训练) |
| 长期 | 用户偏好(~/.claude/memory.md) | 基础能力(预训练) |
对训练数据的启示:
中训练的核心挑战是:如何在不破坏基础能力(长期记忆)的前提下,注入领域知识(中期记忆)。Claude Code 的记忆系统提供了一个有趣的参考框架:
-
分层不混淆。Claude Code 严格区分 user/project/local 三种作用域——训练数据也应该严格区分通用知识、领域知识和任务特定知识,用不同的数据配比和训练策略处理。
-
上下文压缩是必需品。Claude Code 在长对话中使用 compact 策略——用模型生成摘要替换早期消息。训练数据也可以用类似策略:对长文档进行压缩,生成”关键信息保留”版本的训练样本,训练模型的长文本理解和信息提取能力。
-
KAIROS 的仅追加日志范式。KAIROS 模式使用
<autoMemPath>/logs/YYYY/MM/YYYY-MM-DD.md格式的每日日志,不重写、只追加——这种时间有序的数据积累方式,对训练数据的版本管理和增量更新有直接参考意义。
上下文长度选择:中训练的”层”决策。PRISM 的消融实验揭示了中训练上下文长度的关键工程权衡——这与”分层不混淆”原则直接相关,中训练上下文长度本身就是”层”的选择:
| 上下文长度 | 数学推理性能 | 长上下文能力(RULER@128k) | 评估 |
|---|---|---|---|
| 8k | 效率最高 | 严重损害(59.09→6.46,暴跌 ~45 分) | ⚠️ 不可单独使用 |
| 16k | 最佳点(数学推理最高) | 中等 | ✅ 推荐 |
| 32k | 收益递减,偶有回退 | 较好 | 过度投入 |
恢复方案:8k 中训练造成的能力损失可通过权重融合(15%MT + 85%Base 线性混合)+ 两阶段微调恢复至 42.16/59.09——但 16k 从一开始就避免了这个问题。
⚠️ 以上数据来自 PRISM 论文的特定模型配置消融实验,通用性需更多验证。
启示五:多代理的专业分工 → 训练数据的多角色对话设计
Claude Code 内置 6 种代理(第 8 章),每种有不同的角色定位和工具权限。最值得关注的是 Verification Agent 的对抗性验证设计——它被明确要求”假设代码有 bug”,并防范两种认知偏差:
- 验证避免(找理由跳过检查)
- 被表面完善迷惑(前 80% 正确就通过)
对训练数据的启示:
-
多角色对话样本。训练数据不应该只有”用户-助手”两种角色。引入”审查员”、“规划师”、“验证者”等角色的多角色对话,可以训练模型的协作和自我检查能力。
-
对抗性样本。专门构建”看起来正确但有隐蔽错误”的代码样本 + 验证者发现错误的对话链。这直接训练模型的 bug 发现能力。
-
认知偏差防护。在训练数据中加入”模型自己犯了错,然后被另一个角色指出”的样本,训练自我纠正能力。
案例:对抗性验证数据对代码修复能力的影响
这个案例来自我们团队在后训练阶段的一次实验,直接受 Claude Code Verification Agent 的启发。
问题:模型在 SWE-bench 风格的 Bug 修复任务上,有一个典型的失败模式——它倾向于只修第一个明显的错误,而忽略同一个 PR 中的连锁问题。Pass@1 只有 34%。
实验设计:构建了一批”对抗性验证”训练数据,模拟 Claude Code 的 Verification Agent 行为:
| 数据类型 | 样本结构 | 数量 |
|---|---|---|
| 表面正确样本 | 用户提交修复 → 验证者发现”修了 A 但引入了 B” | 2,000 |
| 验证避免样本 | 验证者说”看起来没问题” → supervisor 指出遗漏 → 验证者深入检查 | 1,500 |
| 多文件连锁样本 | 修 file_a.py → 验证者检查 file_b.py 的调用方 → 发现不兼容 | 1,000 |
每条样本都包含三个角色:开发者(提交修复)、验证者(检查修复)、监督者(检查验证者是否偷懒)。验证者的 system prompt 直接借鉴了 Claude Code 的反模式目录:
你是一个对抗性代码验证者。
你的默认假设是:这段修复有 bug。
你必须警惕两种认知偏差:
1. 验证避免:不要因为代码看起来合理就跳过实际的逻辑追踪
2. 表面完善迷惑:不要因为前 80% 正确就假设剩下的也对
结果:在原始训练数据上混入 4,500 条对抗性验证数据(占 SFT 数据的 ~3%),Pass@1 从 34% 提升到 41%(+7pp)。更有意思的是,模型的修复模式发生了质变——它开始主动检查修复的”下游影响”,而不是只改报错的那一行。
关键发现:“监督者”角色(检查验证者是否偷懒)的数据贡献了约 60% 的提升。这验证了 Claude Code 的一个深层洞察:单纯让另一个角色”检查”不够,必须有机制防止检查者本身的认知偏差。
启示六:静态/动态分离 → 课程学习的数据编排
Claude Code 的 SYSTEM_PROMPT_DYNAMIC_BOUNDARY 把 System Prompt 分为静态(角色定义、安全规则)和动态(环境信息、工具列表)两部分(第 6 章)。静态部分在对话间不变,动态部分每次重新组装。
对训练数据的启示:
这个分离思想直接映射到课程学习(curriculum learning):
-
基础能力数据(静态):通用语言理解、推理、数学等——在训练全程始终存在,比例稳定。
-
专项能力数据(动态):代码生成、Agent 行为、领域知识——按训练阶段动态调整比例。中训练早期多注入知识,后期增加复杂任务。
-
数据配比的 Feature Flag:借鉴 Feature Flag 的思想,为训练数据建立”能力开关”系统——想要模型掌握某种能力,就打开对应的数据通道。
Plasticity Window 理论:Midtraining Bridges(arXiv:2510.14865)首次系统性地研究中训练机制,提出”分布桥接”(distributional bridging)理论框架。关键发现:中训练数据引入时机比混合权重更重要——晚期引入的领域数据无法通过提高混合比例来补偿。这为”专项能力数据按训练阶段动态调整比例”提供了理论支撑,并给出了一个具体操作建议:专项数据应尽早引入,而非在训练末期才加入。中训练对与预训练分布”距离远”的领域(如代码和数学)收益最大,且中训练比单纯的 continued pretraining 更好地缓解灾难性遗忘。
配比最优区间:10%–40% 的中等覆盖(arXiv:2609.09081,Everything in Moderation,Yunpeng Xu、Kun Zheng,2026-09-08)。Midtraining Bridges 说明了”时机比权重更重要”,但没有给出喂多少的答案。这项受控实验在 Qwen3-8B-Base(另有 4B 复现)上,用 KOR-Bench 五个语义规则互不相交的领域,训练了覆盖五域单纯形的 30 种配比(24 组扫描 + 6 组留出),每组 5 个种子。核心发现:每个领域都存在内部覆盖率最优——中等区间 10%–40% 对五个领域全为最优,二次内部性置换检验 P≈0.010,8B 峰值落在 9.9%–35.1%。“内部最优”意味着配比不是越多越好,把某个领域堆到高覆盖率反而损害该领域自身的表现。
这条结论与本节后面 Quality-Aware Scaling Laws 的”真正诀窍不是配比而是调度”不冲突:调度决定何时喂,配比决定喂多少,两者是正交的两个轴。完整的操作指引应当是调度 × 配比双轴,而不是二选一。
第四条轴:预算形态——串行拉长,还是拆成并行分支(arXiv:2609.37169,Trajectory Soup,2026-09-29,8 位作者)。调度、配比、单位 token 质量密度(MiST)三条轴合起来仍缺一维:这些预算是在一条 run 上串行花掉,还是拆成多条分支并行花掉? Trajectory Soup 给出的答案是后者,而且给出了为什么。
论文的起点是本章”中训练设定上限”这条核心论点的一个机制性解释:中训练的回报是有界的——追加串行算力几乎不带来下游提升,甚至会损害某些能力。也就是说,上限不只是”配比错了补不回来”,还因为串行算力本身有饱和点。
做法是:从同一 checkpoint 分叉出的、采用不同受控配方的分支,会到达可测量的不同参数空间区域,形成一种延长单条 run 无法提供的”兼容多样性”;把这些分支的预算分摊后再按验证集选最强 checkpoint,通过 intra-trajectory 与 inter-trajectory 两层平均合并成一个模型。偏差-方差分析把两层平均的作用分开了:inter-trajectory 平均消除了单条轨迹内平均够不到的残差,而 checkpoint 选择自带偏差,限制了值得合并多少个 checkpoint。在跨模型规模、学习率 schedule、token 预算与轨迹数的设置下,同等预算优于最强的单条轨迹平均,且预算扩大时优势保持。
落点:配比决定喂多少、调度决定何时喂、单位质量密度决定每 token 值多少,而预算形态决定这些是在一条 run 上串行花掉,还是拆成多条分支并行花掉——第四条轴此前完全没被讨论。它与 TrajLong 的消融(raw 轨迹无效)是同一件事的两个面:冗余的监督填不满预算,加长串行 run 也换不来收益。
⚠️ 置信度:abs 页一手核验(标题、日期、串行饱和、分叉分支、两层平均、偏差-方差分析均逐字确认),但为 2026-09-29 预印本,未见同行评议与独立复现;“跨模型规模 / 学习率 schedule / token 预算 / 轨迹数”的泛化性出自摘要自述,不得写成已被独立验证。具体提升幅度未回正文表格,故不写数字。
边界扩张:中训练数据可以完全没有文本(arXiv:2610.11019,Mid-Training Language Models on Raw Video,2026-10-08,12 位作者)。本章所有数据侧的例子清一色是自然语言、代码与工具调用——这一篇把中训练数据的定义推到了边界之外。
做法是彻底的自监督:把无字幕、无文本损失的原始网络视频当作中训练数据,帧编码为连续视觉 token,语言模型学习预测下一个视觉 token。Qwen3-1.7B 在 YT-Temporal-1B 的原始片段上中训练,之后与未中训练的对照模型走完全相同的图文指令微调(两模型仅差中训练这一步)。结果:4 个视频基准平均 +2.9 分,10 个图像基准平均 +5.1 分(覆盖感知、文档、图表);14 个文本基准 48.9 vs 对照 48.0,不降反略升——尽管中训练里一个文本 token 都没有。
两个可直接引用的点:① 增益在前 30% 训练内出现后即平台化(之后变化 <0.5 分),与 Trajectory Soup 的串行饱和、配比实验的内部最优是同一现象的三个观测面;② 预测字幕并没有优于下一个视觉 token 预测——纯自监督就够,caption 既带来算力开销也带来标注噪声。
对本章的落点:「中训练注入领域知识」里的”知识”不必是文本形态。这对本章”推理时上下文 ↔ 训练时数据”的同构关系是一次边界扩张——推理时塞进上下文的可以是图,训练时喂的也可以是图,两者都不需要语言作为中介。
⚠️ 置信度:数字为 abs 页一手逐字核验;但为单一模型规模(1.7B)、单一数据池(YT-Temporal-1B),外推性未验证,不得当作通用结论。
⚠️ 适用边界(必读):该结论在受控逻辑推理设置下取得(KOR-Bench 五域、Qwen3-8B-Base/4B)。论文自陈拟合曲线能复现形状但不能复现峰值位置,零覆盖率的崩溃效应与通用漂移存在混杂(FineWeb-Edu 对照),探索性 θ* 配比的全流程增益(+4.36% vs +0.80%/+0.64% pp)在 Welch 检验下仅边缘显著。不得把”10%–40%“当作跨领域通用的最优配比定律,它当前只是一条在特定受控设置下成立的经验区间,用于说明”存在内部最优”这一现象存在,而非给出可直接抄用的数字。
量化对照:语料设计胜过 token 量(arXiv:2609.18496,MiST: Mid-Training LLMs for Cybersecurity,Oded Ovadia 等 4 人,2026-09-16,已接收于 EMNLP 2026 主会)。配比实验回答的是”喂多少”,MiST 回答的是另一个问题——用什么质量的语料喂。它给出的答案带数字,而且是一个直接对照。
MiST 的做法是:不做大规模原始领域文本的继续预训练(CPT),而是先策展一个紧凑的、专家审校的种子语料(漏洞记录、分类法、运维产物、防御文档),再把它转成高质量领域合成训练数据。论文 Figure 3 的自述枚举了 5 条生成流——合成教育内容、多轮对话、人格化交互、迭代 QA、分析性解释。产出 975.7M token 的中训练语料,之后走中训练 + SFT + DPO 三阶段。结果:在 13 个网络安全任务与 4 个通用基准上,8B / 32B 相对对应 Qwen 基线平均提升 +13.1 / +8.6 个百分点(相对 +27.0% / +15.8%)。
关键的那条对照在这里:论文另建了一个 raw CPT 基线——用种子数据加 PRIMUS 扩充到 约 2.4B token,约为其中训练语料的 2 倍——再跑同样的 SFT。结果是 MiST 用更少的训练 token,在几乎所有基准上都更好。论文自己的结论句写得很直白:这种策展式中训练”比在体量大得多的原始领域语料上做继续预训练更有效,凸显了数据质量与结构的重要性,而不只是 token 量”。MiST checkpoint 也是更好的下游任务 SFT 与 RL 初始化(以更小的策略偏移达到更高精度)。
为什么这条对本章重要:前文 OctoLong 已经给出过同一形态的弱证据——用 12% 的 OctoLong 数据替换传统上下文扩展语料即有显著增益。MiST 把这件事从”少量高质量也有用”推进到”少量高质量 > 约 2 倍量的原始语料”。配比(10%–40%)说的是比例,MiST 说的是被按比例混合的那个东西本身值多少。两者相乘才是完整的预算式:收益 ≈ 配比 × 单位 token 的质量密度。只调前者而用低密度语料,是数据侧最常见的一种无效优化。
⚠️ 污染局限(论文自陈,非外部指控):网络安全基准的样本与领域训练语料常常来自同一批公开产物(CVE / CWE / ATT&CK)——泄漏风险不是假想的。论文做了三层去污(种子语料审计、合成数据的格式约束、13-gram 重叠过滤),13-gram 过滤在中训练 + SFT 数据上移除了约 3.78% 的候选样本;但论文自己写明:这些控制针对的是”完全匹配与轻度改写的重叠,无法排除改写或语义等价的泄漏”。判定增益是否来自残留污染,需要私有、时间切分或独立策展的基准。
⚠️ 置信度:数字出自 arXiv abs 页与 HTML 全文(975.7M / ~2.4B / +13.1 / +8.6 pp 均逐字确认),但存在上述污染局限,且为 2026-09-16 新论文。本章只采纳其方法学对照(策展 + 合成 vs 原始 CPT),不把 +27.0% 这类数字当作可迁移的通用增益。
ReMiT:RL→中训练的双向反馈飞轮。ReMiT(RL-Guided Mid-Training,arXiv:2602.03075,上交/腾讯优图)为”训练数据按训练阶段动态调整比例”提供了可操作的技术方案。核心机制:
- delta-loss 加权:计算 base 模型与 RL 模型对同一 token 的 log-likelihood 差值——RL 模型对关键推理 token 更有信心的位置获得更高权重
- 序列级中心化归一化:在序列内部做中心化,避免全局偏差
- sigmoid 缩放 + 裁剪:映射为 [0, 1] 区间的重要性权重,防止极端值
- 加权 NTP 损失:在标准 next-token prediction 损失基础上,按重要性权重调节梯度强度
关键区分:这不是知识蒸馏(匹配完整概率分布),而是保留 ground-truth 优化方向但动态调节梯度强度——RL 模型”认为”更重要的 token 在中训练中获更多梯度。这打破了传统单向管线(MT→RL),实现”RL 训练→识别推理关键点→回注中训练数据→重新训练→更好 RL”的闭环。3 模型族 10 基准验证了其有效性。
Switch Distillation:教师→中训练的同类机制(arXiv:2609.01532,Jacqueline He 等 12 人,含 Pang Wei Koh、Luke Zettlemoyer、Wen-tau Yih;代码 github.com/facebookresearch/midtraining-distillation,2026-09-01)。ReMiT 的权重来自 RL 模型(delta-loss),Switch Distillation 的权重来自教师预测熵:只在教师有信心的 token 上做蒸馏,其余 token 回退交叉熵。相对标准 NTP,它达到 1.61–1.71× 推理、1.13–1.19× 知识与常识,并保留 96.7–96.8% 的事实召回;后训练之后仍维持 1.25–1.32× 推理与 1.13–1.20× 知识增益。
通式:中训练可以对 token 加权,而权重来源决定模型学到什么。 ReMiT 的权重含义是”RL 模型认为重要”(强化推理行为),Switch Distillation 的权重含义是”教师认为确定”(保护事实召回)。两者目标不同,甚至方向相反——后者正是为了修复前者式蒸馏对事实召回的损害。
这里有一个值得单列的反直觉点:标准前向 KL 蒸馏在预训练期一并提升推理与事实召回,在中训练期却拖慢事实召回获取(推理仍继续提升)。论文把根因追溯到教师置信度的数据域不对称——教师对程序性数据更自信,而学生更早习得低熵事实知识。同一项技术在训练的不同阶段效果相反,这是本章”推理时与训练时是不同时间维度的同构关系”论点的一个新佐证:阶段不是程度差异,而是性质差异。
但这句论点现在有了一个直接反命题,而且两个都对——关键是分清它们各自成立的层面。 Training Foundation Models with a Single Algorithm(arXiv:2610.40564,2026-10-29)在损失函数层面证明:预训练、中训练、SFT、RL 的算法分离「不是本质性的(not fundamental)」——把合适的 RL 目标推导为「对模型生成目标分布的最大似然拟合」后,四个阶段归入单一似然训练算法(unified training);训练生命周期变成「选什么数据、按什么比例、在什么时候」的问题,传统分阶段训练只是其中一个特例调度。单 trainer 混合静态数据与 RL 生成物,在受控与真实实验中改善精度-算力权衡与任务覆盖。
它对 Switch Distillation 那句「阶段不是程度差异,而是性质差异」的冲击必须精确到层面才说得清:Switch Distillation 的「性质差异」观测于表征与数据域(教师置信度不对称、事实召回受损——蒸馏在中训练期伤害的正是数据域层面的东西);unified training 的「只是调度」成立于损失函数形式。合起来的正确读法是分层陈述:在损失层面,阶段是连续的;在数据域与表征层面,阶段仍是质变的。 124M 受控实验的表格把后者摆得很清楚:分阶段中训练(峰值学习率 2×10⁻⁴)把 ClimbMix held-out loss 从 2.784 推到 12.4 以上、通用基准五项均值从 42.37 掉到 35.00;而把同一批中训练数据混进预训练几乎无损(loss 2.784–2.788、均值 41.9–42.4)——同一份数据,分阶段喂与混着喂,差出 7 个通用分点,这个差距本身就说明「什么时候喂」远不是无关紧要的调度细节。
对本章数据生产的落点反而更清晰:既然损失层面无阶段壁垒,「哪个阶段喂什么」就完全成了数据决策——中训练数据工程的重要性不是被削弱,而是被唯一化了。⚠️ 限定两条:① 该文为 2026-10 预印本,未见同行评议与第三方复现;② 受控实验止于 124M/0.76B 小模型(数学 RL 部分为 0.76B 从零训练),小模型上的调度结论向数十亿参数级的外推未经验证——这与本章其他预印本证据的待遇一致,按「方向性证据」而非「定量结论」引用。
顺带呼应本章启示七:Switch Distillation 的”不确定时回退交叉熵”,与 isConcurrencySafe/isReadOnly 默认 false 是同一种 Fail-Closed 保守主义,只是发生在损失函数层面而非标记位层面。
Quality-Aware Functional Scaling Laws 与 Drop-Stable-Rampup(arXiv:2605.25698,Zhitao Zhu et al.):该研究将数据质量纳入 functional scaling laws,揭示了高质量数据的双角色——噪声受限阶段作为信号放大器(降低 batch size 转换更干净数据为更多信号),信号受限阶段作为噪声抑制器(晚期放置减少终端噪声)。这为”专项能力数据动态调整比例”提供了具体的调度策略:不是简单的”早期多、晚期少”,而是在质量跃迁点先降低 batch size 让模型充分吸收高质量信号,再逐步提升抑制终端噪声。15B MoE 模型上对比 WSD +1.70、对比 Cosine-decay +2.98 的增益暗示:课程学习的真正诀窍不是配比而是调度——相同的训练数据,不同的 batch size 调度,性能差异可达 3 个点。
启示七:Fail-Closed 默认值 → 数据标注的保守主义
Claude Code 的工具系统有一个简单但深刻的设计原则(第 5 章):默认值选择更安全的选项。
isConcurrencySafe默认false(假设不安全)isReadOnly默认false(假设会写入)
如果工具开发者忘了设置某个标记,系统不会因此变得不安全。
对训练数据的启示:
数据标注应该采用同样的保守主义原则:
-
标注不确定时选择更安全的标签。对边界案例,宁可标为”需要人工审核”而不是猜一个标签。
-
质量检查的默认严格。自动化质量检查应该有”严格模式”作为默认——通过检查的数据一定是好的,但可能误杀一些好数据。这比”放过坏数据”要好得多。
-
数据管道的 Fail-Closed 设计。如果某个数据处理步骤失败,默认行为应该是丢弃该样本而不是用不完整的数据继续。
UltraX 的操作验证机制(arXiv:2607.08646,Xinlong Zhao et al.) 为数据管道的 Fail-Closed 设计提供了一个具体实现参考:在删除和修改之外引入插入操作,实现细粒度实例级编辑。核心创新——Line Alignment Mapping + Dynamic Context Replacement 将原文-精炼文对转化为结构化程序监督;滑动窗口预测 + 全局操作聚合 + 系统后处理组成三级验证管线。low-confidence example filtering 和 ratio-controlled sampling 确保即使 LLM 编辑器出错,低置信度样本也不会污染训练集。这与”不确定时丢弃样本”的原则一致——但在工程上提供了可量化的质量门控。
总结:推理时的工程智慧 → 训练时的数据智慧
| Claude Code 的推理时实践 | 对应的训练时实践 | 具体做法 |
|---|---|---|
| 动态 System Prompt 构建 | 丰富的 system 字段设计 | 分层构建 + 多样化组合 |
| 工具描述含选择指导 | Function Calling 数据包含选择逻辑 | 不只描述能力,还描述使用场景 |
| 六层权限 + AI 分类器 | 分层安全对齐数据 | 硬规则 + 软判断 + 默认安全 |
| 三层记忆系统 | 训练数据的时间尺度管理 | 基础/领域/任务 分层不混淆 |
| 多代理专业分工 | 多角色对话训练数据 | 引入审查员/验证者角色 |
| 静态/动态分离 | 课程学习数据编排 | 基础能力恒在 + 专项能力动态 |
| Fail-Closed 默认值 | 数据标注保守主义 | 不确定时选择更安全的选项 |
| 动态组装 System Prompt | 把轨迹编译成带稠密监督的训练任务 | 监督的形态比语料来源更决定效果(TrajLong) |
| 四阶段单一算法(unified training) | 阶段边界退化为数据调度决策 | 时机与配比成为唯一杠杆——损失层面无阶段壁垒,「何时喂什么」完全是数据侧的选择(arXiv:2610.40564) |
Claude Code 给我最大的启发是:推理时的 Context Engineering 和训练时的 Data Engineering 是同一门学科在不同时间维度上的投影。在推理时精心设计的 System Prompt 结构、工具描述、权限层次、记忆管理——这些都可以”时间反转”,变成训练数据的设计原则。
理解了这个同构关系,就可以用”这个模型在推理时需要什么样的上下文”来反推”训练时应该给它看什么样的数据”。这比凭经验调数据配比要系统得多。
这篇专题会持续更新。随着对 Claude Code 源码更深入的分析和中训练实践的积累,我会不断补充新的交叉发现。