Pulpie: Парето-оптимальные модели для очистки веб-страниц
- title
- Pulpie: Парето-оптимальные модели для очистки веб-страниц
- type
- summary
- summary
- Encoder-модели, размечающие блоки HTML как контент или шум за одну двадцатую стоимости Dripper
- tags
- llm, web-scraping, content-extraction, pretraining
- sources
- pulpie-web-cleaning
- created
- 2026-07-23
- updated
- 2026-07-23
- lang
- ru
- translation_of
- pulpie-web-cleaning
- source_updated
- 2026-07-23
- translated
- 2026-09-01
- translator
- lllm/antigravity/gemini-3.7-flash-medium
Feyn выпустила Pulpie - семейство из трёх моделей с открытыми весами, которые принимают сырой HTML и возвращают основной контент. Заявление в анонсе касается в первую очередь стоимости, а не качества: самая компактная модель набирает 0.862 ROUGE-5 F1 на WebMainBench против 0.864 у Dripper, но делает это при 210M параметров вместо 600M и со скоростью 13.7 страниц/с вместо 0.68 на той же NVIDIA L4. Очистка миллиарда страниц обходится примерно в $7,900 с Pulpie Orange Small и в $159,000 с Dripper.
Почему качество извлечения стоит денег
Feyn формулирует это так: модели поглощают веб дважды - на этапе pre-training и снова при inference, и в обоих случаях большая часть входных данных - мусор. Их собственный замер при анализе данных: около 70% блоков на типичной HTML-странице приходятся на навигацию, рекламу, боковые панели и подвалы, оставляя под основной контент лишь небольшую долю файла.
Доказательства пользы для pre-training взяты из статьи AICC (Ma et al., 2025). На базе одного и того же снимка Common Crawl собрали два корпуса, зафиксировав всё, кроме инструмента извлечения: с одной стороны эвристики, с другой - парсер на базе модели. На каждом обучили идентичные модели. Модель, обученная на корпусе с модельным парсингом, набрала в среднем на 1.08 процентного пункта больше по 13 бенчмаркам и обошла модели, обученные на FineWeb и RefinedWeb, хотя те известны сложной фильтрацией и дедупликацией, а не качеством парсинга.
Эвристические экстракторы к тому же портят структурированный контент, а не просто выбрасывают его. Trafilatura сохраняет блоки кода со сходством 0.13, а формулы - 0.61, против 0.91 и 0.94 у моделей извлечения. Модель, обученная на таком корпусе, наследует эти искажения.
Аргумент со стороны inference опирается на работу Shi et al. (ICML 2023): одного нерелевантного фрагмента достаточно, чтобы сломать ответ. По этой же причине чистое извлечение важно для context-engineering - зашумлённая страница в контексте расходует и токены, и точность.
Структурные экстракторы против читающих
В публикации существующие экстракторы разделяются по одному вопросу: читает ли метод страницу или анализирует её структуру?
Структурные экстракторы оценивают блок по поверхностным признакам - тегам, форме DOM-дерева, плотности текста. Так работают Trafilatura, Readability и magic-html, а Boilerpipe обучает классификатор на тех же сигналах. Они дешёвые в работе и путают одинаково устроенные элементы. Навигационная таблица и таблица с данными неотличимы для алгоритма, который просто считает ячейки.
Читающие экстракторы передают страницу в transformer и размечают каждый блок по его смыслу. Dripper делает это через decoder, и именно архитектура decoder'а создаёт основные затраты: генерация по одной метке за шаг требует вычитывать всю модель из памяти GPU на каждом шаге, поэтому пропускная способность упирается в пропускную способность памяти.
Pulpie сохраняет читающий подход, но переносит узкое место в вычисления. Это encoder, который размечает все блоки за один прямой проход (forward pass) - плотное матричное умножение, ограниченное FLOPS, а не пропускной способностью памяти. Из-за этой разницы разрыв в скорости оказывается больше, чем отношение размеров: в 7.1 раза на A100 и в 20 раз на L4. У A100 пропускная способность памяти примерно в 6.8 раза выше, чем у L4, но производительность тензорных ядер - лишь примерно в 2.6 раза выше, поэтому переход на более дешёвую карту бьёт по decoder'у гораздо сильнее, чем по encoder'у. Pulpie Orange Large не уступает Dripper на A100 и вырывается вперёд на L4.
Конвейер обработки
Четыре этапа. Упростить HTML (вырезать скрипты, стили и шум форматирования, пометить каждый блок ID), разбить блоки на пачки размером не более 8 192 токенов, выполнить один прямой проход для разметки каждого блока как контента или шума, вернуть сохранённые блоки в виде HTML или преобразовать в Markdown. Около 80% страниц укладываются в один чанк.
У разбиения на чанки есть побочный плюс, заметный на бенчмарке. Dripper ничего не возвращает на 135 из 6 647 английских страниц WebMainBench, и 130 из них - это страницы, превысившие его контекстное окно в 32k токенов. Упаковка в чанки у Pulpie исключает сбои из-за длины страницы: Orange Small не возвращает результат на 45 страницах, Orange Large - на 21.
Как обучалась модель
В открытых датасетах не было разметки на уровне блоков, поэтому Feyn создала свой. Они взяли выборку из 16 670 английских страниц Common Crawl (по одной на домен), разбили каждую на блоки с помощью MinerU-HTML и разметили каждый блок через DeepSeek V3.2. После удаления пустых и повреждённых страниц осталось 15 880. Затем по всем ним запустили Dripper 0.6B как второго разметчика; согласие с DeepSeek на уровне блоков составило 93.3%, и были оставлены только те 14 959 страниц, где оба разметчика сошлись хотя бы по 70% блоков.
Модель-учитель - это EuroBERT-2.1B, дообученный на этих страницах: learning rate 2e-5, эффективный batch size 8, class-weighted cross-entropy с весами, обратно пропорциональными доле контента в 28.6%, на 4x A100. Она набирает 0.873.
Две модели-ученика дистиллированы из неё по схеме Hinton et al.: KL-дивергенция со сглаженным распределением учителя с весом 0.7, cross-entropy по жёстким меткам 0.3, температура 2.0, те же обучающие данные. Orange Base (610M) достигает 0.863, а Orange Small (210M) - 0.862, так что десятикратное уменьшение размера обходится всего в 1.1 пункта F1.
| модель | параметры | ROUGE-5 F1 | страниц/с (L4) | стоимость / 1 млрд страниц (L4) |
|---|---|---|---|---|
| Trafilatura | эвристика | 0.619 | - | - |
| magic-html | эвристика | 0.700 | - | - |
| Pulpie Orange Small | 210M | 0.862 | 13.7 | ~$7,900 |
| Dripper | 0.6B | 0.864 | 0.68 | ~$159,000 |
| Pulpie Orange Base | 610M | 0.863 | 3.9 | ~$28,000 |
| Pulpie Orange Large | 2.1B | 0.873 | 1.3 | ~$83,000 |
В разбивке по сложности эвристики проседают сильнее всего: от простых страниц к сложным потеря составляет от 14 до 20 пунктов F1 против примерно 9 у encoder'ов. Передовые LLM, по оценке Feyn, показывают на этом бенчмарке около 0.90 - к этому потолку Pulpie скорее приближается, чем достигает его.
Использование
from pulpie import Extractor
extractor = Extractor() # defaults to Pulpie Orange Small
result = extractor.extract(html)
print(result.markdown)
print(result.n_main, result.n_other) # blocks kept vs dropped
Extractor(model="large") жертвует скоростью ради качества уровня учителя, а класс Pipeline совмещает предобработку на CPU с inference на GPU при массовой обработке на одной или нескольких GPU. Все три модели выложены на Hugging Face в репозитории feyninc/, построены на EuroBERT с общим токенизатором и одинаковой архитектурой маркеров блоков <|sep|>.
Feyn отмечает вклад команд MinerU-HTML и Dripper: их предобработку simplify_html, схему разметки на уровне блоков, бенчмарк WebMainBench и сам Dripper 0.6B как кросс-валидирующий разметчик.
Связь с базой знаний
Пайплайн ingest'а в этой базе знаний относится к эвристической стороне разделения. claude-defuddle использует CLI defuddle - структурный экстрактор из семейства Readability, и показатель сходства 0.13 для блоков кода в точности описывает тот сбой, который критичен при сохранении технических статей. Encoder на 210M параметров достаточно компактен для локального запуска, так что подход на базе моделей больше не является привилегией тех, у кого есть бюджеты на pre-training. Что касается поиска и извлечения, команда `extract` в kagi-cli решает ту же проблему оплатой API.