-
Voici le framework Foundation Models
Découvrez comment exploiter le grand modèle de langage contenu dans l'appareil qui sous-tend Apple Intelligence ! Cette vue d'ensemble couvre tout, de la génération guidée pour générer des structures de données Swift et du streaming pour des expériences réactives, aux appels d'outils pour l'intégration des sources de données et aux séances pour la gestion du contexte. Cette séance n'a pas de prérequis.
Chapitres
- 0:00 - Introduction
- 2:05 - Le modèle
- 5:20 - Génération guidée
- 7:45 - Streaming instantané
- 11:28 - Appel d’outils
- 16:11 - Séance avec état
- 21:02 - Expérience de développement
Ressources
Vidéos connexes
WWDC25
- Code-along : Intégrez l’IA contenue sur l’appareil à votre app à l’aide du framework de Foundation Models
- Découvrir les frameworks d’apprentissage automatique et d’IA sur les plates-formes Apple
- Explorez la conception rapide et la sécurité pour les modèles de fondation sur l’appareil
- Présentation approfondie du framework de Foundation Models
-
Rechercher dans cette vidéo…
-
-
2:28 - Playground - Trip to Japan
import FoundationModels import Playgrounds #Playground { let session = LanguageModelSession() let response = try await session.respond(to: "What's a good name for a trip to Japan? Respond only with a title") } -
2:43 - Playground - Loop over landmarks
import FoundationModels import Playgrounds #Playground { let session = LanguageModelSession() for landmark in ModelData.shared.landmarks { let response = try await session.respond(to: "What's a good name for a trip to \(landmark.name)? Respond only with a title") } } -
5:32 - Creating a Generable struct
// Creating a Generable struct @Generable struct SearchSuggestions { @Guide(description: "A list of suggested search terms", .count(4)) var searchTerms: [String] } -
5:51 - Responding with a Generable type
// Responding with a Generable type let prompt = """ Generate a list of suggested search terms for an app about visiting famous landmarks. """ let response = try await session.respond( to: prompt, generating: SearchSuggestions.self ) print(response.content) -
6:18 - Composing Generable types
// Composing Generable types @Generable struct Itinerary { var destination: String var days: Int var budget: Float var rating: Double var requiresVisa: Bool var activities: [String] var emergencyContact: Person var relatedItineraries: [Itinerary] } -
9:20 - PartiallyGenerated types
// PartiallyGenerated types @Generable struct Itinerary { var name: String var days: [Day] } -
9:40 - Streaming partial generations
// Streaming partial generations let stream = session.streamResponse( to: "Craft a 3-day itinerary to Mt. Fuji.", generating: Itinerary.self ) for try await partial in stream { print(partial) } -
10:05 - Streaming itinerary view
struct ItineraryView: View { let session: LanguageModelSession let dayCount: Int let landmarkName: String @State private var itinerary: Itinerary.PartiallyGenerated? var body: some View { //... Button("Start") { Task { do { let prompt = """ Generate a \(dayCount) itinerary \ to \(landmarkName). """ let stream = session.streamResponse( to: prompt, generating: Itinerary.self ) for try await partial in stream { self.itinerary = partial } } catch { print(error) } } } } } -
11:00 - Property order matters
@Generable struct Itinerary { @Guide(description: "Plans for each day") var days: [DayPlan] @Guide(description: "A brief summary of plans") var summary: String } -
13:42 - Defining a tool
// Defining a tool import WeatherKit import CoreLocation import FoundationModels struct GetWeatherTool: Tool { let name = "getWeather" let description = "Retrieve the latest weather information for a city" @Generable struct Arguments { @Guide(description: "The city to fetch the weather for") var city: String } func call(arguments: Arguments) async throws -> ToolOutput { let places = try await CLGeocoder().geocodeAddressString(arguments.city) let weather = try await WeatherService.shared.weather(for: places.first!.location!) let temperature = weather.currentWeather.temperature.value let content = GeneratedContent(properties: ["temperature": temperature]) let output = ToolOutput(content) // Or if your tool’s output is natural language: // let output = ToolOutput("\(arguments.city)'s temperature is \(temperature) degrees.") return output } } -
15:03 - Attaching tools to a session
// Attaching tools to a session let session = LanguageModelSession( tools: [GetWeatherTool()], instructions: "Help the user with weather forecasts." ) let response = try await session.respond( to: "What is the temperature in Cupertino?" ) print(response.content) // It’s 71˚F in Cupertino! -
16:30 - Supplying custom instructions
// Supplying custom instructions let session = LanguageModelSession( instructions: """ You are a helpful assistant who always \ responds in rhyme. """ ) -
17:46 - Multi-turn interactions
// Multi-turn interactions let session = LanguageModelSession() let firstHaiku = try await session.respond(to: "Write a haiku about fishing") print(firstHaiku.content) // Silent waters gleam, // Casting lines in morning mist— // Hope in every cast. let secondHaiku = try await session.respond(to: "Do another one about golf") print(secondHaiku.content) // Silent morning dew, // Caddies guide with gentle words— // Paths of patience tread. print(session.transcript) // (Prompt) Write a haiku about fishing // (Response) Silent waters gleam... // (Prompt) Do another one about golf // (Response) Silent morning dew... -
18:22 - Gate on isResponding
import SwiftUI import FoundationModels struct HaikuView: View { @State private var session = LanguageModelSession() @State private var haiku: String? var body: some View { if let haiku { Text(haiku) } Button("Go!") { Task { haiku = try await session.respond( to: "Write a haiku about something you haven't yet" ).content } } // Gate on `isResponding` .disabled(session.isResponding) } } -
18:39 - Using a built-in use case
// Using a built-in use case let session = LanguageModelSession( model: SystemLanguageModel(useCase: .contentTagging) ) -
19:19 - Content tagging use case - 1
// Content tagging use case @Generable struct Result { let topics: [String] } let session = LanguageModelSession(model: SystemLanguageModel(useCase: .contentTagging)) let response = try await session.respond(to: ..., generating: Result.self) -
19:35 - Content tagging use case - 2
// Content tagging use case @Generable struct Top3ActionEmotionResult { @Guide(.maximumCount(3)) let actions: [String] @Guide(.maximumCount(3)) let emotions: [String] } let session = LanguageModelSession( model: SystemLanguageModel(useCase: .contentTagging), instructions: "Tag the 3 most important actions and emotions in the given input text." ) let response = try await session.respond(to: ..., generating: Top3ActionEmotionResult.self) -
19:56 - Availability checking
// Availability checking struct AvailabilityExample: View { private let model = SystemLanguageModel.default var body: some View { switch model.availability { case .available: Text("Model is available").foregroundStyle(.green) case .unavailable(let reason): Text("Model is unavailable").foregroundStyle(.red) Text("Reason: \(reason)") } } } -
22:13 - Encodable feedback attachment data structure
let feedback = LanguageModelFeedbackAttachment( input: [ // ... ], output: [ // ... ], sentiment: .negative, issues: [ LanguageModelFeedbackAttachment.Issue( category: .incorrect, explanation: "..." ) ], desiredOutputExamples: [ [ // ... ] ] ) let data = try JSONEncoder().encode(feedback)
-
-
- 0:00 - Introduction
Le framework de Foundation Models vous donne accès à un grand modèle de langage local sur macOS, iOS, iPadOS et visionOS. Il permet de créer des fonctionnalités personnalisées, comme des suggestions de recherche, des itinéraires ou des dialogues au sein du jeu, tout en préservant la confidentialité, les données restant sur l’appareil et étant traitées hors ligne. Le framework est optimisé pour la génération de contenu, le résumé de texte et l’analyse des saisies utilisateur. Pour accompagner les développeurs, Apple a préparé une série de vidéos couvrant une présentation du framework, la génération guidée, les API de streaming, l’appel d’outils, la gestion multi-turn et l’intégration fluide dans l’écosystème des développeurs Apple.
- 2:05 - Le modèle
La nouvelle fonctionnalité Playgrounds de Xcode est idéale pour expérimenter les requêtes envoyées au grand modèle de langage local. En quelques lignes de code, vous pouvez tester des prompts et voir les réponses du modèle en temps réel. Le modèle local, avec ses 3 milliards de paramètres, est optimisé pour le résumé, l’extraction et la classification, mais pas pour la connaissance générale ni le raisonnement avancé. Décomposez les tâches en petits morceaux pour maximiser son efficacité. La génération guidée, composant central du framework FoundationModels, facilite l’intégration des résultats du modèle dans les apps. Elle permet de créer des fonctionnalités plus fiables grâce à une approche structurée, dépassant les limites des formats comme JSON ou CSV générés par le modèle.
- 5:20 - Génération guidée
Avec l’importation de FoundationModels, deux nouvelles macros, @Generable et @Guide sont introduites. @Generable permet de décrire des types pour des instances générées par le modèle, pouvant être construites à partir de types primitifs, tableaux, ou types composés et récursifs. @Guide fournit des descriptions en langage naturel des propriétés et contrôle les valeurs générées, garantissant la validité structurelle via un décodage contraint. Cette approche de génération guidée simplifie les prompts, améliore la précision du modèle et accélère l’inférence. Elle vous permet de recevoir directement des objets Swift riches depuis le modèle, facilement exploitables dans des vues, sans avoir à spécifier le format de sortie dans le prompt.
- 7:45 - Streaming instantané
Le framework FoundationModels diffère du streaming delta traditionnel basé sur les jetons pour les grands modèles de langage. Il diffuse plutôt des instantanés (des réponses partiellement générées avec des propriétés optionnelles) plus robustes et pratiques pour gérer des sorties structurées. Cette approche exploite la macro @Generable, qui produit un type PartiallyGenerated reflétant la structure extérieure avec des propriétés facultatives. La méthode streamResponse renvoie une séquence asynchrone de ces types partiellement générés, permettant une intégration fluide avec des frameworks déclaratifs comme SwiftUI. Utilisez les animations et les transitions SwiftUI pour améliorer l’expérience utilisateur lors du streaming. Gérer l’identité des vues et l’ordre des propriétés est crucial pour un résultat optimal.
- 11:28 - Appel d’outils
L’appel d’outils permet à un modèle d’IA d’exécuter du code personnalisé dans une app, augmentant ses capacités. Cette fonctionnalité permet au modèle de décider seul quand utiliser des outils externes pour récupérer des infos ou effectuer des actions, comme rechercher des restaurants, des hôtels ou la météo, selon le contexte de la demande. Le modèle peut s’intégrer à diverses sources fiables, comme MapKit, pour fournir des infos précises et à jour. Ce processus implique que le modèle génère des appels d’outils, automatiquement exécutés par le framework FoundationModels, dont les résultats sont ensuite intégrés à la transcription de la conversation pour que le modèle puisse les utiliser dans sa réponse finale.
- 16:11 - Séance avec état
Le framework de Foundation Models permet des sessions avec état avec un modèle généraliste local. Vous pouvez donner des instructions personnalisées pour guider le style et la concision des réponses, mais cela reste facultatif. Vous définissez vos instructions, distinctes des prompts utilisateur, et le modèle est entraîné à privilégier les instructions pour renforcer la sécurité. Pendant une session, le modèle garde le contexte des échanges, ce qui lui permet de comprendre et de faire référence aux messages précédents. La propriété transcript peut être utilisée pour inspecter ces interactions. Le framework inclut des cas d’usage spécialisés, comme l’adaptateur de balisage, qui gère la création de tags, l’extraction d’entités et la détection de sujets. Personnalisez ces adaptateurs selon vos besoins. Avant de créer une session, vérifiez que le modèle est disponible sur un appareil Apple Intelligence dans une zone géographique prise en charge. Une bonne gestion des erreurs est essentielle pour gérer les violations de sécurité, les langues non prises en charge et les dépassements de contexte.
- 21:02 - Expérience de développement
L’outil Playgrounds permet d’itérer rapidement les prompts des grands modèles de langage dans tous types de projets d’app. Le nouveau modèle de profilage d’Instruments optimise la latence en repérant les points à améliorer dans les requêtes au modèle et la longueur des prompts. Nous vous encourageons à envoyer vos commentaires via l’Assistant d’évaluation.