К содержанию
Как работает ДМПАрхитектура, правила и границы сервиса
Назад
Тестовый стенд12 активных регионовКаталог для масштабирования до 89Обновлено

Технический паспорт сервиса ДМП

Сервис собирает 12 региональных показателей, сохраняет доказательства, отделяет автоматическую проверку от решения человека и передаёт только принятые значения в детерминированное расчётное ядро. Поисковая модель не рассчитывает эффект и не записывает данные в ядро напрямую.

Четыре шага пользователя

  1. Параметры модели

    Регион, база сравнения, сервис ДМП, расчётный год, горизонт и сценарий. Кнопка «Далее» запускает подготовку выбранного региона.

  2. Материалы

    Поиск, загрузка документов, распознавание, значения, периоды, источники, замечания и решения по 12 параметрам.

  3. Корректировка

    Сценарные параметры показаны в той же визуальной логике. Изменения применяются к согласованной версии входных данных.

  4. Справка

    Расчёт, дашборд и DOCX доступны только после готовности обязательных входов и проверки версии результата.

Пока идёт поиск, список параметров не показывается. Пользователь видит общий прогресс: например, «7 из 12 · Проверяем „Стоимость госпитализации“». Уже сохранённые и принятые данные используются повторно; платный поиск запускается только для пробелов или явного повторного поиска.

Сквозной поток данных

Регион изолирован на всём пути. Сетевой поиск даёт кандидатов, сервер получает и разбирает источник, а решение принимается по сохранённому доказательству.

Старт
Пользователь запускает обработку

Нажимает «Далее», загружает документ, запускает повторный поиск или сохраняет решение

Команда поступает на сервер
1Запуск и план обработкиШаги 01–04
  1. 01 · КомандаИнтерфейс

    Передаёт действие и выбранный регион

  2. 02 · КонтрактAPI и блокировка

    Проверяет регион, версию и право на изменение

  3. 03 · УправлениеWorkflow и оркестратор

    Создаёт этапы и один активный процесс региона

  4. 04 · ПланРеестр источников

    Даёт домены, приоритетные URL и ориентиры

Если принятые данные актуальны: повторный поиск не запускается, workflow использует сохранённый факт и переходит к расчёту.

Если данных нет или нужна перепроверка
2Поиск и извлечение доказательстваШаги 05–08
  1. 05 · ПоискPerplexity

    Находит кандидата на разрешённых сайтах

  2. 06 · ПолучениеЗагрузчик источника

    Скачивает страницу, файл или официальный дубль

  3. 07 · ИзвлечениеПарсеры и OCR

    Получают текст и таблицы локально

  4. 08 · КандидатЗначение и координаты

    Число, единица, год, фрагмент и положение

Кандидат передаётся на проверку
3Проверка, решение и расчётШаги 09–12
  1. 09 · КонтрольДетерминированная проверка

    Сверяет показатель, регион, единицу, период и конфликты

  2. 10 · РешениеАвтопринятие или человек

    Спорное и дублированное остаётся на решении

  3. 11 · ФактEvidence Ledger

    Хранит значение, доказательство, историю и версию

  4. 12 · РасчётРасчётное ядро

    Применяет формулы к принятой версии входов

Версионированный результат публикуется в интерфейсе
Результат
Дашборд и DOCX-справка

Показывают один расчёт по согласованным входам без участия 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.1Open 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 и каталоги документов на сервере; внешняя СУБД не используется.
Поиск и AIPerplexity API, модель anthropic/claude-sonnet-4-6Внешний коммерческий сервис. Интеграционный клиент и промпты написаны нами; модель нами не разработана.Поиск кандидатов и извлечение возможных значений по разрешённым источникам.Модель не скачана на сервер: запрос выполняется через облачный API Perplexity.
Разбор документовpython-docx 1.2.0, openpyxl 3.1.5, pypdf 6.16.2, lxml 6.1.2Open source. Сторонние Python-библиотеки; правила выбора и проверки данных написаны нами.Чтение DOCX, XLSX, PDF и HTML; извлечение текста, таблиц и структуры.Установлены из реестра Python-пакетов в серверное окружение приложения.
OCR и PDFOCRmyPDF 15.2, Tesseract 5.3.4, Poppler 24.02Open source. Готовые сторонние инструменты; сценарий их вызова и проверка результата написаны нами.Распознавание сканов, создание текстового слоя PDF, извлечение текста и метаданных.Установлены на сервере как системные и Python-пакеты; обработка выполняется локально.
Конвертация и DOCXLibreOffice 24.2, python-docxOpen source. Конвертер и библиотека сторонние; шаблон и сборка справки написаны нами.PDF-превью офисных документов и формирование итоговой DOCX-справки.LibreOffice установлен на сервере, python-docx — в Python-окружении. Исходный файл сохраняется отдельно.
РасчётPython-модуль calculation_engineСобственная разработка. Формулы и программная реализация находятся в проекте.Evidence Ledger, горизонты, коэффициенты и версионированный расчётный результат.Модуль поставляется с backend-кодом и выполняется локально, без LLM и внешнего расчётного API.
Публикация и защитаNginx 1.24, TLS, systemdOpen 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%.

Основной риск: после изменения входов может остаться старый результат. Поэтому перенос точек вызова и изменение формул нельзя выполнять в одном релизе.

План внедрения

  1. Оболочка. Создать Calculation Service поверх текущего ядра без изменения формул.
  2. Переключатель. Подключить существующие точки пересчёта через feature flag.
  3. Сравнение. Параллельно считать старым и новым путём и фиксировать расхождения.
  4. Проверка. Прогнать три горизонта и основные состояния всех 12 регионов.
  5. Переключение. Перевести шаг 4, дашборд и DOCX на единый сохранённый результат.
  6. Очистка. Удалить прямые обращения к ядру после стабильного прогона.
  7. Документация. Перенести утверждённую архитектуру, контракты, формулы и бизнес-правила в СДД; на странице «?» оставить краткое актуальное представление.

Данные регионов сбрасывать не нужно. После переключения выполняется один пересчёт сохранённых входов с новой версией. Поэтапное внедрение не требует остановки стенда.