Powrót do strony głównej

Makra @Generable @Guide FoundationModels Swift

Makra @Generable i @Guide w FoundationModels automatyzują generowanie struktur Swift z modeli językowych. Obsługa sesji strumieniowych, instrukcji property i integracji SwiftUI zapewnia bezpieczeństwo typów i responsywność UI. Przykłady kodu demonstrują praktyczne zastosowanie.

Generowanie modeli Swift z @Generable i @Guide
Advertisement 728x90

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.

Google AdInline article slot
@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.

Google AdInline article slot
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.

Google AdInline article slot

Co jest ważne

  • @Generable syntetyzuje protokoły dla strumieniowego generowania z LLM do struktur Swift.
  • @Guide dostarcza instrukcji na poziomie właściwości dla precyzyjnego parsowania wyników.
  • Integracja z LanguageModelSession wspiera 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

Advertisement 728x90

Czytaj dalej