Как вы себе представляете работу OCR? Страничка сканируется, программа находит области с буквами, распознает их и выдает текст. Старый добрый Tesseract так и пашет. А вот новый baidu/Unlimited-OCR делает финт ушами: он буквы вообще не ищет. Он берет всю страницу как картинку, жмет ее в горстку визуальных токенов и скармливает языковой модели, которая разворачивает их обратно в структурированный текст. Звучит вроде как надругательство над здравым смыслом, но… работает, и еще как!
Сегодня коротко разложу: что предлагает рынку идейный наследник DeepSeek-OCR, как он устроен, что умеет и как запустить его у себя. Будет полезно всем, кто хочет распознавать многостраничные документы одним залпом.

Суть за 10 секунд
Unlimited-OCR — это вам не просто распознавалка букв, это end-to-end мультимодальная модель на 3B параметров с лицензией MIT. Она кодирует страницу документа в визуальные токены, а LLM-декодер превращает их в цельный Markdown с таблицами, формулами и прочими прелестями форматирования. Контекст до 32 000 токенов, поэтому возможен разбор длинного документа как единой связной задачи, а не кучки разрозненных страниц текста.
3B параметров — Размер
Компактная vision-language модель в BF16. В теории способна влезть на одну видеокарту.
MIT — Лицензия
Полностью открытая — можно брать в коммерцию без плясок с бубном.
32 768 токенов — Контекст
Хватает, чтобы распарсить многостраничный документ (около 40 страниц) или PDF за одну проходку.
Главная идея: оптическое сжатие
Если скармливать LLM длинный документ текстом, токены растут линейно с количеством слов: страница на 1 000 слов — это ~1400 токенов, десять страниц — уже 14 000. В общем, долго, дорого и нудно. А если ту же страницу закодировать как картинку, визуальный энкодер ужимает ее до фиксированного значения токенов (~256 на страницу), и не важно, сколько там текста, что уже интереснее с точки зрения экономии.

Профит двойной: документ обычно влезает в контекст целиком (отсюда название «Unlimited», хотя, конечно, это не совсем правда) и инференс дешевле — LLM обрабатывает сотни визуальных токенов вместо тысяч текстовых. Именно этот подход впервые применили в DeepSeek-OCR, а Unlimited-OCR, продвигает эту затею дальше в сторону длинных документов.
Самая сложная и похожая на магию деталь в этом всем R-SWA (Reference Sliding Window Attention). Смотрите. Ахиллесова пята любой авторегрессионной модели, которая генерирует большой результат — это KV-кеш. Decoder модели выдает результат токен за токеном и модели нужно помнить весь предыдущий контекст, чтобы сгенерировать следующий токен. В итоге при длинных контекстах кеш становится больше модели, занимает всю память и вы ловите ‘Out of Memory’. Unlimited-OCR решает эту проблему изящно: вместо хранения полной истории сгенерированного текста он держит опорную информацию о документе + ограниченное скользящее окно последних выходных токенов. За счет этого KV-кеш держится в рамках одного значения по мере генерации, а не растет вместе с длиной результата. Он почти как школьник: скользит глазами по тексту, понимая что читает сейчас, но уже не помня, что было в начале главы. Аналогия поверхностная, но тонкости работы R-SWA, пожалуй, заслуживают отдельной статьи.
Как работает: пайплайн
Технически это связка «глаза + мозг»: визуальный энкодер видит картинку, языковая модель пишет текст. Примерно так это выглядит по шагам:

Откуда корни
Авторы прямо благодарят DeepSeek-OCR, DeepSeek-OCR-2 и PaddleOCR. Точная начинка, как написано в каточке к GGUF-квантизации, —
SAM+CLIP DeepEncoder vision tower with a DeepSeek-V2 MoE text decoder.
Режимы: gundam vs. base
Эта модель работает в двух режимах, которые вы увидите сразу при запуске:
Gundam (
base_size=1024, image_size=640, crop_mode=True) — картинку режут на тайлы по 640px. Подойдет для крупных сканов, страниц с плотной версткой и множеством мелких деталей вроде сносок мелким шрифтом.Base (
base_size=1024, image_size=1024, crop_mode=False) — страница целиком в 1024 px без нарезки. Проще и быстрее. Многостраничные документы и PDF можно обрабатывать только в этом режиме.
Проще говоря: если текст мелкий и его много, выбирайте gundam. Обычная страница — base.
Что умеет
Распознавать одиночные изображения. Преобразует скан или фото документа в Markdown.
Обрабатывать многостраничные документы. Создает структурированные документы из последовательности картинок за один проход.
Извлекать содержимое из PDF. Преобразует страницы PDF в изображения с настраиваемым DPI и извлекает из них структурированный текст.
Читать документы на разных языках. Модель заявлена как multilingual, поэтому должна распознавать тексты на нескольких языках с сохранением структуры.
Сохранять иерархию и форматирование. Модель выделяет таблицы, формулы и заголовки, а не превращает содержимое в простыню текста.
Как запустить
Вариант 1: transformers (быстро пощупать)
Сначала установите необходимые библиотеки (версии из карточки модели):
pip install torch==2.10.0 torchvision==0.25.0 transformers==4.57.1 \ Pillow==12.1.1 einops==0.8.2 addict easydict pymupdf
Теперь сам код для обработки одной картинки:
from transformers import AutoModel, AutoTokenizer tokenizer = AutoTokenizer.from_pretrained('baidu/Unlimited-OCR', trust_remote_code=True) model = AutoModel.from_pretrained( 'baidu/Unlimited-OCR', trust_remote_code=True, use_safetensors=True, torch_dtype=torch.bfloat16, ) model = model.eval().cuda() model.infer( tokenizer, prompt='<image>document parsing.', image_file='your_image.jpg', output_path='your/output/dir', base_size=1024, image_size=640, crop_mode=True, # gundam-режим max_length=32768, no_repeat_ngram_size=35, ngram_window=128, save_results=True, )
Результаты (Markdown и разметка) будут сохранены в папку, указанную в output_path. Команда document parsing означает задачу парсинга документа, где <image> — это место для вашей картинки.
⚠️ Про no_repeat_ngram_size=35
У OCR-моделей есть распространенная болячка — на длинном документе декодер может зациклиться и повторять один и тот же кусок до бесконечности. Чтобы этого избежать, я добавил
no_repeat_ngram_size=35иngram_window(128 для одной картинки, 1024 для многостраничных) — это защита от сбоев. Если все равно получаете повторы, попробуйте изменить эти параметры.
Вариант 2: SGLang (для прода / API)
Если нужен сервер с OpenAI-совместимым API — модель поднимается через SGLang:
python -m sglang.launch_server --model-path baidu/Unlimited-OCR --trust-remote-code
После этого вы сможете отправлять обычные запросы на /v1/chat/completions, передавая картинку в content. Конкретные настройки (порт, размер контекста, tp) и пример запроса есть в описании модели.
Что выбрать
Transformers: подойдет, чтобы быстро проверить модель на паре картинок. SGLang: лучше использовать, когда нужна высокая производительность и API для больших нагрузок. Он поддерживает пакетную обработку и эффективно использует GPU. Для простой пакетной обработки PDF хватит и скрипта на transformers, запущенного в цикле.
Насколько хорош
По уважаемому OmniDocBench v 1.5 модель выдает 93,23%. На бенчмарке ParseBench (llamaindex) результаты более смешанные: средний балл — 46.17: сильна в извлечении самого текста (Text Content 86.81), но проседает на сохранении форматирования (Text Formatting 0.97). То есть текст она достанет хорошо, а вот со сложным оформлением пока есть проблемы, все-таки это еще совсем молодая модель, а не вылизанный продакшен-комбайн.
Когда брать
Unlimited-OCR — отличный выбор, если надо дешево и локально распарсить кучу документов или PDF в текст, особенно длинных. Если критична идеальная верстка таблиц — тестируйте на своих данных и сравнивайте с PaddleOCR или облачными OCR.
Итого
В общем тренд такой: OCR превращается из квеста «найди буквы» в квест «прочитай глазами». Если раньше нам нужно было распознать страницу как набор текстовых областей, конкретизировать их, а уже потом собрать из них какую-то логику, то теперь мы сначала получаем представление о структуре документа целиком, а потом нанизываем на него текстовую конкретику в токенах. Unlimited-OCR — дешевый открытый способ пощупать этот свежий подход. Можно качать HuggingFace и гонять свои PDF-ки.
Встретимся в новых сериях ML-изысканий для самых ИИ-любознательных.
