SFT 合并数据质量评估:查历史与“找答案”式监督

2026-10-30 · Claude Opus 5.5 · 对象:A/C 去重合并 + B 后的 949 个源实例(A 936、C3 13;C1/C2/B 均为 A 的监督子集),以及 SWE50 基座 / Run1 / Run2 三轮共 150 条轨迹 · 只读审计,未训练、未评测、未调用教师 · 统计与 benchmark 观察均不可训练
564/936与评测同一正则下,正向监督含 git 历史探查的 A 实例(PR #7 的宽口径为 752/936)
568/936正向监督包含 H3 探查的 A 实例;H3 是复核候选标签,不等于全部违规
0 → 35/50教师特有的 fsck --no-reflogs --unreachable:基座 → Run2 用到的题数
71%抽样 H3 回合,两名模型标注员都判“不应模仿”(95% CI 51–85%)
71.5%监督 token 位于含 R1–R3 措辞的回合;不是“坏 token”占比
188/936未命中 H3/U、R2/R3 筛查的 A 实例;不等于质量认证

0. 结论

问题 1:正向监督里大量出现查历史,是否不合适?
这批数据里确实保留了不适合模仿的探查习惯,但 752 条不能整体判坏。752/936 用的是宽口径(git log/show/blame/rev-list/reflog),把 git log -5、git blame 这类正常查史也算了进去。应重点复核 H3:其他 ref、对象、tag 与时间窗探查,剔除明确寻找未来答案、重复无收益的动作(568/936 个实例、1,133 个回合含 H3 或 U)。理由有四条:
  1. 筛查中存在大量低收益动作。大量观察只是空输出、当前分支或普通历史;但有嵌套子模块漏清理的例外,不能声称零泄漏。--all 查询可达过去也可能合理。
  2. 动机是找答案。同回合推理常写着“找未来提交、找上游 PR”。
  3. 教师风格迁移的强证据。教师特有命令在基座 50 题里为 0,SFT 后出现在 32–44 题。
  4. 标注员判定不应模仿。两名标注员独立判断,71% 的 H3 回合不应模仿。
H1/H2(定位与可达历史考古)的抽样不应模仿率为 8%,不支持一刀切禁用 git 历史。H3 也不能只凭命令名删除,需结合意图、观察和后续用途。
问题 2:这批数据能否修复当前症候?
仅靠合并去重,不足以认定能修复当前症候。它改变重复曝光,不新增决策状态。另有三项缺口:
  1. 相关推理措辞普遍存在。71.5% 的监督 token 位于含 R1–R3 措辞的回合,其中也有大量正确推理与动作;屏蔽 H3/U 回合后,剩余 token 的 40.2% 仍位于含 R2/R3 的回合。这是需复核范围,不是应删除比例。
  2. 原生 read/edit 几乎没有成功示范。被监督的 read 有 95% 失败,edit 有 74% 失败。
  3. 学生重复调用和长截断之后的状态缺少直接监督(见第 8 节)。
因此,去重有明确的降冗余价值;查历史风格仍会被监督,复读与循环恢复缺乏直接示范。能否提升解决率,必须由重新训练和独立执行 dev 验证。
问题 3:FailForge(2026-08)与 OPRD(2026-10),哪个更适合本 SFT?
当前纯 SFT:优先采用 FailForge 式的无 gold 失败恢复数据生产;OPRD 的 IF SFT 作为小规模反馈遵循对照。未来在线训练:OPRD 更直接覆盖学生自身失败状态。这不是照搬任一完整配方:先去除已确认的外部答案依赖、修正工具路径合同,再在独立训练任务的真实失败状态中重执行。两篇都没有证明能修复本项目的复读症候,也没有公开可直接套用的 LoRA recipe。

1. 评估方法

先固定口径,再测量。凡是全量可算的都算全量,需要语义判断的才用分层随机抽样和双人标注,并分别报告不确定性。

维度操作定义测量方式证据级别
口径一致训练侧与评测侧用同一个分类器 git_history_taxonomy.py:H3 refs/对象/时间窗筛查;U 上游/网络候选;H2 考古可达历史;H1 定位;H0 工作区 git全量:A 中被监督的 15,700 次调用(15,089 次 bash),评测 13,263 次调用确定性,正则筛查
信息增益探查是否返回了 HEAD 之外的对象,或晚于 base 的提交环境源码(训练 aweagent/core/eval/setup.py:36、评测 image_builder/docker_utils.py:68)+ 全量观察分类 + 独立代理复核确定性 + 复核
迁移学生是否出现基座从未出现、教师特有的命令与推理措辞指纹 n-gram、模板一致率、Jensen–Shannon 散度(题目级 bootstrap 1,000 次),并以教师自身两半散度为基线风格迁移的强关联证据;不是失败归因
是否值得模仿被监督回合是否应获得正向 loss按回合类型分层随机抽 72 个回合(种子 20261030),两名独立模型标注(71 条 Opus/Sonnet;1 条因 Sonnet 限额由另一 Opus 独立补标);Cohen κ、Wilson 区间、按总体加权抽样估计,LLM 标注
覆盖学生在评测中所处的状态,在被监督回合中占多少状态特征分布对比(第 8 节)描述性,任务分布不同
其他缺陷上游副本抄写、失败工具调用被监督全量:观察→后续写入的逐字重合检测;read/edit 返回值分类启发式候选+具体证据复核

2. 口径校正:752/936 与评测的 9→46→45 不是同一个量

同一指标按“实例或题目中至少出现一次”计算。教师侧分母为 A 的 936 个实例,只计被监督调用;评测侧分母为 50 题。

数据表

3. 这些探查返回了什么

训练环境
runner 在 agent 开始前执行 remove_future_commits:所有 ref 重置到 HEAD,reflog expire --expire=now --all,再 gc --prune=now。轨迹里 git log --all 的顶端就是 (HEAD -> scaleswe) pre-agent commit,branch -a 只列出 * scaleswe。但清理只作用于顶层仓库:trufont_uharfbuzz_pr119 的嵌套 harfbuzz 仍保留远端分支和 tag。另一个 A 实例 asottile_add-trailing-comma_pr12 的不可达对象来自 agent 自己的 stash。
评测环境
vendor 中的 SWE-bench(02e7a74)构建镜像时:删除晚于 base 的 tag,执行 reflog expire 与 gc --prune=now --aggressive,并校验 git log --all --after=<base> 为 0 条,否则构建失败。这对应 2025-09 issue #465 的官方修复(PR #471 / v4.1.0)。在已读取的三轮观察中均未检出未来提交证据(各 0/50);没有逐镜像核对 digest 或提交祖先关系,不能认证环境完全无泄漏;“PR 号大于题号”的命中全部是假阳性,原因是 PR 号与合并时间不单调。

下图只统计“纯探查”调用,即每个 git 段都是 H3/H1、其余只有 head/grep 等过滤。混合命令的观察无法拆分,不计入。

4. 迁移证据:命令指纹与推理指纹

4.1 教师特有命令

教师侧为 936 个 A 实例中出现该命令(且被监督)的比例;评测侧为 50 题中出现的比例。

数据表
H3 命令模板基座Run1Run2教师自身两半
与教师被监督模板完全一致的比例3.4%70.9%68.3%—
与教师模板分布的 JS 散度(95% CI)0.98(0.95–0.99)0.34(0.29–0.42)0.31(0.21–0.42)0.096(独立等量子集)

JS 散度以 2 为底,0 表示分布相同,1 表示完全不重合。“教师自身两半”是把教师随机分成互不重叠的两组 45 题后的散度,由独立代理计算,作为“同一分布”的参照。基座的 0.98 主要来自一道题(django-12965)的 489 次日期窗口搜索,这个模板教师从未用过。

4.2 “找答案”式推理措辞

R1 揣测隐藏测试;R2 凭记忆回忆上游或新版本源码;R3 寻找目标提交或上游修复。正则只做筛查。R2|R3 对双标注“有找答案意图”的精确率为 75%,召回率为 62%。

5. 代价:探查与文件写入、长失控的相邻关系

指标教师(被监督)Run1Run2
H3 出现在首次检测到文件写入之前的比例86.8%85%75%
H3 调用的 step 中位数 / 每题中位数第 8 步 / 1— / 5— / 4
H3 后 3 步内出现长失控的比例(随机步基线)—13.0%(8.0%)11.2%(3.8%)

长失控指 stop_reason=length 且推理 ≥20,000 字符。探查之后的失控率是基线的 1.6–3 倍,但这是描述性的:两者可能共同发生在“卡住、不知下一步”的状态里,不能据此说探查导致失控。按“有无 H3”或“H3≥5”分组的 resolved 率在三轮之间方向不一致,且无 H3 的题在 Run1/Run2 只有 4 和 5 道,不作推断。

6. 查历史之外,同样需要处理的监督缺陷

6.1 上游副本:抄写证据

判据:从 U 调用的观察里取 ≥25 字符、含代码结构的行,检查其后同一实例的写入命令或 edit 参数中,是否逐字出现至少 2 行。这是候选检测,既会漏掉改写式采用,也会把已见代码、删除锚点误计为新增。

粗字符串重合候选表(未经完整采用核验)
独立复核实例实际可支持的结论
pallets_click_pr2509step9–10读取swe-rex环境Click8.3.1;工作区8.2.0.dev0。step16新增 prompt_kwargs: t.Any = {} 与 prompt_kwargs["show_default"] = self.show_default,推理说“Implement upstream patch”。支持外部后续版本实现采用,未对照隐藏gold。
liormizr_s3path_pr129 / pre-commit_identify_pr12外部副本已有目标接口/映射;后续写入包含此前保留文本中未见的多条实现行。支持外部实现采用,时间关系与官方目标补丁尚未核验。
joblib_threadpoolctl_pr163粗匹配的3行位于将被删除的old代码,教师还写“Same source.”。不能认定目标答案抄写。
trufont_uharfbuzz_pr119子模块额外refs可读,但目标绑定step5已写,之后才读4.2.0;父仓库本有4.2.0升级历史,旧头文件也已有API。确认清理未递归和切依赖构建,不能计作未来目标修复泄漏。

因此没有采用Worker初报“至少16个确认泄漏”的计数。需把外部实现采用、环境恢复与未来目标答案泄漏分级,后两者不能靠字符串命中相互替代。

6.2 失败的工具调用被正向监督

原生工具被监督调用中成功的失败原因学生 edit 报错(基座 / Run1 / Run2)
read21/392路径在会话工作区之外 274、文件不存在 9723/136 / 26/108 / 42/118
edit57/219路径在会话工作区之外 106、文件不存在 56

训练环境的用户提示写着“仓库位于 /workspace/<repo>”,read/edit 工具却不接受这个路径。教师只好改用 bash,因此 96.1% 的被监督调用是 bash,936 条轨迹里只有 57 次成功 edit、21 次成功 read 可以模仿。学生在评测中的 edit 报错是另一类问题:先 read 后 edit、old_string 匹配不上、old 与 new 相同。这支持正确原生工具示范稀缺、训练与部署契约不同;不能直接证明学生 edit 报错由这些数据导致。共有 440 个被监督回合含失败的 read/edit,涉及 300 个实例。

6.3 只屏蔽探查回合够不够

方案影响的被监督回合说明
屏蔽含 H3/U 的回合1,133(7.3%,token 6.7%)代价小,改变这些回合的正向训练目标;不保证生成习惯消失
屏蔽之后仍含 R2/R3 的回合2,734(剩余 token 的 40.2%,723 个实例)回合级屏蔽会删掉大量正当推理,不可行
只留未命中上述筛查的实例188/936大幅减小覆盖,也可能改变难度分布,不能当正式筛选方案

结论:需确认的探查与失败工具调用可经语义复核后屏蔽或隔离处理;含相关措辞的回合也承载大量实质分析;优先在干净环境里重新执行生成替代示范。只删推理文字、改写成仿佛独立想到的答案,可能破坏因果上下文,需独立消融。

7. 分层随机抽样与独立双标注

抽样总体为 A+C3 的 15,447 个被监督回合(A 本身为 15,434),按类型分为 4 层:含 H3(1,062)、含 U(71)、仅 H1/H2(872)、其他(13,442)。每层随机抽样,抽样单位为回合,层内不放回随机抽样,允许同一实例重复。两名标注员看到相同的可见前后文,彼此独立,不知道对方标签和总体统计;命令本身可见,因此不称完全双盲。一致性:imitate κ=0.68,类别 κ=0.71,找答案意图 κ=0.78,信息增益 κ=0.38(偏弱)。

8. 状态覆盖:数据有没有覆盖学生实际陷入的状态

以下按同一特征定义、同一文件写入检测器复算。训练分母含 A+C3 的 15,447 个监督回合;评测分母为各轮所有 assistant 回合。输入是下一动作之前的可见状态,文件写入仅为命令/工具返回启发式,不能称“改对”。

状态教师监督基座Run1Run2
第100个assistant回合之后0/15,447(0.00%)2,668/5,590(47.73%)554/2,872(19.29%)1,992/4,838(41.17%)
最近≥15次调用未检出文件写入1,237/15,447(8.01%)4,062/5,590(72.67%)1,644/2,872(57.24%)3,411/4,838(70.50%)
近5次调用同一调用重复≥3次0/15,447(0.00%)2,263/5,590(40.48%)714/2,872(24.86%)1,162/4,838(24.02%)
前一回合被length截断0/15,447(0.00%)95/5,590(1.70%)94/2,872(3.27%)70/4,838(1.45%)
输入上下文≥64,000 token5/15,447(0.03%)1,515/5,590(27.10%)319/2,872(11.11%)1,107/4,838(22.88%)
当前思考≥20,000字符3/15,447(0.02%)92/5,590(1.65%)90/2,872(3.13%)69/4,838(1.43%)

最直接的覆盖缺口是重复调用之后与截断之后:学生两轮约四分之一回合发生在重复状态下,训练监督为 0;学生两轮 164 个回合接在 length 截断之后,训练为 0。第 100 回合之后占学生两轮回合的 33.0%,训练为 0。这支持“当前成功教师轨迹没有提供这些状态下的直接恢复目标”,不证明成功示范没有预防作用。

基座也已有循环与长失控;同一检测器下,基座 26/50 题出现重复状态,29/50 题出现≥20K字符思考。不能把复读起源全部归于 SFT。回合份额会被少数超长轨迹放大,按任务计 Run1/Run2 的重复状态仍分别覆盖21/50、20/50。上下文的训练侧用序列token起点,评测侧用请求input_tokens,仅作量级对照。

另一个与反馈利用相关的错位:独立解析的训练测试命令有 96.7% 为 pytest,Django runtests.py 只有4次;学生两轮识别到的直接测试入口中,runtests.py 为55/304(18.1%)。这不能作为加入 benchmark 仓库的理由;应在独立训练仓库补充按项目规范选择入口、读取错误后改变操作的示范。

9. 合并数据质量评分卡

维度结论依据
格式与台账一致合格PR #7 已核对 1,735/1,735 个视图的 token、mask 和台账,没有非 assistant 监督位置。
结果可信度有执行依据,需重审936/936 通过 evaluator。旧审核标记 7 个上游实现依赖;本轮粗匹配 11 个候选(有重叠),需排除更早已见代码和正常依赖。330 个任务只声明 1 个 F2P 节点,测试判别力未验证。
benchmark 隔离精确家族检查通过与受保护 SWE Verified 仓库名单精确交集为 0;fork/语义近重复未全面复核。未来信息访问需另审。
过程监督:动作需修订H3/U候选回合 1,133 个;抽样H3回合中 71% 两模型都判不应模仿。失败的 read/edit 被监督 440 回合。
过程监督:推理高风险,需语义重审71.5% 的监督 token 所在回合含 R1–R3 措辞,不能整块计作坏监督。屏蔽 H3/U 后,40.2% 的剩余 token 仍位于命中 R2/R3 的回合,不等于这些 token 全部有害。
工具协议示范不合格成功的 edit 57/219、read 21/392,几乎没有原生工具的正确示范。
学生状态覆盖恢复状态覆盖不足重复/截断后监督未检出;≥64K上下文监督极少。是分布缺口,不证明教师示范无预防价值。
重复与权重去重可改善合并后 989 个视图;恢复区域的曝光份额只从 3.75% 升到 3.82%(PR #7)。
可迁移性风格迁移强证据教师特有命令和推理措辞从基座 0/50 升到 SFT 后的 32–48/50。

10. 能否修复症候

症候(基座→Run1→Run2)数据里的正面示范数据里的反面示范合并去重后的预期
查 git 历史 9→46→45H1/H2 正当查史H3 568/936 个实例、推理明说找目标提交仍被监督:去重不碰 A 的 mask
长截断复读 29→40→40被监督思考 P50 约 52 token;长截断之后的恢复示范未检出未检出静态复读文本无直接治疗证据
首次修改前失控 12→25→19C1 早期修改(去重后权重下降)86.8% 的 H3 出现在首改之前,示范了“先找答案”无改善依据
无成功修改 9→19→17bash 写入示范很多成功的原生 edit 只有 57/219无改善依据:edit 报错从 23/136 升到 42/118
自然完成 15→5→5904/936 条最终报告被监督—不是缺少报告样本:能否到达正确收尾状态仍需验证
遇错不改策略B 的 40 个恢复窗口(恢复曝光只占 3.82%)失败调用被正向监督覆盖太窄

11. FailForge 与 OPRD:哪个更适合本 SFT

比较项FailForge · 2026-08OPRD · 2026-10
真正解决什么原RFT把持续失败任务丢弃,导致能力缺口;把失败变成可模仿的成功执行。成功轨迹SFT不能充分利用失败状态;用提醒条件教师在学生自身前缀上提供在线分布监督。
谁重执行强教师 Kimi-K2.6;不是 Qwen3.5-4B。5次全失败→技能归纳→同一教师再跑5次→保留首条验证成功。当前学生在线执行,无提醒;教师不重采样,只给同一学生前缀打分。
训练对象原成功集+恢复轨迹,移除注入技能正文,标准SFT/NLL。先8,000条Coding SFT,再2,000条IF SFT;在线成功支路NLL,失败支路Top-100 reverse KL。教师为同架构模型,20/40/60/80%刷新。
关键证据(各自协议)4B Verified:RFT 59.6→66.2;等样本数替换59.6→63.8;无gold版64.2。Hint救回352题却只有63.8,程序技能救回218题得到66.2,说明救回数量不能替代监督质量。4B Verified:基座50.4→Coding53.6→IF55.8→完整OPRD61.2。IF后提醒跟随率49.3→77.1;446→222错误事件属于完整OPRD,不能归给IF。
本项目隔离约束主版诊断读取gold patch,泄漏裁判也读补丁,不能原样使用。可借无gold消融,只用允许可见的失败轨迹和真实观察;隐藏判分仍留独立入口。提醒不得揭示参考补丁;全局提醒可能用最终测试日志。本项目须限制为合法可见反馈,不能把隐藏judge日志搬进教师输入。
数据/计算成本已有标准SFT可复用;成本在真实环境重执行与教师采集。文中训练超参指向未读到的附录,无法核实LoRA/全参。IF子阶段可单独测试;完整OPRD需要在线rollout、同词表教师logits。论文配置16×H20、131K训练上下文;不是最小硬件下限,也没有本地双5090/LoRA吞吐证据。
当前最主要短板仍是教师分布;容易再次收集“顺利成功”而覆盖不到学生卡住状态;不清洗行为会继续蒸馏捷径。2,000条IF的完整构造与生成者未披露,不能据此复制数据;只做IF不能获得完整在线算法的61.2结果。

选择依据:当前要产出可供已有LoRA SFT消费的新数据,FailForge的恢复后SFT、等规模替换、无gold消融与目标更直接匹配。它没有要求改成白盒在线KL,便于把改进归因于数据。OPRD的优势在后续在线阶段:它正面解决学生访问状态与教师成功轨迹不同的问题。本轮应把IF当作竞争假设:若“收到明确提示仍不会遵循”是主要瓶颈,IF可能比增加程序性成功轨迹更合适,需对照决定。

本地改造应如何命名:在独立训练任务上采当前冻结学生的真实失败前缀,教师从同一可重放状态继续,按“失败原因→可迁移程序指导→真实执行→独立验证”生产替代目标。这是FailForge式、学生失败状态驱动的纠偏SFT,不是论文原样复现。前缀与工具观察loss=0,只监督经核验的新恢复输出;不把教师续写充作fresh RL组成员。

移除指导≠消除依赖。教师动作来自 π(a|历史,指导),删掉指导后训练 π(a|历史) 会有条件分布错位。FailForge只删注入技能、不改动作与推理;其“把推理改写成自行发现”的消融反而降至62.0。因此不能任意清洗文句或伪造发现过程。受污染前缀要从污染之前的真实快照重新执行;对无gold程序指导,应检查剩余可见证据能否支撑后续动作,并用无指导恢复评测验收。

两篇都未报告本项目的git探查/长复读指标,也未提供LoRA专属消融;主要成绩均未报多种子方差或置信区间。不同harness、任务分母、温度和回合预算下的百分比只用作论文内部证据,不能预测本项目能回到20/50或提高多少分。

12. 建议:数据修订与验证

顺序最小动作准入证据
P0 数据身份保留原train/dev家族划分;C1/C2作为标签合并,B按源轨迹控制重复;C3单列语义复核。新版本清单、原始hash、源消息位置和mask差异。989/976只是全量候选情景,不能把旧dev直接放训练。
P0 净化隔离确认读取并采用本项目外部答案实现的整条轨迹;复核H3/U,屏蔽明确越界探查和失败原生工具调用,保留真实观察与后续合法恢复。逐条证据链,区分依赖库资料、当前源码symlink、旧代码删除锚点和实际新增实现。不能直接删除所有H3/U。
P0 工具一致让生成环境提示中的路径与read/edit真实可用路径一致,补真实成功read→edit→测试→结束序列。成功工具返回和真实文件变化;不以exit=0替代工具成功,不要求一律native edit。
P1 恢复生产以当前学生在训练任务上的失误分布分层:重复探索、错误测试入口、工具契约、修改后回归、有效验证后的结束。优先替换低质监督,不先放大现有40条B。真实可重放前缀、合法可见反馈、恢复动作及独立判分;新增状态覆盖与唯一实例数。

最小鉴别实验(本轮未执行)

组相同数据底座上的变化所检验的问题
D0共同去掉已确认外部答案依赖后的A/C去重+B安全、可复算的参照分布
D1D0+语义确认的坏动作mask与工具合同修正过程净化是否改善行为
FD1中等监督token替换为无gold程序指导重执行的恢复轨迹程序性失败恢复是否改善解题与退出
ID1中等监督token替换为IF/反馈遵循恢复样本约束遵循是否是更直接瓶颈

F/I使用同一批独立训练任务或失败状态、同一教师、同等采集预算;各组从同一官方Qwen3.5-4B重新初始化LoRA,固定r16/α32(历史正式run配置)、目标模块、学习率调度、优化器、模板和有效监督token预算。与1个epoch或206步不能混为相同预算。主要评测不加提醒;另设带提醒诊断,检验“会不会遵循”与“能否自主纠错”。

主指标:独立家族dev上的真实resolved、配对新增回归和无指导恢复率;辅助指标:明确越界探查率、重复/长截断、有效文件修改、修改后验证、自然结束以及每题token/时间成本。先冻结阈值和协议再训练;现有SWE50已用于形成假设,仅作诊断,不能反复用来选数据或checkpoint。最终使用未参与选型的holdout并报配对置信区间,候选补种子或增大样本;50题中一题即2个百分点,不能凭一题差距宣布优胜。

13. 口径与限制

原文与本地依据

复算与审计文件

冻结统计、抽样清单、两份标签、原文摘录与独立审查存于 storage/audits/sft-git-history-20261030/。行为规则是诊断工具,不用于自动重写训练资格。

python -X utf8 analysis/swe/extract_train_tool_calls.py --source-root E:/Deeplearning/local_train --out <scratch>
DSH_REPO=E:/Deeplearning/deepseek-harness node --experimental-transform-types analysis/swe/extract_eval_tool_calls.mjs <scratch> base=<base-run> run1=<run1-run> run2=<run2-run>
python -X utf8 analysis/swe/audit_git_history_supervision.py --dump <scratch> --out <audit.json> --labels storage/audits/sft-git-history-20261030/sample-labels.json --strata storage/audits/sft-git-history-20261030/sample-manifest.json
python -X utf8 analysis/swe/build_git_audit_report.py --audit <audit.json> --extras storage/audits/sft-git-history-20261030/report-extras.json --out <report.html>
输入与代码哈希