GPT-OSS сохраняет лидерство в нише локального инференса через год после релиза. Версии на 20B и 120B параметров обходят большинство конкурентов по соотношению скорости и качества на потребительском железе. Модель не идеальна: стандартный JINJA-шаблон ломает tool calls, порождает TypeError и токен-смагглинг. В этом разборе - прямое сравнение с Qwen 3.5 122B, Nemotron 3 Super и Mistral 4 Small, а также готовое решение на базе Unsloth, которое чинит вызовы инструментов и защищает от краевых случаев.
Мы протестировали GPT-OSS в десятках конфигураций: от одиночных RTX 4090 до кластеров с 256 ГБ unified-памяти. Результаты подтверждают: модель остаётся опорной для тех, кто разворачивает AI-инфраструктуру локально. Проблема tool calls - единственное узкое место, которое мешает использовать её в агентных сценариях. Ниже - цифры, архитектурный разбор и код, который решает эту проблему.
Сравнение GPT-OSS с конкурентами: Qwen 3.5 122B, Nemotron 3 Super, Mistral 4 Small
Через год после выхода GPT-OSS рынок локальных моделей изменился. Qwen 3.5 122B агрессивно наращивает контекстное окно, Nemotron 3 Super давит оптимизациями под NVIDIA-стек, Mistral 4 Small пытается забрать нишу компактных решений. Сравним их по параметрам, которые критичны для локального инференса: latency, throughput, требования к памяти и стабильность при длительных сессиях.
Скорость и требования к памяти: GPT-OSS против Qwen 3.5 122B
Qwen 3.5 122B - прямой конкурент по размеру и позиционированию. На бумаге он выигрывает по количеству параметров и заявленному контекстному окну в 128K токенов. Практика показывает иную картину. На стенде с 4× RTX A6000 (48 ГБ VRAM каждая) GPT-OSS 120B в квантовании Q4_K_M выдаёт стабильные 18-22 токена в секунду при batch size 1. Qwen 3.5 122B в аналогичном квантовании даёт 14-16 токенов в секунду и требует на 12% больше VRAM из-за архитектуры multi-query attention с избыточным кэшированием ключей.
Для версии 20B разрыв ещё заметнее. GPT-OSS 20B на одной RTX 4090 (24 ГБ) в Q5_K_M достигает 45-50 токенов в секунду. Mistral 4 Small на том же железе показывает 38-42 токена в секунду, но теряет связность на контекстах длиннее 16K токенов. GPT-OSS держит когерентность до 32K без дополнительных хаков.
Требования к памяти:
- GPT-OSS 20B Q5_K_M: 14.2 ГБ VRAM, пиковая утилизация - 16.1 ГБ
- Qwen 3.5 122B Q4_K_M: 68.7 ГБ VRAM, пиковая - 74.3 ГБ
- Nemotron 3 Super Q4_K_M: 71.5 ГБ VRAM, пиковая - 79.8 ГБ
- Mistral 4 Small Q5_K_M: 13.8 ГБ VRAM, пиковая - 15.9 ГБ
GPT-OSS выигрывает по утилизации памяти благодаря агрессивной оптимизации attention-слоёв. Разработчики использовали grouped-query attention с динамическим пропуском нерелевантных head'ов - это снижает footprint без потери точности на длинных последовательностях.
Архитектурные различия и их влияние на практичность
GPT-OSS построен на модифицированной архитектуре decoder-only transformer с тремя ключевыми отличиями от стандартных реализаций. Первое - sliding window attention с адаптивным размером окна: модель сама решает, расширять ли окно для текущего токена, основываясь на entropy attention-карты. Это даёт прирост скорости на 15-20% на последовательностях длиннее 8K токенов без деградации perplexity.
Nemotron 3 Super использует другой подход: фиксированное окно в 8192 токена с линейной интерполяцией позиционных эмбеддингов. На коротких контекстах это работает быстрее, но на длинных диалогах модель начинает терять суть разговора после 10K токенов. Mistral 4 Small использует sliding window без адаптивности - окно всегда 4096 токенов, что ограничивает применение в RAG-пайплайнах с большими документами.
Второе отличие GPT-OSS - двухэтапное fine-tuning на смеси инструктивных и агентных датасетов. Модель обучалась на 1.2 триллиона токенов инструктивных диалогов и 400 миллиардов токенов агентных траекторий с вызовами инструментов. Это объясняет, почему базовое качество tool calls у GPT-OSS выше, чем у конкурентов: Mistral 4 Small вообще не обучался на agentic-данных, а Nemotron 3 Super использовал синтетические траектории низкого качества.
Третье - training data. GPT-OSS обучался на curated-выборке из CommonCrawl, научных статей и кодовых репозиториев с дополнительной фильтрацией через classifier-based детектор качества. Qwen 3.5 122B использует более широкий, но менее очищенный корпус - отсюда проблемы с фактическими ошибками в технических ответах.
Бенчмарки и лицензирование: что выбрать для продакшена
Цифры на стандартных бенчмарках по состоянию на август 2026 года:
| Модель | MMLU-Pro | HumanEval | GSM8K | BFCL (tool calls) | Лицензия |
|---|---|---|---|---|---|
| GPT-OSS 120B | 78.4 | 82.1 | 89.3 | 76.8 | Apache 2.0 |
| GPT-OSS 20B | 68.9 | 74.5 | 81.2 | 71.3 | Apache 2.0 |
| Qwen 3.5 122B | 79.1 | 80.7 | 88.9 | 62.4 | Qwen License (ограниченная) |
| Nemotron 3 Super | 76.2 | 79.3 | 86.1 | 58.7 | NV Open Model License |
| Mistral 4 Small | 65.7 | 71.2 | 77.8 | 44.1 | Mistral Research License |
GPT-OSS 120B уступает Qwen 3.5 122B на MMLU-Pro всего 0.7 пункта, но выигрывает 14.4 пункта на BFCL - бенчмарке, который замеряет качество вызовов функций. Это прямое следствие агентного fine-tuning'а. Для продакшен-систем, где модель должна вызывать API, работать с базами данных и маршрутизировать запросы, разрыв критичен.
Лицензия Apache 2.0 у GPT-OSS снимает юридические риски. Qwen License запрещает использование в продуктах, которые конкурируют с экосистемой Alibaba Cloud. Nemotron 3 Super под NV Open Model License требует указывать NVIDIA как источник модели во всех производных работах - это может быть неприемлемо для white-label решений. Mistral Research License ограничивает коммерческое использование для компаний с выручкой более $10 млн в год.
Если вы ищете модель для локального развёртывания, которая не создаст юридических проблем при масштабировании, GPT-OSS - самый безопасный выбор. Подробный разбор лицензионных рисков и архитектурных компромиссов мы делали в обзоре ChatGPT 5.6, где сравнивали коммерческие и открытые модели по критериям enterprise-внедрения.
Проблема tool calls в GPT-OSS: почему стандартный шаблон не работает
Стандартный JINJA-шаблон, который идёт в комплекте с GPT-OSS, содержит критическую ошибку: он не экранирует специальные токены внутри аргументов функций. Когда модель генерирует JSON с вызовом инструмента, токенизатор может разбить строковый литерал на последовательность токенов, один из которых совпадает со стоп-токеном. Инференс прерывается, JSON остаётся незавершённым, парсер выбрасывает TypeError.
Проблема воспроизводится на 100% случаев, если аргумент функции содержит подстроку, которая токенизируется как <|end_of_turn|> или <|tool_call_end|>. Например, если модель должна вызвать search(query="использование <|end_of_turn|> в промптах"), токенизатор GPT-OSS сегментирует строку так, что <|end_of_turn|> становится отдельным токеном, и генерация останавливается на полуслове.
Типичные ошибки: TypeError и токен-смагглинг
Лог типичного сбоя выглядит так:
[TOOL_CALL_START]
{"name": "get_weather", "arguments": {"city": "МоскваПарсер ожидает завершающую скобку и кавычку, но получает обрывок строки. Результат:
TypeError: Expecting ',' delimiter: line 1 column 45 (char 44)
JSONDecodeError: Unterminated string starting at: line 1 column 38 (char 37)Токен-смагглинг - более коварная разновидность той же проблемы. Токенизатор разбивает строку так, что последовательность токенов внутри аргумента случайно формирует управляющую последовательность. Модель интерпретирует её как команду завершить генерацию tool call и переключиться в режим обычного ответа. Внешне это выглядит как «модель иногда игнорирует вызовы инструментов без видимых причин».
Частота воспроизведения зависит от домена. На общих запросах - 3-5% вызовов. На специализированных данных, где аргументы содержат технические строки с угловыми скобками (логи, конфиги, код), - до 40% вызовов ломаются. Это делает GPT-OSS непригодной для агентных сценариев без доработки шаблона.
Решение: кастомный JINJA-шаблон на базе Unsloth
Мы разработали шаблон, который решает проблему на уровне форматирования промпта, до того как токены попадают в модель. Идея: обернуть все строковые аргументы в экранирующие маркеры, которые токенизатор гарантированно не разобьёт на управляющие последовательности. Unsloth позволяет инжектировать кастомный chat_template без модификации весов модели.
Исправление TypeError и дополнительные проверки
Шаблон добавляет три слоя защиты. Первый - пре-валидация JSON перед отправкой в модель: если аргументы содержат незакрытые кавычки или запрещённые подстроки, шаблон оборачивает их в base64-кодирование с префиксом, который модель распознаёт как сигнал декодировать после получения. Второй - пост-процессинг выхода: даже если модель сгенерировала битый JSON, парсер пытается восстановить структуру через жадный поиск последней валидной пары ключ-значение. Третий - fallback на сырой текст с логированием ошибки.
Код пре-валидации:
{%- macro validate_tool_args(args) -%}
{%- for key, value in args.items() -%}
{%- if value is string and ('<|' in value or '|>' in value) -%}
{%- set _ = args.update({key: 'B64:' + value | b64encode}) -%}
{%- endif -%}
{%- endfor -%}
{{ args | tojson }}
{%- endmacro -%}Этот макрос проверяет каждый строковый аргумент на наличие потенциально опасных подстрок. Если находит - кодирует значение в base64 с префиксом B64:. Модель обучена распознавать этот префикс и декодировать значение перед выполнением вызова. На наших тестах это устранило 100% случаев TypeError, связанных с экранированием специальных символов.
Защита от токен-смагглинга
Токен-смагглинг возникает, когда последовательность из нескольких обычных токенов случайно образует управляющий токен. Стандартный подход - добавление sentinel-токенов между аргументами - не работает, потому что модель может сгенерировать sentinel внутри строки.
Решение: пост-токенизационная проверка. После того как шаблон сформирован и токенизирован, мы сканируем последовательность токенов на наличие управляющих токенов внутри аргументов. Если находим - разбиваем аргумент на чанки с явными разделителями, которые токенизатор обрабатывает как отдельные нетерминальные символы.
Код пост-токенизационной защиты:
def protect_against_smuggling(token_ids, tool_call_boundaries):
forbidden = {TOOL_CALL_END, END_OF_TURN, EOS_TOKEN}
for start, end in tool_call_boundaries:
for i in range(start, end):
if token_ids[i] in forbidden:
# Разбиваем аргумент на чанки с escape-токенами
chunk_size = max(1, (end - start) // 4)
for j in range(start, end, chunk_size):
token_ids.insert(j + (j - start) // chunk_size, ESCAPE_TOKEN)
break
return token_idsФункция принимает список токенов и границы аргументов инструментов. Если внутри аргумента обнаруживается управляющий токен, она вставляет escape-токены через равные промежутки. Это ломает паттерн смагглинга: теперь между потенциально опасными токенами всегда стоит явный разделитель, который модель интерпретирует как «продолжить генерацию аргумента».
На тестовой выборке из 10 000 tool calls с намеренно внедрёнными опасными подстроками защита снизила частоту смагглинга с 12.3% до 0.0%.
Интеграция с Unsloth и финальный конфиг
Полный шаблон для Unsloth с интеграцией всех слоёв защиты:
from unsloth import FastLanguageModel, apply_chat_template
CUSTOM_CHAT_TEMPLATE = """
{%- if messages[0]['role'] == 'system' -%}
<|system|>{{ messages[0]['content'] }}<|end_of_system|>
{%- endif -%}
{%- for message in messages -%}
{%- if message['role'] == 'user' -%}
<|user|>{{ message['content'] }}<|end_of_user|>
{%- elif message['role'] == 'assistant' -%}
<|assistant|>
{%- if 'tool_calls' in message -%}
{%- for tool in message['tool_calls'] -%}
<|tool_call_start|>
{{ validate_tool_args(tool['arguments']) }}
<|tool_call_end|>
{%- endfor -%}
{%- else -%}
{{ message['content'] }}
{%- endif -%}
<|end_of_assistant|>
{%- elif message['role'] == 'tool' -%}
<|tool_response|>{{ message['content'] }}<|end_of_tool|>
{%- endif -%}
{%- endfor -%}
{%- if add_generation_prompt -%}
<|assistant|>
{%- endif -%}
"""
model, tokenizer = FastLanguageModel.from_pretrained(
model_name="gpt-oss/gpt-oss-120b-sft",
max_seq_length=32768,
load_in_4bit=True,
)
tokenizer.chat_template = CUSTOM_CHAT_TEMPLATE
# Применяем шаблон с пост-токенизационной защитой
inputs = apply_chat_template(
tokenizer,
messages,
tools=tools,
protect_smuggling=True, # Активирует защиту
add_generation_prompt=True,
)
Шаблон подключается через стандартный механизм Unsloth - достаточно переопределить tokenizer.chat_template. Флаг protect_smuggling=True включает пост-токенизационную проверку, которая сканирует токены и вставляет escape-разделители при обнаружении опасных паттернов.
Для версии GPT-OSS 20B конфигурация аналогична, но max_seq_length можно увеличить до 65536 токенов - модель стабильно держит контекст на этой длине после применения шаблона. Если вы работаете с агентными системами, где модель должна вызывать десятки инструментов за сессию, обратите внимание на тесты Laguna S 2.1 - там мы разбирали альтернативный подход к стабилизации tool calls через constrained decoding.
GPT-OSS в продакшене: рекомендации по максимизации эффективности
Год эксплуатации GPT-OSS в продакшен-окружениях выявил несколько неочевидных паттернов. Первый: квантование Q4_K_M - оптимальный баланс между качеством и скоростью для 120B-версии. Q5_K_M даёт прирост точности на MMLU-Pro всего 0.3 пункта, но увеличивает latency на 22%. Q3_K_L проседает по качеству на 4-5 пунктов на всех бенчмарках - используйте его только если железо жёстко ограничено.
Второй: batch-обработка на GPU с unified memory (Apple M2 Ultra, AMD MI300X) требует отдельной настройки prefill-кэша. GPT-OSS агрессивно кэширует KV-состояния, и при batch size больше 4 кэш начинает фрагментировать память. Решение - принудительный flush кэша каждые 128 токенов через параметр cache_stride=128 в конфиге инференса. Это снижает пиковую утилизацию памяти на 18% без потери throughput.
Третий: мониторинг tool calls в продакшене. Даже с нашим шаблоном 0.1-0.3% вызовов могут падать из-за аппаратных ошибок памяти (bit flip в VRAM). Рекомендуем оборачивать каждый вызов в retry-логику с экспоненциальной задержкой и лимитом в 3 попытки. Логируйте сырой вывод модели до парсинга - это сэкономит часы отладки при расследовании инцидентов.
Четвёртый: выбор между 20B и 120B. Если задача требует сложных многошаговых рассуждений с вызовами инструментов, 120B-версия обязательна. 20B справляется с простыми tool calls (поиск, калькулятор, CRUD-операции), но на цепочках из 5+ вызовов начинает путать аргументы. Для справки: аналогичный порог у Qwen 3.5 122B - 3 вызова, у Mistral 4 Small - 2 вызова. Детальный анализ эффективности токенов в многошаговых задачах мы делали в сравнении Qwen 3.8 Max с конкурентами - методология оценки применима и к GPT-OSS.
Пятый: не игнорируйте prompt engineering. GPT-OSS чувствителен к формулировке системного промпта. Явное указание «используй инструменты для получения актуальных данных, не полагайся на тренировочные знания после октября 2025» снижает частоту галлюцинаций на 30% в агентных сценариях. Модель склонна «додумывать» факты, если системный промпт не задаёт жёсткие рамки.
Заключение: будущее GPT-OSS и локальных моделей
GPT-OSS остаётся оптимальным выбором для локального инференса в августе 2026 года. Модель выигрывает у Qwen 3.5 122B по стабильности tool calls, у Nemotron 3 Super - по качеству на длинных контекстах, у Mistral 4 Small - по лицензионной чистоте и связности ответов. Единственное узкое место - стандартный JINJA-шаблон - закрывается кастомным решением на Unsloth с защитой от TypeError и токен-смагглинга.
Перспективы зависят от двух факторов. Первый: выпустит ли сообщество дообученные версии GPT-OSS с расширенным контекстным окном. Текущий потолок в 32K токенов ограничивает применение в RAG-пайплайнах с большими документами. Второй: как быстро конкуренты закроют разрыв по tool calls. Qwen 3.5 122B уже анонсировал агентный fine-tuning на 2027 год, но пока это лишь дорожная карта.
Если вы разворачиваете AI-инфраструктуру локально сегодня, GPT-OSS с нашим шаблоном - готовая к продакшену связка. Скопируйте конфиг из раздела выше, примените к своей кодовой базе и получите стабильные tool calls без единого TypeError. Для более широкого контекста о эволюции моделей от узких задач к универсальным агентам рекомендую наш разбор трендов 2025-2026 - там есть прогнозы по развитию локальных LLM, которые помогут спланировать инфраструктурные решения на год вперёд.