章节导航 第 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 是训练时数据工程的镜像”这一核心论点。
启示二:工具描述的精确性 → 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 双路线一致提升均逐字确认),但未经同行评议,未见第三方独立复现。
启示三:权限系统的分层设计 → 安全对齐数据的层次结构
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 的”真正诀窍不是配比而是调度”不冲突:调度决定何时喂,配比决定喂多少,两者是正交的两个轴。完整的操作指引应当是调度 × 配比双轴,而不是二选一。
⚠️ 适用边界(必读):该结论在受控逻辑推理设置下取得(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 蒸馏在预训练期一并提升推理与事实召回,在中训练期却拖慢事实召回获取(推理仍继续提升)。论文把根因追溯到教师置信度的数据域不对称——教师对程序性数据更自信,而学生更早习得低熵事实知识。同一项技术在训练的不同阶段效果相反,这是本章”推理时与训练时是不同时间维度的同构关系”论点的一个新佐证:阶段不是程度差异,而是性质差异。
顺带呼应本章启示七: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 默认值 | 数据标注保守主义 | 不确定时选择更安全的选项 |
Claude Code 给我最大的启发是:推理时的 Context Engineering 和训练时的 Data Engineering 是同一门学科在不同时间维度上的投影。在推理时精心设计的 System Prompt 结构、工具描述、权限层次、记忆管理——这些都可以”时间反转”,变成训练数据的设计原则。
理解了这个同构关系,就可以用”这个模型在推理时需要什么样的上下文”来反推”训练时应该给它看什么样的数据”。这比凭经验调数据配比要系统得多。
这篇专题会持续更新。随着对 Claude Code 源码更深入的分析和中训练实践的积累,我会不断补充新的交叉发现。