从命中率到缺陷量:代理式语料审计的缺陷量账本与部署单元重置
提出 DML,把「流行率 × 人工精度」的乘积与区间建成第一等公民,把审计的部署单位从全库改成单个 crawl,并补上跨运行复现率、饱和预算臂与植入缺陷的反向对照,用于判定一次代理式语料审计到底确立了多少缺陷量。
背景与动机
多语预训练语料的生产方式是「一套配方跑一千种语言」:FineWeb2(arXiv:2506.20920)把同一条过滤与去重流水线适配到每一种语言,单语的分片缺陷落在设计视野之外。斯洛伐克语分片 slk_Latn 有 26,470,482 条文档、351,844 个 host、96 个 Common Crawl 快照(2013–2024),均值 438 词,没有一条文档低于 FineWeb2 为该语言公布的 language_score 阈值 0.667。
Šuppa、Vykopal 与 Kopčan(arXiv:2610.31636)换了一条路子:LLM 只用一次,当语料调试器而非分类器。一个带工具的 agent 通过 11 个只读工具、300 次文档查看预算、250 轮上限去探索语料,把每条发现编译成一条可执行的选择器加一条对未来语料的断言,再由母语者对盲标样本判定。部署阶段不再调用任何模型。三次运行分别花 2.84、$2.45,产出 7 条发现、合并成 4 类现象;编译出的测试套件在单机上 0.7 秒扫完 26,470,482 条文档。最大的发现是 *.firebaseapp.com 与 *.web.app 上的机器生成内容农场,1,408,437 条文档(5.32%)、2,851 个 host、均值 1,011 词,贡献语料 12.3% 的运行词;其中 86.6% 连更严格的阈值都过。三次主运行与四条静态基线都用 claude-sonnet-5,经 Claude Code CLI(v2.1.231)默认采样、不设 temperature。对照侧的不对称不止「谁选读什么」一项:agent 上限 250 轮、可读整篇文档;基线只有 6 轮、只能看元数据加正文前 400 字符,且提示里去掉了「发现必须带量化与流行率」的要求。论文自己承认这使对照「measures the whole agentic setup rather than adaptivity alone」。
这篇论文把「流行率」与「人工精度」分作两列刊出,全文没有一处刊出二者的乘积。缺陷量等于流行率乘精度。内容农场一行的乘积是 5.32% × 0.74 = 3.94%,区间取 Wilson 端点相乘得 [2.72%, 4.69%],上下界相差 1.72 倍;slo.* 机器翻译农场那一行是 0.28% × 0.07 = 0.020%,区间 [0.004%, 0.088%],上下界相差 24.7 倍。正文里「贡献 12.3% 的运行词」用的是未乘精度的分子,乘上精度后为 9.1%,区间 [6.27%, 10.82%]。
Table 2 还印了一列本文此前未引的 Ov.——该发现的文档里,LowConf / LID-Disagree / HighDup 三个静态切片最多能捞回多少:内容农场 13%,两条捷克语相关发现都是 100%,slo.* 机翻农场是 0%。这一列把「基线不如 agent」拆成了两件不同的事。捷克语那两类的文档,静态信号本来就能全部捞回,缺的只是有人去把它们命名成一条发现;而 slo.* 正好相反——它是唯一一条静态切片完全捞不到的发现,却也正是精度只有 0.07、盲标不予支持的那一类。于是「除最大的发现外每条只跑出来一次」这个缺口有了更锋利的读法:未复现的那几条里,一部分是「本来就在静态信号里、只是没人命名」,另一部分是「只有 agent 的读法能碰到、且从未被验证」。
四个方向上的缺口让这个乘积无法被复算。
第一,两个因子不在同一个母体里。精度来自盲标样本,盲标样本只能从带文本的 1-in-13 确定性子样本(2,034,894 条)里抽;流行率是全库 26,470,482 条上的精确计数。两个数的母体不同,相乘得到的缺陷量没有对应的可抽样定义。
第二,守卫的部署单位是 crawl,标定单位却是全库,论文自己在 Limitations 里写明「prevalence guards are calibrated for corpus-wide evaluation, and on a single crawl natural variation trips all seven guards and can produce false alarms」。附录 G 的逐 crawl 表已经把异质性摊开了:内容农场只在 23/96 个快照里出现,2023-06 峰值 38.7%,最后一个快照 0.39%,最新八份与之前全部之比为 21.6 倍;成人垃圾三档的 new/old 比是 0.11、0.07、0.05。池化后的 5.32% 把 0.39%–38.7% 的跨度压成一个数,峰值是池化值的 7.27 倍。
第三,除最大的发现外,每条发现都只跑出来过一次。Table 2 的 Runs 列显示内容农场 3/3,其余 6 条各为 1/3。附录 K 的 claude-opus-5 运行(147 turns、$8.17,成本是主协议的 2.9–3.7 倍)记录了 8 条发现,只精确复现了内容农场(Jaccard 1.00,同一批 1,408,437 条文档),机翻健康农场 0.31(opus 用的是更宽的选择器,147,318 条,而主发现的 slo.* 切片只有约 7.4 万条),捷克语误标 0.09(23,076 条),余下 4 条完全没出现;另有 4 条候选现象是 opus 新提的、从未进入盲标包,第 8 条是元数据不变量。三次主运行只用了 300 次预算中的 173、180、197 次(57.7%–65.7%),预算从未饱和,也没有一条把预算提到 600 或 900 的臂,于是「预算不够」与「不可复现」在现有数据里不可分。
第四,裁定链上人的位置在末端。34 个候选文件先由模型按组 tabulate 并提出 verdict,标注者「adopted the proposed verdicts without deliberating each one independently」。两条裁定行在采纳之后被修正——7 个在 tabulation 中丢失的标签被找回并重新归属——修正恰好给 Random 与 LowConf 各加一条 validated selector。Limitations 逐字写着「the correction moved the best baseline from tying the agent to exceeding it」,即 RQ4 那条「$1.03 的 LowConf 验证 4 条选择器、多于任何一次 agent 运行」的头条,依赖于这次事后修正。记账规则还朝两个方向偏:Random 因为与他人提出的选择器字节相同而被记功(「a selector two conditions proposed identically is credited to both」),LID-Disagree 的 G04 选择器却因为自己没抽到标签而不计入,尽管它所在的组已被批准。
标签侧的损耗同样没有被带进区间。358 条抽取文档里 255 条拿到标签(71.2%),回收率随臂变化:agent 切片 122/175(69.7%)、LID-Disagree 30/36(83.3%)、均匀对照 25/40(62.5%)。每条发现抽 25 条、实得 12–21 条(中位 19)。117/255(45.9%)的标签是在 junk 判据被澄清之前给出的,作者复核后保留而未重判,其中两条受影响最大(12/14 与 11/17)。召回从未测量,论文自陈「We do not know the recall of any selector」,也没有任何植入已知缺陷的反向对照。这处回收率还带一个内部不一致:Limitations 写「117 of the 255 labels were given before it」,而标注指南附录写「the 235 first-pass labels were given without it」。两者可以调和(235 是第一轮给出的总数,其中 117 条留在这 255 条里、其余被丢弃),但论文没有这么写,读者无从判断哪个数对应哪个母体。
核心思路
提出 DML(Defect-Mass Ledger,缺陷量账本)。DML 与现有审计工作流的关键区别在记账单位:不按「一条发现」报数,按四元组(发现, 部署单元, 标签批, 运行)报数。任何跨 crawl、跨运行、跨标签批的汇总都必须先写下聚合规则,并把聚合后的区间一并刊出。流行率、精度、缺陷量三者里,只有缺陷量是策展决策真正消费的量——决定要不要重跑一遍过滤、要不要丢掉一个 host 的,是缺陷文档条数,不是选择器命中条数。
账本共四本。
账一,缺陷量账。 对每条发现 与每个部署单元 报 及其区间 ,并把区间跨度比 列为第一等公民—— 大于 2 的发现不允许进入「已确立缺陷」清单。母体一致性用 检查:精度在子样本上估、流行率在全库上算时, 偏离 1 的部分直接进入 的偏差项。运行词份额一类派生量一律乘精度后再报。 这个门槛可以先拿论文自己的 Status 列试一遍。按 Table 2 印出的七行算:内容农场 1.73、词沙拉成人垃圾 1.52、关键词成人垃圾 1.73、门口页网络 1.19、捷克语混排 1.53,都在 2 以下且论文标 accepted;slo.* 达 31.0 且论文标 candidate——六行吻合。但 czech_text_mislabeled_as_slovak 的区间 [.31,.74] 给出 ,论文却标 accepted。这条门槛会把一条论文已接受的发现降级,说明它要么是定松了,要么说明「区间跨度」与「是否被接受」本该是两个独立轴;建议账一把它们拆成两个标签,不要合成一个准入条件。
还有一处口径要写死: 的值取决于用哪一套端点。论文只印两位小数,用印出的 [.51,.88] 算是 1.73;用未舍入的 Wilson 端点(.5121 / .8820)算是 1.72。slo.* 上差距更大——印出的 [.01,.31] 给 31.0,未舍入的 Wilson 给 24.8,相差 25%。本文上面采用的 1.72 与 24.7 是后者;而同一段里「12.3% 乘精度后的区间 [6.27%, 10.82%]」用的却是前者(未舍入口径应为 [6.30%, 10.85%])。两处差 0.01–0.03 个百分点,不改变任何结论,但账一应当统一声明用哪一套。
账二,标签与裁定溯源账。 按臂刊出回收率 与两种极端归属下的 (103 条无标签文档全判缺陷、全判非缺陷),区间跨过 0.5 接受线的发现状态改标 unsure。判据版本占比 按 slice 刊出(全样本 45.9%,两条 slice 上为 12/14 与 11/17), 超过三分之一的 slice 需要在新判据下重标一遍。裁定溯源给三个数:模型提议与独立裁定的一致率 、去掉模型 tabulation 那一臂的 、以及修正前后双表与修正触发原因。记账规则统一为「按 phenomenon group 计数、归属首个提出者」,删掉字节相同互相记功与无标签即不计这两条方向相反的条款。
账三,部署单元账。 把流行率按 crawl 拆开报 ,并给出三个量:存在率 (命中的快照数 / 快照总数,内容农场 23/96)、池化掩盖度 (内容农场 7.27)、漂移比 (21.6 与 0.05–0.11 两个方向都要报)。关键的新测量是逐 crawl 假警率 :把全库标定的阈值直接套到单个快照上,统计跳闸频率。
账四,复现与饱和账。 发现率 = 命中该发现的运行数 / 运行数,配合跨运行 Jaccard 与跨模型 Jaccard。饱和臂把 inspect 预算从 300 提到 600 与 900, 随预算上升说明前一轮是预算不足,不上升说明该发现本身不可复现。反方向对照补两个空白:一个永不命中的选择器与一个命中全库的选择器,用来确认验证协议能分辨退化输入。
因子设计用 2×2:判据版本(旧 / 新)× 裁定人机边界(模型提议后采纳 / 独立裁定),主终点是 与状态标签,两个因子各跑三条运行。等预算那一层再加一条 arm:给静态基线装上 agent 的聚合与流行率测量工具,只留「自己选读什么」这个差别,把论文自陈的「It therefore measures the whole agentic setup rather than adaptivity alone」拆开。「只留一个差别」这一步要拉平的不只工具:基线轮数上限 6 轮而 agent 是 250 轮,基线只看元数据加正文前 400 字符而 agent 读整篇,基线的提示还去掉了「量化与流行率」的要求。这三项不对齐,装上工具后的对照测的仍然是「整个 agentic setup」。建议在等预算 arm 里把轮数上限、可见字段、提示要求三项显式对齐。
技术路线
第一步,重建审计环境并重跑协议。DuckDB 适配器按原样接上 slk_Latn 的 Parquet,11 个工具的预算价格在附录 A 已刊出,逐条照抄即可。三次主运行之外补到六次,覆盖 2×2 的两格,每次运行记录完整 JSONL 轨迹。轨迹里要单独记一笔聚合调用是否返回了文档正文——第四次的 opus 运行有三个调用返回了 100/120 字符前缀与提取出的邮箱串,使 inspect 计数低报,新版本环境已拒绝这类查询。
第二步,把流行率表从全库粒度降到 crawl 粒度。96 个快照逐条跑 7 条选择器加 2 条不变量,产出 序列与存在率 。这一步不需要模型,0.7 秒的量级可以再跑几十遍。
第三步,重做盲标。抽样框从「每条发现 25 条」改为按目标区间宽度反解样本量:内容农场要把 从 1.72 压到 1.2 以下,n 需要从 19 提到约 150(Wilson 半宽约 0.07)。刻意回避 agent 查看过的文档这一步保留,排除表改用完整轨迹而非截断日志构建——原研究里有一条捷克/斯洛伐克混排文档就是靠截断日志没排除掉的。两名标注者独立标同一批, 高的 slice 全部在新判据下重标。
第四步,植入反向对照。向语料副本注入四类已知缺陷(机器翻译段落、关键词堆叠页、跨语言误标文档、模板化内容农场页),每条都带已知真值位置,测检出率 与误报率。这一步顺带把召回从「无法估计」变成可测量。
第五步,跑饱和臂与反事实记账。预算 300 / 600 / 900 三档各三条运行,拟合 对预算的曲线;记账口径按 group 重算一遍,与原文的 per-selector 口径并列。
三个技术挑战。第一个挑战落在乘积的区间上:流行率是精确计数,精度是抽样估计,二者相乘的区间不能简单相乘端点,需要在同一批标签上做 bootstrap 并保留 与 的相关结构;跨母体时还要把 当作偏差而非噪声处理。逐 crawl 阈值的标定是第二个挑战:全库阈值套到单快照会全面跳闸,重标定需要一份「正常快照」的参考分布,而参考分布本身会随 crawl 漂移,这里要给出的是阈值随时间的自适应规则而不是一个常数。成本口径构成第三个挑战:0.7 秒对 3.42/千文档的单价是在 400 字符片段、20 条一批上测的,语料均值却是 438 词,按全文计单价更高。等成本对照必须把「这些列的计算成本」计入测试侧,或者给测试侧一条只依赖原始文本的选择器。
预期成果
第一,缺陷量的可复算性。目标是把 7 条发现的 全部压到 1.5 以下,内容农场从 1.72 降到 1.2 以内,slo.* 农场从 24.7 降到 2 以内,并刊出 的 bootstrap 区间而非端点相乘。若某条发现即使 n 提到 300 仍跨不过 0.5 接受线,其状态应为 unsure 而不是「未被支持的发现」。
第二,逐 crawl 的假警率。目标是把「单个 crawl 上七条守卫全部跳闸」的自陈变成数字 ,并给出一套随时间自适应的阈值规则,使 在 96 个快照上的中位数低于 0.05。
第三,复现率与饱和点。目标是在六次运行下报出每条发现的 与 300/600/900 三档预算下的曲线,明确区分「预算不足」与「不可复现」;跨模型那一维至少覆盖两个模型族、三条发现的 Jaccard。
第四,反向对照。目标是 不低于 0.8,退化选择器(永不命中 / 命中全库)被验证协议判为不可用。
定性影响有两层。对语料策展,缺陷量账本把「一条发现有多大」从一个池化百分比变成一个带区间、带部署单元、带复现率的数, curator 能据此决定是在下一次 crawl 上跑守卫还是重跑一遍过滤。对 agent 化的数据工程,这套账本可以直接搬到其他「agent 产出可执行测试」的场景——数据合同、单元测试合成、数据质量的回归套件——凡是「一次 LLM 调用产出一段长期运行的代码」的流水线,都面对同一组问题:命中率不等于缺陷量,标定单位不等于部署单位,一次发现不等于可复现发现。
相关工作
被审计的流水线是 FineWeb2(arXiv:2506.20920),一条配方适配全部语言,本文讨论的斯洛伐克语分片缺陷正属于它不设计的那一类。
本文审计的对象与工作流来自 Šuppa 等人的《Can an Agent Debug a Web Corpus?》(arXiv:2610.31636),agent 当语料调试器、发现编译成可执行测试、母语者盲标验证,本文提出的四本账是对它 Table 2 与附录 G 两张表的记账层补充,不改它的方法。
单语流水线的过滤器设计见《The FineWeb Datasets》(arXiv:2406.17557),其质量门是逐条过滤器串联,与本文讨论的「编译后的选择器 + 断言」在部署形态上不同,但面对同一个流行率—精度分离问题。
规模化过滤与评测协议见 DataComp-LM(arXiv:2406.11794),它把数据策展变成可比较的竞赛协议,本文的部署单元账借用了它「固定计算预算下比较」的思路,并把比较单位从数据集换成了 crawl。
用 agent 评判 agent 的对位工作是 Agent-as-a-Judge(arXiv:2410.10934);本文账二里 与 的设计,直接取自该工作对「评判链上人的位置」的处理。
引用核验记录(2026-10-24 编辑)
| 编号 | 标题(abs 页 citation_title) | 作者 / 日期 | 核验 |
|---|---|---|---|
| arXiv:2506.20920 | FineWeb2: One Pipeline to Scale Them All — Adapting Pre-Training Data Processing to Every Language | Penedo 等 10 人 / 2025-06-26 | ✅ |
| arXiv:2610.31636 | Can an Agent Debug a Web Corpus? Agentic Auditing of Slovak FineWeb2 | Šuppa、Vykopal、Kopčan / 2026-10-22 | ✅ |
| arXiv:2406.17557 | The FineWeb Datasets: Decanting the Web for the Finest Text Data at Scale | Penedo 等 8 人 / 2024-06-25 | ✅ |
| arXiv:2406.11794 | DataComp-LM: In search of the next generation of training sets for language models | Li 等 59 人 / 2024-06-17 | ✅ |
| arXiv:2410.10934 | Agent-as-a-Judge: Evaluate Agents with Agents | Zhuge 等 13 人 / 2024-10-14 | ✅ |
回 HTML v1 正文逐项比对通过的数字:26,470,482 条文档 / 351,844 host / 96 快照(2013–2024)/ 均值 438 词 / language_score 阈值 0.667;1,408,437 条(5.32%)/ 2,851 host / 均值 1,011 词 / 12.3% 运行词;11 个只读工具、300 次 inspect、250 轮上限、基线 6 轮;1-in-13 文本子样本 2,034,894 条;2.84 / n8.17、2.9–3.7 倍、Jaccard 1.00 / 0.31 / 0.09;3.42 每千文档(400 字符片段、20 条一批)。
逐字比对通过的引文:「The prevalence guards are calibrated for corpus-wide evaluation, and on a single crawl natural variation trips all seven guards and can produce false alarms」、「the correction moved the best baseline from tying the agent to exceeding it」、「a selector two conditions proposed identically is credited to both」、「We do not know the recall of any selector」、「It therefore measures the whole agentic setup rather than adaptivity alone」。
本轮订正与边界
- 「余下 3 条」→ 4 条。附录 K 的 opus 运行记录 8 条发现,其中 3 条与主发现对应(内容农场 / 机翻健康农场 / 捷克语误标),7 条主发现中未出现的应为 4 条。已在正文就地订正。
- 论文自身的 117 / 235 不一致。Limitations 与标注指南附录对「澄清判据前给出的标签数」给出两个数,论文未说明二者关系。已在正文标出,本文按 Limitations 的 117/255 计算。
- 门槛与论文 Status 列 1/7 冲突。
czech_text_mislabeled_as_slovak的 却被论文接受。这是本文提案自身的校准问题,不是原论文的错;建议把「区间跨度过大」与「跨不过 0.5 接受线」拆成两个标签。 - 端点口径需统一。本文「1.72 / 24.7」用未舍入 Wilson 端点,「[6.27%, 10.82%]」用印出的两位小数端点,两者不一致。差 0.01–0.03 个百分点,不影响结论,但账一应写死一套。
- 两处论文已印、本文此前未引的数:Table 2 的
Ov.列(静态切片可捞回性,两条捷克语发现 100%、slo.*0%),以及模型与工具链(claude-sonnet-5 / Claude Code CLI v2.1.231)。已在正文补入——前者为「等预算 arm」提供了先验,后者是复现的必要条件。