Структурированный вывод без боли
«Верни ответ в JSON» работает ровно до первого длинного письма с цитатой и кавычками внутри. Дальше нужен контракт.
Три уровня
- Просьба в промпте. Ломается на 2–5 % ответов.
- Схема через встроенный режим структурированного вывода. Ломается почти никогда, но ограничивает вложенность.
- Схема плюс валидация плюс один повтор с текстом ошибки. То, с чем живём.
{
"type": "object",
"required": ["intent", "order_id", "reply"],
"properties": {
"intent": {"enum": ["refund", "delivery", "other"]},
"order_id": {"type": ["string", "null"]},
"reply": {"type": "string", "maxLength": 1200}
}
}
Важная деталь: maxLength в схеме не гарантирует длину, модель её не видит. Длину проверяем сами и при превышении просим сократить, передавая первый вариант.
Что не делать
- Не парсить JSON из markdown-блока регулярками. Один раз сломается на ```json внутри цитаты.
- Не добавлять в схему поля «на будущее». Каждое поле — место, где модель может выдумать.