Roman Kryvolapov Engineering Blog

Offline AI Launcher – стартиране на AI LLM невронни мрежи на смартфон

Изтеглете от Google Play

Над 10 000 изтегляния в Google Play

Здравейте!

В свободното си време написах приложение, с което можете да изтегляте и стартирате невронни мрежи 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

LiteRT-LM

Двигателят на Google за модели .litertlm. Той е вграден в приложението и работи много бързо.

MediaPipe / TensorFlow

Двигатели на локален хост

  • Ollama: поддържа се Ollama API: можете да стартирате Ollama на компютър и да общувате с модела от приложението.
  • OpenAI API: поддържа се OpenAI API: можете да стартирате на компютъра LM Studio или всяка програма, съвместима с OpenAI API, и да общувате с модела от приложението.

Бъдещи интеграции

MLC LLM

Засега само експериментално: моделите в HuggingFace се състоят от много файлове, което е неудобно, а самият двигател е слабо оптимизиран за Android и моделите работят по-бавно, отколкото с llama.cpp и MediaPipe. В бъдеще планирам да препакетирам някои модели в специален формат от един файл и да ги кача в HuggingFace.

ONNX

Засега само експериментално: моделите в HuggingFace се състоят от много файлове и не могат да се опаковат в един, затова двигателят е неудобен за използване, а под Android работи бавно.

PyTorch

Планирам да го добавя.

Допълнителни ресурси за четене

Архитектура

  • Модулна Clean Architecture на Робърт Мартин

Робърт Мартин (Уикипедия)

Технологичен стек

  • Езици: Kotlin, Java, C++
  • Система за билд: Gradle Groovy DSL, CMake