Извлечение информации
Структурированные данные из текста
Проблема: Важные факты скрыты в неструктурированном тексте — письмах, документах, веб-страницах. Как автоматически вытащить нужные данные?
Решение: Детектив, ищущий улики
Извлечение информации (information extraction, IE) использует LLM для идентификации и извлечения конкретных данных из неструктурированного текста — из «грязных» абзацев в письмах, PDF, контрактах и веб-страницах — и превращает их в чистые, машиночитаемые записи. Например, из текста "Контракт между Acme Corp и Иваном Петровым от 15 января 2024 на $50,000..." модель выдаёт структурированный JSON: { сторона_а: "Acme Corp", сторона_б: "Иван Петров", дата: "2024-01-15", сумма: 50000 }. Две классические подзадачи — это распознавание именованных сущностей (помечаем фрагменты, которые являются сущностями: люди, организации, даты, суммы) и извлечение связей (relation extraction) — кто подписал что, кто где работает. Результат почти всегда нужен как структурированный вывод, который код ниже по конвейеру использует напрямую, без ручного перепечатывания.
Как это работает
На практике ты даёшь модели две вещи: явную схему вывода (output schema) — точные имена полей, типы и то, какие поля обязательны — и сам исходный текст. С сильной instruction-tuned моделью это часто работает zero-shot, но точность заметно растёт, когда ты добавляешь несколько few-shot примеров, покрывающих граничные случаи: отсутствующий телефон, два человека с одинаковым именем, сумму прописью вместо цифр. Современные API позволяют принудительно соблюдать схему прямо на этапе декодирования (JSON mode / constrained output), и это убирает целый класс ошибок парсинга, потому что ответ гарантированно валидный JSON нужной формы. По сравнению со старыми системами на правилах (регулярные выражения и написанные вручную паттерны) LLM обобщается на формулировки, которых раньше не видела, и учитывает контекст — но стоит дороже за документ и хуже предсказуема.
Подводные камни и разбор примера
Главный риск — галлюцинация (hallucination): когда поля нет в тексте, модель может выдумать правдоподобное значение вместо null. Лечится это так: (1) явно просим возвращать null для всего, что не указано, и (2) валидируем каждое извлечённое поле по исходному тексту, прежде чем ему доверять. Используй IE, когда данные повторяющиеся и их много (тысячи счетов, резюме, тикетов поддержки) и допустим небольшой процент ошибок с ручной проверкой спорных случаев. Конкретный пример: подаём модели строку из письма "Привет, перенесите мою встречу со вторника на следующую пятницу в 15:00, мой номер обращения #A-4471" со схемой { действие, старая_дата, новая_дата, время, номер }. Хороший промпт вернёт { действие: "перенести", старая_дата: "вторник", новая_дата: "следующая пятница", время: "15:00", номер: "A-4471" } — заметь, что относительные даты остались как в тексте: чтобы превратить «следующую пятницу» в конкретную дату календаря, нужен контекст, которого в самой строке нет.
Представьте это как детектива, ищущего улики:
- 1. Определяем типы сущностей: Что извлекаем: людей, организации, даты, суммы, адреса
- 2. Определяем схему вывода (JSON): Указываем точные имена полей, типы и структуру вложенности для вывода
- 3. Даём примеры с граничными случаями: Показываем, как обрабатывать отсутствующие поля, неоднозначные сущности и многозначные поля
- 4. ИИ извлекает сущности: Модель читает текст и заполняет JSON-схему найденными значениями
- 5. Валидируем по источнику: Сверяем каждое извлечённое поле — помечаем как ПОДТВЕРЖДЕНО (найдено в тексте) или НЕ ПОДТВЕРЖДЕНО (выведено)
Где это используется?
- Парсинг резюме: Извлечение навыков, опыта, контактов
- Обработка счетов: Вытягивание сумм, дат, данных поставщиков
- Медицинские записи: Поиск диагнозов, лекарств, дат
- Анализ контрактов: Определение условий, сторон, обязательств
Интересный факт: LLM могут извлекать информацию из сложных связей! "Иван работает в Acme, которая была основана в 2010" — ИИ может понять, что компания Ивана была основана в 2010, хотя это явно не указано.
Попробуйте сами!
Используй интерактивный пример ниже, чтобы извлечь конкретную информацию из разных типов текстовых документов.
Apple Inc. объявила, что CEO Тим Кук представит новый iPhone в штаб-квартире в Купертино 12 сентября 2024 года. Компания ожидает выручку в $90 миллиардов.
- • NER — находит именованные сущности (Человек, Организация, Место, Дата, Деньги) в тексте.
- • Связи — находит связи между сущностями: работает_в, находится_в, владеет.
- • LLMs — делают это без обучения. Не нужны тренировочные данные — опишите, что извлекать.
Частые вопросы
Что такое Named Entity Recognition (NER)?
NER находит и классифицирует именованные сущности в тексте по категориям: персона, организация, место, дата, денежная сумма. LLM выполняют NER zero-shot, без обучающих данных.
Может ли LLM извлекать данные в JSON без fine-tuning?
Да. При хорошо структурированном промпте с описанием желаемой схемы LLM извлекает сущности и выдаёт валидный JSON. Используйте JSON mode или function calling для гарантии формата.
Как обрабатывать вложенные и перекрывающиеся сущности?
Применяйте иерархическое извлечение: сначала идентифицируйте сущности верхнего уровня, затем извлеките атрибуты каждой. Для перекрывающихся сущностей укажите правила приоритета в промпте.
В чём преимущество LLM перед rule-based извлечением?
LLM справляются с неоднозначностью, контекстом и новыми паттернами без написания правил. Они обобщаются на домены и языки. Rule-based системы быстрее и предсказуемее, но хрупкие при вариациях текста.
Попробуй сам
Интерактивное демо этой техники
Извлеки ключевые сущности из новостной статьи
В тексте упоминаются: Tesla, Илон Маск, Берлин, Роберт Хабек. Также говорится о строительстве завода и рабочих местах.
[
{"entity": "Илон Маск", "category": "PERSON", "attributes": {"role": "руководитель Tesla"}},
{"entity": "Роберт Хабек", "category": "PERSON", "attributes": {"role": "министр экономики Германии"}},
{"entity": "Tesla", "category": "ORG", "attributes": {"type": "автопроизводитель"}},
{"entity": "Берлин", "category": "LOCATION", "attributes": {"type": "город", "country": "Германия"}},
{"entity": "Германия", "category": "LOCATION", "attributes": {"type": "страна"}},
{"entity": "15 марта 2025", "category": "DATE", "attributes": {"iso": "2025-03-15"}},
{"entity": "5 млрд евро", "category": "MONEY", "attributes": {"amount": 5000000000, "currency": "EUR"}},
{"entity": "10 000", "category": "NUMBER", "attributes": {"value": 10000, "context": "рабочие места"}}
]
Определение категорий с атрибутами и выходного формата (JSON) превращает размытый список сущностей в структурированные данные, пригодные для дальнейшей обработки.
Создайте бесплатный аккаунт для решения челленджей
5 челленджей с AI-проверкой для этого урока
Этот урок — часть структурированного курса по LLM.
Мой путь обучения