Lokální umělá inteligence v SwiftUI: Integrace Foundation Models se streamovým zpracováním
Framework Foundation Models od Apple umožňuje integrovat lokální jazykové modely do aplikací v SwiftUI. Modely provádějí generování textu, shrnutí a klasifikaci přímo na zařízení bez cloudových dotazů. Třída LanguageModelSession zajišťuje streamování odpovědí pomocí metody streamResponse(to:), což je klíčové pro responsivní uživatelská rozhraní.
Implementace se zaměřuje na zpracování uživatelských dotazů v reálném čase: zadávání textu, odeslání promptu a dynamické aktualizace výstupu při generování fragmentů modelem.
Struktura uživatelského rozhraní pro chatovou interakci
Aplikace je postavena kolem NavigationStack s ScrollView pro odpovědi umělé inteligence a spodní vstupní panel. TextField s modifikátorem glassEffect odpovídá iOS 26. Tlačítko odeslání aktivuje asynchronní úlohu, která blokuje opakované dotazy pomocí stavu inputDisabled.
Kompletní příklad kódu:
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("Zeptejte se mě na cokoliv", 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
}
}
}
}
Mechanismus streamové generace
Metoda streamResponse(to:) vrací asynchronní sekvenci fragmentů textu. Cyklus for try await chunk in streamResponse aktualizuje @State var output v každém kroku, což spouští SwiftUI překreslení. To zajišťuje plynulý UX bez blokujících operací uživatelského rozhraní.
Zpracování chyb je implementováno pomocí do-catch: při selhání se vypíše localizedDescription a vstupní pole se odblokuje.
Klíčové aspekty integrace
- Streamování: Fragmenty jsou generovány postupně, vhodné pro dlouhé odpovědi; vyžaduje přesné řízení stavu, aby se předešlo race conditions.
- Soukromí: Všechny výpočty probíhají na zařízení, data neopouštějí zařízení.
- Podpora platforem: iOS 26+, macOS 26+, tvOS 26+, watchOS 26+.
Co je důležité
LanguageModelSession— hlavní třída pro lokální LLM relace s podporou dávkového a streamového zpracování.streamResponse(to:)minimalizuje latenci v uživatelském rozhraní díky přírůstkovým aktualizacím.- On-device inference eliminuje síťová zpoždění a náklady na API.
- SwiftUI
@State+Taskzajišťují souběžnost bez GCD. glassEffect— nativní modifikátor pro glassmorphism v iOS 26.
Optimalizace výkonu
Pro middle/senior vývojáře: sledujte paměťovou náročnost relací — každá LanguageModelSession načítá model do RAM. Doporučuje se pooling relací nebo opakované použití instancí. Testujte na zařízeních s Neural Engine (A17+ nebo M3+). Streamové zpracování snižuje špičkové zatížení CPU, ale prodlužuje dobu oproti dávkovému režimu.
V produkci přidejte debounce na vstup, historii kontextu a záložní řešení pro zařízení s nižším výkonem.
— Editorial Team
Zatím žádné komentáře.