Recherche12 minSource inspectée 26 juillet 2026

De @Generable à SwiftData : un pipeline de qualité de devis sur l'appareil

L'architecture de production derrière le générateur de modèles de base de RiseHush : streaming typé, rejet en couches, outils locaux, persistance sécurisée pour les acteurs et chemins d'échec qui comptent.

De @Generable à SwiftData : un pipeline de qualité de devis sur l'appareil — RiseHush editorial illustration — risehush.comrisehush.com

La contrainte n’était pas « faire rédiger un devis à un modèle »

Une seule invite peut produire une phrase. Il ne peut pas déterminer si le modèle du système est prêt, maintenir une interface réactive, distinguer une ligne générée d'une citation historique, empêcher un quasi-doublon d'entrer dans une bibliothèque ou laisser le produit utile lorsque l'inférence échoue. Ces décisions environnantes sont la caractéristique.

RiseHush n'a pas de backend d'inférence. Sur les appareils Apple Intelligence pris en charge, l'application envoie une invite limitée au modèle de langage du système Apple sur l'appareil et stocke un résultat accepté dans SwiftData local. La page d'intelligence produit explique ce qu'une personne voit ; cet article documente le chemin de mise en œuvre et ses limites. La propre API de disponibilité d’Apple reste l’autorité permettant de déterminer si le modèle peut fonctionner maintenant.

« Reproductible » signifie ici qu'un autre ingénieur peut répéter la matrice de préparation, les montages de rejet, les chemins d'expiration et les contrôles de persistance. Cela ne signifie pas qu’un modèle de langage non déterministe renverra la même prose bit par bit. Cette page rapporte l'architecture source inspectée, et non de nouvelles mesures de qualité des appareils physiques ; aucun résultat de référence n'est déduit d'un script de test.

  • Inférence:Modèle de langage système d'Apple, sur l'appareil.
  • Contrat de sortie :Un type Swift guidé, puis validation déterministe.
  • Stockage: lignes SwiftData localesmarquées comme générées.
  • Chemin réseau :Pas de serveur de génération RiseHush ni de modèle tiers.

[1][2]

De l'invite à la bibliothèque : le chemin de production

Il s'agit de l'architecture derrière le générateur de devis sur l'appareil de RiseHush, telle qu'inspectée dans la source actuelle de l'application. Il documente les portes, les chemins de défaillance et les vérifications qu'un développeur peut reproduire ; il ne s’agit pas d’un modèle de référence ni d’une affirmation selon laquelle chaque projet est bon.

La commande est délibérée. Des vérifications bon marché et explicables sont effectuées avant toute autre inférence ; aucune écriture n'a lieu tant que chaque porte requise n'a pas accepté le candidat. Une réponse diffusée en continu est un texte d'interface provisoire et non un devis enregistré.

  1. Prouver que vous êtes prêt

    Le service vérifie la disponibilité du modèle de système et les paramètres régionaux demandés avant de créer une session. L’éligibilité des appareils, l’état d’Apple Intelligence, la préparation des actifs de modèle et la prise en charge linguistique sont des résultats distincts.

  2. Contraindre le brouillon

    Un type @Generable Swift demande une phrase originale, normalement de 10 à 16 mots et jamais plus de 18, sans attribution, démarque, hashtags, emoji ou guillemets d'habillage.

  3. Diffusez l'acteur principal

    Une nouvelle LanguageModelSession est préchauffée pour la demande. Des instantanés structurés partiels peuvent mettre à jour l'interface tandis que la boucle Foundation Models reste hors de l'acteur principal.

  4. Rejeter les échecs évidents

    Avant toute évaluation basée sur un modèle, une porte déterministe vérifie les limites de phrases et de mots, l'accord linguistique, les fragments interdits, la ponctuation d'habillage et les modèles de clichés multilingues.

  5. Tester la nouveauté et la qualité

    Lorsque des intégrations de comparaison sont disponibles, les survivants sont confrontés à une vérification sémantique quasi-dupliquée, puis à un juge guidé séparé et à un score de distinction. Un brouillon diffusé en continu qui ne respecte pas un seuil requis est rejeté plutôt que conservé silencieusement.

  6. Persistez le survivant

    Les métadonnées sont calculées en dehors de l'acteur principal. L'insertion SwiftData revient à l'acteur principal, étiquette la ligne comme étant générée et non du domaine public, et annule les insertions transitoires si l'enregistrement échoue.

  7. Réutiliser l'état local

    Les surfaces de l'application et du système consomment le devis stocké. Les widgets lisent les données persistantes ; ils ne réveillent pas le modèle de langage dans une chronologie d'extension.

[2][3][4][5]

La sortie guidée rétrécit la forme ; le code possède toujours la politique

Le brouillon est un type Swift marqué@Generable. Son guide demande une phrase originale, normalement de 10 à 16 mots avec un maximum d'invites de 18, et interdit l'attribution, les guillemets, les hashtags, les emoji, les démarques et les sauts de ligne. Les options de production utilisent une température de 0,7 et un plafond de 40 jetons : suffisamment d'espace pour le wrapper structuré et la phrase courte, sans inviter à une sortie de longueur de paragraphe.

Cela ne rend pas la validation facultative. Apple décrit la génération guidée comme un moyen de produire des données Swift structurées, et non comme une garantie que le contenu respecte toutes les règles du produit. RiseHush traite donc la valeur typée du modèle comme un brouillon non fiable. L'esquisse abrégée ci-dessous préserve l'ordre et les seuils de production tout en omettant les détails d'invite et de persistance spécifiques à l'application.

Architecture sketch — abridged from the current app sourceswift
@Generable
private struct GeneratedQuoteDraft {
    @Guide(description: "One original sentence; 10–16 words; no attribution")
    var text: String
}

guard availability(locale: locale) == .available else {
    throw GenerationError.unavailable
}

let stream = session.streamResponse(
    to: prompt,
    generating: GeneratedQuoteDraft.self,
    options: generationOptions
)

for try await snapshot in stream {
    yield(snapshot.content.text)          // interface update
}

guard deterministicGate.passes(text, locale: locale),
      await noveltyGate.isNearDuplicate(text) == false,
      await judge.score(text).overall >= 6,
      distinctiveness.score(text).overall >= 5
else {
    throw GenerationError.noCandidate
}

return try persistAsGeneratedQuote(text)

This is explanatory code, not a drop-in package. It intentionally omits app-private prompt construction, error mapping, and SwiftData model definitions.

[4][5]

Pourquoi un deuxième passage n'était toujours pas suffisant

La première couche de rejet est déterministe : sortie vide, résidus d'invite interdits, guillemets, limites de mots et de phrases, désaccord linguistique et montages de clichés multilingues. Un filtre de goût Core ML local peut ajouter un signal appris pour l'anglais, l'allemand, l'espagnol, le français, l'italien et le portugais ; il est délibérément ignoré plutôt que mal appliqué en dehors de ces paramètres régionaux calibrés.

Ensuite, lorsque des intégrations de comparaison sont disponibles, une porte de nouveauté sémantique compare le candidat avec un catalogue local limité et rejette les quasi-doublons à un seuil de similarité cosinus de 0,90. Si le catalogue est vide ou si une intégration ne peut pas être produite, cette couche passe au lieu de prétendre que la nouveauté a été prouvée. Une nouvelle session Foundation Models marque ensuite la qualité globale, l’originalité et la chaleur. Ce juge est une session distincte utilisant le même modèle de système – pas un modèle indépendant ni un examen humain. S'il n'est pas disponible, refuse ou ne peut pas produire de sortie structurée, un score déterministe fournit une solution de repli limitée.

Enfin, un score de distinction récompense l’imagerie concrète, l’action, la spécificité émotionnelle et l’action tout en pénalisant les formules et les ancrages négatifs récents. L'acceptation nécessite actuellement une note du juge d'au moins 6 et un caractère distinctif d'au moins 5. Il s'agit de seuils de produits et non d'une preuve d'originalité ou de sécurité globale.

Les décisions de production et les échecs que chacune évite
PréoccupationMise en œuvrePourquoi ça existe
DisponibilitéVérifiez l'état du modèle et la prise en charge des paramètres régionaux avant chaque chemin de génération ; enregistrer pourquoi la préparation a échoué.« Compatible Apple Intelligence » ne signifie pas que le modèle est prêt maintenant ou qu’il prend en charge la langue active du visiteur.
StructureUtilisez @Generable et @Guide pour le brouillon de forme au lieu d'analyser une réponse JSON inventée.Le type Swift est le contrat de sortie, tandis que le code déterministe possède toujours les règles de produit.
ConcurrenceGardez le streaming de modèles et le travail de métadonnées éloignés de l'acteur principal ; recoupez uniquement pour la persistance du modèle local.Le tour des modèles de base peut prendre quelques secondes, tandis que les objets du modèle SwiftData restent liés à l'acteur.
QualitéDisposez des règles déterministes, de la nouveauté sémantique, un juge distinct et des seuils de distinction.La génération guidée rétrécit la forme ; cela ne garantit pas la vérité, l’originalité, le ton ou la qualité du produit.
LatencePréchauffez uniquement sur les surfaces de premier plan capables de générer et appliquez des budgets finis : 45 secondes dans l'interface, 20 pour Siri, 120 pour un pool d'arrière-plan.Une demande adressée à l'utilisateur ne doit pas attendre indéfiniment les actifs, les limites de taux ou un changement de modèle lent.
PersistanceStockez les lignes acceptées sous forme d'enregistrements générés localement, jamais sous forme de citations d'auteurs du domaine public ; revenir en arrière après un échec de sauvegarde.L’écriture générée nécessite une provenance durable et ne doit jamais hériter de l’attribution d’une personne réelle.

[7]

Gardez le modèle éloigné de l'acteur principal

Le service public renvoie les objets du modèle SwiftData, de sorte que ses points d'entrée restent liés à l'acteur principal. Ce n’est pas le cas de la boucle de réponse coûteuse des Foundation Models. Chaque requête possède une nouvelleLanguageModelSession; le streaming et le calcul des métadonnées s'éloignent de l'acteur principal, avec de petits sauts explicites pour les signaux d'invite et la persistance liés à l'acteur.

Le streaming produit des instantanés structurés partiels pour l'interface, puis transmet le texte final via les mêmes barres de porte, de nouveauté, de juge et de distinction que le chemin du pool. Un flux terminé traverse les acteurs par identifiant persistant plutôt que de déplacer un modèle SwiftData non-Sendable. L'appelant résout cet identifiant sur son propre acteur.

Seul le texte accepté est inséré. L'enregistrement est créé sous le nom RiseHush, marquésource = .generatedetisPublicDomain = false, étiqueté avec ses paramètres régionaux et enrichi de métadonnées calculées localement. Si l'enregistrement échoue, les insertions transitoires sont supprimées avant le retour de l'erreur.

[5][10]

Mettez à la terre le concierge avec trois outils en lecture seule

Ask RiseHush n’est pas autorisé à inventer l’état de la bibliothèque d’une personne. L'API d'appel d'outils d'Apple permet à une session de demander des fonctions d'application restreintes et d'incorporer les données renvoyées. L'application expose trois outils limités en lecture seule ; aucun n’atteint un serveur RiseHush.

Les arguments des outils et les tailles de sortie sont limités. La recherche de devis enregistré renvoie au maximum huit résultats, la recherche dans le catalogue au maximum cinq et la sortie totale de l'outil est plafonnée. L'outil de devis enregistrés peut renvoyer les éléments correspondants récents, mais il n'accepte pas de plage de calendrier. Le produit ne doit donc pas promettre que le modèle peut répondre « qu'ai-je enregistré la semaine dernière ? »

  • Recherche de devis catalogue

    Recherche dans le catalogue de devis groupé par humeur, catégorie ou thème. Il ne demande pas au modèle d'inventer une source.

  • Recherche de devis enregistrée

    Recherche les citations enregistrées et préférées de la personne dans le stockage local.

  • Statut de séquence

    Lit la séquence d'inspiration locale afin que Ask RiseHush puisse répondre à une question personnelle limitée.

[6]

Le comportement en cas de défaillance fait partie de l'architecture

La disponibilité n'est pas une valeur booléenne. Un appareil compatible peut toujours avoir Apple Intelligence désactivé, la préparation des actifs du modèle ou une langue que le modèle du système ne prend pas en charge. La génération du runtime peut également refuser, heurter un garde-fou, dépasser le contexte, être limitée, rencontrer une requête simultanée, échouer à l'analyse structurée ou expirer.

RiseHush mappe ces cas au comportement d'un produit fini. La génération de premier plan a un budget de 45 secondes, Siri de 20 secondes et la génération de pool d'arrière-plan de 120 secondes. La bibliothèque organisée reste la solution de repli honnête ; l'application ne stocke jamais la prose d'espace réservé comme si un modèle avait réussi.

Branche observée et comportement du produit qui en résulte
SignalComportement
Appareil non éligible ou Apple Intelligence désactivéeLa génération n'est pas disponible. La bibliothèque organisée existante reste utilisable sans prétendre qu'une réponse modèle s'est produite.
Les ressources du modèle ne sont pas prêtesLa demande signale un état non prêt. Une fois les actifs du modèle Apple présents, l’inférence elle-même ne nécessite pas de serveur RiseHush.
Paramètres régionaux demandés non pris en chargeUn chemin capable de traduire peut entièrement accéder à un brouillon anglais et le traduire localement là où le cadre de traduction d'Apple prend en charge la paire ; sinon, l'application conserve la solution de secours organisée. Le texte traduit est vérifié pour un résultat non vide mais ne répète pas la pile complète de portes, de nouveautés et de juges de la langue cible.
Erreur de garde-fou, de refus, de limite de débit, d'analyse, de contexte, de concurrence ou de délai d'attenteLe chemin de streaming n’effectue pas de nouvelle tentative en ligne illimitée. Il ne renvoie aucun candidat généré et laisse le produit retomber proprement.
Le brouillon manque un seuil de qualitéLe chemin du pool fini peut essayer un autre projet ; le flux en direct s'interrompt plutôt que d'animer une deuxième réponse. Le texte rejeté n'est pas enregistré.
La sauvegarde SwiftData échoueLe service supprime ses insertions transitoires et fait apparaître un échec de persistance au lieu de laisser un devis à moitié enregistré.

[2][3][7]

Un protocole de reproductibilité, sans résultats inventés

Le protocole ci-dessous sépare l’inspection à la source de la preuve sur les appareils sous tension. Enregistrez le matériel, la version du système d'exploitation, les paramètres régionaux, l'état d'Apple Intelligence, l'état de préparation du modèle, l'installation de l'invite, le temps écoulé, la branche du terminal, le motif du rejet et le résultat de la persistance pour chaque exécution. Les instruments Foundation Models d’Apple peuvent exposer le comportement des invites, des outils, des jetons et de la latence au cours d’une session réelle.

Une version lisible par machine est disponible sous le nom de protocole d'évaluation des modèles de base(JSON). Il contient la matrice et le contrat de terrain, et non des mesures fabriquées. Lorsqu'une exécution actuelle sur un appareil physique est approuvée, ajoutez ses lignes anonymisées et publiez les valeurs globales d'acceptation, de délai d'attente et de latence avec l'appareil et le système d'exploitation exacts.

  1. Utilisez du matériel compatible avec un système d’exploitation pris en charge. Testez Apple Intelligence activé et prêt, désactivé et toujours en cours de téléchargement.
  2. Répétez avec un paramètre régional pris en charge et un paramètre régional non pris en charge ; vérifiez que l'application fait la distinction entre la prise en charge des modèles et l'éligibilité générale des appareils.
  3. Une fois les ressources du modèle prêtes, répétez en mode avion et confirmez qu'aucun point de terminaison de génération RiseHush n'est requis.
  4. Observez une partie du texte tout en interagissant avec l'interface ; confirmez que le défilement et les commandes restent réactifs pendant le tour du modèle.
  5. Alimenter des appareils vides, comportant plusieurs phrases, trop longs, entourés de guillemets, dans la mauvaise langue, clichés ou presque en double ; aucune ne doit devenir des lignes générées enregistrées.
  6. Déclenchez le rejet du juge et un délai d'attente limité ; confirmez qu’aucun brouillon rejeté n’est conservé et que l’expérience organisée reste disponible.
  7. Forcer un échec de sauvegarde locale dans un magasin de test ; confirmez que les modèles insérés sont restaurés.
  8. Exercez Siri avec son budget de temps plus court et vérifiez que les widgets lisent uniquement les données persistantes plutôt que de lancer la génération dans l'extension.

[8]

Ce que cette architecture ne prouve pas

Un pipeline de qualité peut rendre les échecs visibles et réduire la mauvaise persistance. Il ne peut pas transformer un petit modèle de langage intégré à l'appareil en une source historique, ni prouver qu'une phrase n'a jamais été écrite nulle part, ni garantir son goût. Les lignes générées ne sont donc jamais attribuées à des auteurs historiques et n'entrent jamais dans le catalogue du domaine public.

La traduction mérite un avertissement séparé. Pour les paramètres régionaux non directement pris en charge par Foundation Models, le chemin facultatif bloque entièrement un brouillon en anglais, puis utilise le cadre de traduction sur appareil d'Apple où la paire est disponible. Le résultat traduit est vérifié pour une réponse non vide et conservé avec de nouvelles métadonnées, mais il ne répète pas actuellement la séquence complète de porte, de nouveauté et d'évaluation de la langue cible après la traduction. Cette voie est une solution de repli et non une preuve d’une qualité égale de production directe.

Les mises à jour du modèle et du système d'exploitation peuvent modifier la disponibilité, la latence, le comportement de refus et la distribution des résultats. Apple recommande de revoir les invites et les évaluations à mesure que les modèles de base changent. La matrice de test de RiseHush doit donc être réexécutée après les mises à jour matérielles de la plateforme plutôt que de traiter cette page comme une preuve de référence permanente.

  • Le modèle du système n'est pas utilisé comme source de faits de citations historiques ou d'attribution d'auteur.
  • Une sortie structurée et une deuxième passe de modèle réduisent les modes de défaillance ; ils ne prouvent pas qu'une ligne soit profonde, originale au sens global, ou adaptée à tout le monde.
  • La couche de nouveauté sémantique passe lorsque son catalogue limité est vide ou que les intégrations de comparaison ne sont pas disponibles ; il réduit les quasi-doublons connus mais ne certifie pas l'originalité globale.
  • La génération hors ligne dépend du matériel compatible, de l'activation d'Apple Intelligence, du comportement linguistique pris en charge et des ressources de modèle déjà prêtes.
  • Le filtre de goût Core ML appris en option est calibré pour l'anglais, l'allemand, l'espagnol, le français, l'italien et le portugais ; d'autres paramètres régionaux reçoivent toujours les couches déterministes et basées sur un modèle qui les prennent en charge.
  • Une solution de secours traduite localement n'équivaut pas à une génération directe de la langue cible : le résultat traduit actuel ne répète pas chaque couche de qualité après la traduction.
  • Les mises à jour du système d'exploitation et du modèle peuvent modifier la latence et la distribution des sorties. La matrice des périphériques doit donc être réexécutée après des modifications matérielles de la plate-forme.
  • Cette page décrit l'architecture actuelle et ne promet pas que chaque surface de plate-forme exécute des modèles de base. Les widgets consomment intentionnellement les résultats persistants.

[3][9][11]

RiseHush envoie-t-il des invites de génération de devis à son propre serveur ?

Non. Sur les appareils pris en charge sur lesquels le modèle de système est disponible, l’ébauche du devis et les tests de qualité s’exécutent avec les infrastructures intégrées à l’appareil d’Apple. RiseHush n'a pas de point final d'inférence pour ce chemin.

@Generable garantit-il un devis bon ou original ?

Non. Cela contraint la forme de la sortie structurée. RiseHush applique toujours des règles de formatage et de langage déterministes, une détection sémantique des quasi-doublons lorsque des intégrations de comparaison sont disponibles, une session d'évaluation distincte, une notation de distinction et un comportement de rejet fini.

Un autre développeur peut-il reproduire la phrase exacte générée ?

Pas fiable. La sortie du modèle de langage n’est pas déterministe et peut changer avec les mises à jour du modèle ou du système d’exploitation. L'unité reproductible est le protocole de préparation, de montage, de porte, de délai d'attente et de persistance, et non une prose identique.

Chaque langue prise en charge reçoit-elle le même chemin de qualité ?

Non. Les paramètres régionaux directement pris en charge reçoivent le chemin de génération commun, tandis que le filtre Core ML appris est calibré pour six langues. Une solution de secours facultative traduite localement part d'un brouillon anglais sécurisé, mais ne répète pas chaque couche de qualité de la langue cible après la traduction.

  1. Apple Developer Documentation — Foundation Models framework overview: direct access to Apple’s on-device language model
  2. Apple Developer Documentation — SystemLanguageModel availability and unavailable reasons
  3. Apple Developer Documentation — supporting languages and locales with Foundation Models
  4. Apple Developer Documentation — generating Swift data structures with guided generation
  5. Apple Developer Documentation — LanguageModelSession, responses, and streaming
  6. Apple Developer Documentation — expanding generation with tool calling
  7. Apple Developer Documentation — improving the safety of generative model output
  8. Apple Developer Documentation — analyzing Foundation Models runtime performance
  9. Apple Developer Documentation — Foundation Models framework updates
  10. Apple Developer Documentation — SwiftData
  11. Apple Developer Documentation — Translation framework