Технический паспорт сервиса ДМП
Сервис собирает 12 региональных показателей, сохраняет доказательства, отделяет автоматическую проверку от решения человека и передаёт только принятые значения в детерминированное расчётное ядро. Поисковая модель не рассчитывает эффект и не записывает данные в ядро напрямую.
Четыре шага пользователя
Параметры модели
Регион, база сравнения, сервис ДМП, расчётный год, горизонт и сценарий. Кнопка «Далее» запускает подготовку выбранного региона.
Материалы
Поиск, загрузка документов, распознавание, значения, периоды, источники, замечания и решения по 12 параметрам.
Корректировка
Сценарные параметры показаны в той же визуальной логике. Изменения применяются к согласованной версии входных данных.
Справка
Расчёт, дашборд и DOCX доступны только после готовности обязательных входов и проверки версии результата.
Пока идёт поиск, список параметров не показывается. Пользователь видит общий прогресс: например, «7 из 12 · Проверяем „Стоимость госпитализации“». Уже сохранённые и принятые данные используются повторно; платный поиск запускается только для пробелов или явного повторного поиска.
Сквозной поток данных
Регион изолирован на всём пути. Сетевой поиск даёт кандидатов, сервер получает и разбирает источник, а решение принимается по сохранённому доказательству.
Нажимает «Далее», загружает документ, запускает повторный поиск или сохраняет решение
- 01 · КомандаИнтерфейс
Передаёт действие и выбранный регион
- 02 · КонтрактAPI и блокировка
Проверяет регион, версию и право на изменение
- 03 · УправлениеWorkflow и оркестратор
Создаёт этапы и один активный процесс региона
- 04 · ПланРеестр источников
Даёт домены, приоритетные URL и ориентиры
Если принятые данные актуальны: повторный поиск не запускается, workflow использует сохранённый факт и переходит к расчёту.
- 05 · ПоискPerplexity
Находит кандидата на разрешённых сайтах
- 06 · ПолучениеЗагрузчик источника
Скачивает страницу, файл или официальный дубль
- 07 · ИзвлечениеПарсеры и OCR
Получают текст и таблицы локально
- 08 · КандидатЗначение и координаты
Число, единица, год, фрагмент и положение
- 09 · КонтрольДетерминированная проверка
Сверяет показатель, регион, единицу, период и конфликты
- 10 · РешениеАвтопринятие или человек
Спорное и дублированное остаётся на решении
- 11 · ФактEvidence Ledger
Хранит значение, доказательство, историю и версию
- 12 · РасчётРасчётное ядро
Применяет формулы к принятой версии входов
Показывают один расчёт по согласованным входам без участия LLM
Текущий технический долг: пересчёт вызывается из нескольких обработчиков API, загрузки, отчёта и обновления состояния. Целевая схема — один модуль расчёта между Evidence Ledger и ядром; она описана в разделе «Развитие».
Компоненты и границы ответственности
| Компонент | Что делает | Чего не делает |
|---|---|---|
| Фронтенд и API | Передают действия, показывают прогресс, кандидатов, документы, решения и расчёт. | Фронтенд не назначает значение достоверным и не подменяет серверную готовность. |
| Workflow и оркестраторSQLite, два фоновых исполнителя | Ведут сохраняемый процесс региона: очередь, подготовка, поиск, проверка, ожидание решения, завершение или ошибка. | Не повторяют платный запрос с неизвестным исходом и не смешивают состояния регионов. |
| Поисковый агентPerplexity | Ищет возможный источник по региону, параметру, периоду и разрешённым сайтам. | Ответ модели не является фактом. Агент не меняет формулы и не пишет в ядро. |
| Получение и распознаваниеПарсеры, OCRmyPDF, Tesseract | Скачивают содержимое, извлекают текст и таблицы, сохраняют хеш и координаты фрагмента. | Непроверенный OCR и закрытая страница не считаются надёжным подтверждением. |
| Проверка и решения | Сопоставляют число, смысл, регион, единицу и год с сохранённым содержимым; маршрутизируют спорное человеку. | Уверенность модели сама по себе не разрешает автопринятие. |
| Evidence Ledger | Хранит принятые факты, источники, фрагменты, историю и версию входов отдельно по регионам. | Повторный поиск не перезаписывает подтверждённое человеком решение. |
| Расчётное ядро | Применяет формулы, горизонт и сценарные коэффициенты к принятой версии входов. | Не ищет данные, не интерпретирует документы и не использует LLM. |
Технологический состав
Ниже указан активный стек и фактическое состояние стенда на 18.09.2026: что написано для проекта, что взято из open source, как компонент установлен и где работает.
Состояние сервера
- Среда
vm-dmp, Ubuntu 24.04.4 LTS, 2 vCPU, 3,8 ГБ оперативной памяти и диск 20 ГБ. Занято 35%, доступно 13 ГБ.- Сервисы
dmp-pilotиdmp-pilot-stagingактивны. Staging работает на локальном порту 8766 за Nginx; после запуска 18.09.2026 в 06:23 автоматических рестартов не было.- Обработка
- OCR доступен локально. Perplexity настроен в режиме controlled autonomy. Работают 2 из 2 фоновых исполнителей, состояния разделены по 12 регионам.
- Зависимости
- Python 3.12.3, SQLite 3.45.1 и Nginx 1.24. Codex и ChatGPT не являются runtime-зависимостями сервиса.
- Хранилище
- Код и окружение staging занимают 188 МБ, региональные данные и документы — 1,3 ГБ, серверные резервные копии — 798 МБ.
- Проверка
- Health API возвращает
200 OK. Загрузка, распознавание, исключение документа и повторная загрузка прошли целевые серверные тесты.
| Слой | Технологии | Происхождение | Для чего используются | Поставка и размещение |
|---|---|---|---|---|
| Веб-интерфейс | HTML5, CSS, Vanilla JavaScript | Собственная разработка. Фреймворки React/Vue не используются. | Четыре шага, карточки параметров, история, дашборд и управление источниками. | Файлы проекта на сервере, выдаются через Nginx. Node.js в рабочем runtime не нужен. |
| Просмотр документов | PDF.js 5.6.205, docx-preview, JSZip 3.10.1 | Open source. Готовые сторонние библиотеки; код просмотрщиков нами не написан. | Локальный просмотр PDF и DOCX, переход к найденному фрагменту, разбор контейнера DOCX. | Скачаны как версионированные frontend-зависимости и хранятся на нашем сервере; CDN не используется. |
| API и сервер | Python 3.12.3, стандартный ThreadingHTTPServer | Смешанный состав. Python и стандартная библиотека — open source; HTTP API и бизнес-обработчики написаны нами. | HTTP API, региональные действия, загрузка документов, статические файлы и выдача результатов. | Python установлен на сервере; собственные модули поставляются вместе с кодом проекта. |
| Оркестрация | Python workflow, два фоновых исполнителя | Собственная разработка. Celery и LangGraph в активном контуре не используются. | Очередь, этапы поиска, восстановление после сбоя и один активный процесс на регион. | Модули проекта и два серверных процесса; отдельный внешний оркестратор не скачивался. |
| Данные и состояние | SQLite 3.45.1, файловое хранилище | Смешанный состав. SQLite — компонент с открытым исходным кодом; схема, региональная изоляция и правила хранения написаны нами. | Состояния регионов, workflow, история решений, документы, OCR-кэш и версии входов. | Локальная база SQLite и каталоги документов на сервере; внешняя СУБД не используется. |
| Поиск и AI | Perplexity API, модель anthropic/claude-sonnet-4-6 | Внешний коммерческий сервис. Интеграционный клиент и промпты написаны нами; модель нами не разработана. | Поиск кандидатов и извлечение возможных значений по разрешённым источникам. | Модель не скачана на сервер: запрос выполняется через облачный API Perplexity. |
| Разбор документов | python-docx 1.2.0, openpyxl 3.1.5, pypdf 6.16.2, lxml 6.1.2 | Open source. Сторонние Python-библиотеки; правила выбора и проверки данных написаны нами. | Чтение DOCX, XLSX, PDF и HTML; извлечение текста, таблиц и структуры. | Установлены из реестра Python-пакетов в серверное окружение приложения. |
| OCR и PDF | OCRmyPDF 15.2, Tesseract 5.3.4, Poppler 24.02 | Open source. Готовые сторонние инструменты; сценарий их вызова и проверка результата написаны нами. | Распознавание сканов, создание текстового слоя PDF, извлечение текста и метаданных. | Установлены на сервере как системные и Python-пакеты; обработка выполняется локально. |
| Конвертация и DOCX | LibreOffice 24.2, python-docx | Open source. Конвертер и библиотека сторонние; шаблон и сборка справки написаны нами. | PDF-превью офисных документов и формирование итоговой DOCX-справки. | LibreOffice установлен на сервере, python-docx — в Python-окружении. Исходный файл сохраняется отдельно. |
| Расчёт | Python-модуль calculation_engine | Собственная разработка. Формулы и программная реализация находятся в проекте. | Evidence Ledger, горизонты, коэффициенты и версионированный расчётный результат. | Модуль поставляется с backend-кодом и выполняется локально, без LLM и внешнего расчётного API. |
| Публикация и защита | Nginx 1.24, TLS, systemd | Open source и системные компоненты. Конфигурация сервиса и правила хранения credential подготовлены нами. | HTTPS, reverse proxy, автозапуск, рестарт, изоляция процесса и безопасная передача API-ключа. | Установлены пакетами операционной системы; секрет хранится вне frontend и исходного кода. |
| Проверки | Python unittest, статические frontend-контракты | Смешанный состав. unittest входит в open-source стандартную библиотеку Python; набор проверок написан нами. | Формулы, парсеры, OCR, региональное состояние, поиск, интерфейсные контракты и отчёт. | Тесты находятся в проекте и запускаются на локальной копии или сервере перед релизом. |
Неактивный контур: адаптер GigaChat написан в проекте, но внешний сервис на стенде отключён. Активная модель не хранится локально и используется только через Perplexity для поиска и извлечения кандидатов.
Общие правила источников и решений
- Запуск поиска
- Автоматический поиск запускается по кнопке «Далее» для выбранного региона. Сначала используются сохранённые документы и кандидаты. Повторный платный поиск нужен только для пробела, устаревших данных или явной команды «Найти заново».
- Где ищет агент
- Только на сайтах из блока «Сайты для поиска». Приоритетный URL проверяется первым; затем используются таблица, код и текстовые ориентиры. Если ориентир не найден, просматривается весь документ, затем выполняется поиск на разрешённых доменах.
- Что сохраняется
- URL и итоговый URL, файл и SHA-256, извлечённые текст и таблицы, исходное число и единица, нормализованное значение, период, даты, фрагмент, страница, таблица, строка и координаты, если они определены. Найденный кандидат остаётся видимым до решения.
- Удаление документа
- Пользователь может исключить документ из карточки параметра. Полученные из него кандидаты и доказательства перестают использоваться, Evidence Ledger и расчёты для горизонтов 1, 2, 3 и 5 лет обновляются. Исходный файл остаётся в серверном архиве для аудита.
- Проверка источника
- Должны совпасть число, показатель, регион, единица и допустимый год данных; конфликтов быть не должно. Проверка выполняется по скачанному содержимому, а не по пересказу модели. Отдельного признака «оригинал» нет.
- Год данных
- Берётся из строки, заголовка, столбца или контекста показателя. Год в имени файла, URL или дате публикации не подменяет период данных. Для расчётного 2026 года обычно допустимы 2025–2026; для ВРП — 2024–2026.
- Дата публикации источника
- Это служебное поле для контроля актуальности. Оно заполняется только по явной дате публикации в карточке или документе; дата принятия акта и год данных хранятся отдельно. Отсутствие даты отмечается предупреждением, но не блокирует расчёт.
- Последняя редакция
- Если найдено несколько документов и есть формулировка «с изменениями» или «с дополнениями», выбирается действующая редакция с наибольшей подтверждённой датой изменений. Старые материалы сохраняются как история, но не дают расчётный факт.
- Закрытый основной источник
- Сервис ищет официальный или региональный дубль и проверяет его содержимое. Значение получает основание «Данные получены из официального дубликата: основной источник недоступен» и статус «Ожидает решения» до подтверждения человеком.
- Точность числа
- Интерфейс показывает значение в масштабе и единице источника, например «8 498,3 млрд руб.». Нельзя молча превращать миллиарды в триллионы или округлять значащую точность. Для расчёта хранится точное нормализованное число, рядом — исходная запись.
- Ручное решение
- Исправление требует значения, года и основания. История фиксирует автора, прежнее и новое значение, источник и причину; действие пользователя помечается иконкой руки. Основная лента называется «История изменений».
- Память подтверждений
- Сохраняет подходящие страницы, таблицы и текстовые ориентиры. Это приоритет для следующего документа, а не перенос старого числа. Если ориентиры не сработали, поиск продолжается по всему документу.
- Статусы
Ожидает решения — найден кандидат, официальный дубль или неоднозначность.
Нет результата — пригодное значение не найдено или обработка завершилась ошибкой.
Готово к расчёту — факт принят проверкой или человеком. Отсутствие даты публикации показывается отдельно.
Бизнес-правила 12 параметров
Правила едины для активных регионов. Региональные URL, страницы и значения не копируются между регионами.
| № | Параметр | Что принимается | Что исключается |
|---|---|---|---|
| 1 | Численность взрослого населения | Население региона в возрасте 18 лет и старше за допустимый год. | Общая численность, дети, трудоспособное или экономически активное население без пересчёта к 18+. |
| 2 | Численность пациентов с ССЗ | Люди с сердечно-сосудистыми заболеваниями в целом. | Число диагнозов и случаев, охват ДМП, новые случаи, одна нозология или расчёт из доли без подтверждения. |
| 3 | Численность занятых в экономике | Занятые в экономике региона. | Рабочая сила, экономически активное и трудоспособное население. |
| 4 | Валовой региональный продукт | Общий ВРП региона; для расчётного года разрешён лаг до двух лет. Для 2026 года допустимы 2024–2026. Факт, оценка и прогноз различаются. | ВРП на душу населения и значение другого региона. |
| 5 | Стоимость очного обращения | Стоимость одного очного амбулаторного обращения. | Стоимость отдельного посещения, подушевой норматив и общий объём финансирования. |
| 6 | Стоимость госпитализации | Стоимость одного случая госпитализации с понятным видом помощи и источником финансирования. | Койко-день, общий бюджет стационара и тариф без подтверждённой единицы «случай». |
| 7 | Стоимость вызова СМП | Стоимость одного вызова скорой медицинской помощи. | Стоимость бригады, смены, услуги без единицы «вызов» и общий бюджет СМП. |
| 8 | Длительность нетрудоспособности при ССЗ | Средняя длительность временной нетрудоспособности при ССЗ, дней на пациента. На текущем стенде для 12 активных регионов закреплено подтверждённое значение 12 дней. | Дни на случай, общие больничные дни, койко-дни, диапазон без выбора и значение одной нозологии. Диапазоны не усредняются автоматически. |
| 9 | Норматив амбулаторных обращений | «Обращения в связи с заболеваниями — всего» на одного жителя или застрахованного в год. | Посещения, стоимость обращения, подушевое финансирование и бюджет. |
| 10 | Доля ССЗ в заболеваемости | Доля сердечно-сосудистых заболеваний в общей или первичной заболеваемости с явным указанием базы. | Доля ССЗ в смертности и доля отдельного диагноза без обоснования. |
| 11 | Случаи госпитализации на 1 000 взрослых | Госпитализации по ССЗ на 1 000 взрослых. | Все госпитализации, абсолютное число без знаменателя и показатель на 100 000 без корректного пересчёта. |
| 12 | Общее число вызовов СМП | Годовое число вызовов. «Выезды» или «выезды бригад СМП» принимаются как эквивалент вызовов; основная подпись и расчётная единица — «вызовов СМП». | Стоимость вызова, показатель на 1 000 населения и число только по отдельной причине. |
Правила готовности и расчёта
Расчёт выполняется кодом. Региональные значения по умолчанию не подставляются: обязательные входы должны быть приняты на шаге 2.
- Готовность шага 2
- Кнопка «Далее» доступна, когда обязательные параметры готовы. Прямой переход по `#report`, запрос дашборда, расчёт, ручной ввод и генерация справки проходят серверную проверку готовности.
- Причина нехватки данных
- Интерфейс перечисляет исходные параметры, которых не хватает для формулы. Производная величина вроде «годовой базы вызовов» не подменяет понятный список входов.
- Версия результата
- Результат связан с регионом, горизонтом, версией входных данных и версией формул. При изменении принятого факта прежний расчёт не считается актуальным.
- Сценарные коэффициенты
- Компенсация амбулаторных обращений — 70%. Снижение госпитализаций и вызовов СМП — по 50%; коэффициенты помечены как тестовые, но намеренно участвуют в демонстрационном расчёте.
норматив обращений × пациенты ДМПслучаи госпитализации на 1 000 × пациенты ДМП / 1 000пациенты ДМП / пациенты с ССЗ × общее число вызовов × 25%годовая база × сценарный коэффициент × стоимость единицы × горизонтдни нетрудоспособности × компенсированные пациенты × ВРП на одного занятого в день × горизонтГоризонт 1, 2, 3 или 5 лет умножает годовые эффекты. Целевой уровень компенсации не накапливается повторно по годам.
Эксплуатационные правила
- Изоляция регионов
- Данные, документы, история, блокировка и активный workflow разделены по регионам. Запуск одного региона не запускает поиск по остальным 11 или всему каталогу 89 регионов.
- Перезапуск сервера
- Локальные незавершённые задания восстанавливаются ограниченное число раз. Платный запрос с неизвестным исходом не повторяется автоматически, чтобы не создавать двойной расход.
- Ошибки и уведомления
- Авторизация, недоступность сайта, платёжный лимит, таймаут, размер файла и отсутствие результата различаются. На экране показывается одно агрегированное уведомление и конкретная причина в карточке параметра.
- Расходы
- Фиксируется стоимость, сообщённая провайдером, или техническая оценка, если точная стоимость недоступна. Жёсткого денежного лимита на стенде нет; поиск всё равно запускается только по команде пользователя.
- Масштабирование
- Общие правила и контракты готовы для реестра до 89 регионов. Для активации региона нужны его разрешённые домены, приоритетные источники и локальные ориентиры; массовый платный прогон всех регионов не выполняется автоматически.
Целевая доработка: единый модуль расчёта
Пользовательский сценарий и формулы не меняются. Меняется внутренний путь: все причины пересчёта проходят через один Calculation Service.
API, поиск, загрузка и отчёт → единый Calculation Service → проверка готовности и версии → один вызов расчётного ядра → сохранённый результат
Что получим
- Один результат для шага 4, дашборда и DOCX
- Единую проверку готовности и список недостающих входов
- Защиту от повторного одинакового расчёта
- Версии по региону, входам, горизонту и формулам
Что затронет
- Подтверждение и исправление параметра
- Завершение поиска, загрузки и распознавания
- Изменение горизонта и параметров шага 3
- Открытие дашборда и формирование DOCX
Не меняется: поиск, Perplexity, OCR, источники, решения пользователя, действующие формулы и коэффициенты 70% и 50%.
Основной риск: после изменения входов может остаться старый результат. Поэтому перенос точек вызова и изменение формул нельзя выполнять в одном релизе.
План внедрения
- Оболочка. Создать Calculation Service поверх текущего ядра без изменения формул.
- Переключатель. Подключить существующие точки пересчёта через feature flag.
- Сравнение. Параллельно считать старым и новым путём и фиксировать расхождения.
- Проверка. Прогнать три горизонта и основные состояния всех 12 регионов.
- Переключение. Перевести шаг 4, дашборд и DOCX на единый сохранённый результат.
- Очистка. Удалить прямые обращения к ядру после стабильного прогона.
- Документация. Перенести утверждённую архитектуру, контракты, формулы и бизнес-правила в СДД; на странице «?» оставить краткое актуальное представление.
Данные регионов сбрасывать не нужно. После переключения выполняется один пересчёт сохранённых входов с новой версией. Поэтапное внедрение не требует остановки стенда.