AI · 7 мин чтения

Извлечение данных из текста LLM: структурированный вывод для ботов и CRM

Извлечение данных из текста LLM я в последний год подключаю к проектам чаще, чем классический парсинг регулярками. Присылают произвольное сообщение из чат-бота, письмо от поставщика, скан чека или комментарий из формы на Тильде, а на выходе нужен предсказуемый JSON: имя, телефон, сумма, дата, статус заказа. Ниже разбираю, как выстраиваю структурированный вывод у нейросети на практике: какие механизмы использую, где модель начинает выдумывать поля и как проверяю результат перед тем, как он попадёт в CRM или таблицу.

Зачем извлекать данные из текста нейросетью, если есть regex и парсеры

Regex отлично работает, пока формат текста стабилен: номер телефона всегда в одном месте письма, сумма всегда после слова «Итого». На практике так бывает редко. Клиенты пишут «плачу через т банк, чек скину завтра», «адрес - дом 12 корпус 3, подъезд со двора», «нужно к пятнице, а лучше к четвергу». Регулярка ловит один шаблон и ломается на втором сообщении с другой формулировкой.

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

Есть и обратная сторона: модель может «дофантазировать» поле, если его нет в тексте, или перепутать формат даты. Про борьбу с этим - в разделе про валидацию ниже.

Структурированный вывод: JSON Schema, function calling и structured outputs

До массового появления structured outputs извлечение данных сводилось к промпту вида «верни JSON с полями…» и надежде, что модель не добавит пояснение перед скобкой. Сейчас у основных провайдеров есть рабочие механизмы:

  • function calling / tool use - модели передаётся описание «инструмента» с JSON Schema, она обязана вызвать его с валидными аргументами;
  • structured outputs с response schema - модель напрямую возвращает JSON по заданной схеме, без обёртки в текст и без markdown-разметки вокруг;
  • constrained decoding на стороне локальных моделей (llama.cpp, vLLM с grammar) - схема применяется на уровне генерации токенов, а не проверяется постфактум.

Я почти всегда беру function calling или structured outputs через Claude API или OpenAI API - они дают предсказуемый JSON без дополнительного парсинга текста. Схему описываю строго: обязательные поля, типы, enum для статусов, ограничение длины строк. Чем жёстче схема, тем меньше у модели пространства придумать своё поле.

Пример схемы для извлечения данных из обращения клиента в поддержку:

{
  "type": "object",
  "properties": {
    "name": {"type": "string"},
    "phone": {"type": "string"},
    "issue_type": {"type": "string", "enum": ["доставка", "оплата", "брак", "другое"]},
    "order_number": {"type": ["string", "null"]},
    "urgency": {"type": "string", "enum": ["низкая", "средняя", "высокая"]}
  },
  "required": ["name", "issue_type", "urgency"]
}

Бесплатный материал

🎁 Полезный скрипт в подарок

Подпишитесь на Telegram - пришлю готовый скрипт по этой теме.

Без спама. Отписка в 1 клик.

Как я выстраиваю промпт для извлечения сущностей из текста

Схема задаёт форму ответа, но не гарантирует, что модель верно интерпретирует содержание. На это влияет промпт:

  1. Указываю роль и контекст: «Ты обрабатываешь обращения из формы обратной связи интернет-магазина одежды».
  2. Явно пишу, что делать с отсутствующими данными: «Если поле не упомянуто в тексте, верни null, не придумывай значение».
  3. Даю 2-3 примера входного текста и ожидаемого JSON - это снижает разброс формата дат и телефонов сильнее, чем любые инструкции в свободной форме.
  4. Прошу не добавлять комментарии и markdown вокруг JSON, даже если используется обычный текстовый режим без structured outputs.

Для писем с уведомлениями об оплате, например при сверке платежей T‑Bank с заказами в WooCommerce, в промпт добавляю список типовых формулировок банка: «Перевод по QR», «Оплата картой», «Возврат». Модель точнее распознаёт тип операции, если видит примеры терминологии, а не гадает по общему смыслу фразы.

Валидация, ретраи и защита от галлюцинаций модели

Даже со schema модель иногда возвращает телефон без кода страны, дату в прошлом году вместо текущего или добавляет email, которого не было в исходном тексте. Три вещи, которые ставлю в продакшене обязательно:

  • Валидация на своей стороне через Pydantic (Python) или Zod (Node) поверх ответа модели - схема API гарантирует структуру JSON, но не бизнес-корректность значений.
  • Повторный запрос при ошибке валидации с указанием, что именно не так: «поле phone не соответствует формату +7XXXXXXXXXX, повтори». Обычно хватает одного ретрая.
  • Отдельное поле confidence или явное «не найдено» вместо пустой строки - так проще отфильтровать записи, которые нужно проверить человеку, а не пускать сразу в автоматическую обработку.

Для задач с финансовой значимостью - суммы в чеках, номера заказов, адреса для расчёта доставки через СДЭК - на первые недели работы всегда добавляю слой ручной проверки. Смотрю, на каких формулировках модель ошибается, и дорабатываю промпт и примеры под конкретный поток сообщений.

Где это применяется на практике: боты, автоматизация, интеграции

Разбор обращений в Telegram-боте

В aiogram-боте для поддержки интернет-магазина ставлю LLM между хендлером сообщения и записью в базу: клиент пишет свободным текстом, бот извлекает номер заказа, тип проблемы и телефон, дальше по этим полям автоматически заводит тикет.

Обработка форм с Тильды

Форма на Тильде часто собирает данные в одно текстовое поле «Комментарий», где человек пишет и адрес, и пожелания по доставке, и удобное время звонка. Вебхук с Тильды прилетает в n8n, там нода с вызовом LLM раскладывает текст на структурированные поля перед отправкой в CRM или в расчёт зоны доставки СДЭК.

Сверка платежей

Для интеграций с эквайрингом извлекаю из уведомлений о платеже (T‑Bank, ЮKassa) сумму, номер заказа и статус, сверяю с заказом в WooCommerce и меняю статус на «Оплачен» без ручной сверки бухгалтером.

Разбор писем поставщиков

Прайс-листы и накладные от поставщиков присылают в почти произвольном текстовом или табличном виде - LLM вытаскивает артикул, количество и цену в единый формат для загрузки в 1С или админку магазина.

Похожие интеграции я собираю на связке n8n и Claude API или через отдельный сервис, если нагрузка выше, чем воркфлоу-инструмент способен обработать без задержек. Если задача похожая - разбор обращений, писем или форм в структурированные данные, можно посмотреть на готовый ИИ-чатбот на Claude в библиотеке скриптов как отправную точку архитектуры, а под конкретный формат данных и объём обращений собираю решение индивидуально.

LLM-экстракция против regex и классического NER

Критерий Regex Классический NER LLM-экстракция
Гибкость к формулировкам низкая, один шаблон на формат средняя, зависит от обучающих данных высокая, понимает смысл фразы
Время на настройку под новый формат часы на каждый новый шаблон недели на разметку и дообучение минуты на правку промпта и схемы
Нужен ли датасет для обучения нет да, размеченный вручную нет, только примеры в промпте
Стоимость одного запроса почти ноль низкая после обучения несколько копеек за запрос через API
Устойчивость к опечаткам и жаргону низкая средняя высокая

Сроки и стоимость разработки

Простой модуль извлечения полей из одного типа сообщений, например разбор комментария к заказу в форме на Тильде на адрес и телефон, оцениваю как кастомный скрипт для Tilda - от 3 000 ₽, если это доработка существующего сайта без внешних интеграций.

Если нужна связка с CRM, эквайрингом или СДЭК - это уже комплексная интеграция, от 40 000 ₽.

Отдельный сервис на n8n с обработкой входящих писем или сообщений через LLM - автоматизация в n8n, от 25 000 ₽.

Полноценная AI-интеграция с Claude API или OpenAI, включая валидацию схемы, ретраи и обработку ошибок под нагрузкой, - от 50 000 ₽, срок обычно 2-3 недели в зависимости от количества типов документов и полей.

На фрилансе и в студиях цены на подобные интеграции у других разработчиков я видел в диапазоне 30 000-150 000 ₽ - разброс большой из-за того, что многие закладывают доработку промпта отдельными итерациями поверх стоимости кода.

Искусственный интеллект для бизнеса

AI / Claude API

от 50 000 ₽

Подробнее →

Частые вопросы

Чем структурированный вывод отличается от обычного ответа нейросети?

Обычный ответ - это свободный текст, который приходится парсить самому и обрабатывать все варианты формулировок вручную. Структурированный вывод задаёт схему заранее через JSON Schema или function calling, модель обязана вернуть данные в этом формате, и на выходе получается объект, который сразу проходит валидацию и уходит в базу без промежуточного разбора текста.

Можно ли доверять LLM извлечение данных из юридически значимых документов?

Напрямую в базу без проверки - нет. Модель иногда добавляет значения, которых не было в тексте, или неверно распознаёт формат чисел и дат. Для чеков, счетов и договоров я всегда добавляю валидацию по схеме, сверку суммы через отдельный числовой парсер и ручную проверку выборки результатов на старте, прежде чем полностью автоматизировать процесс.

Какая модель лучше подходит для извлечения сущностей из текста?

Для большинства задач хватает моделей среднего размера вроде Claude Haiku - извлечение полей не требует сложных рассуждений, а стоимость запроса при этом в разы ниже, чем у топовых моделей. Более крупную модель беру, когда текст многослойный, например письмо с несколькими заказами внутри одного сообщения, и нужно правильно развести сущности между собой.

Сколько стоит внедрить извлечение данных из текста в существующий проект?

Зависит от того, куда встраивается модуль. Доработка формы на Тильде под структурированный вывод - от 3 000 ₽, автоматизация обработки писем или сообщений через n8n - от 25 000 ₽, полноценная AI-интеграция с валидацией и обработкой ошибок под нагрузку - от 50 000 ₽.

Есть задача?

Обсудим в мессенджере

Расскажите, что нужно сделать — отвечу в течение 4 часов в рабочее время. Первая консультация бесплатно.

Самозанятый Калинкин Н. А. · работаю с физлицами и юрлицами

Продолжая пользование настоящим сайтом Вы выражаете своё согласие на обработку Ваших персональных данных (файлов куки) с использованием Yandex.Metrika.
Понятно