Pulpie:用于清理网络的Pareto最优模型
Show HN: Pulpie——用于清理网络的模型
Pulpie是一族Pareto最优模型,用于从HTML页面提取主要内容。其最小模型pulpie-orange-small(210M参数)在WebMainBench上取得0.862的ROUGE-5 F1分数,接近600M参数的Dripper(0.864),但成本仅1/20。在NVIDIA L4 GPU上,Pulpie处理速度13.7页/秒,Dripper仅0.68页/秒。清理10亿页HTML,Pulpie成本约$7,900,Dripper需$159,000。模型采用编码器架构,单次前向传播即可标记每个HTML块为内容或模板,已在HuggingFace开源。
做网页清洗的同行该更新工具了,Pulpie 以二十分之一的成本追平 SOTA 质量,而且开箱即用,是今年数据管线里最值得换的组件之一。

研究 · 实地笔记
Pulpie:用于网页清洗的帕累托最优模型
我们推出 Pulpie,这是一个用于从 HTML 页面中提取正文的帕累托最优模型系列。Pulpie 以二十分之一的成本达到接近 SOTA 的提取质量。
我们最小的模型 pulpie-orange-small 在 WebMainBench 上取得 0.862 的 ROUGE-5 F1 分数。这与领先的提取器 Dripper 相当,后者得分为 0.864。Pulpie 取得这样的表现,尽管其规模只有三分之一:210M 参数,而 Dripper 为 600M。
这些提升来自架构。Pulpie 是一个编码器,在单次前向传播中将每个 HTML 块标记为正文或样板内容。这也让它速度很快。
在 NVIDIA L4 GPU 上,pulpie-orange-small 每秒处理 13.7 个页面,而 Dripper 为每秒 0.68 个页面。按 L4 实例每小时 $0.39 计算,清洗 10 亿个页面,使用 Pulpie 花费 $7,900,使用 Dripper 花费 $159,000。
Pulpie 解锁了以往不可能实现的大规模高质量网页提取。我们预计这将惠及预训练和上下文管理。
我们的模型已开源,可在 Hugging Face 上获取。使用说明请见。
提取是瓶颈
语言模型会两次消费网络内容。第一次是在预训练阶段,模型借此了解世界。第二次是在推理阶段,模型借此引入相关上下文。这两次输入的大部分内容都是噪声。在探索过程中,我们发现一个典型 HTML 页面上 70% 的区块都是导航、广告、侧边栏和页脚之类的模板化内容。正文内容只占页面的很小一部分。
然而,正是这一小部分决定了模型在两端的质量。
AICC(Ma 等,2025)测量了更干净的抽取对预训练的影响。该团队从同一份 Common Crawl 快照构建了两个语料库。一个用启发式方法抽取内容,另一个用基于模型的解析器抽取内容。数据流水线中的其他一切保持不变。随后,他们在每个语料库上训练了一个完全相同的模型。
在模型抽取的语料库上训练的模型,在 13 个基准上的平均准确率高出 1.08 个百分点。由于只有抽取逻辑发生了变化,我们可以将这一提升完全归因于更干净的数据。
令人印象深刻的是,同一个模型还击败了在 FineWeb 和 RefinedWeb 上训练的模型,这两个是过滤最严格的预训练语料库之一。这些数据集凭借精心设计的过滤和去重赢得了声誉。通过改进抽取器就击败了它们,这说明了干净数据的高价值。
除了设定较低的基线之外,糟糕的抽取还会对模型造成实质性伤害。启发式方法会破坏结构化内容。下表展示了 Trafilatura 与基于模型的抽取器在保留代码块和公式方面的对比。相似度得分低意味着内容被破坏。如果用于训练,由此产生的模型将继承这种损害。
| 内容 | Trafilatura(启发式) | 基于模型 |
|---|---|---|
| 代码块 | 0.13 | 0.91 |
| 公式 | 0.61 | 0.94 |
数据质量在推理阶段同样重要。Shi 等人(ICML 2023)表明,仅仅一段无关的段落就足以让模型的回答偏离正轨。当上下文没有噪声时,模型会更准确、更高效。
在预算内进行清洗
清洗网络数据在训练和推理两方面都能带来回报。悬而未决的问题是:我们如何在大规模下做好清洗?
首先,为了理解这一领域,我们可以根据一个问题把当前的提取器分为两大类:该方法是阅读页面内容,还是检查其结构?
基于结构的提取器通过表面信号来判断一个 HTML 块。它们对标签、DOM 和文本密度施加规则,以将正文与模板内容区分开来。Trafilatura、Readability 和 magic-html 都是这样工作的。Boilerpipe 更进一步,在这些相同的信号上训练了一个分类器。这些提取器易于运行,但会混淆结构相似的元素。对于统计单元格数量的算法来说,导航表格和数据表格看起来一模一样。
阅读式提取器将页面输入 Transformer,并根据每个块的内容为其打标签。Dripper 就是基于这一思路构建的解码器。该解码器一次一个 token 地输出标签。每个标签都迫使模型为单步工作从内存中完整读取整个模型。这使得速度受限于内存带宽,并使运行成本高昂。
Pulpie 保留了阅读式方法,但将瓶颈转移到了计算上。我们通过使用编码器架构来实现这一点,它能在单次前向传播中为每个块打标签。这使得 Pulpie 能够达到与 Dripper 相当的质量,同时更小、更快、更便宜。
网页内容提取的质量与成本
ROUGE-5 F1
成本 / 10 亿页
$175K
$140K
$105K
$70K
$35K
$0
0.90
0.80
0.70
0.60
0.50
便宜 20 倍,质量相同
Pulpie Small Dripper已选择 0.862 Pulpie Small
成本 $7.9K 每 10 亿页面
对原始 HTML 进行去浆处理
完整流水线分为四个阶段运行:
- 简化 HTML。 移除脚本、样式及其他格式噪声。为每个块打上唯一 ID。
- 分块。 将块拆分、tokenize,然后打包成最多 8,192 个 token 的 chunk,这样每个 chunk 都能在一次前向传播中放入模型。大约 80% 的页面能放进单个 chunk。
- 分类。 运行一次前向传播。Pulpie 将每个块标记为内容或样板。
- 返回。 将保留的块以 HTML 形式返回,或将其转换为 Markdown。
训练
训练 Pulpie 需要大量带有块级标签的 HTML 页面。此前不存在这样的公开数据集,所以我们自己构建了一个。
我们从 Common Crawl 中采样了 16,670 个英文页面,限制每个域名只取一个。然后我们使用 MinerU-HTML 将每个页面拆分为块,并用 DeepSeek V3.2 将每个块标记为内容或样板。进一步过滤移除了空白、损坏以及其他不适合的页面,最终剩下 15,880 个。
随后我们在全部 15,880 个页面上运行 Dripper 0.6B 作为第二个标注器,以标记不一致的标签。与 DeepSeek 的块级一致率为 93.3%。我们保留了两个标注器在至少 70% 的块上达成一致的 14,959 个页面,用一部分数据换取更干净的训练集。
教出一个老师
为了创建我们的教师模型,我们在上述 14,959 个页面上对 EuroBERT-2.1B 进行了微调。
| 设置 | 值 |
|---|---|
| 学习率 | 2e-5 |
| 有效批大小 | 8 |
| 损失函数 | 类别加权交叉熵 |
| 硬件 | 4x A100 |
类别权重按 28.6% 内容率的倒数设置,以应对类别不平衡。
该教师模型在 WebMainBench 英文集上取得了 0.873 的 ROUGE-5 F1 分数。它有 2.1B 参数,虽然准确但运行成本高昂,因此我们将其知识蒸馏到更小的模型中。
知识传授
为了更好地适配生产环境,我们将 2.1B 的教师模型蒸馏为两个更小的模型:
- Pulpie Orange Base,一个 610M 参数的编码器。
- Pulpie Orange Small,一个 210M 参数的编码器。
两个学生模型都按照 Hinton et al. (2015) 的方法从教师模型学习。教师模型软化后的输出分布通过权重为 0.7 的 KL 散度损失提供了大部分信号,硬标签交叉熵则占其余 0.3,温度为 2.0。两者都在与教师模型相同的数据上训练。
蒸馏后的模型几乎保留了教师模型的全部质量。
| 模型 | 参数量 | ROUGE-5 F1 | 对比教师模型 |
|---|---|---|---|
| Pulpie Orange Small | 210M | 0.862 | -1.1 F1 点 |
| Dripper | 0.6B | 0.864 | -0.9 F1 点 |
| Pulpie Orange Base | 610M | 0.863 | -1.0 F1 分 |
| Pulpie Orange Large(教师模型) | 2.1B | 0.873 | - |
尽管规模缩减了十倍,这个 210M 模型仅相差一个 F1 分。结合其速度和成本优势,pulpie-orange-small 在整个系列中拥有最佳的规模质量比。这是我们推荐用于生产环境的模型。
结果
质量
我们在 WebMainBench 的英文子集(涵盖所有难度级别的 6,647 个页面)上测量 ROUGE-5 F1。空提取计为零分。
| 方法 | ROUGE-5 F1 | 空页面 |
|---|---|---|
| magic-html | 0.700 | 384 |
| Trafilatura | 0.619 | 16 |
| Pulpie Orange Small | 0.862 | 45 |
| Dripper | 0.864 | 135 |
| Pulpie Orange Base | 0.863 | 36 |
| Pulpie Orange Large | 0.873 | 21 |
Pulpie Orange Large 是最强的单一模型,达到 0.873,领先 Dripper 0.9 个 F1 点。这个 210M 的模型以三分之一的规模追平了 Dripper。前沿大语言模型在该基准上的得分更高,接近 0.90,这正是 Pulpie 所逼近的质量水平。
Dripper 在 135 个页面上没有返回任何结果。其中 130 个是由于页面超出了其 32k token 的上下文窗口。Pulpie 将块打包成 8,192 token 的分块,因此页面长度永远不会导致失败。
按难度细分结果:
| 方法 | 全部 | 简单 | 中等 | 困难 |
|---|---|---|---|---|
| magic-html | 0.700 | 0.773 | 0.697 | 0.637 |
| Trafilatura | 0.619 | 0.721 | 0.619 | 0.526 |
| Pulpie Orange Small | 0.862 | 0.906 | 0.868 | 0.813 |
| Dripper | 0.864 | 0.913 | 0.865 | 0.817 |
| Pulpie Orange Base | 0.863 | 0.906 | 0.868 | 0.818 |
| Pulpie Orange Large | 0.873 | 0.914 | 0.879 | 0.827 |
随着页面难度增加,所有方法的表现都有所下降。启发式方法下降最快,从简单到困难页面下降了 14 到 20 个 F1 点,而编码器方法则下降约 9 个 F1 点。Dripper 的性能范围与编码器方法相当,在简单和困难页面之间的差距为 10 个 F1 点。
速度
各模型吞吐量
在 L4 上,比 Dripper 快 20 倍,比较的是在相同页面上运行的 Pulpie Small。
NVIDIA L4 每秒页数
已选 13.7 p/s Pulpie Small
成本 $7.9K 每 10 亿页
L4 吞吐量,基于 500 个真实 Common Crawl 页面:
| 方法 | 吞吐量(页/秒) | 硬件 |
|---|---|---|
| Pulpie Orange Small | 13.7 | L4 |
| Dripper | 0.68 | L4 |
| Pulpie Orange Base | 3.9 | L4 |
| Pulpie Orange Large | 1.3 | L4 |
在同一块 L4 上,Pulpie Orange Small 的运行速度比 Dripper 快 20 倍。
A100 吞吐量,相同页面,仅 GPU 推理,所有模型均采用批处理:
| 方法 | 吞吐量(页/秒) | 硬件 |
|---|---|---|
| Pulpie Orange Small | 25.7 | A100 |
| Dripper | 3.6 | A100 |
| Pulpie Orange Base | 7.7 | A100 |
| Pulpie Orange Large | 3.5 | A100 |
在 A100 上,Pulpie Orange Small 的运行速度比 Dripper 快 7.1 倍。2.1B 教师模型在速度上与 Dripper 持平,同时在质量上超越它。
成本
每 10 亿页面的成本
在 L4 上比 Dripper 便宜 20 倍,比较的是相同页面上的 Pulpie Small。
NVIDIA L4 成本 / 10 亿页面
已选 $8K Pulpie Small
GPU 小时数 20,276 每 10 亿页面
在 $0.39/小时 的费率下,L4 处理 10 亿页面的成本。使用上述测得的吞吐量计算得出:
| 配置 | 页面/秒 | GPU 小时数 / 10 亿 | 成本 / 10 亿页面 |
|---|---|---|---|
| L4 上的 Pulpie Small | 13.7 | 20,300 | 约 $7,900 |
| L4 上的 Dripper | 0.68 | 408,000 | 约 $159,000 |
| L4 上的 Pulpie Base | 3.9 | 71,200 | 约 $28,000 |
| L4 上的 Pulpie Large | 1.3 | 214,000 | 约 $83,000 |
按 $2.72/小时计算,处理 10 亿页面的 A100 成本。使用上文测得的吞吐量计算得出:
| 配置 | 页面/秒 | GPU 小时 / 10 亿 | 成本 / 10 亿页面 |
|---|---|---|---|
| A100 上的 Pulpie Small | 25.7 | 10,800 | ~$29,000 |
| A100 上的 Dripper | 3.6 | 77,200 | ~$210,000 |
| A100 上的 Pulpie Base | 7.7 | 36,100 | ~$98,000 |
| A100 上的 Pulpie Large | 3.5 | 79,400 | ~$216,000 |
像编码器一样的廉价 GPU
Pulpie 与 Dripper 之间的吞吐量差距远大于 3 倍规模差异所能解释的程度。在 A100 上,我们测得这一差距为 7.1 倍,而在 L4 上则扩大到 20 倍。其原因在于架构层面。
解码器一次生成一个 token 的标签。每一步都要从 GPU 内存中读取整个模型,才能产出一个 token。因此,解码器的速度受限于内存带宽。相反,编码器对整个输入执行一次前向传播。这种稠密矩阵乘法只受算力限制。
此外,A100 和 L4 在带宽上的差异比在算力上的差异更大:
| 维度 | NVIDIA A100 | NVIDIA L4 | 比值(A100/L4) |
|---|---|---|---|
| 内存带宽 | 2,039 GB/s | 300 GB/s | 约 6.8 倍 |
| Tensor Core TFLOPS | 312 | 120 | 约 2.6 倍 |
从 A100 降到 L4,对带宽受限的解码器的削弱远比对算力受限的编码器严重。这拉大了吞吐量差距,使得 Pulpie Orange Large 在 L4 上尽管在 A100 上与 Dripper 持平,却能实现反超。
Pulpie 系列模型已发布在 Hugging Face 上。安装该包:
pip install pulpie从原始 HTML 中提取干净内容:
from pulpie import Extractor
extractor = Extractor() # defaults to Pulpie Orange Small
result = extractor.extract(html)
print(result.markdown) # clean markdown
print(result.n_main, result.n_other) # blocks kept vs dropped若追求最高质量而非速度,请选择更大的模型:
extractor = Extractor(model="large") # "small" (default), "base", or "large"对于批量处理,该流水线在一个或多个 GPU 上将 CPU 预处理与 GPU 推理重叠执行:
from pulpie import Pipeline, PageInput
pipeline = Pipeline(model="small")
results = pipeline.extract_batch(
[PageInput(html=h, page_id=i) for i, h in enumerate(pages)]
)这三个模型均基于 EuroBERT(Boizard 等,2025)构建,使用相同的 <|sep|> 块标记架构,并共享同一个 tokenizer:
| 名称 | Hugging Face | 参数量 | ROUGE-5 F1 | 备注 |
|---|---|---|---|---|
| Orange Small | feyninc/pulpie-orange-small-v1 | 210M | 0.862 | 推荐 |
| Orange Base | feyninc/pulpie-orange-base-v1 | 610M | 0.863 | 从 Large 蒸馏而来 |
| Orange Large | feyninc/pulpie-orange-large-v1 | 2.1B | 0.873 | 教师 |
Pulpie Orange Small 是推荐且默认的模型。它以二十分之一的成本接近 SOTA 抽取质量,并且运行速度最快。
Pulpie 由 Feyn 构建。在 GitHub、Hugging Face 或 X 上找到我们。
致谢
Pulpie 直接建立在 MinerU-HTML 和 Dripper 团队的工作之上(Ma 等人,2025)。他们的 simplify_html 预处理、块级标注方案以及 WebMainBench 基准是这项工作的基础。我们还使用他们的 Dripper 0.6B 模型来交叉验证我们的训练标签。我们感谢他们发布了工具和数据。
参考文献
[1]
Ma 等人,“AICC:更精细地解析 HTML,让模型更出色——一个由基于模型的 HTML 解析器构建的 7.3T AI-Ready 语料库。”
arXiv:2511.16397
(2025)。
[2]
Boizard 等,《EuroBERT:为欧洲语言扩展多语言编码器》。
arXiv:2503.05500
(2025)。
[3]
Hinton 等,《在神经网络中蒸馏知识》。
arXiv:1503.02531
(2015)。
[4]
Raffel 等,《以统一的文本到文本 Transformer 探索迁移学习的极限》。
JMLR
2020。
[5]
Penedo 等,《用于 Falcon LLM 的 RefinedWeb 数据集:仅用网络数据超越精选语料库》。
NeurIPS
2023。
[6]
Penedo 等人,《FineWeb 数据集:为大规模提取最优质文本数据而精炼网络》。
arXiv:2406.17557
(2024)。
[7]
Li 等人,《DataComp-LM:寻找下一代语言模型训练集》。
NeurIPS
2024。
[8]
Soldaini 等人,《Dolma:用于语言模型预训练研究的三万亿 token 开放语料库》。
ACL
2024。
[9]
Barbaresi,《Trafilatura:用于文本发现与提取的网页抓取库和命令行工具》。
ACL/IJCNLP
2021。
[10]
Kohlschütter 等人,《使用浅层文本特征进行样板内容检测》。
WSDM
2010。
[11]
Pomikálek。“从网络语料库中移除样板内容和重复内容。”
博士论文,马萨里克大学
,2011。
[12]
Bevendorff 等。“网页内容提取算法的实证比较。”
SIGIR
2023。
[13]
Shi 等。“大语言模型很容易被无关上下文分散注意力。”
ICML
2023。
引用此笔记
@note{pulpie2026,
title = {Pulpie: Pareto-Optimal Models for Cleaning the Web},
author = {Minhas, Bhavnick and Nigam, Shreyash and Feyn Research},
year = {2026},
venue = {Feyn Field Notes}
}来源:Hacker News 热门(buzzing.cc 中文翻译) · usefeyn.com