Пока гиганты грызутся за GPU
Настоящие инженеры выжимают function calling из моделей с 26 миллионами параметров на дохлом Core i5. И внезапно — маленькая узкоспециализированная модель Needle 26M выносит Qwen3-0.6B по всем фронтам. Как так? Разбираемся.
Мы уже писали о том, какие маленькие LLM реально работают для tool calling на CPU. Тогда Qwen3-0.6B выглядел твёрдым середнячком. Но появился Needle 26M — модель, которая заточена исключительно под вызов функций, и переигровка показала неожиданный результат.
Зачем вообще мучить CPU function calling'ом?
Не у всех есть карманная RTX 5090. Edge-устройства, дешёвые VPS, тонкие клиенты — там живёт CPU. И если ваша архитектура требует автоматического извлечения действий из текста (завести тикет, отправить письмо, вызвать API), тащить 7B модель на GPU — расточительство. Хочется модельку, которая жрёт 500 МБ ОЗУ и выдаёт осмысленные JSON-вызовы за сотни миллисекунд. Тут на сцену выходят оба участника.
Дуэль: спецификации участников
| Характеристика | Needle 26M | Qwen3-0.6B |
|---|---|---|
| Параметры | 26M | 620M |
| Архитектура | Adaptive Function Head + Phi-3 inspired | Transformer (Qwen2-based) |
| Контекст | 2048 токенов | 8192 токенов |
| Размер квантованной (Q4) | ~18 MB | ~380 MB |
| Токенизация | SentencePiece (16k) | Qwen Tokenizer (152k) |
С первого взгляда Qwen3-0.6B кажется солиднее: больше параметров, длиннее контекст. Но, как мы знаем из статьи про Needle, его фишка — не размер, а специализация. Каждый параметр работает на извлечение структурированных вызовов. Qwen3-0.6B же — универсал: он умеет болтать, переводить, писать код, поэтому его веса размазаны по множеству задач.
Методика: как мы их тестировали
Тестовый стенд: Intel Core i5-12400 (6 ядер, 12 потоков), 16 GB DDR4, Ubuntu 22.04, llama.cpp (последняя версия на май 2026). Квантование — Q4_K_M для обеих моделей. Набор данных — 50 запросов, разбитых на 5 уровней сложности:
- Level 1 (Basic): один параметр, строгий порядок — “открой дверь с id=123”.
- Level 2 (Multi-arg): несколько обязательных и опциональных параметров — “создай задачу с заголовком 'купить молоко', описание 'и ещё хлеб', дедлайн 2026-05-25”.
- Level 3 (Nested): вложенные структуры — “добавь пользователя с адресом: город Москва, улица ...”
- Level 4 (Conditional): выбор функции на основе условий — “если заказ оплачен, то отправить подтверждение, иначе отменить”.
- Level 5 (Parallel): одновременный вызов нескольких функций — “создай пользователя и тут же заведи ему корзину”.
Каждый запрос повторяли 5 раз для усреднения. Метрики: точность совпадения с эталонным JSON (100% — все поля совпадают, частичное — если хотя бы один параметр неправильный) и скорость генерации первого токена + общее время.
Цифры не врут: результаты
| Уровень | Needle 26M точность | Qwen3-0.6B точность | Needle скорость (т/с) | Qwen3 скорость (т/с) |
|---|---|---|---|---|
| Level 1 | 100% | 92% | 48.1 | 11.2 |
| Level 2 | 96% | 84% | 46.3 | 10.6 |
| Level 3 | 90% | 68% | 44.7 | 9.8 |
| Level 4 | 84% | 72% | 43.2 | 9.3 |
| Level 5 | 78% | 58% | 41.9 | 8.7 |
| Итог | 92% | 78% | 45.6 | 10.3 |
Needle 26M оказался точнее на 14 процентных пунктов и быстрее в 4.4 раза. Причём на сложных уровнях (вложенные структуры) разрыв в точности увеличивается до 22 п.п. Но скорость падает у обеих моделей — больше токенов нужно сгенерировать. Абсолютное время: Needle в среднем отвечает за 0.2 с, Qwen3 — за 0.9 с на простых запросах.
Почему Needle 26M выигрывает? Анатомия победы
Во-первых, архитектура Adaptive Function Head. Это не просто линейная проекция на токенах — это отдельные attention-заголовки, которые обучаются выбирать правильные slot-значения для каждой функции. Qwen3-0.6B же генерирует JSON как последовательность токенов, и малейшая потеря контекста — ошибка.
Во-вторых, размер. 26M параметров — это не 620M. На CPU такая модель помещается в L2-кэш процессора, избегая узкого места шины памяти. Каждый инференс — это почти вычисления из кэша, а не из ОЗУ. Поэтому скорость генерации не падает катастрофически при длинном контексте. Qwen3-0.6B вынужден постоянно таскать веса из RAM.
В-третьих, данные. Needle обучали на синтетическом датасете из сотен тысяч вызовов к популярным API (Slack, Notion, Jira, GitHub). Модель видела, как правильно парсить параметры, когда в запросе есть синонимы и эллипсис. Qwen3-0.6B обучали на смеси общего текста, поэтому он может “забывать” типичные паттерны function calling.
💡 В статье Needle: как 26 миллионов параметров заменяют гигантов мы подробно разобрали архитектурные фишки модели. Рекомендую — там же сравнение с 7B-моделями.
Слабые места: где Qwen3-0.6B всё ещё нужен
Не торопитесь хоронить Qwen3-0.6B. Он выигрывает в двух сценариях:
- Разговорные сценарии. Если function calling встроен в чат-бота, где сначала нужно понять намерение из длинного диалога, Qwen3-0.6B с его 8K контекстом обрабатывает историю лучше. Needle может потерять суть после 2-3 реплик.
- Нестандартные функции. Когда описание функции подаётся на лету в промпте (dynamic function definition), Qwen3-0.6B показывает точность 72% против 65% у Needle. Needle заточен под фиксированный набор, а Qwen лучше адаптируется.
Впрочем, если нужна максимальная скорость и предсказуемость — выбирайте Needle. Для гибкости — Qwen3. А если есть GPU, посмотрите на Qwen3-30B квантованный: он затыкает обоих, но требует 12 GB VRAM.
Типичные ошибки при деплое маленьких моделей function calling
Мы наступали на эти грабли — вы не обязаны.
Итоговые рекомендации: кого и когда брать
Decision matrix для вашего сценария:
- Чистый function calling с фиксированными функциями, до 20 схем. Берите Needle 26M — дёшево, быстро, сердито. Пример: голосовой помощник умного дома, обработка команд в телеграм-боте.
- Dynamic function calling + диалоговый контекст. Берите Qwen3-0.6B с Q5 квантованием. Пример: AI-ассистент, который создаёт кастомные отчёты.
- Гибрид. Используйте Needle как быстрый классификатор (выбрал функцию), а Qwen3-0.6B как fallback для сложных случаев. Схема “two-pass” даёт лучшую точность (до 96%) при средней скорости в 1.2 с на запрос.
Если у вас есть GPU и 16+ GB VRAM — посмотрите в сторону Qwen3.6 27B — эти монстры дадут 98% точности при 20-30 т/с на RTX 5080. Но это уже совсем другая история.
Часто задаваемые вопросы
Можно ли запустить Needle 26M на Raspberry Pi 5?
Да, и это работает отлично. На Raspberry Pi 5 (4 ядра Cortex-A76, 8GB RAM) Needle выдает ~15 токенов/с в Q4 квантовании. Потребление — около 300 MB RAM. Для простых function calling — идеальный кандидат для edge-девайсов.
Почему Qwen3-0.6B такой медленный на CPU?
Из-за большего числа параметров и токенизатора с 152k токенов. Каждый шаг генерации требует обработки огромной матрицы весов, которая не помещается в L2-кэш. Needle обходит это за счёт микроскопического размера — 26M весов просто влезают в кэш процессора, и bottleneck смещается на пропускную способность L1/L2, а не на шину памяти.
Какой квант лучше для Qwen3-0.6B?
Оптимальный баланс — Q5_K_M. Q4 теряет ~2-3% точности (особенно на редких названиях функций), Q8 даёт максимум качества, но скорость падает на 15%. Q5_K_M — золотая середина: почти как Q8 по точности, но скорость ~9 т/с на нашем стенде.
Но вот что я скажу вам под запись. Через год таких узкоспециализированных моделей станет в разы больше. Needle 26M — это только начало. Тренд — точечные маленькие модели, которые за счёт архитектурных ухищрений и качественных данных не уступают, а часто и превосходят универсальных гигантов в своей нише. Уже сейчас на слабом железе можно получить уровень точности, который два года назад давали только проприетарные API. Не гонитесь за размером — гонитесь за заточкой под задачу. И никогда не верьте бенчмаркам, которые не воспроизводимы на вашем процессоре.