Зачем вообще тащить ИИ на телефон?
Представьте: вы в метро, нет сети, но нужно срочно перевести документ или обработать фото. Или вы параноик (как я), который не хочет, чтобы каждый ваш запрос летел в облака Google или OpenAI. Локальный ИИ на телефоне — это не будущее, это настоящее, которое почему-то все игнорируют.
Проблема в том, что большинство гайдов показывают, как запустить llama.cpp на ПК. А на телефоне — тишина. Или советуют использовать облачные API, что убивает всю идею приватности. Сегодня мы это исправим.
Главное преимущество локального ИИ — полный контроль. Ваши данные никуда не уходят, вы не зависите от интернета, и вам не нужно платить за токены. Да, производительность ниже, но для многих задач её хватает с головой.
Что нам понадобится перед стартом
Не обольщайтесь — запустить полноценную Llama 3 70B на iPhone 12 не получится. Но модели типа TinyLlama (1.1B) или даже Phi-2 (2.7B) отлично работают на современном железе. Проверял на Snapdragon 8 Gen 2 — летает.
1 Выбираем стек: React Native или нативный код?
Тут всё зависит от ваших навыков. Если вы фронтенд-разработчик, то React Native с биндингами к C++ код — ваш выбор. Если нативщик — тогда пишем на Kotlin/Swift и подключаем llama.cpp как нативную библиотеку.
Я покажу на примере React Native, потому что это быстрее для прототипа. Но предупреждаю — производительность будет немного хуже, чем в нативном коде.
# Создаём новый проект React Native
npx react-native init LocalAIApp
cd LocalAIApp
2 Интегрируем llama.cpp в проект
Самое сложное — заставить C++ код работать в мобильном окружении. К счастью, комьюнити уже сделало часть работы.
Для Android используем CMake, для iOS — Xcode проект. Но есть лайфхак — можно собрать llama.cpp как отдельную библиотеку и подключить её через FFI (Foreign Function Interface).
Не пытайтесь собрать полную llama.cpp со всеми фичами. Выбирайте только необходимые компоненты — например, базовый инференс без квантования 8-bit, если у вас мало оперативной памяти.
# Клонируем llama.cpp в папку проекта
git clone https://github.com/ggerganov/llama.cpp.git
cd llama.cpp
# Собираем для Android (нужен NDK)
mkdir build-android && cd build-android
cmake -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \
-DANDROID_ABI=arm64-v8a \
-DANDROID_PLATFORM=android-24 ..
make -j4
3 Готовим модель: конвертация и оптимизация
Скачиваем модель в формате GGUF — это единственный формат, который нормально работает в llama.cpp. Hugging Face переполнен такими моделями.
Совет: начинайте с маленьких моделей. TinyLlama (1.1B) весит около 700 МБ и работает даже на старых телефонах. Когда разберётесь, переходите к чему-то серьёзнее.
| Модель | Размер | Минимальная ОЗУ | Скорость на SD 8 Gen 2 |
|---|---|---|---|
| TinyLlama 1.1B | ~700 МБ | 2 ГБ | ~45 токенов/сек |
| Phi-2 2.7B | ~1.7 ГБ | 4 ГБ | ~22 токена/сек |
| Llama 2 7B (Q4) | ~4 ГБ | 6 ГБ | ~8 токенов/сек |
Конвертируем модель в GGUF, если она ещё не в этом формате:
# Устанавливаем Python зависимости
pip install torch numpy sentencepiece
# Клонируем скрипты конвертации
git clone https://github.com/ggerganov/llama.cpp.git
cd llama.cpp
# Конвертируем модель (пример для LLaMA)
python convert.py \
--outfile models/llama-7b.gguf \
--outtype q4_0 \
/path/to/llama-7b
4 Пишем мост между C++ и JavaScript
Тут начинается магия. Нам нужно создать нативный модуль, который будет вызывать функции llama.cpp из JavaScript кода.
Для React Native используем react-native-builder-bob и нативные модули. Выглядит страшно, но на деле — пара сотен строк кода.
// NativeModuleLlama.js
import { NativeModules } from 'react-native';
const { LlamaModule } = NativeModules;
export default class Llama {
static async loadModel(modelPath) {
return await LlamaModule.loadModel(modelPath);
}
static async generate(prompt, options = {}) {
return await LlamaModule.generate(prompt, options);
}
static async freeMemory() {
return await LlamaModule.freeMemory();
}
}
5 Интерфейс: делаем приложение удобным
Самое интересное — дизайн. Не делайте очередной чат-интерфейс. Подумайте, для чего людям ИИ на телефоне:
- Быстрые ответы без интернета
- Обработка документов (тот же DeepSeek OCR локально)
- Переводы в офлайне
- Персональный помощник, который знает только вас
Создайте отдельные экраны для разных задач. Например, сканер документов с OCR (используйте принципы из гайда по Tauri, но адаптированные для мобилок).
6 Оптимизация: заставляем всё летать
Без оптимизации ваше приложение будет жрать батарею как голодный хищник. Вот что нужно сделать обязательно:
- Используйте квантованные модели (Q4_0, Q5_1) — они в 2-4 раза меньше и почти не теряют в качестве.
- Ограничивайте контекст. Не нужно держать в памяти 4096 токенов, если пользователь просто переводит предложения.
- Кэшируйте результаты. Если пользователь часто задаёт похожие вопросы — сохраняйте ответы.
- Приостанавливайте ИИ, когда приложение в фоне. Не тратьте ресурсы зря.
Самая частая ошибка — пытаться запустить генерацию в главном потоке. Делайте это в фоновом потоке, иначе интерфейс будет тормозить, и пользователи удалят приложение через 5 минут.
Где это реально пригодится?
Представьте врача в удалённой клинике без интернета. Он фотографирует симптомы, ИИ анализирует и предлагает варианты диагноза. Или журналиста в зоне конфликта, который переводит документы без доступа к интернету.
Это не игрушка. Это инструмент, который может работать там, где облачные сервисы бессильны.
Кстати, если нужно распределить вычисления между несколькими устройствами, посмотрите про RPC-сервер llama.cpp. Можно создать сеть из телефонов для сложных задач.
FAQ: ответы на вопросы, которые вы постеснялись задать
Сколько будет весить приложение?
Базовое — 20-30 МБ. Но каждая модель добавляет свой вес. Лучше сделать возможность загружать модели отдельно, чтобы не пугать пользователей гигабайтным APK.
А если у пользователя старый телефон?
Определяйте железо при запуске и предлагайте подходящую модель. Для слабых устройств — TinyLlama, для флагманов — что-то посерьёзнее.
Как обновлять модели?
Через собственный сервер или прямо из приложения с Hugging Face. Но предупреждайте пользователей о трафике — модели весят много.
Это законно?
Зависит от лицензии модели. Большинство современных LLM имеют открытые лицензии (Apache 2.0, MIT). Но всегда проверяйте — некоторые коммерческие модели запрещают использование в мобильных приложениях.
Что дальше?
Локальный ИИ на мобильных устройствах — это не нишевая тема для гиков. Это будущее, где наши данные остаются нашими, а интернет становится опцией, а не необходимостью.
Начните с простого: скачайте готовое приложение с llama.cpp (такие уже есть в Store), почувствуйте, как это работает. Потом создайте своё. Не идеальное — просто работающее.
И помните: каждая строчка кода, которая работает офлайн, делает нас немного свободнее от больших корпораций. А это, пожалуй, самая важная причина начать.