Lokale KI in SwiftUI: Integration von Foundation-Modellen mit Streaming
Apples Foundation-Models-Framework ermöglicht die Integration lokaler Sprachmodelle in SwiftUI-Anwendungen. Diese Modelle führen Textgenerierung, Zusammenfassung und Klassifizierung vollständig auf dem Gerät durch, wodurch Cloud-Anfragen überflüssig werden. Die Klasse LanguageModelSession erleichtert Streaming-Antworten über die Methode streamResponse(to:), was für reaktionsschnelle Benutzeroberflächen entscheidend ist.
Die Implementierung konzentriert sich auf die Echtzeitverarbeitung von Benutzeranfragen: Texteingabe, Prompt-Übermittlung und dynamische Aktualisierung der Ausgabe, während das Modell Textabschnitte generiert.
Schnittstellenstruktur für Chat-Interaktion
Die App basiert auf einem NavigationStack mit einer ScrollView für KI-Antworten und einem unteren Eingabebereich. Ein TextField mit dem glassEffect-Modifikator passt sich an iOS 26 an. Die Senden-Schaltfläche löst eine asynchrone Aufgabe aus und verhindert doppelte Anfragen über den inputDisabled-Status.
Vollständiger Beispielcode:
import SwiftUI
import FoundationModels
struct ContentView: View {
@State private var input: String = ""
@State private var output: String = ""
@State private var inputDisabled: Bool = false
var body: some View {
NavigationStack {
ScrollView {
Text(output)
}
}
.safeAreaBar(edge: .bottom) {
inputAccessoryView
}
}
private var inputAccessoryView: some View {
HStack {
TextField("Frag mich alles", text: $input)
.padding()
.glassEffect()
Button {
sendPrompt()
} label: {
Image(systemName: "paperplane")
.frame(width: 25, height: 25)
.rotationEffect(.degrees(40))
}
.buttonStyle(.borderedProminent)
.controlSize(.mini)
.disabled(inputDisabled)
.padding(8)
}
}
private func sendPrompt() {
Task {
guard input.isEmpty == false else { return }
do {
let session = LanguageModelSession()
inputDisabled = true
let streamResponse = session.streamResponse(to: input)
for try await chunk in streamResponse {
self.output = chunk
}
inputDisabled = false
} catch {
print(error.localizedDescription)
inputDisabled = false
}
}
}
}
Streaming-Generierungsmechanismus
Die Methode streamResponse(to:) gibt eine asynchrone Sequenz von Textabschnitten zurück. Die Schleife for try await chunk in streamResponse aktualisiert die @State var output bei jedem Schritt und löst SwiftUI-Neurendering aus. Dies gewährleistet eine flüssige Benutzererfahrung ohne Blockierung der UI-Operationen.
Die Fehlerbehandlung erfolgt über do-catch: Wenn eine Sitzung fehlschlägt, wird localizedDescription ausgegeben und das Eingabefeld wieder aktiviert.
Wichtige Integrationsaspekte
- Streaming: Abschnitte werden inkrementell generiert, geeignet für langfristige Antworten; erfordert präzises Zustandsmanagement, um Race Conditions zu vermeiden.
- Datenschutz: Alle Berechnungen erfolgen auf dem Gerät, Daten verlassen niemals das Gerät.
- Plattformunterstützung: iOS 26+, macOS 26+, tvOS 26+, watchOS 26+.
Was wichtig ist
LanguageModelSessionist die Hauptklasse für lokale LLM-Sitzungen mit Batch- und Streaming-Unterstützung.streamResponse(to:)minimiert UI-Latenz durch inkrementelle Updates.- On-Device-Inferenz eliminiert Netzwerkverzögerungen und API-Kosten.
- SwiftUI
@State+Taskermöglichen Nebenläufigkeit ohne GCD. glassEffectist ein nativer Modifikator für iOS-26-Glasmorphismus.
Leistungsoptimierung
Für mittlere/senior Entwickler: Überwachen Sie den Speicherverbrauch der Sitzung – jede LanguageModelSession lädt ein Modell in den RAM. Erwägen Sie Sitzungspooling oder Instanzwiederverwendung. Testen Sie auf Geräten mit Neural Engine (A17+ oder M3+). Streaming reduziert die Spitzen-CPU-Auslastung, erhöht jedoch die Dauer im Vergleich zum Batch-Modus.
In der Produktion fügen Sie Input-Debouncing, Kontexthistorie und Fallbacks für leistungsschwache Geräte hinzu.
— Editorial Team
Noch keine Kommentare.