Offline AI Launcher – стартиране на AI LLM невронни мрежи на смартфон
Здравейте!
В свободното си време написах приложение, с което можете да изтегляте и стартирате невронни мрежи AI LLM като Google Gemma, DeepSeek, Llama, Qwen и много други направо на смартфона си.
Приложенията с ИИ днес са доста, но основната разлика на това е, че моделите не работят в облака на сървъри, а направо на смартфона, от файла на модела, с процесора и видеокартата на телефона.
Не са нужни нито интернет, нито платен абонамент: достатъчен е смартфон с 6+ ГБ оперативна памет и що-годе съвременен процесор.
Приложението работи с хранилището HuggingFace – най-голямото хранилище на модели с отворен код: там те са милиони, а хиляди от тях са големи езикови модели, или LLM.
Приложението отваря най-разпространения формат на модели .gguf с двигателя llama.cpp, форматите на Google за двигателя MediaPipe – .task и .tflite (версиите на моделите за MediaPipe са в хранилищата на Google), както и модели .litertlm с двигателя LiteRT-LM.
За някои модели, например Gemma 3n (отворен модел, изграден на същите технологии като Gemini), двигателят MediaPipe поддържа обработка на изображения.
Приложението е създадено най-вече за ентусиасти в областта на ИИ, но и за хора, които не могат да използват облачни модели като ChatGPT или Gemini заради възможно изтичане на данни, както и за хора без постоянен достъп до интернет.
В момента приложението е безплатно, но ако не намеря начин да си платя труда по него, част от функциите ще станат платени.
За кого е това приложение?
Приложението е предназначено за:
- ентусиасти в областта на ИИ, които искат да изтеглят и пробват нови модели и различните им дообучени версии;
- хора, които по някаква причина не могат да използват интернет: например се намират там, където няма интернет, или летят със самолет;
- хора, които не могат да използват облачни модели, защото се опасяват от изтичане на данни или защото компанията им забранява облачните модели.
Как се използва
В приложението има раздели: Чат, История, Модели, Настройки.
Чат
В този раздел е чатът с модела, който е стартиран в момента.

- Нов чат: изчиства историята на диалога с модела.
- Иконка „Споделяне на изображение“: добавя изображение в чата. Засега това се поддържа само от двигателя MediaPipe и моделите Gemma 3n и Gemma 3 4B, 12B и 27B.
- Иконка „Направи снимка“: прави снимка и я изпраща в чата. Засега това се поддържа само от двигателя MediaPipe и моделите Gemma 3n и Gemma 3 4B, 12B и 27B.
- Иконка „Прикачване на документ“: прикачва документ във формат pdf, txt, doc или docx. Щом документът се зареди, той се добавя към контекста на съобщението.
- RAG ВКЛ / ИЗКЛ: включва и изключва RAG – добавянето към контекста на диалога на резултатите от търсене във векторната база данни.
- Изчистване на текста: изтрива текста на текущото съобщение.
- Вмъкване на текст: вмъква текст от клипборда там, където е курсорът.
- Гласово въвеждане: включва гласовото въвеждане. Когато спрете да говорите, текстът се изпраща към модела сам, ако в настройките на приложението е включена опцията „Автоматично изпращане на текста към модела след разпознаване на речта“; ако не е – изпратете го с бутона „Изпрати“.
- Изпрати: изпраща съобщението към модела. Надписът на бутона може да се променя в зависимост от състоянието на модела.
- Иконка на микрофон до съобщението: прочита съобщението на глас. Скоростта на четене се задава в настройките на приложението с параметъра „Скорост на гласа“. Ако в настройките е включено „Автоматично озвучаване на отговорите след генериране“, отговорът се прочита сам, щом моделът приключи генерирането му.
- Натискане върху съобщението: отваря меню, в което съобщението може да се копира в клипборда, да се изпрати в друго приложение или да се чуе.
- Горен панел: показва с кой модел се води диалогът. На него се вижда и обемът на свободната оперативна памет, ако е включена опцията „Показване на свободната памет на екраните“.
История
Списък с всички диалози с всички модели.

- Натискане върху диалог: отваря диалога с модела.
- Изтриване: изтрива диалога. Всички диалози наведнъж могат да се изтрият в настройките на приложението с бутона „Изчистване на историята на чата“.
- Продължаване на диалога: всеки диалог може да се продължи, а продължението се запазва като нов диалог. При натискане се отваря списък с всички налични модели и можете да продължите с всеки от тях, дори ако диалогът е започнат с друг. Имайте предвид, че контекстът на модела е ограничен: ако в диалога има много текст, контекстът може да се изчерпи и част от диалога ще се загуби. Размерът на контекста се задава в настройките на приложението. Той се брои не в символи, а в токени, а токенът обикновено е част от дума.
Модели
Тук са всички изтеглени модели, както и моделите, стартирани в Ollama и LM Studio на вашия компютър. Всеки модел е файл в папката на приложението. Тази папка може да се отвори в някои файлови мениджъри, например в ES Explorer, и да добавяте или премахвате модели сами.

- Стартиране на модела: стартира модела и разтоварва всички останали. Ако моделът работи на компютър в локалната мрежа, приложението не го стартира, а отваря диалог с него: моделът се управлява от програмата, в която е стартиран.
- Показване на информация: отваря страница със служебна информация за модела.
- Натискане върху модела: отваря модела в поддържан файлов мениджър. Не всички файлови мениджъри могат да отварят файлове и не всички имат разрешение да отварят папката на друго приложение.
- Изтриване: изтрива модела. Могат да се изтриват и модели, стартирани в Ollama на компютър в локалната мрежа.
- Горен панел: показва папката на приложението с моделите. Натиснете папката, за да я отворите във файлов мениджър, да копирате пътя до нея или да го споделите. На панела се вижда и обемът на свободната оперативна памет, ако е включена опцията „Показване на свободната памет на екраните“.
- Изтегляне на модели: отваря страницата за изтегляне на модели от хранилището HuggingFace.

- Автор: филтрира списъка с модели по автор. Можете да въведете текст или да изберете пресет.
- Pipeline: филтрира списъка с модели по pipeline. Можете да въведете текст или да изберете пресет.
- Филтър: филтрира списъка с модели по филтър. Можете да въведете текст или да изберете пресет.
- Търсене: филтрира списъка с модели по име. Можете да въведете текст или да изберете пресет.
- Параметър за сортиране: по кой параметър да се сортира списъкът.
- ▼: отваря списъка с пресети за съответния филтър.
- +: запазва стойността от текстовото поле в пресетите.
- -: премахва стойността от текстовото поле от пресетите.
- Опресняване: опреснява списъка.
- Затваряне на филтъра: скрива панела с филтрите.
- Отваряне на модела в хранилището: отваря страницата на модела в хранилището HuggingFace.
- Изтегляне: отваря списъка с всички файлове на модела, налични в хранилището. Моделите с квантуване Q4, подходящи за архитектурата Arm, са отбелязани в зелено. Ако смартфонът ви има бърз процесор, а моделът е малък, можете да опитате да изтеглите и стартирате модел с произволно квантуване: колкото по-голямо е числото в квантуването, толкова по-точен е моделът. След натискането в горната част на екрана се показва състоянието на изтеглянето; натиснете го, за да спрете изтеглянето.
- Отметки: моделите, които сте добавили в отметките.

На страницата с отметките са същите филтри и бутони като на страницата за изтегляне, с изключение на самите „Отметки“.
Настройки

- Настройки на приложението

- Избор на език: променя езика на приложението. С варианта „Система“ приложението следва езика на устройството. В момента се поддържат английски, немски, френски, испански, полски, руски и украински.
- Режим на показване: темата на приложението – тъмна, светла или системна.
- Настройки на гласа: настройки на четенето на глас – автоматично прочитане на отговорите след генериране, автоматично изпращане на съобщението след разпознаване на речта и скорост на четене.
- Настройки за дебъгване: тук можете да включите показването на свободната оперативна памет на екраните и да преминете към страницата с информация за дебъгване на двигателя llama.cpp.
- Страница с информация за дебъгване на двигателя LLama.cpp: след включване на превключвателя показва служебната информация, която двигателят извежда в конзолата при зареждане на модела и генериране на отговор. Различните нива на дебъгване са показани в различни цветове.
- Токен за хранилището HuggingFace: за изтеглянето на някои модели от хранилището HuggingFace, например моделите на Google, е нужен токен. Можете да го въведете ръчно. Ако не сте го направили, приложението поддържа вход през сайта на HuggingFace: когато моделът изисква оторизация, приложението опитва да влезе през сайта и добавя получения токен – тогава той се появява в полето за токен.
- Копиране / поставяне на настройките на приложението през клипборда: копира всички настройки на приложението в клипборда във формат JSON, поставя ги от клипборда или ги изпраща като текстово съобщение. Настройките на различни версии на приложението може да са несъвместими.
- Оценка на приложението: оценете приложението в Google Play. Имайте предвид, че това е експериментално приложение: в някои случаи и с някои модели може да не работи стабилно.
- Изчистване на историята на чата: изтрива всички запазени съобщения.
- Възстановяване на настройките по подразбиране: нулира всички настройки на приложението. Понякога настройките се нулират и при обновяване: ако в предишната версия са открити критични грешки, свързани с настройките, а новата версия е по-стабилна.
- Настройки на паметта

- Настройки на паметта: за стартиране на LLM на смартфон е нужна много свободна оперативна памет. На този екран се вижда колко памет е свободна в момента и можете да настроите известия или разтоварване на модела, когато паметта не стига. В кода на двигателя на C++ е вградена функция, която взема параметрите от този екран и спира генерирането, когато паметта стане твърде малко, но понякога паметта свършва внезапно и тогава приложението се затваря. Размерът на контекста на модела пряко влияе на това колко памет заема той; можете да го зададете на страницата с настройки на двигателя. На страницата за паметта се виждат още архитектурата на процесора и поддържаният набор от инструкции.
- Настройки на промпта: на тази страница можете да създавате, редактирате, запазвате в пресети и изтривате промптове. Промптът се използва от всички двигатели и се добавя към първото съобщение на диалога. Промптът по подразбиране не може да се изтрие, а при смяна на езика се връща към промпта по подразбиране за избрания език. Ако искате да използвате собствен промпт, не го запазвайте като промпт по подразбиране.

- Настройки на шаблоните: за да общува с различни модели, двигателят llama.cpp използва различни шаблони; моделите от едно семейство обикновено имат общ пресет. На тази страница можете да обновите пресетите или да добавите нови за различни модели. Ако в приложението е стартиран модел, при отваряне на страницата се избира неговият шаблон.

- Име на шаблона: шаблонът се свързва с изтегления модел чрез „Ключова дума в името на модела“. Ако няколко модела използват един пресет, имената им могат да се изброят със запетаи.
- Шаблон за първото съобщение: шаблонът за първото съобщение трябва да включва промпта. При изпращане на съобщение към модела параметърът
prompt_textсе заменя с промпта, аmessage_text– със съобщението на потребителя. - Ключова дума за спиране на генерирането: когато моделът изведе тази дума, приложението спира генерирането. Това е нужно на някои модели: заради грешки при обучението или доработването им моделът може да извежда неправилни ключови думи, които двигателят не разпознава, и генерирането никога не свършва. Можете да посочите няколко ключови думи, разделени със запетаи.
- Замяна на ключова дума: някои модели връщат в отговора служебни ключови думи. Тук изброявате думите, които да се премахнат от отговора, във формат „ключова дума“ -> „с какво да се замени“. Например служебният таг, с който моделът отбелязва разсъжденията си, може да се замени с ваши думи.
- Настройки на двигателя LLama.cpp: настройките на двигателя llama.cpp, които могат да се запазват като пресети. Повече за настройките и за това на какво влияят можете да прочетете в статиите ми за LLM. Ето някои от тях:

- Размер на контекста: колко токена моделът може да „помни“ едновременно. Зависи от обема на оперативната памет; препоръчителни стойности: 2–4 ГБ – 128–256 токена, 6–8 ГБ – 256–1024 токена, 12–16 ГБ – 1024–32000 токена.
- Размер на отговора: колко токена моделът може да генерира.
- Температура: стойността на температурата (използва се, ако е включено семплиране по температура). Управлява случайността: 1,0 – неутрално, 0,7 – сдържано, 1,3 – творчески.
- Top-K: цяло число за Top-K, използва се, ако
use_top_kе true. Колко от най-вероятните токени се запазват. - Top-P: дробна стойност за Top-P, използва се, ако
use_top_pе true. Прагът на натрупаната вероятност (например 0,9). - Нишки: броят нишки за инициализация.
- Нишки за партида: броят нишки за генериране.
- Семплери: изборът на семплер, който обработва суровите стойности.
- Повече: повече – в статията ми Невронните мрежи с прости думи.
- Настройки на двигателя MediaPipe: настройките на двигателя MediaPipe; отчасти повтарят настройките на llama.cpp.

- Настройки на двигателите LocalHost:

- Настройки на Ollama LocalHost: Ollama може да се стартира на компютъра, така че отговорите да се генерират на видеокартата му, и да се свържете с нея по IP адрес. За целта изпълнете командите:
$env:OLLAMA_HOST="0.0.0.0"задава променливата на средата, за да слуша Ollama външния IP адрес (без нея Ollama слуша само localhost вътре в компютъра);setx OLLAMA_HOST 0.0.0.0 /Mя записва в постоянните променливи на средата (изпълнява се като администратор, след което терминалът се рестартира);ollama pull gemma3n:e4bизтегля модела gemma3n;ollama serveстартира Ollama;ollama listпоказва изтеглените модели. Когато моделът е изтеглен и Ollama е стартирана, моделът се появява в приложението. IP адресът е адресът на вашия компютър в мрежата, обикновено192.168.*.*; можете да го видите в настройките на Wi-Fi на компютъра или в настройките на рутера. - Настройки на OpenAI LocalHost: можете да стартирате модел на компютъра в LM Studio или друга програма, съвместима с OpenAI API, така че отговорите да се генерират на видеокартата му, и да се свържете с него по IP адрес. IP адресът е адресът на вашия компютър в мрежата, обикновено
192.168.*.*; можете да го видите в настройките на Wi-Fi на компютъра или в настройките на рутера. За да слуша LM Studio на порт на вашия компютър, изберете в LM Studio Developer → Settings → Serve on Local Network и стартирайте сървъра, като поставите превключвателя Status в положение Running. - Настройки на RAG:

Ако сте добавили документ в диалога с модела и размерът му не надвишава лимита, зададен на страницата с настройки, при генериране на отговора документът се добавя изцяло към контекста на диалога. Ако е по-голям, той се разделя на части, всяка част се превръща във вектор, а при генериране на отговора се намира подходящият вектор и текстът му се добавя към контекста на диалога.
- Брой резултати: колко резултата от търсенето във векторната база данни и от прикачения документ се добавят към контекста при генериране на отговора.
- Минимален показател за сходство: минималното сходство между два вектора, при което те се смятат за съвпадение; двойките с по-ниско сходство се отхвърлят. Типични стойности: 0,7–0,8 – за строги съвпадения с висока релевантност; 0,5–0,7 – за умерено сходство, когато стават и частични съвпадения; под 0,5 – само за широко покритие или проучвателно търсене.
- Добавяне на прикачените документи във векторната база данни: документът, прикачен по време на диалога, се добавя и във векторната база данни. Тогава при включен RAG всяка заявка търси във векторната база и подходящият документ се добавя към контекста на въпроса.
- Размер на фрагмента в токени: максималният брой токени в един текстов фрагмент, след който той се разделя. Ако стойността е твърде голяма, моделът за ембединги може да се срине или да върне грешка, защото фрагментът ще надвиши максималния размер на входните му данни.
- Припокриване на фрагментите, само за метода Sentences: колко токена от края на един фрагмент се повтарят в началото на следващия, за да се запази контекстът.
- Разделяне на текстовите фрагменти, по-големи от тази стойност, на части: текст, по-дълъг от този брой символи, се разделя на фрагменти. Това важи и за документите, добавени по време на диалога: всеки документ, по-голям от тази стойност, се превръща във вектори и търсенето се извършва по вектори. Ако документът е твърде голям, контекстът на модела ще се изчерпи и той няма да може да генерира отговор.
- Максимален брой символи във фрагмента: ограничава броя на символите във фрагмента. При метода Sentences изреченията може да са дълги и без ограничение моделът за ембединги се срива.
- Настройки на векторната база данни:

Документ или текст може да се добави във векторната база данни ръчно. При добавянето документът се разделя на части и за всяка част се създава вектор. Ако в диалога с модела е включен RAG, всеки ваш въпрос се превръща във вектор, във векторната база се намират подходящи фрагменти от документи и техният текст се добавя към контекста на въпроса. Можете също да проверите кои документи базата намира по текста на заявката: за това е филтърът.
Бъдещи възможности
- LocalHost Server API: приложението ще работи като сървър, съвместим с OpenAI API и Ollama API.
- Извикване на функции: поддръжка на On-Device Function Calling SDK. Засега тя е изключена: SDK не поддържа някои функции, които са нужни на други части на приложението.
Текущи имплементации на двигателите
llama.cpp
- Уикипедия: en.wikipedia.org/wiki/Llama.cpp
- GitHub: github.com/ggml-org/llama.cpp
- Android: github.com/ggml-org/llama.cpp/tree/master/examples/llama.android
- Как е устроен двигателят отвътре: llama.cpp AI LLM Engine – Как работи
LiteRT-LM
Двигателят на Google за модели .litertlm. Той е вграден в приложението и работи много бързо.
- GitHub: github.com/google-ai-edge/LiteRT-LM
- Ръководство за Kotlin: ai.google.dev/edge/litert-lm/android
- HuggingFace: huggingface.co/litert-community
- Сравнение с други двигатели и код за интеграция: Локално стартиране на LLM модели на Android смартфон
MediaPipe / TensorFlow
- Ръководство на Google: ai.google.dev/edge/mediapipe/solutions/guide
- GitHub: github.com/google-ai-edge/mediapipe
- HuggingFace: huggingface.co/litert-community
- Модел в Kaggle: kaggle.com/models/google/gemma-3/tfLite
- Maven: mvnrepository.com/artifact/com.google.mediapipe
Двигатели на локален хост
- Ollama: поддържа се Ollama API: можете да стартирате Ollama на компютър и да общувате с модела от приложението.
- OpenAI API: поддържа се OpenAI API: можете да стартирате на компютъра LM Studio или всяка програма, съвместима с OpenAI API, и да общувате с модела от приложението.
Бъдещи интеграции
MLC LLM
Засега само експериментално: моделите в HuggingFace се състоят от много файлове, което е неудобно, а самият двигател е слабо оптимизиран за Android и моделите работят по-бавно, отколкото с llama.cpp и MediaPipe. В бъдеще планирам да препакетирам някои модели в специален формат от един файл и да ги кача в HuggingFace.
- Хранилище: github.com/mlc-ai/mlc-llm
- Внедряване на CLI: llm.mlc.ai/docs/deploy/cli.html
- Внедряване за Android: llm.mlc.ai/docs/deploy/android.html
- Компилиране на модели: llm.mlc.ai/docs/compilation/compile_models.html
- HuggingFace: huggingface.co/mlc-ai
- Пример за модел: huggingface.co/google/gemma-3-1b-it-qat-q4_0-unquantized
ONNX
Засега само експериментално: моделите в HuggingFace се състоят от много файлове и не могат да се опаковат в един, затова двигателят е неудобен за използване, а под Android работи бавно.
- Уикипедия: en.wikipedia.org/wiki/Open_Neural_Network_Exchange
- ONNX Runtime for GenAI (Java): github.com/microsoft/onnxruntime-genai/tree/main/src/java
- Документация на API: onnxruntime.ai/docs/genai/api/java.html
- HuggingFace: huggingface.co/onnx-community
- Maven: mvnrepository.com/artifact/com.microsoft.onnxruntime
PyTorch
Планирам да го добавя.
- Уикипедия: en.wikipedia.org/wiki/PyTorch
- Официален сайт: pytorch.org
- Хранилище: github.com/pytorch/pytorch
Допълнителни ресурси за четене
- Голям езиков модел (Уикипедия)
- Списък на големите езикови модели (Уикипедия)
- Llama (езиков модел) (Уикипедия)
- Бенчмаркове за езикови модели (Уикипедия)
- Understanding Large Language Models in Your Pockets – производителност на LLM на обикновени смартфони (arXiv)
Архитектура
- Модулна Clean Architecture на Робърт Мартин
Технологичен стек
- Езици: Kotlin, Java, C++
- Система за билд: Gradle Groovy DSL, CMake
