Makra @Generable a @Guide ve FoundationModels: automatizace generování modelů
Makra @Generable a @Guide ve frameworku FoundationModels umožňují generovat instance Swift struktur na základě výstupu jazykových modelů. Kompilátor syntetizuje protokoly a metody pro streamové zpracování odpovědí z LanguageModelSession. To snižuje boilerplate kód a zajišťuje typovou bezpečnost při práci se strukturovanými daty z LLM.
Použití @Generable na strukturu ji činí kompatibilní s mechanismy generování. Struktura musí konformovat Identifiable pro správnou identifikaci objektů.
@Generable
struct ShoppingItem: Identifiable {
let id: String
let value: String
}
Volitelný parametr description upřesňuje kontext generování, nasměrovává LLM k relevantním výsledkům.
@Generable(description: "Generovat položky pro nákupní seznam")
struct ShoppingItem: Identifiable {
let id: String
let value: String
}
Detaily vlastností pomocí @Guide
Makro @Guide se aplikuje na jednotlivé vlastnosti pro poskytnutí instrukcí LLM. To zajišťuje přesnou kontrolu nad obsahem polí bez změny logiky generování modelu.
@Generable(description: "Generovat položky pro nákupní seznam")
struct ShoppingItem: Identifiable {
let id: String
@Guide(description: "Název produktu pro nákup")
let value: String
}
Anotace @Guide se předávají do session jazykového modelu jako direktivy, ovlivňující parsování a validaci výstupů. To je užitečné pro složité struktury s vnořenými typy nebo specifickými formáty dat.
Integrace s LanguageModelSession
Generované modely se integrují do asynchronních úloh přes streamResponse. Metoda přijímá typ výsledku a prompt, vrací stream chunků.
private func generateShoppingList() {
let prompt = "Vytvořit 15 položek nákupního seznamu"
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
}
}
}
Zpracování chunků zahrnuje filtrování nil hodnot a aktualizaci stavu UI. To zajišťuje responzivitu rozhraní během generování.
- Streamové zpracování: Chunky přicházejí asynchronně, minimalizují zpoždění.
- Typová bezpečnost: Kompilátor kontroluje shodu struktury s protokoly.
- Validace: Guard výrazy odstraňují neúplné objekty.
- Zpracování chyb: Try-catch zachycuje selhání session.
SwiftUI integrace pro streamové generování
V pohledech SwiftUI se modely spojují s @State. Tlačítko spouští generování, blokuje se po dobu provádění.
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(
"Vygenerovat nákupní seznam",
systemImage: "cart.fill.badge.plus"
) {
generateShoppingList()
}
.disabled(isGenerating)
}
}
}
private func generateShoppingList() {
// ...
}
}
UI se aktualizuje reaktivně s příchodem dat. To demonstruje reálné použití pro dynamický obsah v aplikacích.
Co je důležité
@Generablesyntetizuje protokoly pro streamové generování z LLM do Swift struktur.@Guideposkytuje property-level instrukce pro přesné parsování výstupů.- Integrace s
LanguageModelSessionpodporuje asynchronní streaming s typovou bezpečností. - Vhodné pro generování seznamů, formulářů a dynamických dat v SwiftUI aplikacích.
- Snižuje šablonový kód, zachovává kontrolu nad strukturou generovaných objektů.
— Editorial Team
Zatím žádné komentáře.