Единый скрипт src/cli.py → разрезание изображений на страницы (Stage 1). Нужен Stage 2 — распознавание текста и структуры документа, генерация LaTeX/HTML/Markdown для последующего анализа LLM.
Результат: 66 текстовых блоков, русский текст — ~60% точности.
i-WHAeKC AOrOBOpa вместо і - индекс договораt - номер месяцаB дефолте — латиница смешана с кириллицейРезультат: 22 структурированных блока с layout-разметкой.
[number], [formula], [text], [paragraph_title]\mathrm{C Rec}_{\mathrm{it}}=\sum...Результат: разница ~1-2%, несущественна.
LGD_ехtг; (кириллица г)LGD_ехtr; (латиница r) — чуть лучшеРезультат: ❌ не поддерживают русский.
Результат: +25% читаемости текста.
До: t - номер месяцаB дефолте, на который прогнозируются возвраты
После: т — номер месяца в диапазоне между текущим сроком в дефолте и горизонтом взыскания
Результат: полное восстановление текста + авто inline-формулы.
До: ΣДсе, - дисконтированная сумма возвратов
После: $\sum_t DCF_{i,t}$ — дисконтированная сумма возвратов
zen/go/v1/messagesРезультат: ❌ не поддерживает PaddleOCR как OCR-backend.
Результат: модель загружена (1.79 GB), ~15 мин/стр на CPU.
Результат: лучший русский OCR из коробки — но медленно на CPU.
<math>MRec_{it}</math> → $MRec_{it}$Результат: 118s на страницу с таблицей, качество отличное.
| col1 | col2 |$...$Входное изображение (JPEG/PNG/TIFF)
│
▼
src/image_split.py ← Stage 1: разрезание
│ --slice / --slice-auto
│ --border, --post-crop
│
▼
src/image_ocr.py ← Stage 2: OCR + Markdown
│ --ocr-engine paddle|surya
│ --llm, --vlm
│ --force-ocr, --pause
│ --result-one-document (ON по умолчанию)
│
├─ PaddleEngine / SuryaEngine (OCR)
├─ fix_ocr_errors (VaR, V^2)
├─ LlmCorrector (Qwen2.5-7B, local)
├─ VlmCorrector (Qwen3.8 Max, API)
│
▼
.md + .json (per page) + merged.md
| Функция | Статус |
|---|---|
--resume (пропуск JSON) |
ON |
--result-one-document |
ON |
--pause 5 |
ON |
--post-crop (Stage 1) |
ON |
src/
image_split.py — CLI Stage 1
image_ocr.py — CLI Stage 2
cli_utils.py — run_main()
env.py — загрузка .env
split/slicer.py — разрезание, post-crop, border
ocr/
paddle_engine.py — PP-StructureV3 + кастом YAML (eslav)
surya_engine.py — Surya 2 + CPU-оптимизации + health_check
postprocess/
fixups.py — VaR, V^2
corrector.py — Corrector Protocol
llm_corrector.py — Qwen2.5-7B локально
vlm_corrector.py — Qwen3.8 Max API (Anthropic)
markdown/generator.py — Markdown + валидация LaTeX
latex/
json_to_latex.py — Единый JSON→LaTeX (Paddle + Surya)
surya2html.py — Surya JSON → HTML + MathJax
tex2html.py — TeX → HTML
| Параметр | До | После | Эффект |
|---|---|---|---|
| KEEP_ALIVE | off | on | -23s повторный старт |
| CTX per slot | 12288 | 8192 | -30% RAM |
| Parallel slots | 8 | 1 | -80% слотов |
| Pre-scale | 2552px | 1056px | -60% пикселей |
| Threads | default | -t 8 |
стабильно |
| Итого | 430s | 300s | -30% |
llama-server не отвечает → logger.warning → перезапуск SuryaEngine
→ повторный health_check → OK / RuntimeError с инструкцией
| Параметр | PaddleOCR | Surya 2 | VLM Qwen3.8 |
|---|---|---|---|
| Архитектура | Ансамбль 5 моделей | Один VLM (650M) | Cloud VLM |
| Русский текст | ~85% | 95%+ | 98%+ |
| Формулы | PP-FormulaNet | VLM (отлично) | VLM (отлично) |
| Таблицы | PP-TableMagic + bbox | ❌ CPU timeout | ✅ Pipe-Markdown |
| Inline-формулы | Нет | <math> тэги |
$...$ |
| Скорость CPU | ~140s | ~300s | ~120s (API) |
| Офлайн | ✅ | ✅ | ❌ |
| Размер моделей | ~2.5 GB | ~1.5 GB | 0 (cloud) |
| Этап | PaddleOCR | Surya 2 | VLM |
|---|---|---|---|
| OCR (одна страница) | 140s | 300s | 120s |
| LLM-корректор | +5 min | не нужен | не нужен |
| VLM-корректор | +10s/блок | не нужен | — |
| JSON + MD сохранение | <1s | <1s | <1s |
| Merge в один документ | <1s | <1s | <1s |
| Итого на страницу | ~5 min | ~5 min | ~2 min |
| 12 страниц (batch) | ~28 min* | ~60 min | ~24 min |
* PaddleOCR с --pause 5