← 所有文章

從 Python 使用 Foundation Models:fm CLI

過去一年,Apple 的裝置端大型語言模型一直被一道牆隔在後面:您只能從 Swift 存取它,而且只能在您用 Xcode 建立的 App 內部使用1。macOS 27 拆掉了這道牆。Apple 現在隨作業系統預先安裝一個名為 fm 的命令列工具,並提供一套供 Python 使用、可用 pip 安裝的 Foundation Models SDK1。那個過去需要一個專案、一次建置,以及一段以編譯式 Swift 寫成的 LanguageModelSession 才能用的模型,如今只要一行 shell 指令就能回應,還能在 Jupyter notebook 裡執行。Foundation Models Framework 團隊的工程師 Eric Gourlaouen 在 WWDC26 議程 334 中直白地點出這項轉變:「在此之前,這些模型只能從 Swift 程式碼中取用」1。改變的並不是模型本身。改變的是,同一個裝置端模型突然之間可以在 App 之外被指令稿驅動、自動化,並加以評估,既不需要 API 金鑰,也沒有雲端成本1

Watch on Apple Developer ↗
Apple 介紹了在 macOS 上存取裝置端 Apple Foundation Model 的兩種新方式:預先安裝的 fm 命令列工具,以及供 Python 使用的 Foundation Models SDK。

重點摘要

  • macOS 27 隨附 fm,這是為裝置端 Apple Foundation Model 預先安裝的命令列工具。其子指令包括 respond(一次性提示輸出至 stdout)、chat(互動式工作階段)與 schema(定義結構化輸出)1
  • fm respond 提供針對模型(切換至 Private Cloud Compute)、影像輸入,以及結構化輸出 schema 的選項;其餘選項可用 --help 列出1
  • Python SDK 從 Python 中存取同一個裝置端模型,需要 Python 3.10 或更新版本、已安裝 Xcode,以及一台 Apple Silicon Mac,並透過 pip 或其他套件管理工具安裝1
  • 這套 SDK 對應 Swift 框架:一個可呼叫 respondLanguageModelSession、工具呼叫,以及透過 fm.generable 裝飾器(作為 generating 引數傳入 fm.respond)進行的引導式生成1
  • 兩種介面都預設使用始終可用的裝置端模型,並可選擇改用更大的 Private Cloud Compute 模型;後者能力更強,但帶有使用量限制1
  • 它帶來的回報在於原型開發與自動化:依語意排序檔案的 shell 指令稿,以及用 Pandas 與 matplotlib 為各提示變體評分的 Python 評估流程1

fm 命令列工具

在 macOS 27 上開啟「終端機」並輸入 fm,工具就會印出它支援的指令1。Apple 重點介紹了三項。fm respond 對模型送出提示並回傳回應。fm chat 啟動一段互動式對話。fm schema 為結構化輸出建立一個 schema1。最簡單的用法正是 Eric 最先示範的那種:輸入 fm respond,鍵入一段提示,按下 enter,片刻後就能在終端機裡讀到模型的回答1

Watch on Apple Developer ↗
這項工具在 macOS 27 上預先安裝,存在於「終端機」App 中;輸入 fm 即會列出可用的指令。

兩個頂層指令沿著一條清楚的界線分工:探索與指令稿撰寫。fm chat 用來對模型取得第一印象。您問一個問題,再追問一句,對話便會延續下去,並擁有自己的斜線指令:/model 將對話切換至 Private Cloud Compute 模型,/save 則儲存對話以便日後接續1。當您寧可取得一段可以擷取的內嵌回應(例如在指令稿中)時,就改用 fm respond,它會把模型的輸出寫入 stdout1

各項選項就落腳在 fm respond 上。Eric 明確點名了三項。模型選項會對 Private Cloud Compute 模型送出提示,而非預設的裝置端模型。影像選項會在提示中納入一張影像。schema 選項則與 fm schema object 搭配,把輸出限制在您所定義的結構之內1。他指出還有更多選項,並指向用以列出全部選項的 help 選項1。逐字稿是依各選項的角色而非確切的旗標拼寫來指稱它們的(畫面上唯一以字面形式呈現的是 fm schema object),因此下文中凡我描述某個選項處,描述的都是有文件記載的行為,而非自行杜撰一段旗標字串。

模型的選擇是最關鍵的決定。fm 預設使用隨 macOS 一同提供、始終可用的裝置端模型1。您可以切換到 Private Cloud Compute 上的 Apple Foundation Model,Eric 形容它是「一個比裝置端模型大得多的模型,因此在複雜問題上表現會更好」,代價則是它帶有使用量限制1。預設值是正確的起點:免費、在地,而且沒有上限。只有當一項任務確實困難到足以需要時,您才升級到 Private Cloud Compute。

打造一段自動化指令稿

排序檔案的示範,是說明「為何 CLI 重要」最清楚的論證。Eric 有一個塞滿草稿版與最終版素材的專案資料夾,想要一段可重複執行的指令稿:保留最終版、為其備份,並把草稿移到一顆封存磁碟上1。困難之處不在於搬移檔案,而在於當檔名一團亂時,判斷哪一個檔案才是草稿。如他所言,從指令稿呼叫語言模型,能讓它「把草稿版與最終版檔案分類」,即使「檔名一團亂、難以可預期地排序」1

Watch on Apple Developer ↗
一段實用的指令稿:載入某個資料夾中的檔案、提示模型把草稿與最終版分開,再依據結構化的 JSON 結果進行備份與封存。

這個樣式可以推廣到任何「對一份清單下判斷」的自動化。指令稿先載入工作目錄中的檔案,再透過 fm respond 提示模型把那份清單分成兩組:最終版檔案與草稿版檔案1。為了讓輸出可用,它預先以 fm schema object 定義一個 schema,描述兩個欄位——一份最終版清單與一份草稿清單——並透過 schema 選項把這個 schema 傳給 fm respond1。模型以 JSON 回傳答案,指令稿讀取後便把最終版複製到備份、把草稿移到封存區1

結構化輸出這一步是承重的關鍵。一段自由文字的答案會迫使指令稿去剖析散文,而那正是每一條與 LLM 對話的 shell 流程中最脆弱的環節。藉由以 fm schema object 宣告 schema 並取回 JSON,指令稿便得到一份可以直接據以行動的契約1。這個樣式正是 Swift 開發者所熟知的引導式生成,在此以 CLI 選項的形式揭露出來1。任何以「對模型的決定做點確定性的事」收尾的任務,要的正是這個樣式:提示、schema、JSON、行動。

Python SDK

第二種介面,是為另一個時刻的另一種人而設。如 Eric 所言:「如果您是機器學習工程師,用到 Python 的機會也許多於 Swift」,而這套 SDK「讓您能輕鬆在 Python 程式碼中使用裝置端模型」1。這項主張建立在 Python 的生態系之上:「Python 擁有豐富的機器學習與資料科學開放原始碼套件生態系」,這意味著您可以撰寫評估流程,並「運用這些套件來量化您功能的品質」1

安裝有四項要求,全都在議程中提到。您需要 Python 3.10 或更新版本、已安裝 Xcode,以及一台 Apple Silicon Mac,並透過 pip 或您所選的任何其他套件管理工具來安裝這套 SDK1。Apple Silicon 與 Xcode 這兩項要求,正透露出這個套件是與作業系統所執行的同一個裝置端模型的綁定,而非一個託管式 API。

對任何用過 Swift 框架的人來說,這套 API 會感覺很熟悉2,而這正是刻意設計:「這些 API 與抽象很快就會讓人感到熟悉」1。您透過建立一個 LanguageModelSession、視需要傳入指示,再以您的提示呼叫 session.respond 來送出提示;結果中即包含模型的輸出1。這套 SDK 把框架的核心功能一併帶了過來:文字與影像輸入、串流式回應、讓模型得以與您程式碼互動的工具呼叫,以及用於結構化輸出的引導式生成1

Watch on Apple Developer ↗
購物 App 的範例:建立一個 LanguageModelSession、呼叫 respond、揭露一個用來擷取近期訂單的工具,並以 fm.generable 裝飾器約束輸出。

其中兩項功能得到了具體說明。在工具呼叫方面,Eric 定義了一個模型可以呼叫的工具,用來擷取使用者最近的幾筆訂單,「好讓它能提供更個人化的資訊」,與 Swift 框架的 Tool 協定是同一套樣式1。在引導式生成方面,他用 fm.generable 裝飾器定義出想要的輸出結構——一個 ItemsSuggestion 物件——並將它作為 generating 引數傳給 fm.respond1。這個裝飾器是 Swift 中 @Generable 巨集的 Python 對應,而 generating 引數則是您把想要回傳的形狀交給模型的方式。由於逐字稿是以角色與物件名稱來呈現它們,而非印出完整的類別主體,請把 ItemsSuggestion 當成這個範例為一個您會自行定義的結構所取的名字。

評估流程:使用 Python 的真正理由

這個案例研究,是 Python SDK 從一項便利之物升格為一套方法的所在。Eric 當時在打造一項功能,要預測使用者想加進購物車的東西,他手上有三種不同的提示實作:一個極簡版、一個較詳盡的版本,以及一個把整套規則清單都寫明的詳細版1。每位提示工程師都會面對的問題是:到底哪一個才是真正最好的,而誠實的答案需要靠量測,而非靠品味。

Watch on Apple Developer ↗
一條 Jupyter notebook 評估流程:用伺服器模型產生評估資料、執行三種提示變體、把輸入與輸出存進 Pandas DataFrame、以評審函式評分,再用 matplotlib 繪製圖表。

Apple 明確指出,Swift 開發者在這方面有自己的答案。Evaluations 框架隨 Xcode 27 一同提供,讓您能輕鬆建立評估,並在多次迭代之間追蹤功能的準確度1。Python SDK 則是為棲身於 notebook 的資料科學家準備的平行路徑。Eric 整套分析都是從 Jupyter 中執行的1

這條流程讀起來就像一個瞄準裝置端模型的標準 ML 評估迴圈。首先,他用一個大型伺服器模型來產生評估資料,為每一筆給出一組輸入與一個預期輸出1。接著,針對每一筆輸入,他分別用三種提示實作各自產生輸出,並把輸入與輸出當作列存進一個 Pandas DataFrame1。然後,以伺服器模型為後盾的評審函式,依他所選的標準為每一筆輸出評分,這些指標再回寫進 DataFrame1。最後,matplotlib 把這些評分化為圖表1

這些圖表道出了一個再怎麼盯著提示看也看不出來的故事:詳細版提示出現高比率的生成錯誤,Eric 將其歸因於觸及了模型最大的脈絡視窗大小;兩個較不詳細的提示往購物車裡多加了商品,詳細版反而加得較少;詳細版漏掉了較多預期中的商品;而極簡版幻覺出最多的商品1。每一個提示都有不同的失敗模式,而唯有量測才讓它們現形。這正是整套做法的論據所在。Eric 說:「有了 Python,我可以直接在 notebook 裡快速進行這些迭代,而不必重新建置整個專案」1

何時該選用哪一個

從上述那些契約,可以推出幾條準則。

當一段 shell 指令稿需要下判斷時,選用 fm respond 排序雜亂的檔名、把一行輸入分類、從非結構化文字中抽取一個欄位。把它與 fm schema object 及 schema 選項搭配,讓指令稿據 JSON 而行,而非去剖析散文1

當您在探索、而非撰寫指令稿時,選用 fm chat 它是對「模型如何處理您的提示」取得第一印象的最快途徑,並可用 /model 升級到 Private Cloud Compute、用 /save 保留一段工作階段1

當您想量測、而不只是呼叫時,選用 Python SDK。 一旦您手上不只一個提示,且需要知道哪一個更好,notebook 加 Pandas 加 matplotlib 的這套迴圈就是合用的工具,因為裝置端模型既免費、又夠在地,足以跑完一整組評估集而不會收到帳單1

預設用裝置端模型;要審慎地才升級到 Private Cloud Compute。 裝置端模型始終可用,且沒有使用量限制。Private Cloud Compute 更大,在複雜問題上更出色,卻帶有使用量限制,因此請把它留給配得上它的那些任務1

在這裡做原型,到 Swift 裡交付。 Eric 自己的說法是,您可以「在您的 Xcode 專案旁」使用這些工具,「作為原型開發與評估提示的一種方式」,或者「單獨使用,以新穎的方式運用這個模型」1。那個購物 App 的範例會「在以 Swift 實作之前」先在 Python 裡為提示做原型1。CLI 與 SDK 縮短了從構想到佐證之間的迴圈;而 App 仍是功能最終落地的地方。

常見問題

fm 命令列工具是什麼?

fm 是一個隨 macOS 27 預先安裝的命令列工具,能從「終端機」App 中存取裝置端的 Apple Foundation Model1。其子指令包括用以提示模型並印出回應的 respond、用以啟動互動式對話的 chat,以及用以定義結構化輸出的 schema。您執行它時既不需要 API 金鑰,也沒有雲端成本,因為預設模型是在裝置上執行的1

我要如何從 fm 取得結構化的 JSON?

fm schema object 定義一個 schema,再透過它的 schema 選項把這個 schema 傳給 fm respond。模型會以符合該 schema 的 JSON 回傳答案,指令稿便能直接據以行動,而不必去剖析自由文字1。這套機制是框架引導式生成的 CLI 版本1

Foundation Models Python SDK 有哪些要求?

Python 3.10 或更新版本、已安裝 Xcode,以及一台 Apple Silicon Mac1。您透過 pip 或您所選的其他套件管理工具來安裝它。Apple Silicon 與 Xcode 這兩項要求,反映出這套 SDK 綁定的是作業系統所執行的同一個裝置端模型,而非去呼叫一個託管式 API1

Python SDK 和 Swift 框架有何不同?

它是同一個模型,以及一套以另一種語言寫成、刻意設計得很熟悉的 API。您建立一個 LanguageModelSession、呼叫 respond、揭露工具,並透過 fm.generable 裝飾器(作為 generating 引數傳入 fm.respond)使用引導式生成1。選擇 Python 的理由在於生態系:Pandas、matplotlib、Jupyter,以及資料科學技術堆疊的其餘部分,用於那些 Swift 無法如此直接觸及的評估流程1

我何時該用 Private Cloud Compute 而非裝置端模型?

fm 與 SDK 都預設使用裝置端模型,它始終可用且沒有使用量限制1。當一個問題複雜到需要那個更大的模型時,再透過 fm respond 的模型選項或 fm chat/model 指令切換到 Private Cloud Compute,並接受它帶有使用量限制1

完整的 Apple Ecosystem 系列:Foundation Models 框架詳解介紹這些工具所對應的 Swift 基礎;iOS 27 工具呼叫控制說明模型如何使用工具;Foundation Models 代理式工作流程探討裝置端模型與更大模型之間的取捨;而 Xcode 27 的程式碼代理則談一個以代理為重心的工作流程在 IDE 內的那一面。系列樞紐位於 Apple Ecosystem 系列。若想了解以代理打造 iOS 的更宏觀面貌,請參閱 iOS 代理開發指南



  1. Apple,WWDC26 議程 334,「Build AI-powered scripts with the fm CLI and Python SDK」,由 Foundation Models Framework 團隊的 Eric Gourlaouen 主講。developer.apple.com/videos/play/wwdc2026/334。以下內容的來源:隨 macOS 27 預先安裝的 fm 工具及其 respondchatschema 子指令;fm chat/model/save 指令;fm respond 的模型、影像、schema 與 help 選項;用以定義結構化輸出的 fm schema object 與 JSON 結果契約;排序檔案的自動化指令稿;裝置端模型與 Private Cloud Compute 模型之間的選擇,以及後者的使用量限制;Python SDK 的要求(Python 3.10+、Xcode、Apple Silicon、透過 pip 安裝);LanguageModelSessionsession.respond、工具呼叫,以及透過 fm.generable 裝飾器(作為 generating 引數傳入 fm.respond)的引導式生成;Jupyter/Pandas/matplotlib 評估流程、三種提示變體、以伺服器模型為後盾的評審函式,以及各提示的失敗模式(觸及最大脈絡視窗時的生成錯誤、多加的商品、漏掉的商品、幻覺出的商品);Xcode 27 Evaluations 框架的提及;以及「在以 Swift 實作之前先用 Python 做原型」的說法。Python SDK 的 GitHub 儲存庫連同範例片段與文件在議程中有所提及,但畫面上並未給出 URL,故以文字描述而非連結。 

  2. Apple Developer,「Foundation Models」框架總覽。這是 WWDC25 推出的 Swift 框架,引入了裝置端的 Apple Foundation Model、LanguageModelSession、引導式生成,以及 Tool 協定,而 fm CLI 與 Python SDK 在 macOS 27 上正對應了這些。 

相關文章

在 Mac 上以 MLX 執行代理式 AI

WWDC 2026:在 Mac 上以 MLX 於本機執行完整的代理式 AI 迴圈,將其擴展至多台 Mac,再透過 Apple 的框架加以保護與效能剖析。

4 分鐘閱讀

Apple 將開源 Foundation Models 框架

WWDC 2026:Foundation Models 框架將於今夏開源,讓同一套 Swift API 也能在伺服器端執行,另有一個全新的 Skills 套件已在 GitHub 上線。

5 分鐘閱讀

CLI 論點

三個 HN 熱門 Claude Code 討論串匯聚出同一個結論:CLI 優先架構比 IDE 代理工作流程更便宜、更快速、更具組合性。

4 分鐘閱讀