В своей прошлой статье я рассказывал о компактной модели, которая по бенчмаркам смогла превзойти модели в 10 раз больше ее самой. О том, что это стало возможным благодаря особому подходу к обучения самой модели и что такую модель вполне реально запустить у себя локально.
Однако, когда дело касается локального запуска, думаю, далеко немногие из нас запускают модели в BF16 через vLLM на Nvidia H100. А значит, все эти красивые результаты по бенчмаркам на практике, вероятнее всего, очень далеки от того, что мы получим на практике.
И я решил это проверить.

1. Введение
1.1 Контекст исследования
Способность языковых моделей корректно вызывать внешние инструменты (tool calling/ function calling) становится критически важной для построения AI-агентов. Большинство существующих бенчмарков, включая Berkeley Function-Calling Leaderboard (BFCL), ориентированы на англоязычные сценарии, оставляя без внимания особенности работы моделей с другими языками. К тому же, подобные тесты определенно проводятся на изолированной системе в идеальных условиях (модель в BF16, vLLM, Nvidia H100+).
Русский язык представляет особый интерес благодаря:
Сложной падежной системе (6 падежей)
Свободному порядку слов
Различиям в написании заимствованных слов (транслитерация vs оригинал)
Тестирование на потребительском желере представляет интерес благодаря:
Возможности проверить насколько модель становится хуже после квантизации
Действительно ли модель так хороша, как о ней заявлено на карточке в HF
Насколько вообще стабильна модель вне идеальных условий
1.2 Цели исследования
Оценить качество tool calling для русскоязычных промптов
Выявить специфические паттерны ошибок
Сравнить эффективность моделей разного размера
Сформулировать практические рекомендации
2. Методология
2.1 Тестовый набор
Для локального тестирования я подготовил гибридный бенчмарк из 53 тестовых случаев, разделенных на две группы:
Группа 1: Кастомные тесты (28 тестов)
Разработаны специально для данного исследования с учетом особенностей русского языка.
Группа 2: BFCL-адаптированные тесты (25 тестов)
Адаптированы на основе тестов Berkeley Function-Calling Leaderboard с переводом промптов на русский язык.
Кастомные тесты распределены по 5 уровням сложности:
Уровень | Название | Описание |
|---|---|---|
L1 | Basic | Простой однократный вызов инструмента |
L2 | Selection | Выбор правильного инструмента из 5-10 вариантов |
L3 | Multi-turn | Многошаговые взаимодействия с симуляцией ответов |
L4 | Logic | Условная логика, параллельные вызовы |
L5 | Complex MT | Сложные многошаговые сценарии (2-3 хода) |
BFCL-тесто были сгруппированы на 4 уровня:
Группа | Тесты | Описание |
|---|---|---|
L1 | BFCL-1.1 — 1.6 | Базовые одиночные вызовы (Basic) |
L2 | BFCL-2.1 — 2.8 | Средняя сложность: выбор, параллелизация |
L3 | BFCL-3.1 — 3.5 | Многоходовые диалоги |
L4 | BFCL-4.1 — 4.6 | Экспертный уровень: логика, форматирование, поиск |
Для статистической значимости каждый тест выполнялся 9 раз (3 температуры x 3 прогона). Общее количество запусков: 477. Максимальное количество API вызовов за тестирование: 657.
2.2 Тестируемые модели
Модель | Параметры | Квантизация | Особенности |
|---|---|---|---|
Qwen3-4B-Instruct | 4B | Q4_K_M | Instruct-версия без CoT |
Qwen3-8B-128k | 8B | Q4_K_M | Расширенный контекст, CoT |
Qwen3-14B | 14B | Q4_K_M | Крупнейшая в серии, CoT |
Nanbeige4-3B-Thinking | 3B | Q4_K_M | Специализация на рассуждениях |
Granite-4.0-h-micro | 3B | Q4_K_M | Специализация на tool calling |
GPT-OSS-20B | 20B | Q4_K_M | Open-source GPT от OpenAI |
2.3 Условия эксперимента
Платформа: LM Studio (v0.3.36)
Температуры: 0.2, 0.5, 0.8
Контекстное окно: 32 000 токенов
Системный промпт и схемы инструментов: полностью на русском языке
Валидация: строгое соответствие имен функций и аргументов (за исключением задач где подразумевается свободный ответ модели)
3. Результаты
3.1 Общая сводка
Модель | L1 | L2 | L3 | L4 | L5 | Overall | Токены |
|---|---|---|---|---|---|---|---|
Qwen3-4B | 100% | 99.2% | 85.6% | 81.8% | 60.0% | 89.5% | 399K |
Qwen3-8B | 84.6% | 91.3% | 72.2% | 85.9% | 48.9% | 80.9% | 663K |
Qwen3-14B | 85.5% | 97.6% | 85.6% | 78.8% | 28.9% | 82.0% | 556K |
Nanbeige-3B | 82.1% | 85.7% | 80.0% | 65.7% | 4.4% | 71.9% | 1,122K |
Granite-4B | 88.9% | 67.5% | 55.6% | 55.6% | 17.8% | 63.3% | 395K |
GPT-OSS-20B | 85.5% | 68.3% | 71.1% | 16.2% | 0.0% | 55.8% | 358K |
3.2 Парадокс масштаба
Неожиданным открытием стало то, что самая маленькая Instruct-модель (Qwen3-4B) показала лучший результат. При этом наблюдается закономерность, что с ростом размера показатели ухудшаются:
Qwen-4B: 89.5% (лидер)
Qwen-8B: 80.9% (-8.6 пп)
Qwen-14B: 82.0% (-7.5 пп)
GPT-OSS-20B: 55.8% (-33.7 пп) — абсолютный аутсайдр при наибольшем размере.
Особенно заметна разница на уровне L5 (сложные многошаговые сценарии):
Qwen-4B: 60.0%
Qwen-8B: 48.9%
Qwen-14B: 28.9%
GPT-OSS-20B: 0.0% (полный провал сложных цепочек)
3.3 Эффективность использования токенов
Модель | Токены | Успех | Токенов на успех |
|---|---|---|---|
Qwen3-4B | 399K | 89.5% | 445K |
GPT-OSS-20B | 358K | 55.8% | 642K |
Granite-4B | 395K | 63.3% | 624K |
Qwen3-14B | 556K | 82.0% | 678K |
Qwen3-8B | 663K | 80.9% | 819K |
Nanbeige-3B | 1,122K | 71.9% | 1,561K |
Nanbeige потребляет почти в 3 раза больше токенов, чем Qwen-4B, при значительно худшем результате — это следствие активного использования Chain-of-Thought рассуждений.
4. Анализ паттернов ошибок
4.1 Языковой дрейф (Language Drift)
Проблема: Модель переводит русские термины на английский при генерации аргументов.
Контекст теста L1-07 (Heavy Parameter Noise):
Этот тест проверяет способность модели фильтровать "шум" в промпте. Пользователь передает 7 значений, но инструмент принимает только 5 параметров. Модель должна:
Выделить 5 релевантных параметров (event_name, date, location, max_participants, category)
Игнорировать 2 "лишних" значения (organizer, budget)
Сохранить язык значений из промпта
Промпт:
Зарегистрировать конференцию 'AI Summit 2024' на 2024-09-20 в Берлине на максимум 500 участников. Организатор — Иван Смирнов, бюджет — $50000.
Результаты: Все пять моделей успешно справились со сложной частью задачи — они корректно выбрали 5 нужных параметров и отбросили "организатора" и "бюджет". Однако четыре из пяти моделей провалились на более простой задаче — сохранении русского языка для параметра location:
Модель | Фильтрация шума | Значение location | Результат |
|---|---|---|---|
Qwen-4B | Успех | "Берлин" | PASS |
Qwen-8B | Успех | "Берлине" | FAIL (падеж) |
Qwen-14B | Успех | "Berlin" | FAIL (перевод) |
Nanbeige-3B | Успех | "Berlin" | FAIL (перевод) |
Granite-4B | Успех | "Berlin" | FAIL (перевод) |
GPT-OSS-20B | Успех | "Berlin" | FAIL (перевод) |
Ключевой вывод: Модели демонстрируют парадоксальное поведение — они справляются с когнитивно сложной задачей (семантическая фильтрация параметров), но ошибаются в тривиальной (копирование строки на том же языке).
Причина: Модели с CoT рассуждают на английском внутри блоков thinking:
the user said "конференция", which translates to conference... location is Berlin...
Переключение на английский язык для внутренних рассуждений "заражает" генерацию аргументов.
4.2 Грамматические падежи
Проблема: Модель сохраняет падеж из исходного текста вместо приведения к начальной форме.
Пример из Qwen-8B (тест L1-07):
{
"location": "Берлине" // Предложный падеж вместо именительного "Берлин"
}Анализ: Qwen-8B пытается быть "грамматически умной" — она видит в промпте "в Берлине" и сохраняет склонение. Qwen-4B просто копирует корень слова.
4.3 Перевод профессиональных терминов
Проблема: Модель переводит профессиональную терминологию на английский.
Пример из Qwen-4B (тест BFCL-3.2):
Промпт (второй ход диалога):
Назначить тикет на старшего инженера
Ответ модели:
{
"name": "assign_ticket",
"arguments": {
"assignee": "Senior Engineer" // Ожидалось: "старший инженер"
}
}Вывод: Даже самая точная модель допускает перевод терминов, которые воспринимаются как "технические".
4.4 Проблема параллельных вызовов
Проблема: Модели с режимом thinking склонны к последовательной стратегии вместо параллельной.
Пример из Nanbeige-3B (тест L5-01):
Промпт:
Получить погоду в Москве, Париже и Токио, затем создать файл с отчетом
Ответ модели — только один вызов:
{
"name": "get_weather",
"arguments": { "city": "Москва" }
}Анализ рассуждений (блок thinking):
Мне нужно вызвать get_weather для Москвы, Парижа и Токио... Поэтому сейчас только первый вызов: get_weather для Москвы. После получения ответа продолжу...
Модель понимает задачу, но её стратегия рассуждений полностью исключает параллельные вызовы. Это объясняет катастрофический результат Nanbeige на L5: 4.4%.
4.5 Формат ответов и CoT-блоки
Проблема: Теги thinking в ответе нарушают строгий формат.
Контекст теста BFCL-4.5 (Format Sensitivity):
Этот тест экспертного уровня специально проверяет "чистоту" вывода модели. Задача элементарная — вычислить площадь круга с радиусом 5. Но критерий успеха строгий: ответ должен содержать только вызов инструмента, без каких-либо пояснений, "вежливых фраз" или блоков рассуждений.
Промпт:
Вычислить площадь круга с радиусом 5
Ожидаемый ответ (чистый формат):
{"name": "circle_area", "arguments": {"radius": 5}}Типичный ответ модели с CoT (провал):
<think>
Okay, the user wants to calculate the area of a circle...
The formula is pi * r^2, so I need to call circle_area with radius 5.
</think>
{"name": "circle_area", "arguments": {"radius": 5}}Результаты по моделям:
Модель | Правильный инструмент | Чистый формат | Итог |
|---|---|---|---|
Qwen-4B | Да | Да | PASS |
Qwen-8B | Да | Нет (CoT) | FAIL |
Qwen-14B | Да | Нет (CoT) | FAIL |
Nanbeige-3B | Да | Нет (CoT) | FAIL |
Granite-4B | Да | Да | PASS |
GPT-OSS-20B | Да | Да | PASS |
Ключевой вывод: Все модели корректно определили нужный инструмент и параметры. Но три модели с режимом thinking (Qwen-8B, Qwen-14B, Nanbeige) провалили тест исключительно из-за формата ответа. Их блоки рассуждений помечаются валидатором как "Response contains conversational filler". Единственная модель, имеющая рассуждения, но прошедшая этот тест - GPT-OSS-20B.
Практическое следствие: В production-сценариях, где парсер ожидает чистый JSON, модели с CoT требуют дополнительной постобработки для удаления тегов thinking.
4.6 Тесты экспертного уровня: логика и цепочки рассуждений
Два теста из экспертной группы BFCL-4.x четко разделяют модели на "рассуждающие" и "механические".
BFCL-4.6: Reasoning & Constraints (Логика с условием OR)
Суть теста: Модель должна решить, инвестировать ли 1000$ в актив A, если выполняется условие: доходность > 10% ИЛИ риск < 5%. Дано: доходность 8%, риск 3%.
Правильный ответ: риск 3% < 5%, условие выполнено → вызвать execute_investment с параметром risk_pct=3.
Модель | Результат | Поведение |
|---|---|---|
Qwen-4B | PASS | Логика OR выполнена корректно |
Qwen-8B | PASS | Рассуждение в CoT, правильный вывод |
Qwen-14B | PASS | Рассуждение в CoT, правильный вывод |
Nanbeige-3B | PASS | Детальный анализ условий |
Granite-4B | FAIL | Вызвала analyze_investment вместо execute |
GPT-OSS-20B | FAIL | Вызвала analyze_investment вместо execute |
Анализ провалов: Granite и GPT-OSS проявили "агентскую осторожность" — вместо принятия решения они "переложили ответственность" на вспомогательный инструмент анализа. Это указывает на неспособность к самостоятельному ��огическому выводу.
BFCL-4.3: Web Search Multi-Hop (3-шаговая цепочка)
Суть теста: Последовательный поиск с передачей контекста между шагами:
"Какая страна производит чай Da Hong Pao?" → Китай
"Кто самый богатый человек в [результат шага 1]?" → [имя]
"Расскажи подробнее о [результат шага 2]"
Модель | Результат | Особенности |
|---|---|---|
Qwen-4B | PASS | Корректная цепочка на русском |
Qwen-8B | PASS | Корректная цепочка |
Qwen-14B | PASS | Корректная цепочка |
Nanbeige-3B | PASS | Детальные CoT-рассуждения |
Granite-4B (RU) | FAIL | Language Drift: запросы на английском |
Granite-4B (EN) | PASS | На родном языке работает |
GPT-OSS-20B | FAIL | Потеря контекста на 2-м шаге |
Ключевой вывод: Тесты экспертного уровня выявляют принципиальную разницу между моделями. Qwen и Nanbeige действительно рассуждают над условиями задачи. Granite и GPT-OSS работают более механически, что приводит к провалам в логических развилках и цепочках.
5. Анализ по моделям
5.1 Qwen3-4B-Instruct — Лидер (89.5%)
Сильные стороны:
Точное копирование русских терминов без перевода
Стабильность во всех температурных режимах (89-90%)
Отсутствие лишнего текста в ответах
Минимальное потребление токенов
Слабые стороны:
Ограниченная логика на L4-L5
Иногда переводит профессиональные термины
Рекомендация: Оптимальный выбор для русскоязычных агентов с простыми и средними задачами.
5.2 Qwen3-8B и Qwen3-14B — Парадокс масштаба
Общие проблемы обеих моделей:
Активное использование английского в CoT-блоках
Грамматическая "умность" (сохранение падежей)
Частое нарушение строгого формата
Qwen-8B специфика:
Лучший результат на L4 (85.9%) благодаря логике
Чаще ошибается на L3 (многоходовые диалоги)
Qwen-14B специфика:
Лучший результат на L2 (97.6%) — точный выбор инструмента
Катастрофа на L5 (28.9%) — "агентская лень", пропуск шагов
5.3 Nanbeige-3B-Thinking — Самая думающая
Особенности:
Рекордное потребление токенов (1.1M) — в 2.8 раза больше Qwen-4B
Детальные рассуждения на каждый шаг
Полный провал параллелизации
Критический дефект: Стратегия "один вызов за раз" несовместима с требованиями Level 5. Модель явно осознает необходимость нескольких вызовов, но её архитектура рассуждений не позволяет их выполнить параллельно.
5.4 Granite-4.0-h-micro — Аутсайдер (63.3%)
Общая оценка: Модель демонстрирует сильнейшую зависимость от языка промпта. Сравнение с англоязычным прогоном (Success Rate 75.5%) показывает, что 12% ошибок вызваны исключительно языковым барьером.
Проблемы в русскоязычной подборке:
Сильнейший языковой дрейф: перевод "Берлин" -> "Berlin" даже при наличии русских схем инструментов.
Низкий L2 (67.5%): ошибки в выборе инструмента на русском языке.
Проблемы, сохраняющиеся в обоих языках (Core Logic):
Несмотря на рост точности в английской версии (L1: 100%, L2: 89%), уровни L3 и L5 остаются низкими (~53% и ~16%). Главная причина — "Агентская спешка" (Agentic Shortcut).
Пример из теста L3 (Sequential Task):
Задача: "Прочитать файл config.json и отправить его содержимое по email".
Ожидаемое поведение: Ход 1 —
read_file, Ход 2 —send_email.Поведение Granite: Модель пытается вызвать оба инструмента сразу в первом ходу. При этом она галлюцинирует содержимое файла, который еще не прочитала, чтобы вставить его в тело письма.
Вывод: Granite-4B хорошо справляется с простыми задачами на родном языке, но его логика многошагового планирования фундаментально ограничена — модель склонна к "жадному" выполнению всей цепочки сразу, что ведет к провалу в реальных сценариях.
5.5 GPT-OSS-20B — Катастрофа параллелизации (55.8%)
Особенности:
Крупнейшая модель в тесте (20B параметров)
Минимальное потребление токенов (358K) — быстрые ответы без рассуждений
Хороший L1 (85.5%) — базовые вызовы работают
Критическая проблема — L4 и L5:
Уровень | Результат | Основная ошибка |
|---|---|---|
L4 | 16.2% | Missing parallel calls (122 ошибки) |
L5 | 0.0% | Полный провал многошаговых сценариев |
GPT-OSS-20B демонстрирует полную неспособность к параллельным вызовам. Из 122 ошибок на L4-L5 подавляющее большинство — "Missing parallel calls". Модель последовательно вызывает только один инструмент, даже когда задача явно требует нескольких.
Парадокс размера: Несмотря на 20B параметров (в 5 раз больше Qwen-4B), модель показывает худший общий результат. Вероятная причина — архитектура не оптимизирована для tool calling и отсутствует обучение на параллельных вызовах.
Языковой дрейф: Как и другие крупные модели, GPT-OSS переводит "Берлин" в "Berlin" в тесте L1-07.
6. Практические выводы
6.1 Для разработчиков AI-агентов
Выбор модели: Для русскоязычных задач предпочтительнее использовать Qwen3-4B-Instruct, а не более крупные модели.
Локализация обязательна: Системный промпт и схемы инструментов должны быть полностью на русском языке — это снижает языковой дрейф.
Мягкая валидация: Рекомендуется допускать варианты написания (Berlin/Берлин) и падежные формы (Берлин/Берлине) для повышения робастности.
Избегайте CoT для tool calling: Модели без режима рассуждений показывают лучшие результаты на строгих бенчмарках.
6.2 Для исследователей
Парадокс масштаба требует изучения: Почему большие модели хуже справляются с форматом? Возможно, это связано с переобучением на англоязычных данных.
CoT vs Tool Calling: Необходимы исследования по совместимости цепочек рассуждений с параллельными вызовами.
Билингвальные бенчмарки: Существующие лидерборды (BFCL) не отражают реальную производительность для неанглоязычных сценариев.
6.3 Ограничения исследования
Тестирование проводилось только на квантизованных моделях (Q4_K_M)
Ограниченный размер тестового набора (53 теста)
Строгая валидация может занижать реальную полезность моделей
7. Заключение
Исследование показало, что качество tool calling на русском языке зависит не столько от размера модели, сколько от её архитектуры и стратегии генерации ответов:
Qwen3-4B-Instruct — оптимальный выбор для русскоязычных агентов благодаря точному следованию формату и копированию терминов.
Модели с CoT проигрывают на строгих бенчмарках из-за языкового дрейфа и формальных нарушений, несмотря на лучшее "понимание" задачи.
Параллельные вызовы остаются сложной задачей для всех моделей, особенно использующих последовательные рассуждения.
Локализация инфраструктуры (промптов, схем) критически важна для минимизации ошибок.
Приложение
Распределение ошибок по типам
Тип ошибки | Qwen-4B | Qwen-8B | Qwen-14B | Nanbeige | Granite | GPT-OSS |
|---|---|---|---|---|---|---|
Position mismatch | 32 | 62 | 52 | 66 | 90 | 71 |
Missing parallel | 9 | 13 | 18 | 46 | 44 | 122 |
No tool calls | 9 | 3 | 5 | 6 | 0 | 17 |
Format error | 0 | 9 | 9 | 9 | 0 | 0 |
Extra calls | 2 | 3 | 6 | 4 | 53 | 0 |
Расшифровка типов ошибок:
Position mismatch — Несовпадение аргументов
Модель вызвала правильный инструмент, но с неверными значениями параметров
Примеры: "Berlin" вместо "Берлин", "Берлине" вместо "Берлин", неверный формат даты
Самая частая ошибка у всех моделей
Missing parallel — Отсутствие параллельных вызовов
Задача требовала нескольких одновременных вызовов, но модель сделала только один
Пример: промпт "погода в Москве, Париже и Токио" требует 3 вызова get_weather, модель делает 1
Рекорд у GPT-OSS-20B (122 ошибки) — полная неспособность к параллелизации
No tool calls — Отсутствие вызовов инструментов
Модель ответила текстом вместо вызова инструмента
Пример: вместо вызова calculate() модель пишет "15 умножить на 23 равно 345"
Часто связано с "агентской осторожностью" — модель решает уточнить запрос
Модель ответила текстом вместо вызова инструмента
Format error — Ошибка формата ответа
Вызов инструмента корректный, но ответ содержит посторонний текст
Пример: блоки thinking, вежливые фразы, пояснения вне JSON
Исключительно проблема моделей с CoT (Qwen-8B, Qwen-14B, Nanbeige)
Extra calls — Лишние вызовы инструментов
Модель вызвала больше инструментов, чем требовалось
Пример: на запрос "удалить файл" модель сначала вызывает list_files, затем delete_file
Критическая проблема Granite (53 ошибки) — склонность к "перестраховке"
Ссылки:
