● Medtech · Terricon Valley · день 1

# MedArchive — итоги первого дня

Автоматическая обработка архива прайсов клиник-партнёров.
Отчёт перед трекером · 26.06.2026

● работает в проде: med.secondbrain.tools

## Что сделано за день

Собран и развёрнут сквозной конвейер — от сырого архива до живого интерфейса.

архив (PDF/скан/DOCX/XLSX)→ извлечение→ нормализация→ валидация→ БД→ API→ UI сравнения
8 871 позиций извлечено
73,9%нормализовано авто (цель ≥70%)
8 / 10 клиник / файлов
live развёрнуто на домене

## Стек технологий

Слой | Решение
--- | ---
Извлечение | Python · pdfplumber, PyMuPDF, openpyxl/xlrd, python-docx
Vision-добор | Gemini `gemini-2.5-flash` (по API)
Нормализация | каскад + эмбеддинги Gemini `gemini-embedding-001`
Валидация | правила ТЗ §4.4 (цена, тарифы, аномалии, версии)
Хранилище | SQLite (MVP) · PostgreSQL + pgvector (боевая схема)
API | FastAPI · 7 эндпоинтов + /stats + Swagger
Фронт | одностраничный (Tailwind) · поиск и сравнение цен
Деплой | Docker (контейнер API) за Caddy · Selectel KZ

## Ключевые инженерные решения

- PDF без линий таблиц → реконструкция по координатам слов (обычный парсер таблиц их не находит).
- Эмбеддинги через Gemini API, не локальный torch → лёгкий контейнер, не упирается в RAM на VPS.
- Битый слой / скан → Gemini Vision по картинке. Чистое берут парсеры, трудное добирает Vision.
- Порог 0,70 + очередь `unmatched`: услуг нет в справочнике → на ручную разметку (ТЗ §4.3).
- SQLite для MVP (без Docker), боевая схема Postgres + pgvector — наготове.

## Нормализация: каскад

код тарификатора→ точное совпадение→ эмбеддинги Gemini→ нечёткое (fuzzy)→ очередь unmatched

Метод | Позиций | Комментарий
--- | --- | ---
код тарификатора | 1 414 | точное, бесплатно — где клиника указала код
точное имя | 167 | совпадение нормализованного названия
эмбеддинги | 4 903 | семантическая близость названий
fuzzy | 71 | запасной сигнал
→ авто всего | 6 555 (73,9%) | цель ТЗ ≥70% взята
в очередь оператора | 2 316 | ручная разметка (ТЗ §4.3)

## Готовность по ТЗ

Раздел | % | Состояние
--- | --- | ---
§2 Форматы на вход | 90 | PDF/скан/DOCX/XLSX/XLS + справочник
§3 Схема БД (4 сущности) | 80 | есть; БИН/город/контакты пока не извлекаются
§4.1 Загрузка архива | 55 | CLI-конвейер; загрузки ZIP в UI нет
§4.2 Извлечение по формату | 85 | работает; tracked-changes неявно
§4.3 Нормализация | 90 | каскад + порог + unmatched, 73,9%
§4.4 Валидация + верификация | 60 | валидация ✅; UI верификации неполный
§4.5 API | 90 | 7 эндпоинтов + /stats + Swagger
§4.6 Интерфейс | 70 | поиск+сравнение+дашборд; нет загрузки/разметки
§7 Что сдаём | 65 | БД/отчёт/OpenAPI/README ✅; слайды-каркас, видео нет

## Готовность по рубрике оценки

Критерий жюри | вес | сделано
--- | --- | ---
Качество извлечения данных | 30% | ~85%
Нормализация и сопоставление | 25% | ~90%
Валидация и верификация | 20% | ~60%
API и поиск | 15% | ~90%
UX административного раздела | 10% | ~65%

≈ 80% по рубрике · общая готовность по ТЗ ≈ 75% · плюс бонус — живой деплой, которого ТЗ не требует.

## Что осталось (план дня 2)

- Экран верификации оператора — главный пробел (вес 20%): оригинал + извлечённое + подтвердить / исправить / сопоставить.
- Загрузка ZIP-архива через интерфейс (§4.1) — сейчас CLI.
- Полный прогон Vision по трудным клиникам (3, 5, 2-2025) — больше охват и качество.
- Упаковка к защите: слайды с цифрами, демо-видео.
- Мелочи: извлечение БИН/города, явная обработка tracked-changes.

# День 1: продукт работает целиком

Собран и развёрнут весь путь — от сырого архива до живого интерфейса.
Ядро (55% оценки: извлечение, нормализация, валидация) проверено на реальных данных.
Дальше — экран верификации, загрузка архива через интерфейс, упаковка к защите.

Демо — med.secondbrain.tools
документация API — med.secondbrain.tools/api/docs