← 所有文章

Foundation Models 裝置端LLM:Tool 協定

Apple 在 WWDC 2025 發表的裝置端LLM契約引出一個立即的路由問題:何時該選擇 LanguageModelSession、何時該選 AppIntent、何時該用 MCP、又何時三者皆非。

iOS 26 在每部支援 Apple Intelligence 的裝置上配置了 30 億參數的語言模型。1 Apple 將此框架命名為 Foundation Models。框架是本機運作的。推論已針對 Apple silicon 進行最佳化並在裝置上執行;網路不在呼叫路徑中。模型存放於 SystemLanguageModel.default,您的應用程式取得 LanguageModelSession,而讓該 session 執行實用工作的型別化介面便是 Tool 協定。

Tool 協定是應用程式開發者最關注的部分。少了它,裝置端LLM就只是一個與您應用程式資料、使用者資料以及系統其他部分毫無連結的聊天完成端點。有了它,模型便能呼叫具型別的 Swift 函式、取回具型別的結果,並在下一輪推理中對答案進行思考。具備工具增強的裝置端生成才是此框架真正的能力。聊天介面只是示範。

TL;DR

  • Foundation Models 為每部符合 Apple Intelligence 條件的裝置在 SystemLanguageModel.default 提供 30 億參數的LLM。模型是本機的;推論針對 Apple silicon 最佳化並在裝置上執行;網路不在呼叫路徑中。
  • Tool 協定是模型與您應用程式之間的契約。工具會宣告具型別的 Arguments、回傳具型別的 Output,並在建構時繫結至某個 LanguageModelSession
  • GenerableGuide 註解讓模型直接產生具型別的 Swift 值,而非僅是字串。解碼器是框架的一部分,而非您的程式碼。
  • Foundation Models、App Intents 與 MCP 之間的路由規則在於由誰執行模型、在何處執行。Foundation Models = 您的應用程式在裝置端執行模型。App Intents = Apple Intelligence 在裝置端執行模型並路由至您的應用程式。MCP = 由外部主機在其選擇的位置執行模型,並透過工具伺服器接入您的應用程式。

框架實際提供的內容

三項基本元素構成此框架:模型、session 與工具。2

SystemLanguageModel 對裝置端基礎模型的參考。預設實例繫結至使用者的裝置,在符合 Apple Intelligence 條件的硬體上可用,並提供應用程式於執行時讀取的能力檢查,以判定模型是否可用。框架支援透過 SystemLanguageModel(useCase:guardrails:)、自訂介面卡與 GenerationOptions 進行設定,但您並不能像對 OpenAI 或 Anthropic 那樣自由挑選任意的雲端模型 ID;Apple 會隨每次 OS 發行版本提供並更新裝置端模型,框架交給您的就是當前已安裝的版本。

LanguageModelSession 一個有狀態的物件,跨呼叫保留對話狀態。Session 在建構時接收系統提示、隨時間累積使用者/助理輪次,並暴露用於生成回應的 async 方法。Session 建立成本低且可拋棄;您應為每個任務建立一個 session,而非整個應用程式共用一個。冥想計時器為「總結我過去 7 天的練習」建立一個 session;食譜應用程式則為「將此食譜改為兩人份而非四人份」建立另一個不同的 session。

Tool(協定)。 一個 Swift 協定,宣告 namedescriptionArguments 型別、Output 型別,以及 async call(arguments:) 函式。工具於建構時繫結至 session(LanguageModelSession(tools: [...], instructions: ...))。當模型判定需要工具時,會發出結構化呼叫;框架解碼引數、執行工具、編碼結果,並回饋給 session 用於下一輪。模型看不到 Swift;由框架負責封送處理。

該協定的完整需求:name: Stringdescription: String、一個符合 ConvertibleFromGeneratedContent 的關聯 Arguments 型別、一個符合 PromptRepresentable 的關聯 Output 型別,以及一個 async call(arguments:) 方法。在 Arguments 結構上使用 @Generable 巨集會免費產生 ConvertibleFromGeneratedContent 的符合性;對於 Output,StringGeneratedContent 已自動符合。Apple 文件中的範例會回傳 String[String]

簡化後的 Tool 協定樣貌:

import FoundationModels

struct WaterEntryLookup: Tool {
    let name = "lookup_water_entries"
    let description = "Look up water intake entries for a given date range."

    @Generable
    struct Arguments {
        @Guide(description: "Start date in ISO-8601 format")
        let startDate: String

        @Guide(description: "End date in ISO-8601 format")
        let endDate: String
    }

    func call(arguments: Arguments) async throws -> String {
        let entries = try store.entries(
            from: ISO8601DateFormatter().date(from: arguments.startDate) ?? .now,
            to: ISO8601DateFormatter().date(from: arguments.endDate) ?? .now
        )
        let totalMl = entries.reduce(0) { $0 + $1.amountMl }
        return "Found \(entries.count) entries totalling \(totalMl)ml."
    }
}

模型看到的是工具描述和產生模式的引數樣貌。Swift 程式碼看到的是具型別的輸入與具型別的輸出。解碼/編碼邊界由 Apple 負責。工具輸出可以是 StringGeneratedContent 物件;上方範例回傳 String,因為消費者是模型下一輪的推理。

Generable 與 Guide:不需解析器的具型別輸出

讓工具引數具型別的同一套註解系統,也能讓模型直接產生具型別的 Swift 值。3 @Generable 結構宣告其形狀;框架會限制模型輸出以符合該形狀。

@Generable
struct PracticeSummary {
    @Guide(description: "Single-sentence headline summarizing the user's week")
    let headline: String

    @Guide(description: "Total practice duration this week in minutes")
    let totalMinutes: Int

    @Guide(description: "Three short observations as bullet points")
    let observations: [String]
}

let session = LanguageModelSession(instructions: "You are a meditation coach.")
let summary = try await session.respond(
    to: "Summarize this week of practice given the entries.",
    generating: PracticeSummary.self
)

該呼叫回傳 Response<PracticeSummary>,其 content 是具型別的 PracticeSummary。您的程式碼裡沒有 JSON 解析、沒有對「headline:」做字串比對、沒有當模型回傳格式錯誤物件時的退路處理。框架透過約束取樣讓模型逐 token 的輸出在結構上對齊 schema,因此結構性無效的輸出不會跨過此邊界。上方 session 不接收任何工具,因為具型別輸出與工具呼叫是彼此獨立的能力;一個 session 可以單用 @Generable 來決定回應形狀、單用工具進行接地、兩者並用,或皆不用。

Swift 具型別介面正是該框架與雲端LLM SDK 的差異所在。雲端 SDK(OpenAI Structured Outputs、Anthropic tool use 等)同樣支援約束取樣,但開發者收到的具型別值是一個依據 schema 驗證過的 JSON 物件,然後再以另一個步驟解碼成 Codable 的 Swift 型別。Foundation Models 將這些步驟合併:@Generable 巨集與框架的解碼器將具型別的 Swift 值作為直接回傳值產出,而每個欄位上的 @Guide 註解則把意圖帶入生成約束。輸出之所以具型別,是因為生成過程是針對 Swift schema 進行型別約束,而不是針對開發者在 Swift 中重建的 JSON 規格。

@Guide 註解是讓您不必把意圖寫進提示中、便能向模型傳達各欄位意圖的方式。產生的描述會成為生成約束的一部分。欄位層級的 guide 讓提示保持簡潔,並讓 schema 緊貼資料。

路由問題的三種樣貌

Apple 現在提供應用程式三種協定介面,可將自身領域暴露給語言模型。它們會路由至不同的執行者。

Foundation Models(LanguageModelSession)。 您的應用程式載入裝置端模型並執行推論。session 可呼叫的工具,正是您應用程式自身程式碼定義的工具。模型永遠不離開裝置。使用者並非透過 Siri 觸發此流程;而是您應用程式的程式碼。使用情境位於應用程式內部:冥想應用程式以LLM總結一週、食譜應用程式調整食譜以減少份數、飲水追蹤器把「我午餐配了一杯水」轉換為結構化條目。

App Intents。 Apple Intelligence 代表使用者執行某個LLM(Apple 的第一方代理),並把能力呼叫路由至您應用程式的 AppIntent 型別。您的應用程式不執行模型。您透過 App Intents 框架宣告具型別的動作,Apple 系統堆疊會依使用者請求、Spotlight 查詢、Siri 輸入或 Shortcuts 編排來決定何時呼叫它們。詳見 App Intents Are Apple’s New API to Your App4

MCP。 外部主機(Claude Desktop、Claude Code、Cursor、ChatGPT)執行開發者選擇的任意模型。您的應用程式提供一個伺服器,讓主機的模型能呼叫。模型在主機執行的位置運作;工具呼叫透過 JSON-RPC 傳輸跨越邊界。詳見 Two Agent Ecosystems, One Shopping List,以及 App Intents vs MCP 中對路由問題的整合分析。5

路由決策可歸結為誰是代理

                  ┌──────────────────────────────────┐
                  │  Who is the language model?       │
                  └────┬─────────────┬─────────────┬──┘
                       │             │             │
              ┌────────┴────┐ ┌──────┴──────┐ ┌────┴──────┐
              │ Your app's  │ │   Apple     │ │  External │
              │ own use of  │ │ Intelligence│ │   host's  │
              │   LLM       │ │   agent     │ │   agent   │
              └──────┬──────┘ └──────┬──────┘ └────┬──────┘
                     │               │             │
                     ▼               ▼             ▼
              Foundation Models  App Intents     MCP
              + Tool protocol   + AppEntity    + tools/list
              (on-device, your  (system runs   (host runs
               app runs model)   the model)     the model)

冥想應用程式要為使用者整理本週摘要,會使用 Foundation Models,因為應用程式自身要呼叫模型並在應用內呈現結果。同一應用程式裡的「記錄一段 5 分鐘的 session」能力則使用 App Intents,讓 Siri 能呼叫它。同一應用程式中「給我看最近的冥想紀錄」這項由 Claude Code session 使用的能力則使用 MCP。三個不同執行者、三組不同義務,底層共享同一個領域層。

推論預算:框架對您的要求

在裝置端執行LLM並非免費。Apple silicon 處理推論,但模型仍受限於上下文視窗、token 預算,以及隨裝置而異的實際延遲。三項約束會形塑您運用此框架的設計方式:6

可用性因裝置而異。 並非每部 iOS 26 裝置都支援 Apple Intelligence。較舊的 iPhone、受限裝置,以及使用者已停用 Apple Intelligence 的裝置,SystemLanguageModel.default.availability 會回傳「不可用」狀態。未檢查可用性即呼叫 LanguageModelSession 的程式碼會在執行時拋出生成錯誤;正確做法是事先依可用性狀態分支 UI,並在不可用時提供無LLM的替代路徑。把模型視為功能旗標,而非保證。

延遲不可忽視。 在我們對 Return 的測試中,iPhone 16 Pro 硬體的首 token 延遲足以應付應用內互動;較長的生成與工具呼叫鏈則並非即時。雲端LLM串流適用的 UI 模式在這裡同樣適用;不要阻塞主執行緒、要呈現漸進式輸出、並為使用者在生成中途離開的情況做設計。

上下文視窗比雲端更小。 裝置端模型的上下文視窗比 GPT-4 等級的雲端模型更小。長文件需要摘要或分塊;長對話歷史需要修剪;傳回大型結構化負載的工具輸出應只回傳一個參考(ID 或 key)讓下一輪在需要時重新擷取,而不要把整個負載內嵌傳回。

整套約束類似於針對低階邊緣執行環境設計,而非前沿雲端模型。框架的便利性讓開發過程更愉快;但底層物理限制並未改變。

何時應選擇 Foundation Models

此框架最契合的場景,是裝置端、低摩擦的生成本身就是產品的時候:

重新格式化與改寫。 將使用者的自由格式筆記轉成結構化條目、潤飾草稿訊息、總結擷取的逐字稿。延遲容忍度中等;資料敏感度高;雲端推論顯得多餘。

對私人資料的本機綜合。 健身應用程式把使用者的健身歷史轉成「本週」摘要;理財應用程式說明使用者的消費型態;日誌應用程式跨一季條目浮現主題。資料不應離開裝置;答案應出現在應用內;提示有界。

用於應用內自動化的輕量工具呼叫。 應用程式讓使用者說「給我看週二的冥想紀錄」,並使用工具擷取底層紀錄,再格式化答案。代理是應用程式、工具是應用程式自身的資料層、模型在本機。

型別一致的生成。 任何原本得手寫 JSON 解析器或字串樣板的場景,@Generable@Guide 都是更耐用的介面。

何時不應選擇 Foundation Models

對於以下幾種常見情況,此框架並非正解:

任何使用者可能向 Siri 提問的事。 「記錄 250 毫升飲水」「開始 5 分鐘冥想」「在清單中加上香蕉」都是 App Intents。Apple Intelligence 是執行者;您的應用程式是目的地。Foundation Models 用於應用內生成,而非 Siri 路由的動作。如果您把同一能力做兩次(App Intent + 帶工具的 LanguageModelSession),App Intent 會勝出,因為使用者呼叫的是 Siri,而非您的應用內畫面。

任何應由外部LLM代理驅動的事。 Claude Code session 接入您應用程式領域屬於 MCP 的範疇。應用程式不執行LLM;由主機執行;模型存在於主機放置之處。Foundation Models 無法服務外部代理。

對大型文件的繁重推理。 裝置端模型很小。200 頁的合約、長段程式碼上下文,或對眾多照片進行多影像推理,都應交給雲端推論(您自己的或廠商的),讓上下文視窗與參數量符合工作負載。超出框架包覆範圍的任務會產生具體錯誤:超出上下文視窗、違反防護欄、不支援的語系。請刻意把這些錯誤呈現出來,而不要設計依賴模型處理超出包覆範圍工作的流程。

跨裝置與跨使用者的工作流。 裝置端模型只能取得應用程式傳入 session 的內容。跨裝置同步(從 Watch 到 iPhone 的計時器狀態)、跨使用者協作(共享清單、共享文件),以及任何受益於伺服端協調的流程,都需要伺服器。模型不是網路原語。

我會在自己技術堆疊裡換個做法的部分

此框架會在第一次設計時就獎勵特定的架構選擇,而這選擇容易出錯。使用者透過應用程式 UI呼叫的能力,以及LLM作為工具取用的能力,不該以重複的散文式路徑各做一份。

冥想應用程式可能想加上LLM整理的「每週回顧」面板。粗淺做法是一段提示:「這是使用者本週的條目,寫一段話。」更好的做法是定義一個 WeeklyEntries 工具讓模型在需要知道本週內容時呼叫,並透過 @Generable 提供結構化的 WeeklySummary 輸出。第一種做法脆弱(模型每次都要吞下整串長條目)、token 成本高,且產出非結構化散文。第二種做法耐用(工具呼叫把「發生了什麼」與「該怎麼描述」分離)、便宜(模型只擷取所需內容),且具結構(結果是具型別的 Swift 值)。

此模式可乾淨地與 App Intents 和 MCP 組合。同一個 WeeklyEntries 查詢也是 AppIntent 參數解析器與 MCP 工具處理器的本體。一個 Swift 函式;三個介面。模型呼叫的就是使用者呼叫的同一個函式。

另一項架構決策:工具描述是提示的一部分。模型讀取 Tool.description 來決定是否以及何時呼叫。請把描述當成預期未來貢獻者會閱讀的 docstring;模型就是那位未來的貢獻者。

此模式對 iOS 26+ 的 Apple 技術堆疊代表什麼

三個重點。

  1. 裝置端LLM是執行時功能,而非後端。 把它當成具備上下文視窗與裝置端推論預算的系統框架,而非遠端服務。架構決策落在可用性、延遲、上下文視窗紀律與結構化輸出。

  2. Tool 協定就是介面。 沒有工具,模型只是與您的領域毫無連結的聊天完成端點。有了工具,模型便成為您應用程式資料之上的結構化查詢層。

  3. Foundation Models、App Intents 與 MCP 之間的路由規則就是「誰執行模型」。 應用內生成走 Foundation Models。Apple Intelligence 路由的能力走 App Intents。外部代理的能力走 MCP。同一個 Swift 領域函式可被三個介面共同呼叫。

三篇姊妹文進一步深入 Foundation Models 框架:Foundation Models use cases 探討工作負載適配的決策、custom adapters 說明如何以應用程式資料微調裝置端模型,而 the agentic workflow 則處理應用內與工具化LLM的職責切分。

完整的 Apple Ecosystem 系列:為 Apple Intelligence 而設的具型別 App Intents;為跨LLM代理而設的 MCP 伺服器;兩者之間的 routing question;用於 Lock Screen 狀態機的 Live Activities;視覺層的 Liquid Glass patterns;多平台出貨範圍可達跨裝置觸及的 multi-platform shipping。專欄總覽位於 Apple Ecosystem Series。如需更廣泛的 iOS 結合 AI 代理脈絡,請參閱 iOS Agent Development guide

FAQ

iOS 26 中的 Foundation Models 框架是什麼?

Foundation Models 是 Apple 用來存取裝置端語言模型的框架,該模型隨 iOS 26(以及 iPadOS 26、macOS 26、visionOS 26)上符合 Apple Intelligence 條件的裝置一同提供。框架暴露 SystemLanguageModelLanguageModelSessionTool 協定,讓應用程式不需網路存取即可執行具型別的裝置端LLM呼叫。

Tool 協定如何運作?

Tool 是一個 Swift 型別,宣告 Arguments 結構(以 @Generable@Guide 註解)、async call(arguments:) 方法,以及供模型決定何時呼叫的 name 與 description。工具於建構時繫結至 LanguageModelSession。當模型判定需要工具時,框架會解碼引數、執行呼叫,並把具型別的輸出回饋給 session。

Foundation Models、App Intents 與 MCP 有何不同?

Foundation Models 是讓您的應用程式在裝置端執行LLM以進行應用內生成。App Intents 是讓 Apple Intelligence(系統代理)呼叫您應用程式的具型別能力。MCP 是讓外部LLM主機(Claude、ChatGPT 等)透過 JSON-RPC 傳輸呼叫您應用程式的具型別工具。三項協定的差異在於由誰執行模型。同一個 Swift 領域函式可服務三者。

Foundation Models 能呼叫 MCP 工具嗎?

不行。LanguageModelSession.tools 接受符合 Apple Tool 協定的型別,而非 MCP 工具伺服器。若要橋接兩者,您得撰寫一個 Foundation Models 的 Tool,讓其 call 方法去呼叫 MCP 客戶端。Apple 並未提供內建的介面卡;這道橋將是應用程式端的程式碼。

裝置端模型足以應付正式環境嗎?

對於此框架所設計的使用情境(重新格式化、摘要、對本機資料進行結構化生成、輕量工具呼叫)而言,可以。對於跨大型上下文的前沿推理、大規模多模態理解,或跨文件推理,則不行。裝置端模型是 30 億參數模型,上下文視窗比雲端LLM更小;請挑選符合此包覆範圍的工作負載。

參考資料


  1. Apple Developer, “Apple Intelligence and machine learning” 與 WWDC 2025 議程 “Meet the Foundation Models framework”。框架的標題數字(30 億參數的裝置端語言模型)出自 Apple 在 WWDC 2025 的公告。 

  2. Apple Developer, “FoundationModels framework”SystemLanguageModelLanguageModelSessionToolGeneratedContent 及相關支援型別。 

  3. Apple Developer, “Generating Swift data structures with guided generation”,以及 @Generable / @Guide 巨集參考文件。透過約束取樣將型別約束生成作為一等能力。 

  4. 作者於 App Intents Are Apple’s New API to Your App 的分析,2026 年 4 月 28 日。 

  5. 作者於 Two Agent Ecosystems, One Shopping List(2026 年 4 月 29 日)以及 App Intents vs MCP: The Routing Question(2026 年 4 月 30 日)中的分析。 

  6. Apple Developer, “Adopting Apple Intelligence in your app”“SystemLanguageModel” 中關於 availability 模式的內容。Apple WWDC 2025 議程涵蓋 Apple silicon 上的裝置端推論路徑與依裝置而異的可用性限制。 

相關文章

Foundation Models 使用案例:通用模型與內容標記

iOS 26 Foundation Models 提供 .general 與 .contentTagging 兩種使用案例。運用 Apple 的規則,判斷何時提示工程勝過專業化模型。

3 分鐘閱讀

Foundation Models 自訂 Adapter:何時應該訓練一個

iOS 26 Foundation Models 自訂 adapter 訓練 LoRA 權重、匯出 .fmadapter 套件、透過 Background Assets 配送,並需要 Apple 的權限授權。

4 分鐘閱讀

清理層才是真正的 AI 代理市場

Charlie Labs 從建構代理轉向清理代理留下的爛攤子。AI 代理市場正從生成轉向證明。清理才是耐久的那一層。

2 分鐘閱讀