Show HN: Pulpie – 用于清理网页的模型
摘要
Feyn 推出了 Pulpie,这是一系列用于从 HTML 页面中提取主要内容的帕累托最优模型,以二十分之一的成本实现了接近最先进的质量。最小的模型 pulpie-orange-small 在 ROUGE-5 F1 指标上与领先的提取器相当,同时体积更小、速度更快,能够为预训练和推理提供可扩展的网页清理。
Hey HN,我是 Feyn 的创始人 Shreyash。我们构建了 Pulpie,这是一系列用于清理网页的帕累托最优模型。Pulpie 从原始 HTML 中去除样板内容(广告、页脚、侧边栏),并以 HTML 或 Markdown 格式返回主要内容。<p>我们在提取质量上达到最先进水平,同时成本降低 20 倍。使用 Pulpie 清理 10 亿个网页花费 7,900 美元,而使用当前领先的提取器 Dripper 则需要 159,000 美元。<p>优势来自架构。当前领先的提取器是解码器,逐个 token 生成输出。每一步都需要从内存中读取整个模型来产生单个 token。相反,Pulpie 模型是编码器。它们对整个输入 HTML 执行一次前向传播,并将每个块标记为样板内容或主要内容。因此,Pulpie 受计算限制,而解码器受内存限制。较便宜的 GPU 具有相对更多的计算能力而非内存带宽。这使得 Pulpie 很容易以最佳方式运行。<p>以下是 Pulpie 和 Dripper 并排清理同一页面的效果:<a href="https://www.youtube.com/watch?v=ibd-tIiQECo" rel="nofollow">https://www.youtube.com/watch?v=ibd-tIiQECo</a>。您可以亲自进行并排比较:<a href="https://huggingface.co/spaces/feyninc/pulpie" rel="nofollow">https://huggingface.co/spaces/feyninc/pulpie</a><p>我们构建 Pulpie 的动机来自开发一个深度研究工具。每个搜索 API 都返回包含广告、导航元素和侧边栏的嘈杂内容。有一次,一则关于“Gemini on Pixel”的广告混入了我们的搜索结果,被传递到 LLM 上下文中,最终出现在提供给用户的最终答案中。这让我们很尴尬,但也让我们认识到糟糕的数据会扼杀模型的智能。我们构建 Pulpie 是为了以低成本获得干净的数据。<p>所有模型都在 Hugging Face 上开源。您可以在此处了解我们的训练过程以及如何使用 Pulpie:<a href="https://usefeyn.com/blog/pulpie-pareto-optimal-models-for-cleaning-the-web/#get-started">https://usefeyn.com/blog/pulpie-pareto-optimal-models-for-cl...</a><p>很高兴回答任何问题!
查看缓存全文
缓存时间: 2026/07/06 17:05
# Pulpie:用于清理网页的帕累托最优模型——Feyn
来源:https://usefeyn.com/blog/pulpie-pareto-optimal-models-for-cleaning-the-web/
我们推出了 Pulpie,一个用于从 HTML 页面提取主要内容的帕累托最优模型系列。***Pulpie 的提取质量接近 SOTA,但成本仅为后者的二十分之一。***
我们最小的模型 `pulpie-orange-small` 在 WebMainBench 上取得了 0.862 ROUGE-5 F1 分数。这与领先的提取器 Dripper(得分 0.864)相当。Pulpie 的性能优势得益于其仅为其三分之一的大小:2.1 亿参数对比 Dripper 的 6 亿参数。
性能提升源于架构设计。Pulpie 是一个编码器,它能在单次前向传播中为每个 HTML 区块标记为内容或样板。这也使其非常快速。
在 NVIDIA L4 GPU 上,`pulpie-orange-small` 每秒可处理 13.7 个页面,而 Dripper 仅为 0.68 个页面。以 L4 实例每小时 0.39 美元的成本计算,***使用 Pulpie 清理 10 亿页面的成本为 7,900 美元,而使用 Dripper 则需要 159,000 美元。***
Pulpie 实现了以前不可能大规模完成的高质量网页提取。我们预计这将有利于预训练和上下文管理。
我们的模型是开源的,可在 Hugging Face (https://huggingface.co/feyninc) 上获取。请参阅入门指南 (https://usefeyn.com/blog/pulpie-pareto-optimal-models-for-cleaning-the-web/#get-started) 了解使用说明。
语言模型会消耗网页两次。第一次是在预训练期间,它们学习世界知识。第二次是在推理时,它们拉取相关上下文。这两次输入的大部分都是噪音。在探索过程中,我们发现典型 HTML 页面上 70% 的区块是导航、广告、侧边栏和页脚等样板。主要内容只占页面的一小部分。
然而,正是这一小部分决定了模型在两端(预训练和推理)的质量。
AICC (Ma et al., 2025 (https://usefeyn.com/blog/pulpie-pareto-optimal-models-for-cleaning-the-web/#ref-1)) 测量了更干净的提取对预训练的影响。该团队使用同一 Common Crawl 快照构建了两个语料库。一个使用启发式方法提取内容,另一个使用基于模型的解析器提取内容。数据流水线中的所有其他条件保持不变。然后他们在每个语料库上训练了相同的模型。
使用模型提取的语料库训练的模型在 13 个基准测试中的平均准确率高出 1.08 个百分点。由于只有提取逻辑发生了变化,我们可以将这一提升完全归功于拥有更干净的数据。
令人印象深刻的是,同一个模型还击败了在 FineWeb 和 RefinedWeb(两个经过最严格过滤的预训练语料库)上训练的模型。这些数据集通过精心设计的过滤和去重赢得了声誉。通过改进提取器来击败它们,说明了干净数据的巨大价值。
除了设定低基线外,糟糕的提取还会实实在在地损害模型。启发式方法会破坏结构化内容。下表展示了 Trafilatura 和基于模型的提取器在保留代码块和公式方面的对比。低相似度分数表明内容被破坏。如果在训练中使用,最终模型将继承这种损害。
| 内容 | Trafilatura (启发式) | 基于模型 |
|------|----------------------|----------|
| 代码块 | 0.13 | 0.91 |
| 公式 | 0.61 | 0.94 |
数据质量在推理时也很重要。Shi et al. (ICML 2023) (https://usefeyn.com/blog/pulpie-pareto-optimal-models-for-cleaning-the-web/#ref-13) 指出,一个不相关的段落就足以使模型的答案偏离轨道。当模型的上下文没有噪音时,它会更准确、更高效。
## 预算内的网页清理
清理网页在训练和推理中都有回报。悬而未决的问题是我们如何大规模地进行良好清理?
首先,为了理解现状,我们可以根据一个问题将当前的提取器分为两类:该方法是读取页面内容,还是检查页面结构?
**基于结构的提取器** 通过表面信号判断 HTML 区块。它们对标签、DOM 和文本密度应用规则,以分离内容和样板。Trafilatura、Readability 和 magic-html 就是这样工作的。Boilerpipe 更进一步,在这些相同信号上训练分类器。这些提取器易于运行,但会混淆构建方式相似的元素。一个导航表格和一个数据表格,在算法按单元格计数时看起来一模一样。
**读取型提取器** 将页面输入到 transformer 中,并根据区块内容为每个区块打标签。Dripper 是建立在此思想上的解码器。解码器一次输出一个令牌的标签。每个标签都强制从内存中读取整个模型以完成一步工作。这导致速度受限于内存带宽,并且运行成本高昂。
Pulpie 保留了读取方法,但将瓶颈转移到了计算上。我们通过使用一种编码器架构来实现这一点,该架构在单次前向传播中为每个区块打标签。这使得 Pulpie 能够匹配 Dripper 的质量,同时体积更小、速度更快、成本更低。
| 方法 | ROUGE-5 F1 | 成本 / 10亿页面 |
|------|------------|-----------------|
| ... | ... | ... |
(图表数据略,按原文格式保留)
Pulpie Small vs Dripper:20倍成本降低,相同质量
## 清理原始 HTML
完整的流水线分为四个阶段:
1. **简化 HTML。** 移除脚本、样式和其他格式噪音。为每个区块分配唯一 ID。
2. **分块。** 将区块拆分,进行分词,并将其打包成最多 8,192 个令牌的块,以便每个块在单次传递中适配模型。大约 80% 的页面适合单个块。
3. **分类。** 执行一次前向传播。Pulpie 将每个区块标记为内容或样板。
4. **返回。** 将保留的区块作为 HTML 返回,或将其转换为 Markdown。
## 训练
训练 Pulpie 需要一个包含区块级标签的大型 HTML 页面集合。没有这样的公开集合,因此我们自己构建了一个。
我们从 Common Crawl 中采样了 16,670 个英文页面,限制每个域名一个页面。然后我们使用 MinerU-HTML 将每个页面分割成区块,并使用 DeepSeek V3.2 将每个区块标记为内容或样板。进一步过滤去除了空页面、损坏页面以及其他不合格页面,剩下 15,880 个页面。
然后,我们使用 Dripper 0.6B 作为第二个标注器对所有 15,880 个页面进行标注,以标记不一致的标签。区块级别的与 DeepSeek 的一致率为 93.3%。我们保留了 14,959 个页面,其中两个标注器在至少 70% 的区块上达成一致,牺牲了一些数据以换取更干净的训练集。
## 训练教师模型
为了创建我们的教师模型,我们在上述 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,一个 6.1 亿参数的编码器。
- Pulpie Orange Small,一个 2.1 亿参数的编码器。
两个学生模型都按照 Hinton et al. (2015) (https://usefeyn.com/blog/pulpie-pareto-optimal-models-for-cleaning-the-web/#ref-3) 的方法从教师模型学习。教师模型的软化输出分布通过 KL 散度损失(权重 0.7)提供大部分信号,硬标签交叉熵占剩余的 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 持平。前沿 LLM 在此基准上得分更高,接近 0.90,这是 Pulpie 接近的质量水平。
Dripper 在 135 个页面上返回空结果。其中 130 个是由于页面溢出其 32k 令牌上下文窗口。Pulpie 将区块打包成 8,192 令牌块,因此页面长度永远不会导致失败。
按难度划分的结果:
| 方法 | 全部 | 简单 | 中等 | 困难 |
|------|------|------|------|------|
| 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 点。
### 速度
NVIDIA L4
页面/秒
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 |
Pulpie Orange Small 在相同 L4 上运行速度比 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 相当,同时质量更高。
### 成本
NVIDIA L4
成本 / 10亿页面
L4 以 $0.39/hr 计算处理 10 亿页面的成本。使用上述测量的吞吐量计算:
| 设置 | 页面/秒 | GPU 小时 / 10亿 | 成本 / 10亿页面 |
|------|---------|-----------------|-----------------|
| Pulpie Small on L4 | 13.7 | 20,300 | ~$7,900 |
| Dripper on L4 | 0.68 | 408,000 | ~$159,000 |
| Pulpie Base on L4 | 3.9 | 71,200 | ~$28,000 |
| Pulpie Large on L4 | 1.3 | 214,000 | ~$83,000 |
A100 以 $2.72/hr 计算处理 10 亿页面的成本。使用上述测量的吞吐量计算:
| 设置 | 页面/秒 | GPU 小时 / 10亿 | 成本 / 10亿页面 |
|------|---------|-----------------|-----------------|
| Pulpie Small on A100 | 25.7 | 10,800 | ~$29,000 |
| Dripper on A100 | 3.6 | 77,200 | ~$210,000 |
| Pulpie Base on A100 | 7.7 | 36,100 | ~$98,000 |
| Pulpie Large on A100 | 3.5 | 79,400 | ~$216,000 |
### 廉价 GPU 更适合编码器
Pulpie 和 Dripper 之间的吞吐量差距远大于 3 倍的规模差异所暗示的。在 A100 上,我们测量到这一差距为 7.1 倍,而在 L4 上则扩大到 20 倍。原因在于架构。
解码器一次生成一个令牌的标签。每一步都需要从 GPU 内存中读取整个模型来生成一个令牌。因此,解码器的速度受限于内存带宽。相反,编码器对整体输入执行一次前向传播。这种密集矩阵乘法仅受限于计算。
此外,A100 和 L4 在带宽上的差异比在计算上的差异更大:
| 维度 | NVIDIA A100 | NVIDIA L4 | 比例 (A100/L4) |
|------|-------------|-----------|-----------------|
| 内存带宽 | 2,039 GB/s | 300 GB/s | ~6.8x |
| Tensor Core TFLOPS | 312 | 120 | ~2.6x |
从 A100 降到 L4 对受带宽限制的解码器影响远大于对受计算限制的编码器。这扩大了吞吐量差距,并让 Pulpie Orange Large 在 L4 上领先于 Dripper,尽管在 A100 上两者相当。
## 入门指南
Pulpie 模型已在 Hugging Face 上发布。安装包:
```
pip install pulpie
```
从原始 HTML 中提取干净内容:
```python
from pulpie import Extractor
extractor = Extractor() # 默认使用 Pulpie Orange Small
result = extractor.extract(html)
print(result.markdown) # 干净的 markdown
print(result.n_main, result.n_other) # 保留与丢弃的区块数
```
如需追求最高质量而非速度,可选择更大的模型:
```python
extractor = Extractor(model="large") # "small" (default), "base", or "large"
```
对于批量处理,流水线将一个或多个 GPU 上的 CPU 预处理与 GPU 推理重叠:
```python
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 et al., 2025 (https://usefeyn.com/blog/pulpie-pareto-optimal-models-for-cleaning-the-web/#ref-2)),使用相同的 `<|sep|>` 区块标记架构,并共享同一个分词器:
| 名称 | 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 (https://github.com/feyninc)、Hugging Face (https://huggingface.co/feyninc) 或 X (https://x.com/FeynAI) 上找到我们。
## 致谢
Pulpie 直接建立在 MinerU-HTML 和 Dripper 团队 (Ma et al., 2025 (https://usefeyn.com/blog/pulpie-pareto-optimal-models-for-cleaning-the-web/#ref-1)) 的工作之上。他们的 `simplify_html` 预处理、区块级标注方案以及 WebMainBench 基准测试是这项工作的基础。我们还使用他们的 Dripper 0.6B 模型来交叉验证我们的训练标签。我们非常感谢他们公开了工具和数据。
## 参考文献
[1] Ma et al. "AICC: Parse HTML Finer, Make Models Better — A 7.3T AI-Ready Corpus Built by a Model-Based HTML Parser." *arXiv:2511.16397* (2025).
[2] Boizard et al. "EuroBERT: Scaling Multilingual Encoders for European Languages." *arXiv:2503.05500* (2025).
[3] Hinton et al. "Distilling the Knowledge in a Neural Network." *arXiv:1503.02531* (2015).
[4] Raffel et al. "Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer." *JMLR* 2020.
[5] Penedo et al. "The RefinedWeb Dataset for Falcon LLM: Outperforming Curated Corpora with Web Data Only." *NeurIPS* 2023.
[6] Penedo et al. "The FineWeb Datasets: Decanting the Web for the Finest Text Data at Scale." *arXiv:2406.17557* (2024).
[7] Li et al. "DataComp-LM: In Search of the Next Generation of Training Sets for Language Models." *NeurIPS* 2024.
[8] Soldaini et al. "Dolma: An Open Corpus of Three Trillion Tokens for Language Model Pretraining Research." *ACL* 2024.
[9] Barbaresi. "Trafilatura: A Web Scraping Library and Command-Line Tool for Text Discovery and Extraction." *ACL/IJCNLP* 2021.
[10] Kohlschütter et al. "Boilerplate Detection using Shallow Text Features." *WSDM* 2010.
[11] Pomikálek. "Removing Boilerplate and Duplicate Content from Web Corpora." *PhD thesis, Masaryk University*, 2011.
[12] Bevendorff et al. "An Empirical Comparison of Web Content Extraction Algorithms." *SIGIR* 2023.
[13] Shi et al. "Large Language Models Can Be Easily Distracted by Irrelevant Context." *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}
}
```
相似文章
Show HN:以Fable质量一半的成本优化和服务模型
World Model Optimizer 是一款开源CLI工具,能够从智能体轨迹中优化AI模型,并通过路由器提供服务,在降低成本的同时保持前沿模型的质量。
新本地模型在PII移除上达到接近前沿性能,仅需9毫秒CPU推理
介绍了ScreenLeak基准,用于衡量计算机使用AI数据中的PII编辑,并提出了两个本地模型(用于文本的v45_phase3和用于图像的rfdetr_v8),在低延迟下实现了接近前沿的性能。
我对规模从2B到35B的模型进行了高难度HTML数据提取的基准测试
一项基准测试,比较了参数规模从2B到35B的AI模型在从HTML中提取结构化数据这一具有挑战性的任务上的表现和准确性。
哪种网络搜索API能为本地RAG解析提供最干净的Markdown输出?
针对为本地RAG管线提供干净Markdown输出的需求,本文比较了多种网络搜索API与工具(包括Brave Search、Parallel AI、You.com、Exa、Tavily、Firecrawl、Jina Reader以及SearXNG),评估它们在信噪比和开发者开销方面的表现。
基于微调PEGASUS的抽象摘要优化
本文展示了在XL-Sum英语语料库上微调PEGASUS的方法,在ROUGE评分上相比基线mT5模型取得了显著提升,达到了当前最优结果。