
Проблема структурированного вывода на локальных моделях
В сообществе Reddit r/artificial обсуждается типичная проблема при запуске AI-агентов на локальных моделях: они ненадёжно генерируют JSON. Даже если модель в основном выдаёт корректный объект, она может забыть закрывающую скобку, придумать несуществующее имя инструмента или добавить пояснительный текст после JSON. Пользователь /u/paulqq отмечает, что облачные API (например, OpenAI) обрабатывают это на сервере, тогда как локально разработчику приходится решать самому.
Предложенное решение: GBNF-грамматики из llama.cpp
Автор предлагает подход на основе GBNF (Grammar-Based Natural Form) — встроенного в llama.cpp механизма, ограничивающего возможные токены на каждой позиции генерации. Он написал компилятор, который преобразует схему каждого инструмента в грамматические правила. В результате модель физически не может произвести некорректный JSON — вывод всегда соответствует заданной схеме. Дополнительно грамматика сужается на каждом шаге: вместо всех 50 инструментов модель видит только 3-5 релевантных, что уменьшает нагрузку и повышает точность.
Практическая реализация: проект Eris
Метод реализован в проекте Eris — локальном агенте на Rust, который использует Markdown-заметки пользователя как память и работает полностью на устройстве. Исходный код открыт (Apache 2.0), а подробное описание техники с примерами кода опубликовано в блоге проекта. Пост не является рекламой, а делится опытом решения конкретной проблемы.
| Пункт | Detail |
|---|---|
| Платформа | Reddit, r/artificial |
| Автор | /u/paulqq |
| Суть | Использование GBNF-грамматик в llama.cpp для гарантии валидного JSON |
| Реализация | Проект Eris (Rust, локальный AI-агент) |
| Статус | Открытый код, Apache 2.0 |
| Верификация | OpenAI.com/news (общая информация о структурированном выводе) |
Что остаётся неясным
На данный момент не проведено независимое тестирование метода на разных моделях и размерах. Неясно, насколько сильно грамматики замедляют генерацию и как решается проблема конфликта грамматик для сложных вложенных схем. Также стоит проверить совместимость подхода с другими бэкендами, кроме llama.cpp.
Источники
Оригинальное обсуждение: https://www.reddit.com/r/artificial/comments/1v9r73b/how_i_made_small_local_ai_models_stop_breaking/
Верификационный материал: https://openai.com/news/