Makra @Generable i @Guide w FoundationModels: automatyzacja generowania modeli
Makra @Generable i @Guide we frameworku FoundationModels umożliwiają generowanie instancji struktur Swift na podstawie wyników modeli językowych. Kompilator syntetyzuje protokoły i metody do przetwarzania strumieniowego odpowiedzi z LanguageModelSession. To redukuje boilerplate-kod i zapewnia bezpieczeństwo typów przy pracy ze strukturalnymi danymi z LLM.
Zastosowanie @Generable do struktury czyni ją kompatybilną z mechanizmami generowania. Struktura musi konformować do Identifiable dla poprawnej identyfikacji obiektów.
@Generable
struct ShoppingItem: Identifiable {
let id: String
let value: String
}
Opcjonalny parametr description precyzuje kontekst generowania, kierując LLM do relewantnych wyników.
@Generable(description: "Generuj elementy dla listy zakupów")
struct ShoppingItem: Identifiable {
let id: String
let value: String
}
Detalizacja właściwości przez @Guide
Makro @Guide stosuje się do poszczególnych właściwości, aby dostarczyć instrukcji LLM. Zapewnia to precyzyjną kontrolę nad zawartością pól bez zmiany logiki generowania modelu.
@Generable(description: "Generuj elementy dla listy zakupów")
struct ShoppingItem: Identifiable {
let id: String
@Guide(description: "Nazwa produktu do zakupu")
let value: String
}
Adnotacje @Guide przekazywane są do sesji modelu językowego jako dyrektywy, wpływające na parsowanie i walidację wyników. Jest to przydatne dla złożonych struktur z zagnieżdżonymi typami lub specyficznymi formatami danych.
Integracja z LanguageModelSession
Generowane modele integrują się w zadania asynchroniczne przez streamResponse. Metoda przyjmuje typ wyniku i prompt, zwracając strumień chunków.
private func generateShoppingList() {
let prompt = "Utwórz 15 elementów listy zakupów"
Task {
do {
let session = LanguageModelSession()
let response = session.streamResponse(
generating: [ShoppingItem].self
) {
prompt
}
isGenerating = true
for try await chunk in response {
self.shoppingList = chunk.compactMap {
guard let id = $0.id, let task = $0.value else {
return nil
}
return ShoppingItem(id: id, value: task)
}
}
isGenerating = false
} catch {
print(error.localizedDescription)
isGenerating = false
}
}
}
Przetwarzanie chunków obejmuje filtrowanie nil-wartości i aktualizację stanu UI. Zapewnia to responsywność interfejsu podczas generowania.
- Przetwarzanie strumieniowe: Chunki napływają asynchronicznie, minimalizując opóźnienia.
- Bezpieczeństwo typów: Kompilator sprawdza zgodność struktury z protokołami.
- Walidacja: Wyrażenia guard odsiewają niekompletne obiekty.
- Obsługa błędów: Try-catch przechwytuje awarie sesji.
Integracja SwiftUI dla generowania strumieniowego
W widokach SwiftUI modele wiązane są z @State. Przycisk wyzwala generowanie, blokując się na czas wykonania.
struct ContentView: View {
@State private var shoppingList: [ShoppingItem] = []
@State private var isGenerating: Bool = false
var body: some View {
List(shoppingList) { item in
Text(item.value)
}
.toolbar {
ToolbarItem(placement: .bottomBar) {
Button(
"Wygeneruj listę zakupów",
systemImage: "cart.fill.badge.plus"
) {
generateShoppingList()
}
.disabled(isGenerating)
}
}
}
private func generateShoppingList() {
// ...
}
}
UI aktualizuje się reaktywnie w miarę napływu danych. To demonstruje praktyczne zastosowanie dla dynamicznej treści w aplikacjach.
Co jest ważne
@Generablesyntetyzuje protokoły dla strumieniowego generowania z LLM do struktur Swift.@Guidedostarcza instrukcji na poziomie właściwości dla precyzyjnego parsowania wyników.- Integracja z
LanguageModelSessionwspiera asynchroniczne strumieniowanie z bezpieczeństwem typów. - Nadaje się do generowania list, formularzy i dynamicznych danych w aplikacjach SwiftUI.
- Redukuje szablonowy kod, zachowując kontrolę nad strukturą generowanych obiektów.
— Editorial Team
Brak komentarzy.