Pulpie: 網頁清洗的帕累托最優模型
Pulpie: 網頁清洗的帕累托最優模型
Pulpie 是一系列帕累托最優(Pareto-optimal)模型,旨在透過移除導航、廣告和頁尾等冗餘資訊(boilerplate),從 HTML 頁面中提取主要內容。透過使用編碼器(encoder)架構而非解碼器(decoder),Pulpie 在實現尖端(SOTA)提取品質的同時,將成本降低至 Dripper 等領先提取器的 1/20。
對 LLM 訓練與推理的高影響力數據清洗
對於大型語言模型(LLMs)的預訓練和推理階段,乾淨的數據至關重要。研究表明,基於模型的提取方法在保留程式碼塊和公式等結構化內容方面,顯著優於基於啟發式(heuristic-based)的方法,後者往往會破壞數據。
根據 AICC (Ma et al., 2025),單獨改進提取器就能帶來模型準確度的可衡量提升。在模型提取的語料庫上訓練的模型,在 13 個基準測試中的平均準確度比使用 FineWeb 和 RefinedWeb 等重度過濾語料庫訓練的模型高出 1.08 個百分點。
在推理階段,上下文窗口中的雜訊會干擾模型的回答。單個不相關的段落就可能降低準確度和效率,這使得高品質的清洗對於 RAG 流水線而言至關重要。
架構轉向:從頻寬受限轉向計算受限
Pulpie 的效率提升源於其架構。傳統的提取器如 Dripper 使用解碼器,一次發送一個 token 來輸出標籤——這使得它們受限於頻寬且成本高昂——而 Pulpie 使用編碼器,在單次前向傳播中為每個 HTML 區塊標籤化。這將瓶頸從記憶體頻寬轉移到了計算,而這在現代 GPU 上效率顯著更高。
這種架構差異在像 NVIDIA L4 這樣較便宜的 GPU 上尤為明顯。在 L4 上,pulpie-orange-small 每秒處理 13.7 個頁面,而 Dripper 僅為 0.68 個頁面。當規模擴大到十億個頁面時,這會導致巨大的成本差異:
| Setup | Pages/sec (L4) | Cost / 1B pages (L4) | | :--- | :--- | :--- | | | Pulpie Small | 13.7 | ~$7,900 | | Dripper | 0.68 | ~$159,000 |
模型家族與性能基準測試
Pulpie 由一個教師模型和兩個蒸餾後的學生模型組成。所有模型都基於 EuroBERT 並使用 <|sep|> 區塊標記架構。
模型規格
| Model | Parameters | ROUGE-5 F1 | Notes |
|---|---|---|---|
| Pulpie Orange Large | 2.1B | 0.873 | Teacher model |
| Pulpie Orange Base | 610M | 0.863 | Distilled from Large |
| Pulpie Orange Small | 210M | 0.862 | Recommended for production |
品質比較
在 WebMainBench 英文子集上,Pulpie Orange Small 的品質與 Dripper 持平(0.862 vs 0.864 ROUGE-5 F1),但體積僅為其三分之一。Pulpie 在處理長頁面方面也優於 Dripper;由於 Pulpie 將區塊打包成 8,192-token 的區塊,因此它不會遇到 32k-token 上下文窗口失效的問題,而 Dripper 在 135 個頁面中返回了空結果。
訓練與蒸餾流水線
Pulpie 模型是使用從 16,670 個英文 Common Crawl 頁面創建的高品質合成數據集進行訓練的。每個頁面被使用 MinerU-HTML 切分為區塊,並由 DeepSeek V3.2 標記為內容或內容冗餘(content-boilerplate)。為了確保標籤品質,標籤經過了 Dripper 0.6B 的交叉驗證,僅保留兩個標籤器在至少 70% 的區塊上達成一致的頁面。
- 教師訓練:使用 class-weighted cross-entropy 來處理不平衡(內容率為 28.6%)的情況,在驗證過的數據集上對 EuroBERT-2.1B 模型進行微調。
- 蒸餾:在溫度為 2.0 的情況下,結合使用 KL-divergence loss(權重 0.7)和 hard-label cross-entropy(0.3)將 2.1B 的教師模型蒸餾到 Base (601M) 和 Small (210M) 模型中。
實作與使用
Pulpie 可作為 Python 套件使用,並在 Hugging Face 上開源。用戶可以根據對速度與品質的需求選擇模型大小。
from pulpie import Extractor
# Defaults to Pulpie Orange Small
extractor = Extractor()
result = extractor.extract(html)
print(result.markdown) # Clean markdown output
對於批量處理,Pipeline 類別允許 CPU 預處理與 GPU 推理重疊進行:
from pulpie import Extractor, Pipeline, PageInput
pipeline = Pipeline(model="small")
results = pipeline.extract_batch(
[PageInput(html=h, page_id=i) for i, h in enumerate(pages)]
)
社群回應
雖然該版本的發布獲得了對其架構洞察力的讚賞,但一些社群成員質疑是否有必要使用基於模型的提取器來取代簡單的 CSS 選擇器或 Markdown 轉換器。然而,作者提供的數據顯示,像 Trafilatura 這樣的啟發式工具在 ROUGE-5 F1 (0.619) 上的得分顯著低於 Pulpie Orange Small (0.862),說明了在網頁規模清洗數據時的品質差距。