Lernbuddy

Meine Tochter ist 13. Wie die meisten Schülerinnen in ihrem Alter in Österreich hat sie ein iPad. Und wie die meisten Eltern habe ich ein ungutes Gefühl dabei, wenn sie ihre Hausaufgaben in ChatGPT tippt — nicht weil die Antworten falsch wären, sondern weil alles, was sie eingibt, in einer Cloud landet, über die ich keine Kontrolle habe. Namen, Schulen, halbfertige Gedanken, die Themen, bei denen sie sich schwertut. Dinge, die auf ihrem Gerät bleiben sollen.

Also habe ich Lernbuddy gebaut. Ein Lernbegleiter für 10- bis 14-Jährige, der vollständig auf dem Gerät läuft — mit Gemma 4 E4B. Keine Netzwerkaufrufe. Keine Telemetrie. Das Modell liegt direkt neben den Karteikarten und dem Lernverlauf des Kindes, auf derselben Festplatte. Mehr nicht.

Was die App kann

Drei Dinge, alle getrieben von Gemma 4 E4B:

Sokratischer Chat. Sie stellt eine Frage, das Modell gibt einen Hinweis — niemals die Lösung. Der System-Prompt ist auf konkretes Lob ausgelegt („gut erkannt, dass Brüche einen gemeinsamen Nenner brauchen") und verweigert es konsequent, Aufgaben direkt zu lösen.

Karteikarten. Schultext einfügen → Karten. Oder einfach ein Thema eintippen (unregelmäßige Verben, Hauptstädte Europas) → das Modell greift auf Allgemeinwissen zurück und erzeugt ein Deck. Jede Karte landet zuerst in einer Vorschau, in der man bearbeiten, löschen oder weitere ergänzen kann, bevor sie in der Datenbank landen.

Quiz mit modellvalidierten Antworten. Freitextantworten, kein Multiple Choice. Das Modell liest die richtige Antwort und die Antwort des Kindes und entscheidet richtig / fast / falsch — Tippfehler und Umformulierungen werden toleriert. Am Ende schreibt es sogar eine kurze, persönliche Zusammenfassung: „Die Partizipien hast du gut im Griff. ‚choose' und ‚speak' sind durcheinandergeraten — die kommen morgen wieder."

Hinter dem Quiz steckt ein kleiner SM-2-Algorithmus für Spaced Repetition. Karten, die sie falsch beantwortet, kommen am nächsten Tag wieder; Karten, die sie kann, rutschen immer weiter nach hinten. Ein Streak-Zähler und ein themenbezogenes Badge („✓ 12 sitzen · … 4 üben") machen Fortschritt sichtbar, ohne ein Dashboard zu brauchen.

Architektur

Das Ganze ist eine .NET 9 MAUI-App — eine Codebasis, vier Targets (Windows, Android, iOS, macCatalyst), zweisprachig von Anfang an (Deutsch ist die Hauptzielgruppe, Englisch der Default für internationale Demos).

Inferenz läuft über das IChatClient-Interface von Microsoft.Extensions.AI. Die konkrete Implementierung umschließt LLamaSharp, das unsloth/gemma-4-E4B-it-GGUF (Q4_K_M-Quantisierung, ~4,6 GB) ausführt. Das Chat-Template von Gemma 4 — <|turn>role\n... — wird von Hand zusammengebaut; das in der GGUF eingebettete Jinja-Template enthält Tool-Calling-Logik, die das Kind nie brauchen wird.

Ein Singleton-Service InferenceStatus schickt Statusmeldungen wie „Modell wird geladen … 4,6 GB" oder „Generiere … 23 Tokens (4,1/s)" an ein kleines Banner, das auf jeder Seite sichtbar ist. Wenn das Prompt-Processing 30 Sekunden bis zum ersten Token braucht (CPU ist bei langen Prompts langsam), tickt das Banner trotzdem weiter. Keine toten Spinner — das ist wichtiger als reiner Durchsatz, wenn man 11 ist und wartet.

Lange Quelltexte werden absatz- und satzweise in ~500-Zeichen-Stücke zerlegt. Karten erscheinen rollend, statt zwei Minuten auf einen Mega-Prompt zu warten. Der Gesamtdurchsatz ist dadurch etwas schlechter; die gefühlte Wartezeit deutlich besser.

Die Privacy-Story

Der Privacy-Vertrag des Projekts beginnt mit „local first": keine personenbezogenen Daten in Prompts, Eltern-PIN-Sperre für jeden zukünftigen Cloud-Modus, Modell-Download nur über WLAN und mit ausdrücklicher Zustimmung. Die aktuelle App macht nach der Installation null ausgehende Netzwerkaufrufe. Das Einzige, was das Gerät jemals verlässt, ist das, was man in ein Gemini-API-Formular eintippt — und genau dieses Formular gibt es nicht. Bewusst nicht.

Genau das ist der Unterschied. Es gibt Dutzende „ChatGPT für Kinder"-Apps; fast keine kann glaubwürdig sagen: „Die Hausaufgaben deines Kindes verlassen das Gerät nicht."

Was ich gelernt habe

Ich bin durch drei Runtime-Sackgassen gelaufen, bevor es lief. ONNX Runtime GenAI unterstützt den Multi-File-ONNX-Split von Gemma 4 noch nicht. transformers.js + WebGPU in einer MAUI HybridWebView ist theoretisch wunderschön und in der Praxis ein Stapel aus vier bleeding-edge Komponenten, die lautlos auf Arten versagen, die nichts an die Oberfläche bringt. LLamaSharp + GGUF funktioniert — bis auf den kleinen Haken, dass LLamaSharp keine iOS-arm64-Natives ausliefert. Also habe ich llama.cpp auf einem Mac selbst für iOS gebaut, die resultierenden .a-Dateien über den NativeReference-Mechanismus von MAUI statisch eingebunden und [DllImport("llama")] via Runtime-Resolver auf __Internal umgebogen.

Die Lehre: Wer in 2026 ein Multi-Plattform-Projekt mit lokalem LLM in .NET baut, wählt die Runtime mit der tiefsten Community — nicht die mit der hübschesten Abstraktion. llama.cpp hat eine Community in der Größenordnung von Tausenden; die .NET-Wrapper drumherum erben diese Tiefe quasi gratis mit.

Ausprobieren

Code: https://github.com/gpiwonka/Lernbuddy

Lizenz: MIT. Solo gebaut, nebenher, zwischen Tagesjob und den Abenden eines müden Vaters mehrheitlich während der 24 Stunden vom Nürburgring

Zuletzt bearbeitet: 23.05.2026 20:15
Navigation