Инструмент для сравнения разных 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-07c31b6681 refactor: move benchmark/ to apps/benchmark/ — переезд под apps/
  • 2026-03-2578ae925b feat: benchmark framework with schema-driven OCR pipeline (BG-1056) — главный refactor в multi-eval framework
  • 2026-03-29cdd57c57 feat(benchmark): universal fact-based extraction + bbox editor (BG-1059) — добавлен bbox editor + fact-based extraction
  • 2026-04-016ecf3297 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’ов поверх PDF
  • EditableBboxOverlay.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Что
recallTP / (TP + FN) — доля extracted параметров от actual в GT
precisionTP / (TP + FP) — доля extracted что правильные
f1Harmonic mean precision/recall
value_accuracyТочность числовых значений у matched параметров
unit_accuracyТочность единиц измерения
range_accuracyТочность reference ranges
compositeF1 × (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:

FieldNormalizationMatch criteria
Namelowercase, trimexact или fuzzy ≥ 0.8
Valueparse float, comma → dotexact numeric match
Unitnormalize symbols (μ → u)exact after normalization
Rangenormalize 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); runs exp-{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 prompt
  • feat(recognize): inherit test_date from lab-panel headers on same page
  • fix(recognize): dedup same-date repeats across summary + detail pages
  • feat(recognize): date-attribution rules + cross-page dedup
  • feat(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 annotationRecognition + любой layerДаActive, BG-1056
eval/recognize-evaluation/ (наша Phase 1)Standalone TS recognition benchmarkRecognitionБыл (early)Frozen Dec 2025, evolved → apps/benchmark
apps/evaluation/Off-line LLM-judge для prompt regressionAnalysis (judge)НетActive (см. llm-judges)
apps/ocr-playground/Старый OCR playgroundRecognitionБыл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-judgeAnalysisНет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

Источники

Источники: 1 2 3 4 5 6 7.

Сноски

  1. Сессия ildar/b89ead75, 2026-03-31 — `.

  2. Сессия ildar/ebf694af, 2026-04-25 — `.

  3. Сессия ildar/7bb29523, 2026-04-25 — `.

  4. Сессия ildar/880e64a6, 2026-04-25 — `.

  5. Сессия ildar/3dd5d94e, 2026-04-25 — `.

  6. Сессия ildar/5ab360d8, 2026-04-25 — `.

  7. 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).