Офлайн AI-ассистент на iOS и Android: внедряем Llama.cpp

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

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

Услуги, которые мы предлагаем
Показано 1 из 1Все 1734 услуг
Офлайн AI-ассистент на iOS и Android: внедряем Llama.cpp
Сложный
~2-4 недели
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    858
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    745
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1162
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    1034
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    968
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    563

Представьте: AI-ассистент в мобильном приложении работает без интернета, все данные остаются на устройстве. Никакой передачи на сервер, никаких задержек сети. Облачные LLM требуют постоянного соединения, передают конфиденциальные данные и создают задержки. Для медицины или финансов это неприемлемо. On-device решение решает эти проблемы, но требует тщательной интеграции под платформу. Мы внедряем Llama.cpp — библиотеку инференса LLM на CPU/GPU — в iOS и Android приложения. Разберём технические детали: от выбора модели до борьбы с перегревом.

Как выбрать модель для офлайн-ассистента?

Llama.cpp работает с моделями в формате GGUF. Популярные варианты для мобиля:

Модель Квантование Размер RAM Скорость (iPhone 14)
Llama-3.2-1B Q4_K_M 0.8 ГБ ~1.2 ГБ 25–35 t/s
Llama-3.2-3B Q4_K_M 2.0 ГБ ~2.5 ГБ 10–15 t/s
Phi-3-mini-4k Q4_K_M 2.2 ГБ ~2.8 ГБ 8–12 t/s
Gemma-2-2B Q4_K_M 1.6 ГБ ~2.0 ГБ 12–18 t/s
Qwen2.5-1.5B Q4_K_M 1.0 ГБ ~1.4 ГБ 20–28 t/s

На iPhone SE 2nd gen (3 ГБ RAM) Llama-3.2-3B Q4 работает на пределе — OOM возможен при длинных контекстах. Безопасный выбор для широкого парка устройств — модели до 1.5–2 ГБ. В одном из проектов для финансового приложения мы выбрали Llama-3.2-1B Q4_K_M, что позволило уложиться в 1 ГБ памяти на iPhone SE. Скорость генерации составила 25-30 t/s, что достаточно для ответов на вопросы. Тепловой троттлинг был сведён к минимуму ограничением контекста до 1024 токенов.

Проблемы и решения при on-device LLM

Проблема Решение
OOM при большом контексте Ограничить n_ctx до 1024–2048 токенов
Тепловой троттлинг Мониторинг thermalState, паузы между генерациями
Повреждённый GGUF-файл Верификация SHA256 после скачивания
Низкая скорость на старых устройствах Использовать модели 1B с квантованием Q4

Как собрать llama.cpp для iOS?

# Клонируем репозиторий
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp

# Сборка через CMake для iOS
cmake -B build-ios \
    -DCMAKE_TOOLCHAIN_FILE=ios.toolchain.cmake \
    -DPLATFORM=OS64 \  # arm64 only
    -DLLAMA_METAL=ON \  # Metal GPU ускорение
    -DLLAMA_STATIC=ON
cmake --build build-ios --config Release

Результат — libllama.a статическая библиотека. Создаём Swift Package с C-bridging header:

// llama_bridge.h
#include "llama.h"
// Обёртки для Swift-дружественного API
void* llama_create_context(const char* model_path, int n_ctx, int n_gpu_layers);
const char* llama_generate_token(void* ctx, const char* prompt);
void llama_free_context(void* ctx);

n_gpu_layers — количество слоёв, выгружаемых на Metal GPU. Значение -1 означает все слои на GPU. На iPhone 14 с 6 ГБ unified memory — ставьте -1. На устройствах с 3 ГБ — экспериментируйте: слишком много слоёв на GPU вызывает OOM.

Swift-обёртка для стриминга токенов

import Foundation

actor LlamaSession {
    private var context: OpaquePointer?
    private var model: OpaquePointer?

    func load(modelPath: String, contextSize: Int32 = 2048, gpuLayers: Int32 = -1) throws {
        var params = llama_model_default_params()
        params.n_gpu_layers = gpuLayers

        model = llama_load_model_from_file(modelPath, params)
        guard model != nil else { throw LlamaError.modelLoadFailed }

        var ctxParams = llama_context_default_params()
        ctxParams.n_ctx = UInt32(contextSize)
        ctxParams.n_batch = 512

        context = llama_new_context_with_model(model, ctxParams)
    }

    func generate(prompt: String) -> AsyncThrowingStream<String, Error> {
        AsyncThrowingStream { continuation in
            Task.detached(priority: .userInitiated) {
                // Токенизация
                var tokens = [llama_token](repeating: 0, count: 4096)
                let nTokens = llama_tokenize(self.model, prompt, Int32(prompt.utf8.count),
                                              &tokens, 4096, true, false)

                // Инференс — по одному токену
                for i in 0..<nTokens {
                    llama_batch_add(&batch, tokens[Int(i)], llama_pos(i), [0], false)
                }

                while true {
                    llama_decode(self.context, batch)
                    let nextToken = llama_sample_token_greedy(self.context, &candidates)

                    if nextToken == llama_token_eos(self.model) { break }

                    // Конвертация токена в строку
                    var buf = [Int8](repeating: 0, count: 64)
                    llama_token_to_piece(self.model, nextToken, &buf, 64, 0, true)
                    let piece = String(cString: buf)

                    continuation.yield(piece)
                }
                continuation.finish()
            }
        }
    }
}

Стриминг токенов через AsyncThrowingStream — пользователь видит текст по мере генерации, не ждёт весь ответ. Это критично для UX: 10 токенов в секунду воспринимается нормально, если текст появляется постепенно.

Почему тепловые ограничения критичны?

Llama.cpp на iPhone при длительной генерации разогревает устройство. iOS throttling: при перегреве система снижает тактовую частоту, скорость генерации падает с 25 t/s до 8–10 t/s. Это не баг — поведение системы.

Практическое решение: ограничивать максимальный контекст (n_ctx) до 1024–2048 для коротких сессий. Между запросами — пауза. Мониторить ProcessInfo.processInfo.thermalState на iOS:

NotificationCenter.default.addObserver(forName: ProcessInfo.thermalStateDidChangeNotification, ...) { _ in
    let state = ProcessInfo.processInfo.thermalState
    if state == .critical || state == .serious {
        // Приостановить генерацию, уведомить пользователя
    }
}

Типичные ошибки при интеграции

  • Слишком большой контекст — выбирайте n_ctx ≤ 2048 для мобильных устройств.
  • Игнорирование тепловых throttle — мониторьте thermalState и делайте паузы.
  • Неправильная версия модели — проверяйте, что GGUF-файл совместим с вашей сборкой llama.cpp.
  • Отсутствие верификации хеша — повреждённые файлы приводят к крашам.

Android: llama.cpp через NDK

// CMakeLists.txt в jni/
add_library(llama_jni SHARED llama_jni.cpp)
target_link_libraries(llama_jni llama ggml)

// Kotlin side
class LlamaEngine {
    init { System.loadLibrary("llama_jni") }

    external fun loadModel(modelPath: String, nGpuLayers: Int): Long  // возвращает handle
    external fun generateNext(handle: Long, tokens: IntArray): String
    external fun freeModel(handle: Long)
}

На Android — Vulkan backend вместо Metal: в CMakeLists включаем LLAMA_VULKAN=ON. Поддерживается на устройствах с Vulkan 1.1+, то есть практически всё с Android 10+.

Проблема с Android: процесс не имеет ограничения памяти как целого пула — система может убить приложение (SIGKILL) при нехватке RAM без предупреждения. ComponentCallbacks2.onTrimMemory(TRIM_MEMORY_RUNNING_CRITICAL) — последний шанс освободить контекст перед убийством процесса.

Скачивание модели: прогресс и верификация

GGUF-файлы весят 1–4 ГБ. Скачиваем через URLSession (iOS) или WorkManager с DownloadManager (Android). Верификация SHA256 обязательна: после скачивания вычисляем хеш и сравниваем с ожидаемым из репозитория на HuggingFace. Повреждённый GGUF вызывает краш при парсинге заголовка или позже при инференсе — лучше поймать на верификации.

Мобильная нейросеть работает быстрее без задержек сети, что особенно важно для критичных по времени приложений. Экономия средств: полностью офлайн решение исключает затраты на серверную инфраструктуру.

Что входит в интеграцию

  1. Анализ парка устройств и подбор модели с оптимальным квантованием
  2. Сборка llama.cpp под iOS (Metal) и/или Android (Vulkan)
  3. Разработка Swift/Kotlin обёртки с асинхронным стримингом токенов
  4. Реализация скачивания моделей с прогрессом и верификацией SHA256
  5. UI чат-интерфейса с индикацией теплового состояния
  6. Стресс-тестирование на реальных устройствах и тонкая настройка контекста
  7. Документация по интеграции и поддержка на этапе запуска

Сроки ориентировочно

Одна платформа, базовый чат-интерфейс с выбранной моделью — от 3 недель. Обе платформы, несколько моделей на выбор, фоновое скачивание, управление контекстом — от 7 недель. Стоимость рассчитывается индивидуально.

Наш опыт — 5 лет в мобильной разработке и более 20 проектов с on-device ML. Мы гарантируем работоспособность решения на целевых устройствах после тестирования. Получите консультацию по выбору модели и оценке вашего проекта. Закажите интеграцию и убедитесь в преимуществах офлайн AI-ассистента.

AI и ML в мобильных приложениях: CoreML, TFLite и on-device модели

Мы различаем два принципиально разных подхода: приложение с on-device AI и приложение, которое просто вызывает облачное API. Первое работает без интернета, не отправляет данные пользователя на сторонние серверы и отвечает за 50 миллисекунд. Второе зависит от задержки сети и тарифного плана. Выбор архитектуры — ключевой этап, который напрямую влияет на стоимость, приватность и пользовательский опыт. Наш опыт показывает: в 70% проектов on-device инференс оказывается дешевле в долгосрочной перспективе за счёт исключения серверных затрат.

Как выбрать между CoreML и TFLite для on-device инференса?

CoreML — нативный фреймворк Apple для запуска ML-моделей на устройстве. Поддерживает Neural Engine (начиная с A11 Bionic), GPU и CPU как fallback. Модели конвертируются в формат .mlmodel через coremltools из PyTorch, ONNX или TensorFlow. Конвертация — не всегда тривиальна: кастомные слои требуют реализации MLCustomLayer, а квантизация до INT8 иногда заметно роняет точность на специфических данных. Мы гарантируем, что итоговая модель проходит валидацию на реальных данных до и после конвертации.

TensorFlow Lite — кросс-платформенная альтернатива для Android и Flutter. На Android использует NNAPI (Neural Networks API) для хардварного ускорения — с Android 10 NNAPI стабильнее, до этого лучше явно использовать GPU delegate через GpuDelegate. Типичная ошибка: модель обучена на нормализованных данных в диапазоне [0,1], а в приложении на вход подаётся [0,255] — инференс работает, но с бессмысленными результатами без ошибки. Мы включаем модуль автоматической валидации входных данных в SDK.

Для задач классификации изображений, детекции объектов и сегментации доступны готовые оптимизированные модели. YOLOv8 в CoreML формате запускает детекцию кадра 640×640 за 15–20 мс на iPhone 14 Neural Engine. MobileNetV3 на TFLite с GPU delegate — около 8 мс на Pixel 7 при классификации.

Параметр CoreML TFLite
Платформы iOS, macOS, watchOS Android, iOS, Linux, embedded
Хардварное ускорение Neural Engine, GPU, CPU NNAPI, GPU (OpenCL/OpenGL), CPU
Поддержка квантизации FP16, INT8 (с coremltools) FP16, INT8, dynamic range
Кастомные операции Через MLCustomLayer (Swift) Через делегаты (Java/Kotlin)
Размер бандла модели ~3–5 МБ (MobileNetV2 quantized) ~2–4 МБ

Что делать, если нужна генерация текста на устройстве?

Запуск небольших языковых моделей на устройстве стал реальностью в последние несколько лет. Apple Intelligence использует собственные модели через Private Cloud Compute, но для сторонних разработчиков доступны другие пути.

llama.cpp с Metal backend на iOS — работающий подход для phi-3-mini (3.8B параметров, 4-bit квантизация, ~2.3 ГБ). Инференс: 15–25 токенов/секунду на iPhone 15 Pro. Для интеграции в Swift используем Swift Package llama.swift или обёртку через C-интерфейс llama.h. Бинарник к приложению не прикладываем — модель скачивается при первом запуске и хранится в Application Support. Наши сертифицированные разработчики настраивают инкрементальную загрузку, чтобы не блокировать первый запуск.

На Android аналог — Google AI Edge (бывший MediaPipe LLM Inference API) с поддержкой Gemma-2B. Работает через GPU delegate, на Tensor G3 чипе Pixel 8 Pro — около 20 токенов/секунду.

Ограничения реальны: модели больше 4B параметров на мобильных устройствах по-прежнему медленны. Для сложных задач рассуждения on-device LLM уступает GPT-4o в качестве. Гибридный подход — on-device для коротких задач и приватных данных, облако для сложных запросов — часто оптимален. Оценим ваш кейс и предложим баланс производительности и приватности — пишите.

Интеграция OpenAI API и других облачных моделей

Для сценариев, где cloud inference допустим, интеграция OpenAI, Anthropic или Google Gemini — это HTTP клиент + streaming SSE. В Swift удобно через AsyncThrowingStream для стриминговых ответов. В Kotlin — через Flow.

Критически важно: API-ключи никогда не хранятся в бандле приложения. Даже обфусцированный ключ извлекается из IPA за 10 минут через strings или frida. Правильная архитектура: мобильное приложение → собственный backend → OpenAI API. Backend контролирует rate limiting, логирует запросы, защищает ключ.

Что входит в работу (deliverables)

  • Обученная и квантизированная модель под целевое устройство (документация по метрикам)
  • SDK для интеграции (Swift/Kotlin/Flutter) с примерами вызова
  • Тесты производительности на 3–5 реальных устройствах
  • Инструкция по обновлению модели OTA
  • Поддержка при прохождении модерации App Store / Google Play (проверка соответствия Guidelines 4.2, 5.1)
  • 2 недели технической поддержки после релиза

Типичный пайплайн проекта

  1. Анализ задачи — замеряем latency, privacy, size, поддерживаемые устройства.
  2. Прототипирование модели — в Python, оценка accuracy на целевых данных.
  3. Конвертация и квантизация — под CoreML/TFLite с валидацией.
  4. Интеграция в приложение — модель оборачивается в сервисный слой (легко подменять CoreML → TFLite → облако).
  5. Тестирование — на реальных девайсах, замер FPS, RAM, батареи.
  6. Деплой — через TestFlight / Firebase App Distribution, мониторинг метрик.

Сроки: интеграция готовой CoreML/TFLite модели — 1–2 недели, разработка кастомной модели с мобильной оптимизацией — от 6 недель, on-device LLM чат с персонализацией — 4–8 недель.

Почему мы беремся за сложные кейсы?

10+ лет опыта в мобильной разработке, 50+ внедрённых AI/ML решений, гарантия совместимости с актуальными версиями iOS и Android. Все проекты проходят code review и нагрузочное тестирование. В стоимость уже входит подготовка документации для модерации и обучение вашей команды.

Свяжитесь с нами — мы поможем выбрать архитектуру и внедрить ML в ваше приложение под ключ. Закажите аудит существующего решения — бесплатно оценим потенциал экономии серверных затрат (в некоторых проектах экономия достигает $10k в месяц).