EnglishРусский Map

Pulpie: Парето-оптимальные модели для очистки веб-страниц

title
Pulpie: Парето-оптимальные модели для очистки веб-страниц
type
summary
summary
Encoder-модели, размечающие блоки HTML как контент или шум за одну двадцатую стоимости Dripper
tags
llm, web-scraping, content-extraction, pretraining
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.