Оформление
ocr
Сервис распознавания сканов и фотографий: как устроена фоновая задача, какие модели используются и какие у сервиса слабые места.
Назначение
Принимает скан, фотографию страницы или PDF, состоящий из изображений, и распознаёт текст. Определяет разметку страницы, находит таблицы, читает текст. Возвращает два файла: markdown для чтения и json с постраничным текстом.
В платформе источник называется OCR. Репозиторий называется paleograph, внутренняя настройка сервиса называет его ocr-mcp.
Про имя hippocampus
Заголовок файла README в репозитории paleograph называет сервис hippocampus. Это устаревшая надпись: в коде, настройках и тестах такого имени нет ни разу. На архитектурной схеме продукта Hippocampus нарисован внутри базы знаний, а не здесь.
Инструменты
Три инструмента, модель видит два.
| Инструмент | Кто вызывает | Назначение |
|---|---|---|
init_eva_session | Только Runtime | Привязка сессии |
parse | Модель | Запуск распознавания, возвращает номер задачи |
parse_result | Модель | Опрос состояния задачи |
Распознавание идёт минутами, поэтому оно построено как фоновая задача. Модели предписано опрашивать состояние примерно раз в 15 секунд.
Особая форма параметров
В отличие от остальных сервисов, параметры здесь передаются не по отдельности, а одним вложенным объектом payload. Это стоит проверить на стенде: платформа должна надёжно формировать именно такую форму вызова.
Что за ним стоит
Механизм распознавания выбирается настройкой.
| Настройка | Что используется |
|---|---|
recognitor (по умолчанию) | Закрытая сборка ZeBrains, объединяющая несколько механизмов распознавания |
got_ocr | GOT-OCR2.0 |
qwen_mlx | Qwen2.5-VL, только на процессорах Apple |
В зависимостях закреплены Surya OCR, PaddleOCR вместе с PaddlePaddle, EasyOCR, а также torch и transformers.
| Параметр | Значение |
|---|---|
| Разрешение отрисовки PDF | 200 точек на дюйм |
| Предел длины ответа модели распознавания | 4096 токенов |
| Устройство | Видеокарта в основном режиме, Apple MPS в режиме для разработки |
| Закрытый источник пакетов | Требуется для установки закрытых зависимостей |
Точный состав моделей неизвестен
Основной механизм распознавания это закрытый пакет, которого нет на диске. По зависимостям видно, какие семейства он может использовать, но не видно, какие именно контрольные точки моделей и каких версий там внутри. Ещё в двух файлах зависимостей указаны разные версии этого пакета. Список моделей нужно подтверждать у команды.
Ограничения
| Ограничение | Подробности |
|---|---|
| Форматы у открытых механизмов | Только изображения и PDF. Описание сервиса при этом обещает ещё и офисные форматы, но открытые механизмы их не читают |
| Предел размера файла | Отсутствует вообще. Единственный сервис без такой проверки |
| Одновременная работа | Один рабочий поток. Все распознавания идут строго по очереди |
| Таймаут задачи | Отсутствует |
| Перезапуск | Все задачи и очередь теряются без предупреждения |
| Повторный опрос готовой задачи | Первый опрос забирает результат и удаляет задачу. Второй опрос вернёт ошибку «задача неизвестна» |
| Одновременных задач в памяти | Пять. При шестой самая старая молча вытесняется |
Модель загружается заново на каждый документ
По умолчанию включён режим, при котором модель выгружается из памяти после каждой работы и загружается снова на следующей. Это экономит память, но стоимость загрузки модели платится за каждый документ.
Имена файлов результата берутся такими, какими их создал механизм распознавания. Два документа с одинаковым началом имени затрут результаты друг друга.
Замечание по безопасности
Настройка логирования в этом сервисе состоит из нескольких строк и не содержит скрытия чувствительных значений. Обращения к файлам чата идут с ключом доступа в адресе, а значит ключ попадает в логи в открытом виде.
Все остальные сервисы, кроме searcher, это скрытие выполняют, и оно же требуется их общим внутренним регламентом. Это единственный настоящий пробел в обращении с секретами среди переданных сервисов.
Развёртывание
| Параметр | Значение |
|---|---|
| Транспорт | Только Streamable HTTP, задан в коде |
| Порт | В настройках 8002, в описании и примере окружения 8802 |
| Образ | python:3.12, плюс системные библиотеки для работы с изображениями |
| Файл для docker compose | Отсутствует |
Разные значения порта
Порт указан в трёх местах и двумя разными значениями. На стенде источник OCR подключён по порту 8802, значит рабочее значение именно это.