Brownie — KI um Apparat op Android
Problem
All KI-Assistent, dee wierklech eppes ka, ass um Handy en einfache Client. De Modell läit am Rechenzentrum vun engem anere, d'Gespréich reest do hin an zréck, an d'Ganzt hält op ze funktionéieren, wann een am Fliger sëtzt oder hannert der Firewall vun enger Firma ass. De Schutz vun de Donnéeën ass do e Versprieche vun enger Politik an net eng Eegeschaft vum System.
Ech wollt wëssen, wat wierklech iwwreg bleift, wann een op dat alles verzicht — keng Chatbot-Demo, mee e richtegen Agent, deen Tools oprifft, Fichiere liest a schreift, sech vun enger Sessioun op déi aner erënnert an den Apparat steiert, a komplett op der Hardware leeft, déi een an der Täsch huet.
Aschränkung
En Handy ass kee Server. Et gëtt kee Swap, deen eppes bréngt, de Späicher gëtt mat all anerer App gedeelt, déi leeft, an eng Inferenz, déi laang dauert, stéisst direkt un déi thermesch Limitte vum Apparat. D'Gewiichter vum Modell, d'Tool-Schicht, den Historique vum Gespréich an d'Interface mussen alleguer an dat eranpassen, wat en Android-Apparat aus der Mëttelklass iwwreg huet — an d'Interface muss flësseg bleiwen, während de Modell schafft.
Déi zweet Aschränkung hunn ech mir selwer opgeluecht, a si war méi schwéier: keng Hëllef aus der Cloud. En hybriden Opbau, deen einfach e Modell aus der Distanz oprifft, wann den Apparat u seng Grenze stéisst, hätt all Demo méi flësseg gemaach an de Grond fir dëse Projet futti gemaach.
Entscheedungen
- D'Quantiséierung gëtt zur Lafzäit gewielt, net beim Build. D'App kuckt beim éischte Start no, wéi vill RAM do ass, a wielt eng Stuf: Q4 mat ongeféier 1,5 GB fir Apparater mat 6–8 GB, Q4 plus e Vision-Projektor fir 8–12 GB, Q8 mat Vision doriwwer. Ënner 6 GB seet d'App, datt se net funktionéiert, amplaz lues ze versoen an dem Benotzer d'Schold ze ginn.
- Fënnef Gradle-Moduler amplaz vun engem.
:core:inferenceëmschléisst LiteRT-LM, den Download vum Modell an d'Erkennung vum Apparat;:core:agenthält d'Schleef;:core:toolsde Registre a seng zwielef Ëmsetzungen;:core:memoryd'Persistenz, de Profil an d'Volltextsich an de Sessiounen;:appd'Compose-Interface. Déi Grenz, déi sech gelount huet, ass d'Inferenz — dat ass dat Stéck, dat am sécherste ersat gëtt, wann dee nächste Modell erauskënnt, deen um Apparat leeft. - De Kontext gëtt zesummegefaasst amplaz ofgeschnidden. Wann d'Fënster voll ass, mécht den Agent e Resumé a fiert weider. Ofschneide wier en Dag Aarbecht gewiescht; déi éischt Hallschent vun engem Gespréich ze verléiere ass genee dee Feeler, deen d'Benotzer net erkenne kënnen.
- E MCP-Client. Nei Tools kënnen derbäikommen, andeem een d'App op e Server riicht, ouni datt en APK erausgi muss ginn.
Resultat
120 Kotlin-Fichieren op fënnef Moduler, 200 Commits. Tool-Opruff iwwer méi Ronnen, bis zu zéng Iteratioune pro Message, Äntwerten am Streaming mat Tool-Chips an der Interface, Fichier-Tools an enger Sandbox, Kontakter, Kalenner, Clipboard, autonom Aufgabe mat Zäitplang, d'Liese vum Ecran an d'Automatiséierung vum Apparat iwwer d'Accessibility-APIs, Web-Extraktioun iwwer eng WebView, a Sprooch an all zwou Richtungen.
Keng Cloud, kee API-Schlëssel, keng Donnéeën, déi den Handy verloossen. Nom eemolegen Download vum Modell lued de Moteur a fënnef bis fofzeng Sekonnen an d'App funktionéiert ouni Netz.
Wat ech anescht maache géif
D'Tool-Schicht ass der App iwwer de Kapp gewuess. :core:tools ass um Enn méi grouss ginn wéi de Modul vun der Interface — véierefofzeg Fichiere géint eenavéierzeg — well all nei Fäegkeet eng weider Ëmsetzung bedeit huet, déi mat an d'App kompiléiert gouf. De MCP-Client, deen ech an der v6 derbäigesat hunn, huet déi richteg Form, an do géif ech ufänken: e klengt agebaute Set fir dat, wat wierklech Zougrëff op de Prozess brauch, an alles anescht hannert engem Tool-Server, dee sech änneren kann, ouni datt en APK erausgi muss ginn. Ech si spéit bei déi Grenz komm; si hätt déi éischt sollte sinn.