Skip to main content
Le prompt est la demande que vous envoyez au modèle pour une requête donnée. Avec Foundation Models, vous pouvez soit envoyer une simple chaîne, soit construire un Prompt de façon plus structurée. Si votre sortie est instable, le problème vient souvent d’un prompt trop vague, pas du framework.

Prompt vs Instructions

Les deux servent à guider le modèle, mais ils ne jouent pas le même rôle :
QuestionPromptInstructions
Quand ça changeÀ chaque requêteQuand le rôle ou la feature change
Ce que vous y mettezLa demande du moment, le contexte local, les variables UILe ton, le rôle, le format stable
Qui l’alimenteSouvent l’action utilisateurPresque toujours votre code produit
Le bon réflexe est simple : le prompt contient ce qui varie, les instructions contiennent ce qui doit rester stable.

La forme la plus simple

import FoundationModels

let session = LanguageModelSession()
let response = try await session.respond(
    to: "Résume ce texte en trois points."
)
Cette forme suffit pour :
  • tester vite
  • explorer un comportement
  • valider une idée de fonctionnalité

Prompt pour construire une requête plus propre

Quand vous devez injecter du contexte, des variables ou des conditions, utilisez Prompt :
import FoundationModels

let userLevel = "débutant"
let feature = "sortie structurée"

let prompt = Prompt {
    "Tu aides un développeur Swift."
    "Niveau de l'utilisateur :"
    userLevel
    "Sujet :"
    feature
    "Explique en 3 points maximum."
}
Le builder vous évite de concaténer de grosses chaînes fragiles.

Ajouter des conditions

let wantsExamples = true

let prompt = Prompt {
    "Explique la différence entre MLX et Foundation Models."

    if wantsExamples {
        "Ajoute un exemple concret pour une app Swift."
    }

    "Réponds de façon concise."
}
C’est particulièrement utile quand le prompt dépend de l’état de l’interface.

Ajouter du contexte sans bruit

Le bon réflexe est d’ajouter uniquement le contexte qui influence réellement la réponse. Exemple utile :
let prompt = Prompt {
    "Contexte produit :"
    "L'app aide des développeurs iOS à choisir entre plusieurs approches IA."
    "Question :"
    "Quand faut-il préférer Foundation Models à un backend local ?"
    "Réponds avec des critères de décision."
}
Exemple moins utile :
  • répéter des instructions déjà présentes dans la session
  • injecter un long historique non utilisé
  • mélanger plusieurs objectifs en une seule requête

Quelques règles qui améliorent presque toujours le résultat

  1. Dites ce que vous voulez obtenir, pas seulement le sujet.
  2. Donnez le niveau de détail attendu.
  3. Précisez le format de sortie si vous affichez directement le texte.
  4. Évitez les demandes trop larges si l’UI attend une réponse courte.
Par exemple, préférez :
Explique LoRA en 3 puces pour un développeur Swift débutant.
à :
Parle-moi de LoRA.

respond ou streamResponse

Pour un prompt donné, vous avez deux grandes options :
  • respond(to:) si vous attendez le résultat complet
  • streamResponse(to:) si vous voulez afficher la réponse progressivement
Vous verrez le streaming plus en détail dans la page dédiée.

Quand toucher aux GenerationOptions

Ne commencez pas par là. Touchez à GenerationOptions quand votre prompt est déjà correct et que vous voulez contrôler :
  • la stabilité de la réponse
  • sa longueur maximale
  • son niveau de variation
import FoundationModels

let session = LanguageModelSession()

let options = GenerationOptions(
    sampling: .greedy,
    temperature: 0.2,
    maximumResponseTokens: 180
)

let response = try await session.respond(
    to: "Résume ce ticket en 4 points maximum.",
    options: options
)
Ici, sampling: .greedy et une température basse poussent vers une réponse plus prévisible. maximumResponseTokens évite qu’une réponse courte devienne un mini-article.

Comment lire les modes de sampling

  • .greedy choisit toujours le token le plus probable. C’est le mode le plus stable.
  • .random(top:seed:) pioche parmi un nombre fixe de tokens probables. C’est utile si vous voulez un peu de variété, mais garder une réponse cadrée.
  • .random(probabilityThreshold:seed:) pioche dans un ensemble de tokens dont la probabilité reste au-dessus d’un seuil. Le nombre de candidats varie selon le contexte.
Les mêmes options s’appliquent aussi à streamResponse(to:options:).

Repère avancé : tokenCount(for:)

Apple documente aussi tokenCount(for:) sur SystemLanguageModel pour mesurer le poids d’instructions. C’est utile quand vous ajustez finement votre contexte, mais Apple l’indique en 26.4 beta. Pour un premier design produit, ne basez pas votre feature sur ce point. Commencez par des prompts courts, puis mesurez seulement si vous avez un vrai problème de contexte.

Quand passer à la sortie structurée

Si votre app a besoin de champs stables comme :
  • un titre
  • une liste
  • une note
  • un niveau de priorité
ne parsez pas du texte brut si vous pouvez l’éviter. Passez à Guided Generation.