Зачем вызывать инструменты на устройстве — и почему это так сложно

Функция вызова инструментов (tool calling / function calling) — это сердце современных агентных систем. Именно она позволяет языковой модели не просто «поговорить», а реально что-то сделать: проверить погоду, забронировать встречу, управлять умным домом. Большие облачные модели справляются с этим отлично, но каждый запрос — это сетевой round-trip, задержка и расход трафика. А что, если всё это должно работать прямо на телефоне, умных часах или очках?

Именно эту задачу решила команда Cactus Compute, выпустив открытую модель Needle — 26-миллионный параметровый специалист по однократному вызову функций, дистиллированный из Gemini. Проект был опубликован на Hacker News в формате «Show HN» и немедленно вызвал дискуссию: как модель настолько маленькая может конкурировать с монстрами в 270M–350M параметров?

ℹ Что такое дистилляция модели?
Дистилляция (knowledge distillation) — процесс, при котором маленькая «студенческая» модель обучается воспроизводить поведение большой «учительской» модели. Студент не обучается на реальных данных с нуля — он учится имитировать выходы учителя, перенимая его «знания» в компактную форму.

Что такое Needle и как он устроен

Команда Cactus дистиллировала Gemini в 26-миллионный параметровый «Simple Attention Network» — модель, которую можно дообучить прямо на Mac или PC.

Needle — это экспериментальная реализация концепции Simple Attention Networks, нацеленная на переосмысление того, что значит «крошечный ИИ» для потребительских устройств: телефонов, часов, очков.

Архитектура модели радикально отличается от стандартных трансформеров. Вот ключевой принцип:

Cross-attention — правильный примитив для этой задачи, а параметры FFN (feed-forward слоёв) расходуются впустую при таком масштабе.

В Simple Attention Networks вся модель состоит только из attention и gating — без MLP-слоёв вообще.

Архитектурные параметры модели: d=512, 8H/4KV (GQA), BPE-словарь на 8192 токенов. Encoder состоит из 12 слоёв (только self-attention + gating, без FFN), decoder — из 8 слоёв с cross-attention к encoder. Это классическая encoder-decoder схема, но очищенная от всего лишнего.


graph TD
    A["Запрос пользователя"] --> B["Encoder x12\n(Self-Attn + GQA + RoPE)"];
    C["Список инструментов (JSON)"] --> B;
    B --> D["Cross-Attention\n(Decoder x8)"];
    D --> E["ZCRMSNorm"];
    E --> F["Linear (Tied Embeddings)"];
    F --> G["Softmax"];
    G --> H["Tool Call Output\n(JSON)"];

Производительность

В продакшене Needle работает на платформе Cactus со скоростью 6000 токенов/сек на prefill и 1200 токенов/сек на decode. Для модели, предназначенной для умных часов, это фантастический результат.

Сравнение с конкурентами

Needle превосходит FunctionGemma-270M, Qwen-0.6B, Granite-350M и LFM2.5-350M в задаче single-shot function calling для персонального ИИ — при этом все эти модели крупнее и обладают более широким набором возможностей, хорошо работая в разговорных сценариях.

Это важная оговорка: Needle — не универсальная языковая модель. Это специализированный инструмент для одной задачи — вызова функций — и именно в ней он бьёт противников, которые крупнее в 10–14 раз.

МодельПараметрыSingle-shot tool callДиалогУстройство
Needle26M✅ Лучший❌ НетТелефон, часы
FunctionGemma270MХуже✅ ДаСмартфон
Qwen600MХуже✅ ДаСмартфон/ПК
Granite350MХуже✅ ДаСмартфон/ПК
LFM2.5350MХуже✅ ДаСмартфон/ПК
⚠ Важное ограничение
Needle — не замена полноценной LLM. Он не умеет вести диалог и не отвечает на произвольные вопросы. Его задача — принять запрос пользователя и список инструментов, и выдать JSON с вызовом нужной функции. Ничего больше.

Как использовать Needle: практическое руководство

Быстрый старт

После клонирования репозитория и запуска setup открывается веб-интерфейс на http://127.0.0.1:7860, где можно тестировать и дообучать модель на своих инструментах. Веса скачиваются автоматически.

git clone https://github.com/cactus-compute/needle.git
cd needle && source ./setup
needle playground

Инференс через Python API

После загрузки чекпоинта можно запустить инференс буквально в несколько строк: передаёте запрос и JSON-список инструментов — получаете обратно JSON с именем функции и аргументами.

from needle import SimpleAttentionNetwork, load_checkpoint, generate, get_tokenizer

params, config = load_checkpoint("checkpoints/needle.pkl")
model = SimpleAttentionNetwork(config)
tokenizer = get_tokenizer()

result = generate(
    model,
    params,
    tokenizer,
    query="What's the weather in San Francisco?",
    tools='[{"name":"get_weather","parameters":{"location":"string"}}]',
    stream=False,
)
print(result)
# [{"name": "get_weather", "arguments": {"location": "San Francisco"}}]

Команды CLI

Needle поставляется с полноценным CLI: needle playground — веб-интерфейс, needle finetune data.jsonl — дообучение на своих данных, needle run — одиночный инференс, needle generate-data — синтез обучающих данных через Gemini.

💡 Совет по дообучению
Используйте команду needle generate-data для автоматической генерации синтетических обучающих примеров через Gemini API. Затем запустите needle playground — в браузере можно дообучить модель на своих инструментах буквально за несколько минут, без написания кода.

Архитектурные решения: почему Simple Attention Network?

Ключевой вопрос: почему авторы отказались от стандартной архитектуры трансформера?

Причина проста и элегантна. В задаче однократного вызова функций модели нужно сделать ровно одно: сопоставить намерение пользователя с одним из доступных инструментов и извлечь аргументы. Это задача семантического поиска и структурированного вывода, а не генерации свободного текста.

Feed-forward слои в трансформерах хранят «фактические знания» о мире — именно они занимают большую часть параметров LLM. Но для вызова функций эти знания не нужны. Нужно только умение сопоставлять структуры. Поэтому:

  • Encoder обрабатывает описания инструментов через self-attention (GQA + RoPE) — без FFN
  • Decoder читает запрос пользователя и через cross-attention к encoder находит нужный инструмент
  • Tied embeddings — матрица эмбеддингов используется как для входа, так и для выхода, экономя параметры
  • ZCRMSNorm вместо LayerNorm — более стабильная нормализация без смещения
📝 Аналогия
Представьте Needle как очень умного диспетчера на коммутаторе: он знает все номера (инструменты) и мгновенно соединяет входящий звонок (запрос) с нужным абонентом (функцией). Ему не нужно знать историю мировой литературы — ему нужна идеальная память на имена и номера.

Место Needle в экосистеме edge AI

Tool calling — это ядро агентных систем. Существует потребность в динамическом комбинировании edge-вычислений и облачных моделей (таких как Gemini Flash), чтобы получить лучшее из обоих миров.

Cactus Compute развивает именно этот подход — гибридный AI: простые, повторяющиеся вызовы инструментов обрабатываются на устройстве (Needle), сложные рассуждения уходят в облако (Gemini). Cactus работает локально на edge-устройствах с гибридной маршрутизацией сложных задач к облачным моделям, таким как Gemini.

Эта стратегия даёт:

  • Конфиденциальность: личные данные не покидают устройство
  • Скорость: никакой сетевой задержки для рутинных действий
  • Офлайн-работу: агент функционирует даже без интернета
  • Экономию: дорогие облачные запросы только когда реально нужны

Веса модели полностью открыты на Hugging Face (Cactus-Compute/needle), а также опубликован код генерации обучающего датасета.

Заключение

Needle — это не просто ещё одна маленькая языковая модель. Это демонстрация важного принципа: специализация бьёт универсальность при равных ресурсах. Отказавшись от FFN-слоёв, выбросив всё ненужное для конкретной задачи и применив дистилляцию из Gemini, команда Cactus Compute создала модель в 26M параметров, которая обходит конкурентов в 10 раз большего размера.

Для разработчиков, строящих агентные приложения на мобильных устройствах и wearables, Needle открывает новый класс возможностей: полноценный агентный слой прямо на чипе телефона или умных часов, с задержкой в миллисекунды и без зависимости от облака.

Проект полностью открытый, веса доступны, код генерации данных опубликован. Это означает, что любой разработчик может адаптировать Needle под свой набор инструментов — командой в одну строку: needle finetune data.jsonl.

Будущее агентного ИИ — не в том, чтобы запускать GPT-4 на смартфоне. Оно в том, чтобы понять, какие задачи реально требуют мощи GPT-4, а какие решает специализированная 26M-модель быстрее и надёжнее.