3,583 papers
arXiv:2512.13700 73 3 дек. 2025 г. FREE

Структурированное извлечение данных: группировка признаков и временная консолидация

КЛЮЧЕВАЯ СУТЬ
LLM проваливается когда нужно извлечь данные из груды разрозненных записей — модель путает факты из разных периодов, пропускает важное, выдаёт непредсказуемый формат. Метод хронологической консолидации позволяет превратить хаотичные записи в точные структурированные данные с заданным форматом. Двухшаговый промпт: сначала модель создаёт временную линию (организует хаос в хронологию), потом извлекает по JSON-схеме с группировкой связанных признаков. 82-97% точности вместо случайных результатов.
Адаптировать под запрос

TL;DR

Исследователи из University of Kentucky создали систему для извлечения структурированных данных из медицинских записей и выявили три ключевых принципа промптинга: логическая группировка связанных признаков (событие + дата + подтверждение), хронологическая консолидация разрозненных записей перед анализом, и жёсткая JSON-схема с типами данных и обязательными полями. Система работала как автоматизированная инфраструктура с RAG и векторными базами данных, но принципы применимы вручную в чате.

LLM теряется когда нужно извлечь много разных признаков из огромного массива разрозненных записей. Модель либо пропускает важное, либо путает факты из разных временных периодов (что происходило в 2020 смешивается с 2023), либо выдаёт результат в непредсказуемом формате. При извлечении медицинских данных (был ли инсульт, когда, какие симптомы) модель справлялась на 82-97% по occurrence-признакам, но хуже с датами (65% для SCI, 92% для MI).

Три тактики решают проблему: (1) группируй логически связанные признаки — инсульт + дата + подтверждающие детали извлекай в одном запросе, не по отдельности, (2) создавай timeline — перед извлечением попроси модель собрать разрозненные записи в единую хронологическую линию, (3) задавай JSON-схему — опиши структуру результата с типами данных (string/boolean/date), обязательными полями и enum-ограничениями.


🔬

Схема метода

Работает в одном промпте с двумя шагами:

ШАГ 1: Хронологическая консолидация
Входные данные: Разрозненные записи (email, заметки, документы)
→ Единая временная линия с датами и событиями

ШАГ 2: Групповое извлечение
Входные данные: Timeline + схема JSON с группами признаков
→ Структурированный JSON-объект по схеме

Если текст слишком большой для одного запроса: - Разбивай на части с перекрытием (overlapping chunks) - Извлекай из каждой части - Объединяй результаты финальным запросом (reconciliation)


🚀

Пример применения

⚠️ Ограничения метода: Работает плохо для субъективных оценок без явных упоминаний в тексте. Даты извлекаются хуже чем факты (особенно если даты размыты: "в прошлом году", "недавно"). Лучше всего для фактических данных с явными упоминаниями.

Задача: У тебя записи с 8 встреч с российскими инвесторами по поводу стартапа за полгода. Часть — голосовые заметки из такси после встречи, часть — email с договорённостями, часть — наброски в блокноте. Нужно структурировать: кто, когда, основные вопросы, обещанные следующие шаги, статус лида (горячий/теплый/холодный).

Промпт:

У меня 8 записей о встречах с инвесторами за 6 месяцев — голосовые заметки, email, наброски. Нужно извлечь структурированные данные.

ШАГ 1: Создай единую временную линию всех встреч
Формат: дата → инвестор → краткое содержание встречи

ШАГ 2: Из временной линии извлеки данные по схеме

ГРУППА 1 - Базовая информация:
- investor_name (string, обязательно)
- date (date YYYY-MM-DD, обязательно)
- meeting_type (enum: ["личная встреча", "звонок", "email"], обязательно)

ГРУППА 2 - Содержание встречи:
- key_questions (array of strings) — основные вопросы инвестора
- concerns (array of strings) — сомнения или опасения
- positive_signals (array of strings) — что понравилось

ГРУППА 3 - Следующие шаги:
- next_steps (string) — договорённости о дальнейших действиях
- deadline (date YYYY-MM-DD или null) — срок выполнения следующего шага
- lead_status (enum: ["горячий", "теплый", "холодный"]) — твоя оценка статуса

Выведи результат как JSON array объектов, где каждый объект = одна встреча по схеме выше.

[ВСТАВИТЬ СЮДА СВОИ 8 ЗАПИСЕЙ]

Результат:

Модель создаст временную линию всех встреч с датами, потом извлечёт структурированный JSON — массив объектов, каждый содержит investor_name, date, meeting_type, массив key_questions, массив concerns, массив positive_signals, next_steps, deadline (или null), lead_status. Все поля заполнены по схеме, даты нормализованы в формат YYYY-MM-DD, enum-поля только из разрешённых значений.


🧠

Почему это работает

LLM хорошо работает со структурой, но плохо — с хаосом. Когда подаёшь разрозненные записи без порядка, модель не держит контекст — что было раньше, что позже, какие факты к кому относятся. Создание timeline — это способ заставить модель сначала организовать, потом анализировать. Временная линия превращает хаос в последовательность.

Группировка связанных признаков использует то, что модель держит локальный контекст лучше чем глобальный. Когда извлекаешь "инвестор + дата + вопросы + next steps" вместе, модель связывает эти данные в памяти одного рассуждения. Если извлекать отдельными запросами ("найди всех инвесторов", потом "найди даты", потом "найди вопросы") — модель теряет связь между ними.

JSON-схема с типами и enum — это рельсы для вывода. LLM генерирует текст вероятностно, но если задана жёсткая структура (date должен быть YYYY-MM-DD, lead_status только из трёх значений), модель следует ограничениям потому что они встроены в инструкцию. Это убирает вариативность и делает вывод предсказуемым.

Рычаги управления:

  • Обязательные поля (required) — убери чтобы модель могла пропускать данные, которых нет в тексте
  • Enum-значения — замени на open-ended string если нужна гибкость, не жёсткие категории
  • Количество групп — меньше групп = проще для модели, но можешь упустить связи; больше групп = точнее, но дольше
  • Overlapping chunks — увеличь перекрытие если факты теряются на границах; уменьши для экономии токенов

📋

Шаблон промпта

У меня {количество} записей/документов по теме {тема} за {период времени}. Нужно извлечь структурированные данные.

ШАГ 1: Создай единую временную линию всех событий
Формат: дата → ключевой субъект → краткое описание события

ШАГ 2: Из временной линии извлеки данные по схеме

ГРУППА 1 - {название группы}:
- {поле_1} ({тип данных}, обязательно/опционально) — {описание}
- {поле_2} ({тип данных}, обязательно/опционально) — {описание}

ГРУППА 2 - {название группы}:
- {поле_3} ({тип данных}, обязательно/опционально) — {описание}
- {поле_4} (enum: ["{значение_1}", "{значение_2}", "{значение_3}"]) — {описание}

Выведи результат как JSON array объектов, где каждый объект = {единица анализа} по схеме выше.

[ВСТАВИТЬ ЗАПИСИ/ДОКУМЕНТЫ]

Плейсхолдеры: - {количество} — число записей/документов - {тема} — о чём записи (встречи с инвесторами, email от клиентов, интервью) - {период времени} — временной охват (3 месяца, год, за 2023) - {название группы} — логическое имя группы признаков (Базовая информация, Содержание, Следующие шаги) - {поле_N} — название поля (investor_name, date, key_questions) - {тип данных} — string / date / boolean / array of strings / integer - {описание} — что должно быть в поле - {значение_N} — разрешённые значения для enum - {единица анализа} — что представляет один объект (одна встреча, один клиент, одно интервью)

Типы данных: - string — текст произвольной длины - date — дата в формате YYYY-MM-DD - boolean — true/false - integer — целое число - array of strings — список текстовых значений - enum — выбор из фиксированного списка значений

Обязательно/опционально: - обязательно — модель должна найти значение или явно сказать "нет данных" - опционально — модель может пропустить поле если данных нет


⚠️

Ограничения

⚠️ Субъективные оценки: Если признак требует интерпретации (насколько заинтересован инвестор, качество идеи), модель додумывает или ошибается. Работает для фактов с явным упоминанием.

⚠️ Размытые даты: "В прошлом году", "недавно", "несколько месяцев назад" — модель плохо нормализует в точную дату. Точность извлечения дат в исследовании: 65% для травм спинного мозга, 92% для инфарктов (где даты обычно точнее записаны).

⚠️ Большой объём текста: Если все записи не влезают в контекст (128K токенов для большинства моделей — примерно 300 страниц А4), нужно разбивать на части. Это добавляет шагов и может терять связи между фактами из разных частей.

⚠️ Разрешение противоречий: Если в разных записях противоречащие факты (инвестор сказал "интересно" в email, но в личной встрече отказал), модель не всегда выберет правильный. Нужно добавлять в промпт правило разрешения (брать последнее по времени, брать из более надёжного источника).


🔍

Как исследовали

Команда из University of Kentucky взяла 100 пациентов из медицинских баз данных (Epic, Sunrise Clinical Manager, Allscripts) — у каждого огромный массив записей: истории болезни, заключения врачей, результаты анализов. Задача: извлечь 5 медицинских условий (травма спинного мозга, инфаркт, инсульт, диабет 2 типа, транзиторная ишемическая атака) и даты их возникновения.

Бенчмарк: Врачи из Spinal Cord and Brain Injury Research Center вручную прошли все записи и создали "золотой стандарт" — правильные ответы для сравнения. Систему развернули на одной NVIDIA A100 GPU (чтобы проверить на скромных ресурсах, не суперкомпьютере) с моделью Qwen QwQ-32B и embedding-моделью sentence-transformers/all-mpnet-base-v2.

Результаты показали паттерн: Модель отлично определяла occurrence (был инсульт или не был) — точность 82-97% в зависимости от условия. Но с датами хуже — точность падала до 65% для SCI (где даты часто размыты: "травма несколько лет назад") и 92% для MI (где даты обычно точные: "инфаркт 15 марта 2021"). Интересно что модель нашла ошибки в экспертной разметке — несколько случаев где врачи пропустили упоминания условий.

Почему такие результаты: Occurrence — это факт с явным упоминанием ("пациент перенёс инсульт"), модель хорошо ловит такие паттерны. Даты — это извлечение деталей из контекста где часто нет прямой записи ("инсульт три года назад" → надо вычислить год относительно даты документа), плюс размытые формулировки. Исследование подтвердило: группировка признаков (условие + дата вместе) даёт лучшие результаты чем извлечение по отдельности, потому что модель держит связь между событием и его временной меткой.


💡

Адаптации и экстраполяции

📌

🔧 Техника: Добавь уровень уверенности → Видишь где модель сомневается

Если модель не уверена (дата размыта, факт косвенный), полезно знать это явно. Добавь поле confidence в каждую группу:

ГРУППА 1 - Базовая информация:
- investor_name (string, обязательно)
- date (date YYYY-MM-DD, обязательно)
- confidence (enum: ["высокая", "средняя", "низкая"]) — насколько уверен в точности данных

Модель поставит "низкая" где факты неявные или противоречивые — ты увидишь какие записи перепроверить вручную.


📌

🔧 Техника: Убери overlapping для коротких текстов → Экономия токенов

Если все записи влезают в контекст одним запросом (меньше ~100K токенов), не разбивай на части. Overlapping chunks нужен только для гигантских массивов где иначе не влезет.


📌

🔧 Техника: Добавь поле source_quote → Проверяемость

Для критичных данных (юридические документы, финансы, медицина) добавь в схему:

- source_quote (string) — точная цитата из текста, откуда извлёк значение

Модель выдаст цитату-доказательство для каждого факта. Это замедляет работу (больше токенов), но делает результат проверяемым.


🔗

Ресурсы

Leveraging LLMs for Structured Data Extraction from Unstructured Patient Records — Mitchell A. Klusty, Elizabeth C. Solie, Caroline N. Leach, W. Vaiden Logan, Lynnet E. Richey, John C. Gensel, David P. Szczykutowicz, Bryan C. McLellan, Emily B. Collier, Samuel E. Armstrong, V. K. Cody Bumgardner. Center For Applied Artificial Intelligence и Spinal Cord and Brain Injury Research Center, University of Kentucky.

Использованные технологии: REDCap (данные), Docker (контейнеризация), vLLM (inference), FAISS (векторный поиск), Qwen QwQ-32B (LLM), sentence-transformers/all-mpnet-base-v2 (embeddings), Slurm (workload manager), CILogon (аутентификация), OpenAI tool-calling format (структурированный вывод).


📋 Дайджест исследования

Ключевая суть

LLM проваливается когда нужно извлечь данные из груды разрозненных записей — модель путает факты из разных периодов, пропускает важное, выдаёт непредсказуемый формат. Метод хронологической консолидации позволяет превратить хаотичные записи в точные структурированные данные с заданным форматом. Двухшаговый промпт: сначала модель создаёт временную линию (организует хаос в хронологию), потом извлекает по JSON-схеме с группировкой связанных признаков. 82-97% точности вместо случайных результатов.

Принцип работы

Не заставляй модель извлекать и структурировать одновременно. Разбей на два чётких шага. Шаг 1 — собери разрозненные записи в единую временную линию с датами и событиями. Шаг 2 — извлеки структурированные данные из timeline по жёсткой схеме с группировкой логически связанных признаков. Группируй то что связано: событие + дата + детали извлекай вместе, не по отдельности.

Почему работает

LLM держит локальный контекст лучше чем глобальный. Когда подаёшь разрозненные записи без порядка, модель не держит контекст — что было раньше, что позже, какие факты к кому относятся. Timeline превращает хаос в последовательность — модель видит структуру. Группировка связанных признаков использует то что модель связывает данные в памяти одного рассуждения. Если извлекать отдельными запросами — модель теряет связь между ними. JSON-схема с типами данных — это рельсы для вывода, убирает вариативность.

Когда применять

Структурирование разрозненных записей → конкретно для извлечения фактических данных из хаотичных документов (встречи с инвесторами, интервью с клиентами, исследовательские заметки, email-переписка), особенно когда записи растянуты во времени и нужен точный формат вывода. НЕ подходит для субъективных оценок без явных упоминаний в тексте — модель додумывает.

Мини-рецепт

1. Задай двухшаговую структуру: ШАГ 1 — создай временную линию (формат: дата → субъект → краткое содержание), ШАГ 2 — извлеки по схеме
2. Опиши JSON-схему с группами: Группа 1 — базовая информация (имя, дата, тип), Группа 2 — содержание (вопросы, опасения, позитив), Группа 3 — следующие шаги (договорённости, дедлайн, статус)
3. Укажи типы данных для каждого поля: string, date (формат YYYY-MM-DD), boolean, array of strings, enum с разрешёнными значениями
4. Отметь обязательные поля: пиши "обязательно" для ключевых данных, "опционально" для второстепенных — модель поймёт что можно пропустить
5. Вставь свои записи после инструкции — модель сначала создаст timeline, потом извлечёт структурированный JSON

Примеры

[ПЛОХО] : Извлеки из этих 8 записей о встречах с инвесторами: кто, когда, о чём говорили, что решили — модель вернёт хаотичный текст, смешает факты из разных встреч, пропустит даты или даст их в разных форматах
[ХОРОШО] : У меня 8 записей о встречах с инвесторами за 6 месяцев. ШАГ 1: Создай временную линию (дата → инвестор → краткое содержание). ШАГ 2: Извлеки JSON по схеме: ГРУППА 1 — investor_name (string, обязательно), date (date YYYY-MM-DD, обязательно), meeting_type (enum: ["личная встреча", "звонок", "email"]). ГРУППА 2 — key_questions (array of strings), concerns (array of strings). ГРУППА 3 — next_steps (string), deadline (date или null), lead_status (enum: ["горячий", "тёплый", "холодный"]). Выведи как JSON array объектов — модель создаст упорядоченную timeline, потом структурированный JSON с нормализованными датами и заполненными полями
Источник: Leveraging LLMs for Structured Data Extraction from Unstructured Patient Records
ArXiv ID: 2512.13700 | Сгенерировано: 2026-01-08 23:47

Проблемы LLM

ПроблемаСутьКак обойти
LLM пропускает данные при извлечении много признаков из большого массива разрозненных записейЗадача: извлечь 15+ признаков из 50 документов — модель теряет часть фактов, не держит глобальный контекст; точность 82-97% для фактов типа "было/не было", но хуже для связанных данных (даты, детали)Группируй логически связанные признаки: инсульт + дата + подтверждающие детали извлекай в одном запросе, не по отдельности
LLM путает факты из разных временных периодов без хронологииРазрозненные записи (email за 2020, заметка за 2023, документ за 2021) — модель смешивает что когда происходило; события из разных лет сливаются в один контекстПопроси модель сначала создать timeline: ШАГ 1: собери все события в хронологическую линию с датами, потом извлекай данные из timeline

Методы

МетодСуть
Timeline перед извлечением — против хаоса в разрозненных записяхДвухшаговый промпт: ШАГ 1: Создай временную линию всех событий (дата субъект краткое описание) ШАГ 2: Из timeline извлеки данные по схеме. Временная линия превращает хаос в последовательность — модель сначала организует, потом анализирует. Для: записи без порядка (встречи, email, заметки), факты из разных периодов. НЕ для: одно событие или уже упорядоченные данные
Группировка связанных признаков в одном запросе — против потери связейИзвлекай логически связанные данные вместе: инвестор + дата + вопросы + next_steps в одном запросе вместо четырёх отдельных. Модель держит локальный контекст (данные в одном рассуждении) лучше чем глобальный (связи между разными запросами). Для: признаки с зависимостями (событие + контекст события). НЕ для: независимые признаки
JSON-схема с типами данных и enum — рельсы для структурированного выводаЗадавай жёсткую схему: типы (string, date YYYY-MM-DD, boolean, array of strings), обязательные/опционально (required/optional), enum для категорий (["горячий", "тёплый", "холодный"]). Схема убирает вариативность вывода — модель следует ограничениям. Рычаг: убери required если модель должна пропускать отсутствующие данные; замени enum на open-ended string для гибкости. Для: извлечение данных, анкеты, отчёты. НЕ для: творческие задачи

Тезисы

ТезисКомментарий
LLM держит локальный контекст лучше чем глобальный — связи между данными в одном рассуждении надёжнее чем между разными запросамиМедицинское извлечение: occurrence-признаки (был инсульт?) 82-97%, связанные данные (дата инсульта) 65-92%. Модель связывает факты в памяти одного рассуждения, но теряет связи между отдельными запросами. Применяй: группируй зависимые данные в один запрос (событие + дата + детали), не дроби на отдельные вопросы
📖 Простыми словами

Структурированное извлечение данных: группировка признаков и временная консолидация

arXiv: 2512.13700

Суть в том, что современные нейронки — это не магические оракулы, а скорее очень дотошные, но рассеянные архивариусы. Когда ты скармливаешь им гору неструктурированного текста, вроде медицинских карт или логов, они тонут в деталях и начинают путать факты. Чтобы вытащить из этого хаоса структурированные данные, нужно перестать просить «просто проанализируй» и начать диктовать жесткие правила игры. Исследователи доказали: LLM выдает результат на порядок выше, если заставить её сначала навести порядок в пространстве и времени, а уже потом делать выводы.

Это как если бы ты вывалил перед помощником огромный мешок чеков, справок и записок за десять лет и попросил составить финансовый отчет. Если он начнет хватать бумажки наугад, получится полная фигня. Но если он сначала разложит их по датам в одну линию, а потом скрепит скрепкой чек из магазина с гарантийным талоном — картинка сложится сама собой. Без предварительной хронологической консолидации модель просто не понимает, что «вчера» в одной записке и «15 мая» в другой — это одно и то же событие.

Чтобы это реально работало, нужно внедрить три конкретных метода. Первый — логическая группировка: не проси просто «дату», проси связку «событие + дата + подтверждение», чтобы модель не теряла контекст. Второй — хронологический таймлайн: сначала заставь AI выстроить цепочку событий, и только потом извлекай из неё суть. Третий — жесткая JSON-схема: нужно четко прописать типы данных и обязательные поля, иначе нейронка начнет «креативить» там, где нужны сухие факты. Если в схеме сказано, что поле должно быть числом, модель с меньшей вероятностью напишет туда «примерно пять».

Хотя систему тестировали на сложных медицинских картах, этот универсальный паттерн применим везде, где есть куча невнятного текста. Это сработает для анализа юридических договоров, цепочек писем от клиентов или даже для разбора личных заметок за год. Принцип один: структура первична, анализ вторичен. Если ты не заставил модель сначала сгруппировать данные и выстроить их в очередь, ты получишь не отчет, а галлюцинации на вольную тему.

Короче, забудь про простые вопросы к длинным текстам — это путь к ошибкам. Хочешь точности — внедряй RAG с предварительной обработкой и требуй ответ строго по схеме. Даты и субъективные оценки все еще остаются слабым местом, но если факт в тексте упомянут явно, эти три метода выжмут из модели максимум. Либо ты строишь для AI жесткие рельсы, либо она увозит тебя в дебри творческой интерпретации, где факты не стоят и ломаного гроша.

Работа с исследованием

Адаптируйте исследование под ваши задачи или создайте готовый промпт на основе техник из исследования.

0 / 2000
~0.5-2 N-токенов ~10-30с
~0.3-1 N-токенов ~5-15с