Проблема: «Слепота» к схемам у малых моделей
Структурированный вывод (structured output) — критически важная задача для интеграции LLM в production-системы. Однако малые модели часто игнорируют сложные JSON-схемы, выдавая «сырой» текст или нарушая типы данных. В исследовании LiquidAI использовалась модель LFM2.5-350M (гибридная архитектура attention/convolution), которая до тонкой настройки показывала лишь 22.6% успеха на бенчмарке IFStruct (тест 2000 сэмплов). Это означает, что в 77% случаев модель выдавала невалидный или несоответствующий схеме результат.
Решение: GRPO-файн-тюнинг за 100 шагов
Команда применила метод Group Relative Policy Optimization (GRPO) через библиотеку TRL. Ключевые параметры эксперимента:
- Данные: 500 сэмплов из набора nvidia/Nemotron-RL-instruction_following-structured_outputs.
- Аугментация: 40% данных дополнены инструкцией «вернуть вывод в fenced code block», 20% преобразованы в задачи с выводом в виде top-level массива.
- LoRA-адаптер: обучалось всего ~6 млн параметров (1.66% от модели) с рангом r=16 и альфа 32. Целевые модули: q_proj, k_proj, v_proj, out_proj, in_proj, w1, w2, w3.
- Обучение: 100 шагов, 8 генераций на группу, размер батча оптимизирован под 16 GB VRAM (подходит для бесплатных тарифов Colab/Kaggle).
Функция вознаграждения (Reward Function)
Результат оценивался по трем метрикам, суммируемым с весами [1.0, 0.5, 2.0]:
- json_format_reward (вес 1.0): 1.0 за точное соответствие формату (raw JSON или code block), 0.2 за парсируемый, но неверный формат, 0.0 за невалидный JSON.
- field_count_reward (вес 0.5): 1.0 за точное совпадение количества полей, линейное снижение за отклонения.
- schema_validation_reward (вес 2.0): Штраф за каждое нарушение JSON Schema, частичный кредит за покрытие required-ключей.
Результаты: Таблица сравнения
После 100 шагов обучения модель научилась лучше соблюдать структуру. Ниже приведено сравнение базовой модели и модели после GRPO-файн-тюнинга на бенчмарке IFStruct:
| Метрика | LFM2.5-350M (Base) | LFM2.5-350M (GRPO Fine-tuned) |
|---|---|---|
| Общий успех (Overall) | 22.6% (452/2000) | 29.7% |
| JSON формат | 18.0% | — |
| YAML формат | 27.2% | — |
| Wrapper key | 28.5% | — |
| Bare list | 16.6% | — |
Хотя абсолютный прирост кажется modest (+7.1%), для модели в 350 миллионов параметров это значительный скачок, демонстрирующий, что RL-оптимизация может компенсировать недостаток размера модели в задачах строгого соблюдения инструкций.
Почему это важно для разработчиков
Этот рецепт доказывает, что не обязательно использовать огромные модели (70B+) для задач, требующих строгого JSON-вывода. Легковесный RL-файн-тюнинг на слабых GPU позволяет получить модель, которая:
- Требует минимум ресурсов для инференса (локальный запуск на MacBook M5 Max через llama.cpp).
- Генерирует предсказуемый вывод, упрощая парсинг в downstream-системах.
- Обучается за счет времени, сопоставимого с одним коротким epoch SFT, но с более сложной функцией потерь.
Полный код и ноутбук доступны на GitHub в репозитории LiquidAI.
Источник: Hugging Face blog ↗
