语料调试器:用 LLM Agent 审计斯洛伐克语 FineWeb2

论文:Can an Agent Debug a Web Corpus? Agentic Auditing of Slovak FineWeb2 作者:Marek Šuppa(夸美纽斯大学/Cisco)、Ivan Vykopal(KInIT/布尔诺理工大学)、Jaroslav Kopčan(KInIT) arXiv ID:2610.31636(2026-10-22 提交,WaC Workshop @ EMNLP 2026) 代码与数据:https://github.com/NaiveNeuron/agentic-corpus-debugger


1. 背景与动机

FineWeb2 这类多语言预训练语料用同一套流水线(recipe)处理上千种语言,任何单一语言的失败模式都不会被逐一检查。现有两条路都有明显缺陷:

  • 人工审计:一次性、消耗专家时间,下一次爬取来了又得重做,无法复用;
  • LLM 全量分类:成本极高(本文估算对 26.5M 文档的斯洛伐克语部分每遍要 \(12k–\)90k),且产出只是标签,没有解释力。

本文提出第三条路:只用 LLM 一次,把它当"语料调试器"(corpus debugger)而不是分类器。Agent 探索语料后,把每个发现编译成可执行的测试(作者称之为 "pytest for web corpora"),未来的爬取或流水线修订可以零模型成本地回归运行这些测试。研究对象为 FineWeb2 斯洛伐克语部分:26,470,482 篇文档、351,844 个主机、96 个 Common Crawl 快照(2013–2024)。

2. 方法框架

2.1 三阶段工作流

  1. 发现(Discovery):Agent 通过只读、带预算的 API 探索语料,产出候选发现(finding)。
  2. 验证(Validation):斯洛伐克母语者对每个候选发现做盲标注(看不到来源、URL、元数据);随后由模型汇总证据提出裁决建议,标注者可采纳或否决。验证确实行使了否决权——7 项发现中有 1 项被否决。
  3. 部署(Deployment):运行测试时完全不调用模型。每个测试是一个 YAML 文件,包含 selector(SQL 谓词)、对未来语料版本的断言和证据,状态分 accepted 与 candidate 两级。

2.2 审计环境与 API 设计

  • 数据视图:DuckDB over Parquet,两个关系表:
  • corpus_meta:全部 26.5M 文档的元数据(无文本),支持全语料亚秒级精确统计;
  • corpus:确定性 1/13 子采样(2,034,894 篇带全文),用于必须读文本的场景。
  • 元数据列:URL、crawl 快照、日期、language、language_score、minhash_cluster_size、n_bad_words、GlotLID top_langs、三个辅助语言识别器(fastText、langdetect、Lingua)等。schema 刻意不含任何关于缺陷或失败模式的暗示。
  • 11 个工具与预算:schema()、aggregate(sql)、domain_stats、crawl_stats、run_detector、save_finding 免费;sample_documents、inspect_document、search_text、sentence_lid、evaluate_detector 按每篇文档计 1 次 inspection。每次 run 上限 300 次 inspection、250 轮,同一文档 id 只计费一次。全部调用记入 JSONL 轨迹可重放(附录 I:147 次调用 98.0% 返回相同行集,94.6% 字节级一致,差异均为 LIMIT 并列截断)。
  • 诚实披露的漏洞:免费的 aggregate 本可用 substr(text,1,120) 绕预算读文本;作者检查了全部日志,三个正式 run 没有利用此漏洞(第四个 opus run 有 3 次),后续版本将拒绝此类查询。

2.3 提示词卫生(Prompt Hygiene)

系统提示只描述工具、finding schema 与认识论标准(系统性、可复现检索、有文档依据、可量化),不提及任何具体缺陷、失败模式或邻近语言。附录 C 用脚本机械验证:提示词不含 41 个缺陷相关术语中的任何一个;三次 run 的 227 次工具调用全部是审计 API(无 shell、文件、网络访问)。这保证了发现来自语料本身而非提示词引导。

2.4 测试编译

测试分两类:

  • Prevalence guards:某切片在未来版本中占比增长超过阈值(实测流行率 × 1.2)即失败;
  • Invariants:某条件一旦出现即失败(如 language_score > 1.0、文档 id 重复)。

每个 guard 附带审计者的证据、至多 5 个起始文档 id 和预期误报率;还可通过 apply_patches.py 转成 Parquet 格式的文档 id drop list,作为语料"补丁"。

3. 七项发现

三次 Agent run(每次成本 \(2.21–\)2.84)共产出 7 个去重后的发现,归为 4 类现象。盲标随机对照组缺陷率仅 0.08。

发现 组 出现 run 数 流行率 盲标缺陷率 [95% CI] 状态
firebase_content_farm_spam G01 3/3 5.32% .74 [.51,.88] accepted
adult_spam_farm_wordsalad G04 1/3 0.39% .84 [.62,.94] accepted
porn_spam_keyword_farm G04 1/3 0.36% .83 [.55,.95] accepted
slo_prefix_machine_translated_farm G05 1/3 0.28% .07 [.01,.31] candidate(未获支持)
porn_doorway_spam_network G04 1/3 0.20% 1.00 [.84,1.00] accepted
czech_slovak_code_switched_docs G02 1/3 0.17% .81 [.60,.92] accepted
czech_text_mislabeled_as_slovak G02 1/3 0.12% .53 [.31,.74] accepted

3.1 最大发现:Firebase 内容农场(G01)

  • *.firebaseapp.com 与 *.web.app 上的 1,408,437 篇文档(占 5.32%),分布于 2,851 个主机;
  • 平均 1,011 词(语料均值 438 词),占全部词数的 12.3%;
  • 时间线:2022 年前几乎不存在,2022 年末急剧上升,2023-06 快照中占 38.7%,直到最后一个快照仍存在;
  • 流水线的所有信号全部漏掉了它:平均 language_score 0.98(远高于 0.8 阈值)、MinHash 簇大小均值 1.00(无一篇达到去重阈值)、87% 文档三个辅助 LID 一致。即使施加更严阈值(score≥0.9、簇≤2、三 LID 一致),仍有 86.6%(1,220,394 篇)通过。

3.2 其他现象

  • G02 捷克语污染:捷克语文本被错标为斯洛伐克语、捷/斯 code-switching 文档,完全落在 LID 分歧切片内。附录 D 用 CHALIS 基准验证"三个辅助 LID 一致判捷克语"规则在单标签句上精度 99.6%,但 55.4% 的捷/斯材料本质模糊(联合有效句上误触 28.5%),故仍需人工判断。
  • G04 成人垃圾家族:关键词堆砌、word-salad、doorway 网络,2020 年达峰后衰退,三个 selector 完全落在 n_bad_words≥3 切片内。
  • G05 slo.* 机器翻译农场:唯一未获盲标支持的发现(缺陷率 .07,与随机对照无差异),以 candidate 状态发布——证明验证环节真的能否决 Agent 的判断。

3.3 元数据不变量(第四次 claude-opus-5 run 发现)

  • language_score > 1.0:斯洛伐克语 40.4% 文档(10,691,128 篇)分数超 1.0(最高 1.00001),源于 fastText 计算 log(p+10⁻⁵) 避免 log 0;该不变量在 12 个 FineWeb2 配置中的 11 个上失败(仅斯瓦希里语干净)。
  • 文档 id 唯一性:13 个 id 重复(26 行),全部出现在 CC-MAIN-2024-10 快照。

4. 实验设置

  • 模型:三次 Agent run 与四个 baseline 均用 claude-sonnet-5(Claude Code CLI v2.1.231,默认采样);第四次 claude-opus-5 run 在冻结协议之外(附录 K)。
  • 预算:Agent 每次 300 inspections / 250 轮;baseline 每次 6 轮。
  • 四个静态 baseline:各抽 300 篇极端文档,给同一模型看元数据+前 400 字符,不给工具:
  • Random(均匀采样)、LowConf(language_score < 0.8,占 0.49%)、LID-Disagree(辅助 LID 与流水线标签不一致,3.12%)、HighDup(minhash_cluster_size ≥ 100,0.23%);第五个 profanity-ranked 策略只做样本分析未跑模型。
  • 盲验证:358 篇抽取文档由一名母语者盲标(每个 Agent 发现 25 篇、基线候选 11–12 篇、40 篇均匀对照;排除 Agent 已看过的文档;最终 255 篇有标签)。判定:语言标签为 cs/mix/other 或可用性为 junk 即缺陷。
  • 裁决:34 个候选按文档重叠(Jaccard≥0.8)聚成 11 组;模型汇总证据提出裁决,标注者采纳;共 11 approve、8 reject、5 unsure。批准规则:≥5 个标签且缺陷率 ≥ 0.5。

5. 结果

RQ1:Agent 能发现母语者确认的系统性缺陷 ✅

三次 run 分别用了 197、180、173 次 inspection(预算的 58–66%),记录 2、4、3 个发现;盲标支持 7 项中的 6 项(.53–1.00 vs 对照 .08)。附录 J 显示 Agent 还会主动提供反对自己假设的证据(如无音标的非正式斯洛伐克语会让三个 LID 都误判为捷克语,主动把预期精度降到 0.5)。

RQ2:编译后的测试极便宜 ✅

全部 7 个 selector 仅依赖元数据,扫描全部 26.5M 文档只需 0.7 秒墙钟时间(20 核约 13 秒 CPU),无 GPU、无 LLM。对比同模型全量分类:每遍 $90,456(含 harness 开销)或 $12,309(纯 token 价),且每次爬取都要重复。注:测试便宜是因为复用了流水线已算好的元数据列,纯文本 selector 会更贵。

RQ3:静态策略能够到所有已验证现象 ❌(对 Agent 不利的诚实结果)

G02 完全在 LID-Disagree 内;G04 完全在 profanity 切片内;G01 在 5.32% 流行率下 300 篇随机样本约含 16 篇农场文档(三个 baseline 都提出了它)。内容农场是唯一静态过滤全部失败的案例,但静态采样可以达到。Agent 的贡献是精确测量、特征刻画、失败归因与可复用测试,而非独家发现。

RQ4:匹配预算下最佳 baseline 优于 Agent ❌

条件 检查数 候选 验证通过 组数 成本
Random 300 7 2 2 $1.22
LowConf 300 6 4 3 $1.03
LID-Disagree 300 5 2 2 $1.16
HighDup 300 5 2 2 $1.06
Agent run 1/2/3 197/180/173 2/4/3 2/3/3 2/3/3 \(2.21/\)2.84/$2.45
4 baselines 合计 1,200 21 6 4 $4.46
3 agent runs 合计 550 7 6 3 $7.50

LowConf 以不到一半成本验证了更多 selector(4 vs 3)。差异在附带物:Agent 的每个 selector 附带全语料精确流行率与失败归因,baseline 只能从 400 字符视图判断。注:两处裁决采纳后修正(7 个丢失标签找回),使 LowConf 从与 Agent 打平变为超过 Agent。

补充验证

  • Held-out 验证:9 个测试在 Agent 从未接触的 28,720 篇 held-out 数据上原样运行,所有切片流行率在训练值的 0.86–1.06 倍内,未过拟合。
  • 时间维度:两个捷克语切片在全部 96 个快照中存在(0.06–0.40%),是流水线的持久属性;内容农场只出现在 23 个快照,但最新 8 个中比早期大 21.6 倍(15.9% vs 0.74%);成人垃圾 2020 年达峰后近消失。
  • 跨模型稳健性:claude-opus-5 run(147 轮,$8.17)精确复现内容农场(Jaccard 1.00),另发现 4 个未验证新候选(机翻 sk. 子域名 903,273 篇、离岸内容农场 473,571 篇、邮箱占位符 76,133 篇、广告样板 18,887 篇)。最大现象是语料属性而非模型属性。
  • 作为补丁的效果:应用全部 7 个 selector(含未获支持的 slo.*)将删除 1,615,885 篇(6.10% 文档、16.31% 词数);补丁后重跑测试全部归零,93.90% 文档保留。

6. 图表要点

  • 图 1:三阶段工作流——所有标签来自人,部署不用模型。
  • 图 2:主 run 共 67 个事件的工具分布与累计 inspection 消耗,事件 41–49 为 Firebase 农场调查(统计主机→采样→评估 detector→保存发现)。
  • 图 3:各 selector 在 96 个快照中占比随时间的变化。
  • 图 4:7 项发现的盲标缺陷率(Wilson 区间),对照阴影带(.08)与 .5 接受线;6 项过线,slo.* 不显著。
  • 图 5:各候选切片按流行率与静态切片检索占比定位——农场、成人垃圾、机翻农场不在三个静态切片内。
  • 图 6:内容农场在 language_score、MinHash 簇、辅助 LID 三个信号上的分布,直观证明其绕过所有过滤器。
  • 图 7:验证通过数 vs 成本散点图,LowConf 明显占优。

7. 局限性

  1. 范围窄:仅一种语言、一个语料、一个模型的三次 run;其他 11 种语言只重跑了斯洛伐克语测试,未做 Agentic 发现;Agent 只用了预算的 58–66%。
  2. 验证单薄:单一母语标注者、255 篇标签(每个发现中位 19 篇),置信区间宽;只测精度不测召回;缺陷标准粗糙,未测下游模型效果;无标注一致性测量。
  3. 对比不完全公平:baseline 同时缺工具与自适应性;部分裁决由模型提出、标注者采纳而非独立审议;两处裁决事后修正改变了结论方向。
  4. 成本与稳定性:低成本依赖流水线已算好的元数据;guard 阈值按全语料校准,单爬取上的自然波动会触发误报;主机模式会随网络变化漂移。

8. 结论与评价

  • LLM Agent 以每次 \(2.21–\)2.84 的成本审计了斯洛伐克语 FineWeb2,发现、测量并刻画了经母语者确认的缺陷,留下一套无需模型即可运行的回归测试。
  • 论文坦诚地给出负面结果:每次 run Agent 验证的 selector 少于精心选择的静态采样 baseline,且其验证的每个缺陷都落在某种静态策略的覆盖范围内。
  • 真正的贡献是工作流本身:把一次性审计变成可执行、可验证、可否決的回归测试(实际否决了 1/7),已在其他 11 个 FineWeb2 配置上运行,框架、测试套件、验证数据与 Agent 轨迹全部开源。
  • 最大的发现(5.32% 的 Firebase 内容农场,86.6% 能通过更严阈值)说明:即使重度过滤的语料也存在流水线所有信号都漏掉的系统性污染——而这些缺陷之所以可见,恰因 FineWeb2 公开了丰富元数据。对构建多语言预训练语料的团队,本文的"审计即测试"范式值得直接复用。