S1. Операциональные определения критериев EULAR 2021
Дефиниция EULAR сформулирована для клинициста, а не для базы данных. Чтобы применить её к регистру, каждый критерий был переведён в проверяемое правило и согласован с главным внештатным ревматологом города до начала анализа. Правила, уточнённые по итогам адъюдикации, помечены в тексте.
| Критерий | Операциональное правило | Источник данных |
|---|---|---|
| A. Неудача ≥ 2 ГИБП/тсБПВП с разными механизмами действия | Отмена по неэффективности или нежелательному явлению ≥ 2 препаратов из разных классов (иФНО, иИЛ-6, иJAK, анти-CD20, ко-стимуляция, иИЛ-1) на третьей и последующих линиях. Считаются препараты, а не классы: класс остаётся «неудачным», даже если позднее пациент ответил на другой препарат того же класса. Не считаются неудачей: ремиссия, беременность, онкологическое заболевание, смерть, технические и административные причины, неустановленная причина. | Регистр (детерминированно) там, где есть кодированные причины отмены; иначе — текст анамнеза (БЯМ) |
| B. Признаки активного или прогрессирующего заболевания (≥ 1 из 4) | B1: DAS28-СОЭ > 3,2 / CDAI > 10 / SDAI > 11. B2: текущие системные проявления из 11 категорий; ревматоидные узелки учитываются только при указаниях на новые, увеличивающиеся или активные узелки лёгких, стабильные и анамнестические — нет; синдром Шегрена учитывается всегда. B3: невозможность снижения ГК < 7,5 мг/сут. B4: рентгенологическое прогрессирование. Оценка по последнему осмотру; суставные симптомы без индексов в основной анализ не входят. | Текст осмотра (БЯМ), каждое «да» с цитатой |
| C. Ведение воспринимается как проблемное | Два слоя: свободная оценка по тексту в целом и структурированный чек-лист 8 пунктов «пациент» + 17 пунктов «врач». В дефиницию статуса не входит; описательный слой. | Текст осмотра (БЯМ), с цитатой |
| Итоговый статус | D2T = A. Персистирующий D2T = A и B; контролируемый D2T = A и не B. Анализ чувствительности: A и B и C. | — |
S2. Конвейер обработки
Ключевой принцип: модель не принимает решение о статусе. Она извлекает признаки с цитатами, а статус собирается прозрачным кодом по заранее зафиксированным правилам. Поэтому любое правило можно изменить и пересчитать когорту без повторных обращений к модели, что и было сделано при уточнении правила по узелкам.
S3. Инструкция для модели (системный промпт v2.1)
Приводится дословно, на языке исходника (английские инструкции с русскими клиническими терминами, поскольку тексты осмотров русскоязычные). Инструкция передаётся как системное сообщение; текст осмотра и регистровая цепочка — как пользовательское сообщение.
# ROLE
You are an expert Rheumatologist and Clinical Data Scientist adjudicating "Difficult-to-Treat Rheumatoid Arthritis" (D2TRA) per EULAR 2021, extended with a structured perception checklist (version v2.1, September 2026).
# INPUT
NOTE_TEXT: one or more clinical documents (выписки / осмотры) of ONE patient, separated by "---". Use NOTE_TEXT only. Never invent facts. Every true value must be backed by a short verbatim quote (≤120 chars) from the text. Use null when the text gives no usable evidence either way; use false for explicit negation or clear absence in the most recent visit.
# CRITERION A — treatment failure history
Failed ≥2 distinct mechanisms of action (MOA) among bDMARD/tsDMARD. MOA classes: TNF-i (адалимумаб, этанерцепт, инфликсимаб, голимумаб, цертолизумаб), IL6-i (тоцилизумаб, левилимаб, олокизумаб, сарилумаб), JAK-i (тофацитиниб, барицитиниб, упадацитиниб, филготиниб), CD20-i (ритуксимаб), T-costim (абатацепт), IL1-i (анакинра, канакинумаб). Count MOAs, not drugs (adalimumab + etanercept = 1 MOA). "Failure" = stopped/switched for inefficacy (нф, неэффективность, без эффекта, первичная/вторичная неэффективность) or adverse event (ня, непереносимость). Stopped for cost, pregnancy, administrative, remission, infection-only interruption = NOT a failure. The current drug counts as failed only if the text says it is ineffective.
Also list EVERY bDMARD/tsDMARD ever mentioned for this patient in bts_drugs with its MOA and outcome: failed_inefficacy / failed_adverse_event / stopped_other (cost, pregnancy, administrative, remission, infection interruption, unknown reason) / ongoing / unknown. One entry per drug course; a quote for each.
# CRITERION B — active / progressive disease. Sub-items are reported separately; the overall B is computed downstream (narrow: b1/b2b/b3/b4; wide: also b2a).
- b1_activity: moderate or higher activity — DAS28-ESR > 3.2 OR CDAI > 10 OR SDAI > 11 at the most recent visit with data. Report the numbers found.
- b2a_joint_signs: articular signs/symptoms of active RA at the most recent visit — explicit swollen/tender joints (ЧПС/ЧБС > 0, синовит, припухлость, болезненность при пальпации), morning stiffness ≥30 min, physician statement of "активность заболевания" without indices. Report the quote.
- b2b_systemic: any RA systemic (extra-articular) manifestation CURRENTLY present at the most recent visit: ревматоидные узелки; кожный васкулит (язвенно-некротический, инфаркты ногтевого ложа, дигитальный артериит); нейропатия (мононеврит, полинейропатия); плеврит; перикардит; миокардит; синдром Шегрена (incl. сухой синдром); поражение глаз (склерит, эписклерит, увеит); интерстициальное заболевание лёгких (ИЗЛ, НСИП, пневмонит); генерализованная миопатия; поражение системы крови как проявление РА (анемия, нейтропения, тромбоцитоз названные врачом как проявление РА). Historical mentions ("в анамнезе", "ранее") do not count. List the manifestations found with the exact key names; value=true only if the list is non-empty.
- b3_gc: inability to taper glucocorticoids below 7.5 mg/day prednisone-equivalent (метилпреднизолон 6 мг = преднизолон 7.5 мг) because of disease activity, or a stated need for ongoing GC ≥7.5 mg. Report the dose.
- b4_radiographic: rapid radiographic progression — new erosions, "прогрессирование", "отрицательная динамика" on X-ray/MRI/CT of joints, or Sharp/van der Heijde ≥5 points/year.
# CRITERION C — perception. Two independent assessments.
## C_free (as before): the physician and/or the patient explicitly perceive the disease management as problematic — "трудноконтролируемый", "рефрактерный", "проблемный", "стандартная терапия неэффективна", "сложный пациент", "не удаётся достичь ремиссии/низкой активности", repeated escalations without effect. Physician and patient statements separately.
## C_struct: for EACH item below, true if explicitly supported by the text, false if explicitly negated/absent, null if not mentioned. Quote when true.
Patient-side (P):
P1 pain VAS/ВАШ ≥ 4 (of 10) at the most recent visit.
P2 functional impairment or ankylosis (ФН/ФК III–IV, выраженные функциональные нарушения, анкилоз, self-care limitation).
P3 joint surgery of any kind (артропластика, эндопротезирование, синовэктомия, артродез).
P4 need for continuous NSAID intake (постоянный/ежедневный приём НПВП).
P5 combination therapy with more than 3 drugs for RA simultaneously (DMARDs + GC + NSAID etc. counted as antirheumatic drugs).
P6 systemic manifestations present (same list as b2b).
P7 severe kidney involvement: ХБП 4–5, амилоидоз, гемодиализ.
P8 osteoporosis with pathological (low-energy) fractures.
Physician-side (D):
D1 radiographic stage 4 (IV стадия, Штейнброкер IV).
D2 endoprosthesis or other joint surgery performed.
D3 failure of three MOA classes of bDMARD/tsDMARD (≥3 distinct failed MOAs).
D4 patient non-adherence / non-compliance (некомплаентность, пропуски, самостоятельная отмена).
D5 impossibility to withdraw glucocorticoids (невозможность отмены ГКС, зависимость от ГКС).
D6 infectious events limiting therapeutic options (recurrent/serious infections that forced stopping or avoiding DMARDs).
D7 incorrect diagnostic concept (диагноз пересмотрен, сомнения в диагнозе РА, overlap-синдром).
D8 comorbidities limiting therapeutic options (онкология, ХСН, гепатит, ХОБЛ, etc. explicitly limiting DMARD choice).
D9 systemic manifestations complicating the disease course (systemic manifestation explicitly described as complicating management).
D10 need for psychiatric consultation (депрессия, тревога, консультация психиатра/психотерапевта).
D11 polyvalent allergy (поливалентная аллергия, multiple drug allergies).
D12 therapy schedule disruptions due to infectious events (перерывы в терапии из-за инфекций, COVID-19 etc.).
D13 absence of therapy escalation per expert opinion (therapy not escalated despite activity; "рекомендована эскалация", "не проводилась смена терапии").
D14 tuberculosis history or latent TB (туберкулёз в анамнезе, ЛТИ, положительный Диаскинтест/квантиферон, профилактика изониазидом).
D15 renal amyloidosis or end-stage renal failure.
D16 secondary osteoarthritis grade 3–4 (вторичный остеоартроз 3–4 ст.).
D17 joint contractures (контрактуры).
# OUTPUT
Return JSON exactly matching the provided schema. Keep quotes short and verbatim. No prose outside JSON.
S4. Схема структурированного ответа (JSON Schema, strict)
Каждый признак возвращается объектом {value, quote}: value ∈ {true, false, null}, quote — дословная цитата из текста. Ответ, не соответствующий схеме, отклоняется API; ответ с положительным значением без цитаты отклоняется нашим кодом и запрашивается повторно.
{
"type": "object",
"properties": {
"A": {
"type": "object",
"properties": {
"value": {
"type": [
"boolean",
"null"
]
},
"quote": {
"type": [
"string",
"null"
]
},
"failed_moa": {
"type": "array",
"items": {
"type": "string",
"enum": [
"TNF-i",
"IL6-i",
"JAK-i",
"CD20-i",
"T-costim",
"IL1-i"
]
}
},
"bts_drugs": {
"type": "array",
"items": {
"type": "object",
"properties": {
"drug": {
"type": "string"
},
"moa": {
"type": "string",
"enum": [
"TNF-i",
"IL6-i",
"JAK-i",
"CD20-i",
"T-costim",
"IL1-i",
"IL17-i",
"IL23-i",
"other"
]
},
"outcome": {
"type": "string",
"enum": [
"failed_inefficacy",
"failed_adverse_event",
"stopped_other",
"ongoing",
"unknown"
]
},
"quote": {
"type": [
"string",
"null"
]
}
},
"required": [
"drug",
"moa",
"outcome",
"quote"
],
"additionalProperties": false
}
}
},
"required": [
"value",
"quote",
"failed_moa",
"bts_drugs"
],
"additionalProperties": false
},
"B": {
"type": "object",
"properties": {
"b1_activity": {
"type": "object",
"properties": {
"value": {
"type": [
"boolean",
"null"
]
},
"quote": {
"type": [
"string",
"null"
]
},
"das28": {
"type": [
"number",
"null"
]
},
"cdai": {
"type": [
"number",
"null"
]
},
"sdai": {
"type": [
"number",
"null"
]
}
},
"required": [
"value",
"quote",
"das28",
"cdai",
"sdai"
],
"additionalProperties": false
},
"b2a_joint_signs": {
"type": "object",
"properties": {
"value": {
"type": [
"boolean",
"null"
]
},
"quote": {
"type": [
"string",
"null"
]
}
},
"required": [
"value",
"quote"
],
"additionalProperties": false
},
"b2b_systemic": {
"type": "object",
"properties": {
"value": {
"type": [
"boolean",
"null"
]
},
"quote": {
"type": [
"string",
"null"
]
},
"systemic": {
"type": "array",
"items": {
"type": "string",
"enum": [
"nodules",
"vasculitis",
"neuropathy",
"pleuritis",
"pericarditis",
"myocarditis",
"sjogren",
"eye",
"ild",
"myopathy",
"hematologic"
]
}
}
},
"required": [
"value",
"quote",
"systemic"
],
"additionalProperties": false
},
"b3_gc": {
"type": "object",
"properties": {
"value": {
"type": [
"boolean",
"null"
]
},
"quote": {
"type": [
"string",
"null"
]
},
"dose_mg_pred_eq": {
"type": [
"number",
"null"
]
}
},
"required": [
"value",
"quote",
"dose_mg_pred_eq"
],
"additionalProperties": false
},
"b4_radiographic": {
"type": "object",
"properties": {
"value": {
"type": [
"boolean",
"null"
]
},
"quote": {
"type": [
"string",
"null"
]
}
},
"required": [
"value",
"quote"
],
"additionalProperties": false
}
},
"required": [
"b1_activity",
"b2a_joint_signs",
"b2b_systemic",
"b3_gc",
"b4_radiographic"
],
"additionalProperties": false
},
"C_free": {
"type": "object",
"properties": {
"physician": {
"type": "object",
"properties": {
"value": {
"type": [
"boolean",
"null"
]
},
"quote": {
"type": [
"string",
"null"
]
}
},
"required": [
"value",
"quote"
],
"additionalProperties": false
},
"patient": {
"type": "object",
"properties": {
"value": {
"type": [
"boolean",
"null"
]
},
"quote": {
"type": [
"string",
"null"
]
}
},
"required": [
"value",
"quote"
],
"additionalProperties": false
},
"value": {
"type": [
"boolean",
"null"
]
}
},
"required": [
"physician",
"patient",
"value"
],
"additionalProperties": false
},
"C_struct": {
"type": "object",
"properties": {
"P1": {
"type": "object",
"properties": {
"value": {
"type": [
"boolean",
"null"
]
},
"quote": {
"type": [
"string",
"null"
]
}
},
"required": [
"value",
"quote"
],
"additionalProperties": false
},
"P2": {
"type": "object",
"properties": {
"value": {
"type": [
"boolean",
"null"
]
},
"quote": {
"type": [
"string",
"null"
]
}
},
"required": [
"value",
"quote"
],
"additionalProperties": false
},
"P3": {
"type": "object",
"properties": {
"value": {
"type": [
"boolean",
"null"
]
},
"quote": {
"type": [
"string",
"null"
]
}
},
"required": [
"value",
"quote"
],
"additionalProperties": false
},
"P4": {
"type": "object",
"properties": {
"value": {
"type": [
"boolean",
"null"
]
},
"quote": {
"type": [
"string",
"null"
]
}
},
"required": [
"value",
"quote"
],
"additionalProperties": false
},
"P5": {
"type": "object",
"properties": {
"value": {
"type": [
"boolean",
"null"
]
},
"quote": {
"type": [
"string",
"null"
]
}
},
"required": [
"value",
"quote"
],
"additionalProperties": false
},
"P6": {
"type": "object",
"properties": {
"value": {
"type": [
"boolean",
"null"
]
},
"quote": {
"type": [
"string",
"null"
]
}
},
"required": [
"value",
"quote"
],
"additionalProperties": false
},
"P7": {
"type": "object",
"properties": {
"value": {
"type": [
"boolean",
"null"
]
},
"quote": {
"type": [
"string",
"null"
]
}
},
"required": [
"value",
"quote"
],
"additionalProperties": false
},
"P8": {
"type": "object",
"properties": {
"value": {
"type": [
"boolean",
"null"
]
},
"quote": {
"type": [
"string",
"null"
]
}
},
"required": [
"value",
"quote"
],
"additionalProperties": false
},
"D1": {
"type": "object",
"properties": {
"value": {
"type": [
"boolean",
"null"
]
},
"quote": {
"type": [
"string",
"null"
]
}
},
"required": [
"value",
"quote"
],
"additionalProperties": false
},
"D2": {
"type": "object",
"properties": {
"value": {
"type": [
"boolean",
"null"
]
},
"quote": {
"type": [
"string",
"null"
]
}
},
"required": [
"value",
"quote"
],
"additionalProperties": false
},
"D3": {
"type": "object",
"properties": {
"value": {
"type": [
"boolean",
"null"
]
},
"quote": {
"type": [
"string",
"null"
]
}
},
"required": [
"value",
"quote"
],
"additionalProperties": false
},
"D4": {
"type": "object",
"properties": {
"value": {
"type": [
"boolean",
"null"
]
},
"quote": {
"type": [
"string",
"null"
]
}
},
"required": [
"value",
"quote"
],
"additionalProperties": false
},
"D5": {
"type": "object",
"properties": {
"value": {
"type": [
"boolean",
"null"
]
},
"quote": {
"type": [
"string",
"null"
]
}
},
"required": [
"value",
"quote"
],
"additionalProperties": false
},
"D6": {
"type": "object",
"properties": {
"value": {
"type": [
"boolean",
"null"
]
},
"quote": {
"type": [
"string",
"null"
]
}
},
"required": [
"value",
"quote"
],
"additionalProperties": false
},
"D7": {
"type": "object",
"properties": {
"value": {
"type": [
"boolean",
"null"
]
},
"quote": {
"type": [
"string",
"null"
]
}
},
"required": [
"value",
"quote"
],
"additionalProperties": false
},
"D8": {
"type": "object",
"properties": {
"value": {
"type": [
"boolean",
"null"
]
},
"quote": {
"type": [
"string",
"null"
]
}
},
"required": [
"value",
"quote"
],
"additionalProperties": false
},
"D9": {
"type": "object",
"properties": {
"value": {
"type": [
"boolean",
"null"
]
},
"quote": {
"type": [
"string",
"null"
]
}
},
"required": [
"value",
"quote"
],
"additionalProperties": false
},
"D10": {
"type": "object",
"properties": {
"value": {
"type": [
"boolean",
"null"
]
},
"quote": {
"type": [
"string",
"null"
]
}
},
"required": [
"value",
"quote"
],
"additionalProperties": false
},
"D11": {
"type": "object",
"properties": {
"value": {
"type": [
"boolean",
"null"
]
},
"quote": {
"type": [
"string",
"null"
]
}
},
"required": [
"value",
"quote"
],
"additionalProperties": false
},
"D12": {
"type": "object",
"properties": {
"value": {
"type": [
"boolean",
"null"
]
},
"quote": {
"type": [
"string",
"null"
]
}
},
"required": [
"value",
"quote"
],
"additionalProperties": false
},
"D13": {
"type": "object",
"properties": {
"value": {
"type": [
"boolean",
"null"
]
},
"quote": {
"type": [
"string",
"null"
]
}
},
"required": [
"value",
"quote"
],
"additionalProperties": false
},
"D14": {
"type": "object",
"properties": {
"value": {
"type": [
"boolean",
"null"
]
},
"quote": {
"type": [
"string",
"null"
]
}
},
"required": [
"value",
"quote"
],
"additionalProperties": false
},
"D15": {
"type": "object",
"properties": {
"value": {
"type": [
"boolean",
"null"
]
},
"quote": {
"type": [
"string",
"null"
]
}
},
"required": [
"value",
"quote"
],
"additionalProperties": false
},
"D16": {
"type": "object",
"properties": {
"value": {
"type": [
"boolean",
"null"
]
},
"quote": {
"type": [
"string",
"null"
]
}
},
"required": [
"value",
"quote"
],
"additionalProperties": false
},
"D17": {
"type": "object",
"properties": {
"value": {
"type": [
"boolean",
"null"
]
},
"quote": {
"type": [
"string",
"null"
]
}
},
"required": [
"value",
"quote"
],
"additionalProperties": false
}
},
"required": [
"P1",
"P2",
"P3",
"P4",
"P5",
"P6",
"P7",
"P8",
"D1",
"D2",
"D3",
"D4",
"D5",
"D6",
"D7",
"D8",
"D9",
"D10",
"D11",
"D12",
"D13",
"D14",
"D15",
"D16",
"D17"
],
"additionalProperties": false
}
},
"required": [
"A",
"B",
"C_free",
"C_struct"
],
"additionalProperties": false
}
S5. Слепая валидация и адъюдикация
Форма разметки
Разметчик видит текст осмотра и деперсонифицированную выписку из регистра; результат модели скрыт, доступ к остальным разделам системы на время разметки заблокирован. Карты выдаются в перемешанном порядке, страта не показывается.
| A | Критерий выполнен? (да / нет / нельзя определить) + отметка неудачных классов |
| B1–B4 | Четыре подпункта по отдельности, каждый да / нет / нельзя определить; поля DAS28 и дозы ГК |
| Системные | Чек-боксы по 11 категориям |
| C | Свободная оценка; наличие прямой формулировки врача; чек-лист 8 + 17 |
| Итог | Статус: персистирующий D2T / контролируемый D2T / не D2T; качество документов; комментарий |
Форма адъюдикации
Для каждой карты с расхождением рядом показаны оценка системы с цитатами и ответы эксперта; подсвечены разошедшиеся признаки. Вердикт: права система / прав эксперт / иной статус. Причина расхождения кодируется из списка: препарат только в анамнезе (нет в регистре); короткий курс; отмена по НЯ; немедицинская причина смены; препарат клинического исследования; два препарата одного класса; активность на фоне перерыва; диагноз не РА; недостаточно данных; система неверно прочла текст; ошибка разметки эксперта.
S6. Параметры запуска и воспроизводимость
| Модели | GPT-5.6 Luna (все пациенты) · GPT-5.6 Terra (1 232 пограничных) · OpenAI Responses API |
| Режим | zero-shot; reasoning effort = medium; строгая JSON-схема (strict); verbosity = low |
| Калибровка | 80 карт, вручную оценённых ведущим ревматологом в пилоте; после калибровки инструкция не менялась |
| Объём | 2 748 пациентов, 3 299 документов; медиана длины 6 890 (когорта 1) и 11 720 (когорта 2) знаков |
| Время обработки | менее суток на всю когорту |
| Версия правил | v2.1 (сентябрь 2026) + уточнение B2 по узелкам от 01.10.2026 |
Индивидуальные данные пациентов не передаются. Агрегированные таблицы, код сборки статуса и формы доступны по запросу у авторов.
Тот же метод — для вашего регистра
MAG применяет этот подход к регистрам и массивам медицинских карт в ревматологии и других областях: операционализация критериев вместе с клиническим руководителем, извлечение с цитатами, слепая валидация, подготовка публикации. Основная работа — методическая: правила, валидация, интерпретация.
- Любые критерии: D2T, ремиссия, фенотипы, нежелательные явления, причины отмены
- Русский, английский и другие языки записей
- Данные остаются у владельца; работа на деперсонифицированных текстах
- Веб-интерфейс валидации для ваших экспертов