Foundation Models : L'IA On-Device d'Apple pour les Développeurs
Publié le · 28 min
Avec iOS 26, Apple ouvre enfin les portes de son modèle de langage embarqué aux développeurs tiers. Le Framework Foundation Models permet d'intégrer des capacités d'intelligence artificielle directement dans vos applications, sans serveur distant, sans coût d'inférence, et avec une confidentialité totale des données utilisateur.
Ce guide explore en profondeur cette nouvelle API : de la simple génération de texte jusqu'aux architectures complexes avec Tool Calling, en passant par la génération guidée type-safe qui fait la force de ce framework.
Ce que vous allez apprendre
Cet article couvre l'ensemble du Framework Foundation Models :
- Configuration et vérification de la disponibilité du modèle
- Sessions de langage et génération de texte
- Génération guidée avec les macros
@Generableet@Guide
- Génération guidée avec les macros
- Tool Calling pour étendre les capacités du modèle
- Gestion des erreurs et des guardrails de sécurité
- Construction d'un assistant conversationnel complet en SwiftUI
Prérequis et compatibilité
Appareils supportés
Le Framework Foundation Models s'appuie sur Apple Intelligence, disponible uniquement sur les appareils équipés d'une Neural Engine suffisamment puissante :
| Plateforme | Appareils compatibles |
|---|---|
| iPhone | iPhone 15 Pro et ultérieurs |
| iPad | iPad avec puce M1 et ultérieurs |
| Mac | Mac avec Apple Silicon (M1+) |
| Vision Pro | Tous les modèles |
Configuration requise
Trois conditions doivent être réunies pour utiliser le framework :
Le modèle (~3 milliards de paramètres) pèse environ 3 Go et se télécharge automatiquement après l'activation d'Apple Intelligence. Ce téléchargement s'effectue en arrière-plan et peut prendre plusieurs minutes selon la connexion.
Premiers pas : LanguageModelSession
Session simple
La classe LanguageModelSession est le point d'entrée principal du framework. Elle gère la communication avec le modèle et maintient l'historique de la conversation :
Cette approche attend que le modèle génère l'intégralité de sa réponse avant de la retourner. Pour des réponses longues, l'utilisateur peut avoir l'impression que l'application ne répond plus.
Streaming des réponses
Pour une expérience utilisateur fluide, utilisez streamResponse qui retourne un AsyncThrowingStream :
Le streaming permet d'afficher le texte caractère par caractère, exactement comme les interfaces de chat modernes. L'utilisateur voit la réponse se construire en temps réel.
Instructions système
Les instructions définissent le comportement et la personnalité du modèle pour toute la durée de la session :
Les instructions sont plus puissantes qu'un simple préfixe de prompt. Le modèle les considère comme des directives prioritaires et les applique de manière cohérente tout au long de la conversation.
Génération guidée : @Generable et @Guide
La génération guidée est la fonctionnalité phare du Framework Foundation Models. Elle permet d'obtenir des réponses structurées sous forme de types Swift natifs, sans parsing JSON fragile.
Le macro @Generable
Annotez vos structures avec @Generable pour que le modèle puisse les instancier directement :
Le modèle utilise le "constrained decoding" pour garantir que la sortie respecte exactement la structure définie. Pas de JSON malformé, pas de champs manquants.
Contraintes avec @Guide
Le macro @Guide permet d'affiner le comportement de génération pour chaque propriété :
Les contraintes disponibles incluent :
| Contrainte | Usage | Exemple |
|---|---|---|
description |
Guide sémantique | "Nom du personnage" |
.range() |
Plage numérique | .range(1...100) |
.anyOf() |
Valeurs énumérées | .anyOf(["A", "B", "C"]) |
.count() |
Taille de tableau | .count(3...5) |
.regex() |
Pattern de string | .regex(/[A-Z]{2}-\d{4}/) |
Ordre des propriétés
L'ordre de déclaration des propriétés est crucial. Le modèle génère les valeurs séquentiellement, de haut en bas :
Si vous placez summary avant mainTopics, le modèle ne pourra pas s'appuyer sur les sujets identifiés pour construire le résumé.
Génération avec streaming
Combinez génération guidée et streaming pour une UX optimale :
Le type PartiallyGenerated expose chaque propriété comme optionnelle, permettant d'afficher les valeurs au fur et à mesure de leur génération.
Tool Calling : Étendre les capacités du modèle
Le modèle embarqué a une connaissance limitée (données d'entraînement jusqu'à 2023) et aucun accès aux données externes. Le Tool Calling permet de combler ces lacunes en lui donnant accès à vos APIs.
Anatomie d'un Tool
Un Tool implémente le protocole Tool avec les éléments suivants :
- description : guide le modèle sur quand utiliser l'outil
- Arguments : struct
@GenerableetSendabledéfinissant les paramètres attendus
- Arguments : struct
- func call() : implémentation retournant un
String(ou tout typePromptRepresentable)
- func call() : implémentation retournant un
Le name est auto-généré depuis le nom de la struct/class et peut être omis.
Enregistrement et utilisation
Les tools sont passés à la session lors de sa création :
Exemple complet : Tool avec HealthKit
Voici un exemple réaliste intégrant HealthKit pour les données de santé :
Chaînage de tools
Le modèle peut appeler plusieurs tools en séquence pour répondre à une requête complexe :
Le framework gère automatiquement l'insertion des résultats des tools dans le transcript de la conversation.
Gestion des erreurs
Le Framework Foundation Models définit des erreurs spécifiques via GenerationError :
| Erreur | Description |
|---|---|
guardrailViolation |
Contenu bloqué par les filtres de sécurité |
exceededContextWindowSize |
Conversation dépassant 4096 tokens |
rateLimited |
Trop de requêtes ou app en arrière-plan |
unsupportedLanguageOrLocale |
Langue non supportée |
concurrentRequests |
Tentative d'envoi pendant une génération |
assetsUnavailable |
Modèle supprimé ou espace disque insuffisant |
unsupportedGuide |
@Guide avec pattern non supporté |
decodingFailure |
Échec de désérialisation du type Generable |
refusal |
Le modèle refuse de répondre (explication possible via .explanation) |
Les Guardrails en détail
Apple applique des filtres de sécurité stricts et non désactivables. Certains contenus déclenchent systématiquement une violation :
- Contenu violent ou explicite
- Demandes liées à des activités illégales
- Certains sujets politiques sensibles
- Informations médicales ou juridiques critiques
Ces guardrails sont parfois trop restrictifs (un article de presse sur un décès peut être bloqué). Apple travaille à améliorer ces faux positifs — signalez-les via Feedback Assistant.
Limitations à connaître
Caractéristiques du modèle
| Aspect | Valeur | Implication |
|---|---|---|
| Paramètres | ~3 milliards | Moins puissant que GPT-4 ou Claude |
| Context window | 4096 tokens | Conversations limitées en longueur |
| Quantization | 2-bit | Optimisé pour la mémoire, pas la précision |
| RAM utilisée | ~3 Go | Impact sur les apps gourmandes en mémoire |
Ce que le modèle ne fait PAS bien
Apple recommande d'éviter ces cas d'usage :
- Génération de code : Résultats inconsistants et souvent incorrects
- Calculs mathématiques : Erreurs fréquentes sur les opérations complexes
- Connaissance factuelle récente : Données d'entraînement jusqu'à 2023
- Conversations générales : Non conçu comme chatbot généraliste
Le modèle excelle en revanche pour :
- Summarization et extraction d'entités
- Génération de contenu créatif court
- Classification et tagging
- Compréhension de texte structuré
Optimisation des performances
Préchauffage du modèle
Le chargement initial du modèle prend quelques secondes. Utilisez prewarm() pour anticiper. Cette méthode est synchrone et ne lance pas d'erreur — elle retourne immédiatement et le chargement s'effectue en arrière-plan :
Appelez prewarm() dès que vous anticipez l'utilisation du modèle (ex: quand l'utilisateur ouvre l'écran de chat).
Gestion de la mémoire
Avec ~3 Go de RAM utilisés par le modèle, surveillez l'empreinte mémoire :
Limitation des propriétés Generable
Chaque propriété d'un type @Generable est générée séquentiellement. Plus il y a de propriétés, plus la génération est lente :
Concevez vos types Generable avec uniquement les propriétés que vous afficherez réellement.
Exemple complet : Mini Chat Conversationnel
Voici une implémentation complète d'un assistant conversationnel avec SwiftUI et iOS 26 :
Modèle de données
ViewModel avec session managée
Vue principale du Chat
Cette implémentation gère :
- La vérification de disponibilité du modèle
- Le streaming des réponses en temps réel
- La gestion complète des erreurs
- L'historique de conversation maintenu par la session
- Le préchauffage pour des temps de réponse optimaux
Pour aller plus loin
Le Framework Foundation Models ouvre des possibilités considérables pour les applications iOS. Il ne remplace pas les modèles cloud pour les tâches complexes, mais excelle pour les fonctionnalités de qualité de vie qui fonctionnent offline et respectent la vie privée.