ТЕХНОЛОГИИ

JSON Schema в GBNF для llama.cpp: как обнаружить пропущенные ограничения

В этом материале
ГЛАВНОЕ ЗА МИНУТУ

Преобразование JSON Schema в GBNF для llama.cpp не доказывает, что все ограничения схемы будут действовать.

Преобразование JSON Schema в GBNF для llama.cpp не доказывает, что все ограничения схемы будут действовать. Конвертер поддерживает определенное подмножество, а отдельные конструкции могут быть пропущены. Для приемки нужны положительные и отрицательные примеры, независимый validator и сохраненная грамматика. Проверяйте смысл ограничений отдельно от успешной конвертации и от того, насколько убедительно модель объясняет полученный объект в обычном тексте ответа.

Что гарантирует грамматика

GBNF ограничивает допустимые последовательности вывода согласно выбранным правилам. Руководство grammars описывает преобразование Schema и его ограничения. Это не общий движок бизнес-логики и не обещание поддержки каждой версии JSON Schema. Если правило относится к существованию объекта в базе или внешнему состоянию, grammar не заменяет проверку приложения. Даже корректный JSON с допустимыми полями может быть непригодным для задачи, поэтому заранее разделите синтаксические, схемные и предметные условия приемки результата.

Инвентаризируйте используемые keywords

Сохраните исходную схему и перечень фактически используемых конструкций. Проверьте официальное описание unsupported features и сообщения конвертера. Не считайте отсутствие исключения доказательством полной поддержки: документация отдельно отмечает возможность пропуска отдельных ограничений. При изменении версии повторите сравнение с тем же набором keywords. Не переписывайте одновременно prompt и schema ради прохождения теста, потому что тогда непонятно, какой слой реально удерживает требуемое ограничение и не исчезнет ли оно на другом пользовательском запросе.

Пример отрицательной матрицы

Возьмите объект с обязательным полем, перечислением и вложенной структурой. Добавьте допустимый пример, пропуск поля, неверный enum и неправильный тип. Для применяемого сложного ограничения включите отдельный отрицательный объект, нарушающий только его. Это структура теста без утверждения о поддержке конкретного keyword. Прогоните примеры независимым schema validator и проверкой grammar. Если результаты расходятся, зафиксируйте точное правило, а не объявляйте весь constrained decoding неработающим или весь набор ограничений автоматически гарантированным.

Проверьте серверный контракт

Server README описывает применение grammar и schema к ответу. Сверьте фактическое поле запроса и выбранный endpoint установленной сборки. Schema не обязательно становится содержательным объяснением задачи для модели, поэтому prompt должен по-прежнему описывать нужный объект. Для streaming промежуточный fragment может не быть завершенным JSON. Сохраняйте полный ответ и finish condition; обрезанный по output budget текст нельзя считать доказательством ошибки grammar conversion без отдельного разбора того, почему генерация завершилась раньше.

Что вынести в приложение

Если нужное ограничение не реализуется выбранным преобразованием, проверяйте его явно после генерации и задайте понятную обработку отказа. Не используйте тихий retry без ограничений как незаметную замену контракта. В релизный пакет включите schema, generated grammar, версии, warnings и результаты отрицательных fixtures. При обновлении движка сравнивайте именно эти артефакты. Полезный итог показывает, какие правила обеспечены грамматикой, какие независимым validator и какие предметной логикой. Это позволяет применять constrained generation честно и предсказуемо, без обещания, что любой объект, появившийся из schema-constrained endpoint, автоматически удовлетворяет всем исходным намерениям автора схемы или всем требованиям downstream приложения при любом изменении входного prompt.

Связанные материалы

JSON от OpenRouter: когда нужен structured output и схема; llama.cpp server: локальный API из GGUF-модели.

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