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

Задача формулируется просто: получить от модели структуру, которую программа примет без ручного вмешательства, и заранее решить, что делать в тех случаях, когда структура всё-таки нарушена. Второе важнее первого — сбой не устраняется полностью, он переводится из категории «испорченная запись в CRM» в категорию «повторный запрос, о котором никто не узнал».

Ниже — три способа зафиксировать формат и что каждый реально гарантирует, механика сбоя, расчёт стоимости брака, порядок обработки сбоя, готовые наборы полей для трёх типовых задач и правило отбора полей. Сквозной пример прежний для раздела: оптовая компания с интернет-магазином, 1 500 записей в месяц. Ставки модельные: инженер подрядчика 3 000 ₽/час, менеджер и методист внутри компании 900 ₽/час.

Три способа зафиксировать формат

Способы не альтернативные, а вложенные: третий не отменяет второго, второй не отменяет первого. Разница между ними в том, кто отвечает за соблюдение структуры — модель, платформа или ваш код.

СпособГде живётЧто гарантируетЧего не ловит
Описание в промпте с примеромТекст инструкции: перечень полей, типы, пример заполненного ответаНичего не гарантирует. На практике даёт 99 из 100 корректных ответовОставшийся процент: лишний текст вокруг структуры, пропущенное поле, число словами
Проверка по схеме на стороне кодаКод вокруг модели: разбор ответа, сверка со схемой, повтор при несоответствииСтруктура на выходе корректна всегда — некорректный ответ просто не проходит дальшеСмысловые ошибки внутри правильных полей: не тот ИНН, перепутанные телефон и факс
Режим строгого вывода у моделиПлатформа: ограничение генерации по схеме или вызов функции с описанными параметрамиСтруктура задаётся до генерации, доля сбоев формата падает почти до нуляТе же смысловые ошибки. Плюс доступен не у всех моделей и не во всех версиях API

Про третью строку стоит сказать отдельно. Вызов функции с описанной схемой параметров есть у основных российских платформ — GigaChat и Yandex AI Studio, — и его же обычно используют как способ получить предсказуемую структуру; у локальных моделей, развёрнутых через Ollama, ограничение вывода по схеме тоже поддерживается. Но конкретное поведение режима зависит от версии API, поэтому его проверяют на своей платформе до того, как закладывают в архитектуру, а не после. Механика самого вызова функций разобрана в отдельном материале про то, как модель нажимает кнопки в ваших системах.

Даже строгий режим не отменяет проверку в коде

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

Сравнение трёх способов зафиксировать формат ответа: промпт, схема в коде, строгий режим модели
Способы вложены друг в друга: строгий режим не отменяет проверку, проверка не отменяет описания

Почему просьба отвечать в JSON ломается на сотом ответе

Модель составляет ответ по одному фрагменту за раз, взвешивая всё, что ей дали: инструкцию, найденные документы и сообщение клиента. Требование формата — такое же правило, как остальные, и оно конкурирует с ними. Пока обращение типовое, формат держится. Ломается он на нетипичном входе: клиент прислал две заявки в одном письме, в тексте оказалась таблица, поле нечем заполнить, или сообщение само похоже на структуру и модель пытается её продолжить.

  • Обёртка вокруг структуры. Модель добавляет вежливую фразу перед ответом или пояснение после. Формально данные есть, программа их не разбирает.
  • Пропущенное поле вместо явной пустоты. Поле, которое нечем заполнить, просто исчезает. Это самая коварная разновидность: карточка создаётся, менеджер видит её заполненной и не знает, что телефона в ней нет.
  • Число словами или с единицей измерения. Вместо суммы приходит «примерно 240 тысяч» или «240 000 ₽» строкой. Дальше это либо не разбирается, либо разбирается неправильно.
  • Две записи вместо одной. В письме было два запроса, и модель вернула структуру с двумя объектами там, где код ожидает один.

Один процент — это модельная величина для несложной структуры и типового потока; на своих данных она снимается за вечер по журналу. Устойчиво другое: доля сбоев растёт вместе с числом полей и с разнородностью входящих сообщений, и почти не зависит от того, насколько настойчиво написано требование в инструкции.

Что стоит формат, за которым никто не следит
Записей, уходящих от агента в учётную систему, в месяц1 500
Доля ответов с нарушенной структурой без проверки, модельно 1 %15 записей
Из них видны сразу — пустое или сдвинутое поле в карточке9 записей
Уехали дальше с мусором и всплыли позже6 записей
Разбор одной битой карточки: 20 минут × 900 ₽/час300 ₽
Девять карточек: 9 × 300 ₽2 700 ₽/мес
Исправление уехавшей записи с повторным выяснением у клиента: 1 час × 900 ₽900 ₽
Шесть записей: 6 × 900 ₽5 400 ₽/мес
Проверка по схеме с повторным запросом и журналом сбоев: инженер 6 ч × 3 000 ₽18 000 ₽ разово
Итого8 100 ₽ в месяц против 18 000 ₽ разово — проверка окупается за два с небольшим месяца

Шесть записей из пятнадцати — та часть, ради которой всё и делается. Испорченная карточка, замеченная сразу, стоит двадцати минут; испорченная карточка, замеченная через две недели, стоит часа и одного неловкого звонка клиенту, а иногда и сорванной отгрузки. Разница между этими двумя ситуациями — не в качестве модели, а в наличии или отсутствии двадцати строк проверки в коде.

Воронка: 1500 записей, 15 со сбоем формата, 9 замечены сразу и 6 уехали в систему
Дорого стоят не пятнадцать сбоев, а те шесть, которые обнаружились через две недели

Что делать со сбоем: повтор, дефолт, человек

Проверка по схеме нужна не сама по себе, а ради заранее описанного поведения при сбое. Порядок из трёх ступеней закрывает практически все случаи, и важно, что переход между ступенями происходит автоматически, а не по звонку в поддержку.

  1. 1
    Ступень 1. Повторный запрос с указанием на ошибку

    Ответ не прошёл схему — модель получает тот же вход и короткое дополнение: какое поле отсутствует или какого типа оказалось значение. Один повтор закрывает большинство сбоев формата. Двух повторов достаточно; после третьего повторять бессмысленно и дорого — каждый повтор это ещё один вызов модели и плюс одна-три секунды к ответу.

  2. 2
    Ступень 2. Явное значение «неизвестно» вместо пустоты

    Если после повторов поле по-прежнему не заполнено, оно записывается как явно неизвестное, а не как пустая строка. Разница принципиальная: пустая строка выглядит как заполненное поле и не поднимает тревогу, явное «неизвестно» видно в списке и попадает в фильтр. Это дешёвая правка схемы, которая снимает половину историй про «карточка была заполнена, а телефона нет».

  3. 3
    Ступень 3. Передача человеку с сохранением исходника

    Запись не создаётся, исходное сообщение уходит в очередь на ручной разбор вместе с тем, что модель успела извлечь. Это нормальный исход для 0,1–0,3 % потока, то есть для двух-пяти записей в месяц в нашем примере. Главное требование к ступени — счётчик: если доля ручного разбора вышла за один процент, дело не в формате, а в том, что на вход пошли документы другого типа.

Схема обработки ответа агента: проверка по схеме, повтор, значение неизвестно, передача человеку
Сбой не устраняется полностью — он переводится в повтор, о котором никто не узнал

Наборы полей для трёх типовых задач

Ниже — рабочие составы полей, с которых имеет смысл начинать. Они намеренно короткие: каждое лишнее поле оплачивается ростом доли сбоев, а не только счётом за модель.

  1. 1Карточка лида, 8 полей. Имя контакта, компания, телефон, канал обращения, товарная группа, объём запроса, срок потребности, требуемое действие. Каждое поле помечено как обязательное или явно допускающее значение «неизвестно». Как это ложится на реальный процесс продаж, разобрано в решении автозаполнение CRM.
  2. 2Резюме звонка, 6 полей. Дата и длительность, кто участвовал, суть запроса одной фразой, достигнутая договорённость, срок следующего шага, признак «требует руководителя». Последнее поле — булево, и оно важнее остальных: именно по нему строится очередь на просмотр, чтобы руководителю не приходилось читать все резюме подряд.
  3. 3Поля из счёта, 7 полей. Поставщик, ИНН, номер документа, дата, сумма, сумма НДС, срок оплаты. Здесь к схеме обязательно добавляются арифметические проверки в коде: сумма НДС не больше суммы, дата не из будущего, ИНН нужной длины. Модель их не заменяет — она заполняет поля, а не сверяет документ.

Лишние поля — это сбои, задержка и деньги

Соблазн описать схему «с запасом» возникает у всех: раз уж мы всё равно извлекаем данные, добавим ещё десяток полей на будущее. Цена такого запаса измеряется не только счётом за модель. Практический ориентир: восемь полей карточки лида проходят стабильно, шестнадцать дают модельно около 5 % сбоев вместо одного. В той же арифметике, что и в расчёте выше, это 75 битых записей в месяц вместо 15 и порядка 40 000 ₽ ручного разбора вместо 8 100 ₽.

Денежная сторона токенов при таких объёмах вторична. На потоке 1 500 ответов в месяц разница между компактной и раздутой структурой в счёте за модель измеряется сотнями рублей и сама по себе решения не меняет. Значимой она становится в двух случаях: когда поток идёт на десятки тысяч ответов в месяц и когда каждый сбой тянет за собой повторный запрос — тогда лишние поля оплачиваются дважды, деньгами и задержкой ответа.

Правило отбора полей

Поле попадает в схему, только если у него есть читатель — человек, отчёт или другая система, которая его использует прямо сейчас. Поля, добавленные «на будущее», ухудшают надёжность сегодня в обмен на пользу, которая может не наступить. Если поле всё-таки нужно, но заполняется редко, — выносите его во вторую, отдельную схему, которая запускается только на тех обращениях, где оно уместно.

Когда строгий формат не нужен

Схема с проверкой — это 6–10 часов инженера на первую задачу и постоянная работа по её сопровождению при каждом изменении состава полей. Есть три ситуации, где эти часы не окупаются.

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

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