Инструмент для сравнения разных pipeline’ов распознавания анализов из PDF / фото на размеченном датасете с метриками (recall, precision, F1, value/unit/range accuracy, composite). Развивался итерациями: началось как standalone TS-эксперимент в eval-репо для сравнения OCR vs Vision-LLM подходов, в апреле 2026 переехало в монорепо bloodgpt-for-business/apps/benchmark/ (BG-1056) с bbox annotation UI и multi-eval framework.
Что это сейчас в одном предложении
Загружаешь PDF → выбираешь стратегию (provider / model / prompt) → запускаешь → видишь PDF с overlaid bounding boxes + table извлечённых параметров + редактируемые bbox’ы и значения прямо в UI → сравнение с ground truth → метрики.
История развития
Phase 1 — standalone TS app в eval-репо (Oct — Dec 2025)
eval/recognize-evaluation/ в Realai-plus/eval — первая итерация. Standalone TypeScript-приложение. Старт в начале октября 2025: эксперименты с Gemini bounding-box segmentation masks для распознавания структуры PDF.
Архитектурный принцип сложился именно здесь — separation of evaluation phase (expensive, run once) and reporting phase (cheap, run multiple times). Сохранён до сих пор в Phase 2.
В этой фазе сравнивались 8 pipeline configurations для распознавания:
Two-Stage OCR + LLM (LLM получает text blocks с unique ID, возвращает только ID-блоков → минимизирует hallucination):
- P1 DataLab + Cerebras (gpt-oss-120b, fast)
- P2 DataLab + GPT-4o-mini
- P3 DataLab + GPT-4.1-nano
Single-Stage Vision-LLM (VLM напрямую обрабатывает изображение):
- P4 Gemini 2.5 Flash (native bbox)
- P5 Gemini 2.5 Pro (native bbox)
- P6 Vision + BBox (gpt-4o-mini, percentage coords)
Hybrid (несколько extraction attempts с агрегацией):
- P7 Cross-Check (P1+P2+P3, 3-run voting, выбор highest agreement)
- P8 Feedback Cross-Check (Pipeline1+Pipeline2 → discrepancies → Pipeline3 с feedback prompt)
UNIFIED-SYSTEM-DESIGN.md упоминал план до 16+ pipelines (DataLab варианты + Vision + Gemini 2/3 + ensemble).
Dataset (Dec 2025): 17 документов крови с manually annotated ground truth. Languages: German (12), English (3), Hungarian (2). Document types: Scanned PDF (10), Photo (5), Digital PDF (2). Параметров: min 8, max 35, mean 18.5. В eval/recognize-evaluation/data/ несколько test-set’ов (source-tests, lazuka, hungarian-x2, case-001 и др.) — ~90 файлов суммарно, не всё benchmark dataset.
Архитектура Phase 1 (сохранилась как принцип):
EVALUATION PHASE (run once per pipeline run):
Test cases (PDF/IMG) + LLM model + Ground truth
→ RAW RESULT { caseId, groundTruth: {data, hash}, extractedData, metadata }
→ results/run-xxx/ { metadata.json, raw-results.json, timings.json }
REPORTING PHASE (run multiple times with different params):
Load raw results → Choose GT source → Hash comparison
→ Apply mapping → Comparator (configurable)
→ Evaluation result: metrics + differences → HTML / JSON report
Главное свойство: LLM-вызовы делаются один раз, потом сколько угодно reports без новых API costs. Можно crank-up или off normalization / fuzzy matching без re-run pipeline.
Параллельный артефакт — paper-draft. eval/paper-draft.md (декабрь 2025) — «Comparative Analysis of OCR and Vision-Language Model Pipelines for Automated Blood Test Result Extraction». Это способ структурировать находки эксперимента в академическом формате (related work обзор: CRF baselines, deep-learning table detection, MiniCPM-V, GPT-4V vs Gemini, DrLlama, Spike API / Affinda commercial baselines, Xue et al.; описание методологии; таблицы результатов с [TBD] placeholder’ами). Не submission, внутренний документ. Если развить dataset и доуложиться по числам — формат позволяет выйти на публикацию.
DASHBOARD_IDEAS.md — план развить статичный HTML report в interactive dashboard где comparison параметры переключаются прямо в браузере. Документ из 2025 года, часть идей могла устареть — фильтровать через текущее понимание задачи.
Phase 2 — переезд в монорепо bloodgpt-for-business (Dec 2025 →)
Работа фактически переехала из eval-репо в bloodgpt-for-business в начале декабря 2025, до создания apps/benchmark/. Точный старт — 2025-12-05 (sessions b89ead75, потом ebf694af Dec 7, 7bb29523 Dec 9, 880e64a6 / 3dd5d94e / 5ab360d8 Dec 9-13). Промпты этого периода — про bbox-overlay в OCR Playground, Vision + BBox координаты, Gemini 3 pro preview, сравнение нескольких pipeline’ов на одной картинке через checkboxes. Это были эксперименты в bloodgpt-for-business/benchmark/ (без apps/ префикса).
Эволюция директории и framework:
- Dec 2025 — Feb 2026 — экспериментальный код в
benchmark/корня монорепо, активные сессии (b89ead75, 8cb61bd4 Jan 15, 4aa5df26 Jan 31) - 2026-03-07 —
c31b6681 refactor: move benchmark/ to apps/benchmark/— переезд подapps/ - 2026-03-25 —
78ae925b feat: benchmark framework with schema-driven OCR pipeline (BG-1056)— главный refactor в multi-eval framework - 2026-03-29 —
cdd57c57 feat(benchmark): universal fact-based extraction + bbox editor (BG-1059)— добавлен bbox editor + fact-based extraction - 2026-04-01 —
6ecf3297 feat(benchmark): fact-extraction-bbox strategy + fix Annotate facts display (BG-1059)
К текущему моменту (Apr 2026) это multi-eval framework (не только recognition — задуман на normalization / LOINC / range detection / FHIR validation; пока имплементирован только recognition eval). Главное отличие от Phase 1 — bbox annotation editing UI прямо в браузере.
Архитектура Phase 2:
BenchmarkEvalDefinition
├── evalId: "recognition" | "normalization" | "loinc" | ...
├── strategies[]: StrategyDefinition[]
│ └── stages: logged to Langfuse as spans
├── evaluate(output, groundTruth) → metrics
└── metricsToScores(metrics) → Record<string, number>
│
┌─────────────────────┼─────────────────────┐
▼ ▼ ▼
CLI Runner Web Server Run Store
(generic-runner.ts) (POST /api/run) (runs.jsonl)
│ │ ▲
└──────────┬──────────┘ │
▼ │
Langfuse ────────── scores ─────────┘
(datasets, traces, scores)
Принципы (из VISION.md):
- Multi-job — recognition не единственный benchmarking target; любая business-операция может быть eval-ом
- Run → Evaluate, two phases — execute → compare с ground truth — decoupled (наследник Phase 1)
- CLI ↔ Web UI interop — same storage, same evals. Run из CLI, view в Web; or vice versa
- Strategies with internal stages — стратегия из стадий (Nanonets OCR → markdown → LLM structuring), каждая логируется в Langfuse как span
- Visual inspection — для image-based jobs показывает PDF с overlaid bbox, linked к extracted parameters
- Ground truth from multiple sources — synthetic generated PDFs, real annotated, через web UI annotation tool
- Shared core — same evaluation logic в CLI batch / Web UI / CI regression
Eval ≠ pipeline step (важная calibration из VISION.md):
Production pipeline: recognition → normalization → LOINC → range detection → FHIR. Benchmark eval может быть: одним production step, subset (только recognition blood params), combination (end-to-end PDF → recognized + normalized), или task entirely (FHIR validation: проверить что generated bundle valid R4). Eval определяется: что в input, что в output, как scoring.
Структура приложения:
| Папка | Назначение |
|---|---|
evals/ | Eval definitions — recognition.eval.ts сейчас единственный |
lib/ | Shared core — eval-registry.ts, run-store.ts, dataset-resolver.ts, langfuse-prompts.ts, pdf-to-images.ts, types.ts |
runner/ | CLI runner — experiment-runner.ts, generic-runner.ts, splitting.ts |
server/ | Web server — index.ts, sse-renderer.ts (SSE для real-time UI updates) |
ui/src/pages/ | 4 страницы: Dashboard, Run, Review, Annotate |
ui/src/components/ | UI компоненты — BboxEditor, EditableBboxOverlay, EditorToolbar, AnnotationSidePanel |
generator/ | Synthetic ground truth generation — ground-truth.ts, generate-pdfs.ts |
Bbox annotation UI — главный новый feature Phase 2:
BboxEditor.tsx— основной редактор bounding box’ов поверх PDFEditableBboxOverlay.tsx— overlay с editable bbox’ами, drag-to-resize, кликабельныеEditorToolbar.tsx— инструменты редактирования (add / delete / merge / split bbox)AnnotationSidePanel.tsx— боковая панель со списком extracted параметров, синхронизирована с bbox’ами
Это и есть state-of-the-art для команды: загрузить файл → нажать кнопку → получить картинку с bbox + таблицу + возможность редактировать.
Метрики (актуально для обеих фаз)
7 scores recognition eval:
| Score | Что |
|---|---|
recall | TP / (TP + FN) — доля extracted параметров от actual в GT |
precision | TP / (TP + FP) — доля extracted что правильные |
f1 | Harmonic mean precision/recall |
value_accuracy | Точность числовых значений у matched параметров |
unit_accuracy | Точность единиц измерения |
range_accuracy | Точность reference ranges |
composite | F1 × (0.4·value + 0.3·unit + 0.2·range + 0.1·page) |
Parameter matching — normalized string comparison с 0.8 fuzzy similarity threshold. Field-level normalizations:
| Field | Normalization | Match criteria |
|---|---|---|
| Name | lowercase, trim | exact или fuzzy ≥ 0.8 |
| Value | parse float, comma → dot | exact numeric match |
| Unit | normalize symbols (μ → u) | exact after normalization |
| Range | normalize dashes (en-dash → -) | exact after normalization |
Composite формула вшита в eval definition; можно изменить per-eval.
Conventions для datasets (Phase 2)
Из CONVENTIONS.md:
expectedOutput= output schema промпта который тестируется. 1:1 сравнение в Langfuse UI.- Naming: datasets
{name}-{description}(bench-A-pages-per-batch); items{dataset}-{variant}(bench-A-8p-10pp); runsexp-{id}-{config-label}-run{N} - Dataset Item структура:
input: {pdf: data:base64, totalPages, promptName},expectedOutput: <exact JSON>,metadata: {scenario, generatedAt, totalParams, annotatedBy}
Связь с production recognize
В апреле 2026 параллельно идёт большая серия коммитов в bloodgpt-for-business про unification recognize pipeline (Никита):
feat(recognize): unified image-based pipeline with CoT promptfeat(recognize): inherit test_date from lab-panel headers on same pagefix(recognize): dedup same-date repeats across summary + detail pagesfeat(recognize): date-attribution rules + cross-page dedupfeat(fhir-context): multimodal narrative → FHIR with visual crosscheck
Это движение в сторону unified Vision-LLM single-pass (с CoT prompt), что ближе к категории P4-P6 из Phase 1. Но обратной петли benchmark → production пока нет — production унифицируется на основе рабочих наблюдений, не F1-чисел; и наоборот — paper-draft не обновляется под новый unified pipeline. Phase 2 теоретически замкнёт эту петлю когда benchmark станет частью CI / regression workflow.
Третий трек — fact-based recognition
Параллельно с unified pipeline идёт отдельный prototype по fact-based recognition (BG-1059, ветка feat/universal-bbox-editor, Mar 29 — Apr 1, ~3931 строк). Промежуточное представление документа как набор fact’ов с position / source / context метаданными. Этот трек тоже использует bbox UI (отдельную имплементацию, не shared с apps/benchmark — потенциальный candidate для consolidation).
Как соотносится с другими evaluation-инструментами
| Инструмент | Назначение | Слой | Bbox UI | Статус |
|---|---|---|---|---|
apps/benchmark/ (наша Phase 2) | Multi-eval с CLI+Web+bbox annotation | Recognition + любой layer | Да | Active, BG-1056 |
eval/recognize-evaluation/ (наша Phase 1) | Standalone TS recognition benchmark | Recognition | Был (early) | Frozen Dec 2025, evolved → apps/benchmark |
apps/evaluation/ | Off-line LLM-judge для prompt regression | Analysis (judge) | Нет | Active (см. llm-judges) |
apps/ocr-playground/ | Старый OCR playground | Recognition | Был | Dead (single commit “before bare repo migration”, migrated → benchmark) |
Upstream eval/eval/ (llm-judges) | Python LLM-judge framework (DeepEval-based) | Analysis | Нет | Frozen Dec 2025, частично портирован в apps/evaluation/ |
Inngest cron evaluation-judge (data-quality-dashboard) | Продакшен-cron LLM-judge | Analysis | Нет | Active (BG-1196) |
Открытые вопросы
- Какие evals помимо recognition будут реализованы (упомянуты normalization / LOINC / range detection / FHIR validation, не имплементированы)
- Интеграция с test corpus Никиты (~100 JSON в 10+ языках, см. llm-judges) — портировать как dataset items в apps/benchmark или сохранить отдельно
- Объединение с bbox-editor из fact-based-recognition — общий компонент или каждому свой
- BG-1056 — состояние и planned next steps (verify через Linear)
- Как этот framework используется в production decisions — есть ли regression workflow CI или manual
- Расширение dataset Phase 1 (17 документов мало) — если хотим вернуться к paper-формату
- Apps/ocr-playground официально удалить из репо или оставить как archaeological?
Связанные продуктовые / технические страницы
- recognition — production pipeline, который benchmark тестирует
- llm-judges — параллельный evaluation track для Analysis-слоя
- data-quality-dashboard — продакшен мониторинг (другая аудитория, не для experiments)
- fact-based-recognition — fact-based prototype, тоже работает с bbox (BG-1059, separate track)
- bounding-box-validation — отдельная research-страница про bbox validation
Источники
Сноски
-
Сессия
ildar/b89ead75, 2026-03-31 — `. ↩ -
Сессия
ildar/ebf694af, 2026-04-25 — `. ↩ -
Сессия
ildar/7bb29523, 2026-04-25 — `. ↩ -
Сессия
ildar/880e64a6, 2026-04-25 — `. ↩ -
Сессия
ildar/3dd5d94e, 2026-04-25 — `. ↩ -
Сессия
ildar/5ab360d8, 2026-04-25 — `. ↩ -
Linear BG-1056, accessed 2026-05-17, https://linear.app/realai/issue/BG-1056 — Linear
BG-1056(framework refactor Mar 25),BG-1059(fact-extraction + bbox editor Mar 29 — Apr 1). ↩