← Все материалы

Гайд

Нейросеть обещала JSON. Почему приложение всё равно упало?

Почему просьбы вернуть JSON недостаточно: схема ответа, проверка смысла и обработка ошибок, с коротким примером startCompletion в Чатиуме.

Обновлено

Окна приложения с кодом соединены с серверными модулями

Модель может вернуть синтаксически правильный JSON с неправильной категорией, выдуманным идентификатором или отсутствующим условием. Поэтому задача приложения шире, чем успешно вызвать JSON.parse. Нужны согласованная структура и проверка того, что значения допустимы для вашей работы.

В Чатиуме можно сделать обработчик заявок, который принимает от модели ограниченный набор полей и отправляет сомнительные случаи человеку. Тогда формат ответа помогает автоматизации, не превращаясь в ложную гарантию смысла.

Промпт

Создай сортировщик заявок с тремя категориями и отдельной очередью проверки. Нейросеть должна возвращать категорию и признак сомнения в согласованном формате. Проверяй значения на сервере, сохраняй исходник и не применяй непрошедший проверку результат.

Три уровня корректности

Первый — синтаксис: ответ действительно можно прочитать как JSON. Второй — схема: нужные поля присутствуют и имеют допустимые типы. Третий — смысл: категория соответствует обращению, а указанный ID существует и доступен пользователю.

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

Пример: доступ, оплата или другое

Условное обращение: «Оплата прошла, но кабинет не открывается». Категории — access, billing, other. Чтобы выбрать правильную, нужны правила команды: это проблема доступа после оплаты или вопрос проверки платежа? Без них два разных ответа могут быть разумными.

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

Схема в коротком вызове Чатиума

В примере используется GPT-6 Luna с поддержкой структурированного ответа на выбранном маршруте. sourceText содержит обращение и правила категорий. ctx даёт платформа; done и failed — зарегистрированные маршруты app.function, которые проверяют caller.type === 'plugin' && caller.appSlug === 'start'.

TypeScript
import { startCompletion } from '@start/sdk'
import { s } from '@app/schema'

const { completionId } = await startCompletion(ctx, {
  model: 'openai/gpt-6-luna',
  system: 'Классифицируй обращение по правилам. Неясные случаи отметь для проверки.',
  responseFormat: s.object({
    category: s.enum(['access', 'billing', 'other']),
    needsReview: s.boolean(),
  }),
  messages: [{ role: 'user', content: [{ type: 'text', text: sourceText }] }],
  onCompletionCompleted: done,
  onCompletionFailed: failed,
})

Вызов возвращает completionId; содержимое ответа приходит позже через обработчик. Там приложение проверяет завершение, извлекает результат и валидирует его перед применением. Код не показывает полный обработчик и не превращает любое завершение генерации в корректную бизнес-запись.

Что проверять после получения

Проверка Пример
Формат Ответ читается и соответствует ожидаемой схеме
Допустимые значения Категория входит в утверждённый список
Связанные данные Указанная запись существует и доступна
Состояние запуска Ответ относится к текущей версии исходника
Смысл Решение согласуется с правилами задачи

Если проверка не прошла, не подставляйте тихо значение по умолчанию. Например, автоматический выбор первой категории превратит техническую ошибку в неверную маршрутизацию обращения.

Как учитывать ограничения модели

Не все маршруты OpenRouter поддерживают структурированные ответы. Перед выбором проверяйте возможности конкретной модели и провайдера. Суффикс free, другая версия или запасной маршрут могут иметь иной набор параметров.

Даже у совместимой модели нужно обрабатывать отказ, ошибку и неполный результат. Просьба «верни только JSON» в системном тексте не заменяет поддерживаемый механизм схемы и проверку на стороне приложения.

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

Строгая схема устраняет галлюцинации?

Она ограничивает форму и допустимые поля, но не гарантирует правильность содержания. Ошибочная классификация может полностью соответствовать схеме.

Можно ли добавить все поля как обязательные?

Только если для каждого есть корректное значение при недостатке данных. Иначе модель будет вынуждена заполнять неизвестное. Неопределённость нужно выразить в контракте.

Что делать с ошибочным ответом?

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