Разработка AI-ассистента в мобильном приложении на базе Llama (Meta)
Llama — семейство открытых весов моделей от Meta. Это единственный выбор, когда нужен ассистент, который работает полностью на устройстве (нет сервера, нет облака, нет утечки данных), или когда требуется тонкая настройка модели под предметную область через fine-tuning на собственных данных. Но «открытые веса» не означает «работает на телефоне из коробки» — нужна существенная техническая работа по квантизации и выбору runtime.
Архитектура: on-device или серверная Llama
Два совершенно разных сценария:
On-device (Llama на устройстве) — модель загружается в память телефона, inference без интернета. Реально для Llama 3.2 1B и 3B в INT4 квантизации. Llama 3.2 3B INT4 занимает ~2 ГБ RAM и работает на iPhone 15 Pro со скоростью 15–25 токенов/сек.
Серверная Llama — модель на собственном GPU-сервере (или арендованном), мобильный клиент общается через API. Позволяет использовать Llama 3.3 70B или Llama 3.1 405B — полноценные модели, неотличимые по качеству от GPT-4.
Для большинства коммерческих приложений — серверный вариант. On-device оправдан при жёстких требованиях к приватности (медицинские данные не покидают устройство) или при работе без интернета.
On-Device: llama.cpp, Core ML, ExecuTorch
llama.cpp — наиболее зрелый runtime для запуска GGUF-моделей. На iOS: компилируется как C++ библиотека, вызывается через Objective-C++ bridging header. На Android: через JNI. Сложность — сборка под разные архитектуры (arm64-v8a для современных устройств, armeabi-v7a для старых).
// iOS — минимальная обёртка над llama.cpp
class LlamaContext {
private var context: OpaquePointer?
init(modelPath: String) {
var params = llama_context_default_params()
params.n_ctx = 4096
params.n_threads = 4 // меньше потоков — меньше нагрев
let model = llama_load_model_from_file(modelPath, llama_model_default_params())
context = llama_new_context_with_model(model, params)
}
func generate(prompt: String, maxTokens: Int = 256) -> AsyncStream<String> {
// tokenize → sample loop → detokenize
}
}
Apple MLX / Core ML — Apple предоставляет официальный конвертер для Llama моделей в Core ML формат. Преимущество: Neural Engine задействуется автоматически, inference быстрее и холоднее, чем через CPU. Ограничение: только iOS 17+.
ExecuTorch — Facebook's runtime для мобилей, официально поддерживает Llama 3. Более сложная сборка, но лучшая интеграция с Android Neural Networks API.
Квантизация: выбор точности
| Тип | Размер (3B) | Качество | Скорость |
|---|---|---|---|
| FP16 | ~6 ГБ | Эталонное | Медленно |
| Q8_0 | ~3.3 ГБ | ≈FP16 | Умеренно |
| Q4_K_M | ~2.0 ГБ | Хорошее | Быстро |
| Q2_K | ~1.3 ГБ | Заметно хуже | Очень быстро |
Для большинства мобильных задач — Q4_K_M оптимальный баланс. Q2_K можно рассматривать для устройств с 4 ГБ RAM.
Серверная Llama: Ollama и vLLM
Для серверного деплоя — Ollama (простота) или vLLM (производительность). Ollama поднимает OpenAI-совместимый API: POST /api/chat, формат запроса идентичен OpenAI Chat Completions. Мобильный клиент, написанный для OpenAI, работает с Ollama без изменений — нужно только поменять base URL.
vLLM предпочтительнее для продакшена с нагрузкой: continuous batching, tensor parallelism на нескольких GPU, throughput в разы выше Ollama.
Fine-tuning: когда нужен и как
Базовая Llama достаточна для общего ассистента. Fine-tuning оправдан когда нужна специализация: медицинские термины, юридический стиль, специфика отрасли. LoRA/QLoRA — стандартный подход для fine-tuning на одном GPU. Обученные адаптеры (~50–100 МБ) загружаются поверх базовой модели.
Ориентиры по срокам
Серверная Llama с Ollama и мобильным клиентом — 1–2 недели. On-device через llama.cpp со сборкой под iOS/Android и управлением загрузкой модели — 3–5 недель. Fine-tuning + деплой — отдельная оценка.







