За 12 лет у среднего взрослого человека накапливается стопка: выписки из нескольких клиник, анализы в почте и личных кабинетах лабораторий, снимки в мессенджере, КТ на диске. Проблема не в отсутствии данных — проблема в формате. Врач на приёме располагает 15 минутами и видит только то, что пациент вспомнил распечатать. Тренд ГГТ за восемь лет, ферритин на верхней границе с 2017-го, узел щитовидки, выросший на 60% за два года — всё это остаётся невидимым.
Автор проекта сформулировал задачу как инженерную: не «нейросеть лечит вместо врача», а «как принести врачу один документ, который он прочитает за две минуты». Формат этого документа — problem list по методике POMR, которую разработал Лоренс Уид ещё в 1968 году. Врач мыслит проблемами, а не сырыми данными, поэтому на вход ему нужен структурированный список: текущие проблемы с приоритетами, тренды показателей, что уже сделано, что показано по гайдлайнам и что делать не следует.
| Таблица | Назначение | Ключевые поля |
|---|---|---|
| documents | Один распознанный файл | file_hash (sha256), raw_text, doc_date, extraction_method |
| analytes | Справочник показателей с алиасами | code (ggt, ldl, tsh…), name_ru, canonical_unit, category |
| measurements | Одно числовое измерение из одного документа | analyte_id, value_num, unit, ref_low, ref_high, flag, measured_at |
Весь архив хранится локально — медицинские данные автор не захотел отдавать в облако. Формат хранения — SQLite: один файл без сервера, совместимый с любым инструментом и рассчитанный на десятилетия. Структура мультипациентная: у каждого члена семьи своя база и своё дерево файлов, переключение — через переменную окружения MEDIC_PATIENT. Перед любой записью агент обязан проверить, чья база активна, чтобы исключить смешение данных.
Архив хранится локально в SQLite: один файл без сервера, 17 таблиц, полная изоляция данных по каждому члену семьи.
Схема включает 17 таблиц. Ядро — три: documents (один распознанный файл с полным raw_text и sha256-хешем для дедупликации), analytes (справочник показателей с алиасами — «Гамма-ГТ», «ГГТ» и ggt нормализуются к единому code) и measurements (одно число из одного документа с референсным коридором и флагом лаборатории). Справочник алиасов решает хроническую проблему: одна и та же гамма-глутамилтрансфераза в трёх лабораториях называется тремя способами, и без нормализации тренд по показателю не собрать.
Загрузка документов устроена по принципу «сначала текстовый слой, при неудаче — OCR». Библиотека pdfplumber извлекает текст из цифровых PDF; если текста меньше порогового значения — файл уходит в OCR-резерв. Ключевое архитектурное решение: полный raw_text всегда сохраняется в базе, и перед сборкой итогового документа агент прогоняет «свип сырого текста» — ищет по ключевым словам прямо в documents.raw_text, а не только в нормализованных measurements. Табличный парсер не видит абзац «в S4 печени сохраняется кальцинат до 3 мм» или строку «семейный анамнез: рак желудка у деда» — а именно такие находки меняют интервал скрининга.
Самый важный раздел проекта — не код, а правила для Claude. Первая строка файла-конституции: «Claude — аналитик данных, не клиницист». Из этого следует жёсткий набор ограничений. Никаких диагнозов: формулировка всегда «стоит обсудить с врачом такого-то профиля». Каждая значимая рекомендация сопровождается ссылкой на клинический гайдлайн и, где возможно, указанием Class/Level доказательности. Запрещены слова «СРОЧНО» и «критично» — вместо эмоциональной срочности используются приоритеты P1/P2/P3. Если российские и западные протоколы расходятся — показываются оба варианта без произвольного выбора одного из них.
Привязка каждого утверждения к источнику — не формальность, а архитектурное ограничение против галлюцинаций. Если модель не может подкрепить рекомендацию гайдлайном, рекомендация не проходит. Это превращает «спросил у нейросети» в «прогнал данные через аналитический конвейер с проверками» — и именно в этом разница между полезным инструментом и опасным суррогатом врача.


