Тестирование локальных ИИ-моделей до 9B на агентские задачи

Все хотят запустить локальную нейронку, отдать ей доступ к консоли и уйти пить кофе. Желательно, чтобы она при этом не удалила продакшен и умела дергать внешние API. Ребята из ServerFlow прогнали через тесты пачку мелких моделей от 3 до 9 миллиардов параметров, чтобы понять, кто реально тянет tool calling, а кто уходит в бесконечный цикл. Спойлер: синтетическим бенчмаркам верить нельзя.

Тестовый стенд и базовые настройки

В тестах участвуют модели от 3B до 9B:

  • Qwen 3.5
  • Gemma 4 E4B
  • Ministral 3
  • Nemotron 3 Nano
  • SERA
  • OmniCoder
  • Nanbeige.

Гоняли весь этот зоопарк через фреймворк opencode и движок llama.cpp. Окно контекста выкрутили на 64 000 токенов, чтобы моделям было где развернуться при чтении исходников. Смотрели не только на успешность выполнения, но и на время работы и жор VRAM.

Для повторения эксперимента базовый запуск модели через llama.cpp выглядит примерно так:

StoDum
./main -m models/OmniCoder-9B.Q4_K_M.gguf \
  -c 64000 \
  --temp 0.1 \
  -n -1 \
  --grammar-file grammars/json_arr.gbnf \
  -p "your_agent_prompt_here"

Интеграция фичи в готовый проект

Первый сценарий максимально жизненный: есть готовое веб-приложение FocusBoard. Модели нужно самостоятельно найти нужные файлы и прикрутить автозавершение сессии с работающим таймером обратного отсчета. Главное условие — не сломать то, что уже работает.

Алгоритм работы агента в этом кейсе выглядит так:

  1. Изучить структуру директорий через вызов инструмента list_files.
  2. Прочитать содержимое нужных компонентов с помощью read_file.
  3. Сгенерировать патч и применить его через edit_file.
  4. Запустить базовую проверку синтаксиса.

Мелкие модели вроде Nanbeige 3B и Sera 8B ожидаемо отлетели. Они уходили в бесконечные циклы, путались в собственных вызовах и не могли исправить ошибки синтаксиса. А вот Ministral-3-8B и OmniCoder-9B выдали отличный результат. Они с первой попытки распарсили проект, написали логику таймера и сами покрыли её тестами без дополнительных пинков со стороны пользователя.

Поиск в сети и сборка данных

Вторая задача — собрать актуальные новости про новые ИИ-модели для генерации изображений за 2026 год, отфильтровать мусор и сложить данные в валидный JSON.

Для подобных задач системный промпт обычно содержит жесткую инструкцию по формату ответа:

StoDum
{
  "name": "search_and_extract",
  "description": "поиск новостей и формирование отчета",
  "parameters": {
    "type": "object",
    "properties": {
      "model_name": { "type": "string" },
      "release_month": { "type": "string" },
      "key_features": { "type": "array", "items": { "type": "string" } }
    },
    "required":["model_name", "key_features"]
  }
}

Здесь снова начались проблемы с логикой. Одна из моделей начала жестко галлюцинировать при записи структуры файла, а другая просто сожгла 200 запросов к поисковику, зациклившись на одной и той же битой ссылке.

Точные результаты снова показали OmniCoder-9B и Ministral-3-8B, к которым присоединилась Qwen3.5-9B. Они грамотно подобрали поисковые запросы, нашли нужные источники и выплюнули правильно отформатированный файл.

Синтетические тесты против суровой реальности

На десерт оставили синтетический бенчмарк на tool calling ⚠️. Тут проверяют, как ИИ вызывает инструменты, справляется со сложными промптами и умеет ли ничего не делать, когда применение функции не требуется.

Здесь произошел разрыв шаблона: почти идеальный скор в 0.88 выбила крошечная Nemotron-3-Nano-4B, уступив только эталонному монстру на 31B параметров. Остальные модели на 8-9B показали весьма средние цифры.

Маленькие локальные модели уже готовы писать код и дергать ручки API, чтобы вы могли поменьше работать. Но опираться на синтетику при выборе весов не стоит: поведение в бенчмарках и в реальной кодовой базе отличается кардинально. Для практического применения и написания агентов сегодня лучше всего брать OmniCoder-9B или Ministral-3-8B. Грузите их в память, настраивайте системный промпт и идите проверять логи.