На каком уровне модели данных живёт ответственность за группировку медицинских записей пациента для отображения. Текущий рендер — плоский неструктурированный список ресурсов (тяжёлые металлы, ЭКГ, социальный анамнез, лабораторные тесты — вперемешку).
Статус
contested — три подхода обсуждаются параллельно. На production — flat list (fhir-observation) плюс первое приближение варианта 1 (группировка по базовым FHIR-категориям).
Контекст
Парсер при конвертации PDF/CDA → FHIR уплощает структуру исходного документа: секции исходного PDF теряются, ресурсы складываются в один общий список. Иллюстративный пример — Hearing tests: в исходном документе четыре парных наблюдения (по два уха × два теста) связаны единой секцией, после парсинга — четыре изолированных Observation в плоской ленте без признаков что они между собой связаны.
То же касается медконтекста — всегда уплощается.
Плоский список — слабое UX-решение: пользователь не различает что перед ним и в каком отношении находятся ресурсы. Это — мотивация переезда на структурированную модель.
Параллельный осложняющий фактор: SNOMED-маппинг сейчас принципиально слабее LOINC. У LOINC закрытый список кодов → LLM выбирает ближайший. У SNOMED список «актуальных» кодов небольшой; если подходящего нет, LLM просят «придумать код из памяти» — качество не валидируется.
Рассматривали
1. Базовые FHIR-категории (Resource.category)
Использовать встроенное поле Resource.category (fhir-resource-categories): Observation → laboratory / vital-signs / imaging / survey / social-history. DocumentReference → LOINC document classes. Каждый ресурс с category по своему value-set’у.
За:
- Штатный механизм FHIR, без custom extensions.
- Малые закрытые value-set’ы (9 кодов Observation — простой LLM-маппинг).
- Категории даются бесплатно — поля уже есть в спецификации.
- Первое приближение реализовано в production.
Против:
- Гранулярность недостаточна: все лабы попадают в один bucket
laboratory, нет sub-grouping (биохимия / гематология / гормоны). - Не сохраняет структуру исходного документа.
2. SNOMED-иерархия
Использовать snomed CT иерархию (Clinical Finding / Observable Entity / Procedure / Substance) как primary taxonomy. Группировка по верхнему уровню иерархии, при необходимости — глубже.
За:
- Семантическая богатость — покрывает всю мед-онтологию, переиспользуется в графе связей и ассоциациях с заболеваниями.
- Иерархия даёт переменную глубину группировки в UI.
Против:
- База непублична — только заявки, membership distribution service, нет свободного доступа к CT.
- Маппинг сейчас слаб — LLM придумывает коды; нужно строить инфраструктуру как у LOINC (закрытый список + словарный поиск). Построение этой инфраструктуры — отдельный долгосрочный трек.
3. Composition с секциями документа
Сохранять секции исходного PDF/CDA в fhir-composition — оболочках со ссылками на ресурсы. Один Composition на документ, section[] с title / code / entry[] (refs на Observations / Conditions / etc).
За:
- Сохраняется оригинальная структура документа (Hearing tests / Labs / Vitals — как было в PDF).
- FHIR-native, Composition специально для этого.
- Не противоречит вариантам 1 и 2 — Composition обёртка может содержать ресурсы любых категорий и SNOMED-кодов.
Против:
- Требует изменений в health-report-pipeline (recognize-этап должен извлекать секционную структуру, не уплощать).
- Не покрывает голые observation-входы (HL7-фиды без структуры документа).
- Кросс-документальная семантика не решается секциями. Названия секций в разных документах разные («Hearing» / «Аудиометрия» / «ЛОР»), и без нормализованного code-системы (LOINC / SNOMED для section.code) сравнить «эта секция о слухе» между двумя документами не получится. Composition решает intra-document структуру, не inter-document.
К обсуждению
Подходы не взаимоисключающие — Composition хранит исходную структуру, ресурсы внутри помечены FHIR-category, при наличии SNOMED-кода — дополнительная иерархия для cross-document grouping. Поэтому вопрос не «который выбрать», а в каком порядке реализовать следующий шаг поверх уже идущей в production категоризации:
- Composition как next step — изменения в recognize-этапе, intra-document структура восстанавливается. Cross-document — отдельная задача (нормализация
section.code). - SNOMED как long-track — лицензирование и инфраструктура маппинга отдельной нитью; результат переиспользуется в biomarker-graph и ассоциациях с заболеваниями.
Открытые вопросы
- Как реализовать Composition корректно — восстанавливать оригинальные секции PDF в
section[]? Что делать с документами без явной секционной разметки (HL7-фиды)? - Если делаем Composition — какой code-система для
section.code, чтобы инвалидировать кросс-документальную проблему «секции называются по-разному»? LOINC document sections / SNOMED Procedure / custom? - SNOMED-лицензирование — стоимость и условия доступа к CT прояснить независимо от выбора порядка.
- Реалистичность сроков SNOMED — построение собственной mapping-инфраструктуры может не уложиться в краткосрочный план.
- Где живёт UI-state «текущая выбранная группировка» если их несколько — переключатель в шапке, sidebar с видами, persisted preference.
Связано
- fhir-resource-categories — встроенный FHIR
categoryfield (вариант 1) - snomed — SNOMED CT (вариант 2)
- fhir-composition — Composition ресурс (вариант 3)
- fhir-observation — Observation, основной ресурс группировки
- fhir-document-reference — оригинальные документы как FHIR
- uploaded-document-types — типы загружаемых документов
- health-report-pipeline — pipeline парсинга, точка изменения для варианта 3
- recognition — recognize-этап, где сейчас уплощается структура
- patient-summary — где результат группировки отображается
- patient-timeline-visualization — survey индустрии по визуализации мед-данных