Apple 測試 Siri 模型委派功能?2026 年 9 月 14 日,Apple 正式發布 iOS 27 並推出了新一代 Siri AI,與此同時,逆向工程揭露了作業系統內部的代碼結構,該結構允許系統將對話推理任務委派給第三方模型,包括 Anthropic 的 Claude 和 OpenAI 的 ChatGPT。對於行動端架構師與平台工程師而言,私有框架中出現的 Siri 模型委派功能,標誌著架構正朝向模組化的助理協調機制轉移。儘管歐盟《數位市場法案》(DMA)相關的監管環境為系統級互通性提供了制度背景,但外部模型委派仍會為行動端意圖執行帶來操作變異性。行動開發團隊不應預期單一基礎模型具備可預測的行為,而應將 App Intents 視為防禦性的領域邊界,強制實施嚴格的架構驗證、穩健的實體消歧以及明確的副作用安全性管理。
iOS 27 架構與私有框架中的模型委派機制
iOS 27 的正式發布為 Apple Intelligence 建立了分割式的運行時基礎架構。Siri AI 利用 Apple 的設備端與伺服器端基礎模型系列,包括用於支援設備端體驗(如全系統聽寫與表達性語音)的 AFM Core Advanced 模型,以及透過 Private Cloud Compute 叢集運行的伺服器模型。在此運作環境中,Siri AI 作為原生應用的協調者,利用來自郵件 (Mail)、訊息 (Messages) 與照片 (Photos) 的個人情境,透過檢視註解 (View Annotations) 獲取螢幕意識,並利用 Spotlight 支援的語義索引進行運作。
重點概覽
- 內部委派機制:從洩露的 iOS 27 與 macOS 27 版本代碼中,發現了特定的內部機制,特別是 Model Delegation 機制與 Model Manager Services 中的 Inference Providing 協定,旨在將請求路由至 Claude 和 ChatGPT 等第三方模型。
- 未公開的系統授權:這些多模型委派功能目前僅限於私有系統框架;Apple 尚未向第三方開發者或終端用戶開放外部委派授權。
- App Intents 作為支援的合約:無論上游指令是由 Apple 基礎模型還是外部推理代理程式解析,App Intents 始終是 Apple 規定的程式化邊界,用於向系統公開第三方應用的操作功能。

MacRumors 發布的技術分析指出,開發者在檢查私有框架時發現了兩個截然不同的架構層。第一層是模型委派機制,使 Claude 等第三方模型能作為整合式助理擴充功能運作。在技術演示中,Claude 可以解讀無限制的自然語言指令並提取用戶的營運目標,但當任務需要存取系統數據或執行本地應用時,外部模型會將結構化動作委派回 Siri。第二層則是作業系統 Model Manager Services 中的推理提供協定 (Inference Providing protocol),其中包含可將 Apple 伺服器端推理後端替換為其他基礎模型的代碼路徑。
歐洲的監管環境為這些發展提供了重要的制度背景。根據歐盟《數位市場法案》(DMA) 第 6(7) 條規定,作為守門人的作業系統必須遵守互通性強制要求,提供對核心平台功能的平等存取權。雖然 Apple 目前在歐盟市場暫時保留了面向消費者的 Siri AI 功能,等待數據隱私與安全方面的監管協調,但系統二進位文件中出現的模型無關協調掛鉤,顯示 Apple 工程團隊正在測試技術模組化,若未來出現更廣泛的跨模型互通性要求,這些技術將發揮作用。
工程範圍說明: 公開證據證實了私有模型委派機制的存在,並同時確認 App Intents 是 Apple 用於公開第三方應用操作的支援介面。Apple 尚未公開記載連接這兩層的具體內部橋接結構。下方的拓撲圖為說明性的參考邊界模型。
+-------------------------------------------------------------------------+ | 參考模型:私有委派結構周圍的公共 App Intents 邊界 | +-------------------------------------------------------------------------+ | | | [ 用戶自然語言輸入 (語音 / 動態島 / 輸入給 Siri) ] | | | | | v | | [ 系統協調者:情境解析與 Spotlight 語義索引 ] | | | | | +----------------------+----------------------+ | | | | | | v v | | [ 主要系統智慧 ] [ 私有委派路徑 ] | | - 設備端 AFM Core 模型 - 模型委派路徑 | | - 私有雲端運算 (Private Cloud Compute) - 模型管理服務 | | | (Claude / GPT 路徑) | | | | | | +----------------------+----------------------+ | | | | | v | | [ 未記載的內部動作橋接 ] | | | | | v | | [ 公共 App Intents 邊界:應用程式 AppIntent 與 EntityQuery ] | | | | | +----------------------+----------------------+ | | | | | | v v | | [ 強型別原生驗證 ] [ 參數消歧 ] | | (邊界檢查, 執行者隔離) (用戶對話與選擇) | | | +-------------------------------------------------------------------------+
解析模型委派層:系統協調與 App Intent 合約的差異
自然語言推理與應用程式執行之間的架構區分,是理解 iOS 如何處理助理工作流程的關鍵。在傳統的行動助理實作中,語音處理與功能分派是透過 SiriKit 下的靜態領域類別進行協調的。經過多次開發者版本更新,Apple 已將此介面轉向宣告式的 App Intents 架構。
在此現代範式下,原生應用程式無需解析音訊流或維護音素字典。相反地,應用程式會向系統的運行時註冊表公開兩個基礎元件:
AppEntity宣告:內部商業模型(如訂單記錄、帳戶設定檔或文件參考)的型別表示。應用程式還可以透過專門的索引與檢視註解 API,將合格的實體公開給 Spotlight 搜尋或螢幕意識機制。AppIntent規格:包含強型別參數、在地化提示摘要與返回合約的可執行常式。

當內部框架透過外部推理模型路由用戶語音時,委派層將指令理解與動作執行區分開來。在所演示的工作流程中,外部模型作為上游語義解譯器,並能將動作返回給 Siri。對於第三方應用而言,Apple 記載的 App Intents 架構分別定義了將支援動作公開給系統的型別合約。
簡化概念對比:助理演進
傳統模式匹配分派:
用戶輸入 -> 語法領域規則 -> 欄位填寫 -> 處理器呼叫
多模型協調管線:
用戶輸入 -> 主動模型提供者 (AFM / Claude / GPT)
-> 語義參數合成
-> 正式 Swift AppIntent 合約
-> 防禦性驗證與實體解析
-> 領域業務邏輯
這種結構性的分離揭示了一個重要的工程事實:自然語言推理模型會引入語義變異。Apple 將 App Intents 記載為將支援的應用操作公開給 Siri 和 Apple Intelligence 的型別合約。不同的上游推理模型在達到該合約之前,對等效用戶語言的解釋方式可能仍有差異,從而引入獨特的標記化 (Tokenization) 細微差別與不同的語義假設。在假設的多模型架構中,一個模型可能會合成精確的字母數字參考代碼,而另一個模型則可能提供間接的描述性字串或部分的實體標題。
因此,行動開發者不能假設上游模型交接能保證輸入有效的領域數據。App Intents 架構提供了結構化介面,但驗證傳入參數是否符合現實操作不變數 (Invariants) 的責任,仍完全由原生應用程式代碼承擔。
Swift AppIntents 的防禦性工程標準
為了調整 iOS 應用程式以適應上游意圖可能源自多個推理模型的環境,工程團隊需要採用防禦性程式設計技術。與其將傳入的意圖呼叫視為預先驗證過的系統事件,工程團隊應以對待外部 REST API 控制器或公共 RPC 端點的相同嚴謹態度來設計意圖處理器。
App Intents 可能根據其宣告的運行時配置在前台或後台模式下執行。因此,開發者除非意圖明確需要前台執行環境,否則應避免假定活動視窗階層或呈現同步 UI 檢視控制器。對於修改共享狀態或遠端狀態的意圖,將領域邏輯隔離在非同步、執行緒安全的領域服務之後是一種強大的防禦模式。
| 工程維度 | 說明性最小模式 | 防禦性多模型 App Intent 模式 |
|---|---|---|
| 參數攝取 | 假設符合字串或基本型別 | 驗證字元集、字串長度與領域不變數 |
| 實體解析 | 透過 EntityQuery 直接進行鍵值查詢 |
實作 EntityStringQuery 以進行正規化文字搜尋 |
| 消歧流程 | 失敗時拋出通用系統錯誤 | 區分缺失值 (needsValueError) 與選項 (needsDisambiguationError) |
| 副作用控制 | 立即執行狀態變更 | 針對破壞性或高影響力動作納入 requestConfirmation() |
| 併發模型 | 無限制的非同步任務 | 隔離領域執行者,防止重試期間的競爭條件 |
為在處理跨不同模型提供者合成的輸入時保持營運完整性,架構必須整合四種防禦性實作模式:
- 基於識別碼與字串的實體解析:實作
EntityStringQuery以支援唯一識別碼查詢與任意文字搜尋。當外部模型提供描述性標籤而非精確鍵值時,正規化的字串匹配能優雅地處理部分片語。 - 互動式參數澄清:若上游推理提供者省略了必要參數,處理器應調用互動式值提示 (
needsValueError)。當多個實體符合模糊片語時,系統必須觸發消歧 (needsDisambiguationError)。 - 持久化變更的冪等性 (Idempotency):由於對話助理可能會在網路逾時或用戶確認模糊後重新發送請求,事務性意圖應接受或派生持久化操作 Token,以防止重複執行副作用。
- 高影響力修改的明確確認:對於涉及財務承諾、帳戶修改或不可逆刪除的動作,請利用
requestConfirmation()確保在執行狀態變更前獲得明確的用戶同意。
// 工程範圍說明:以下 Swift 範例為參考架構,展示防禦性 AppIntent 驗證、
// 實體查詢消歧與冪等性領域執行。這並非 Apple 針對未發布的
// 模型委派私有框架所預設的實作方式。
import Foundation
import AppIntents
// MARK: - 語義 App Entity 表示
public struct BookingEntity: AppEntity {
public static var defaultQuery = BookingQuery()
public static var typeDisplayRepresentation: TypeDisplayRepresentation = "服務預約"
public var id: String
public var serviceName: String
public var referenceCode: String
public var displayRepresentation: DisplayRepresentation {
DisplayRepresentation(
title: "\(serviceName)",
subtitle: "參考代碼: \(referenceCode)"
)
}
}
// MARK: - 防禦性實體查詢解析器 (ID 與字串搜尋)
public struct BookingQuery: EntityStringQuery {
public init() {}
// 1. 解析系統或持久化快取提供的精確唯一識別碼
public func entities(for identifiers: [String]) async throws -> [BookingEntity] {
var resolvedEntities: [BookingEntity] = []
for id in identifiers {
if let entity = await BookingDataSource.shared.fetchBooking(byId: id) {
resolvedEntities.append(entity)
}
}
return resolvedEntities
}
// 2. 處理上游推理模型合成的自然語言搜尋字串
public func entities(matching string: String) async throws -> [BookingEntity] {
return await BookingDataSource.shared.searchBookings(matching: string)
}
// 3. 當未提供查詢參數時返回初始候選建議
public func suggestedEntities() async throws -> [BookingEntity] {
return await BookingDataSource.shared.fetchAllActiveBookings()
}
}
// MARK: - 參考防禦性 AppIntent 模式
public struct ConfirmBookingIntent: AppIntent {
public static var title: LocalizedStringResource = "確認預約"
public static var description = IntentDescription(
"使用經驗證的預約實體確認有效的預約或訂位。",
categoryName: "預約"
)
// 若省略或模糊,配置為進行互動式運行時消歧
@Parameter(
title: "目標預約",
description: "待確認的特定有效預約實體。"
)
public var targetBooking: BookingEntity?
// 呼叫者提供的持久化冪等性 Token,以防止冗餘的副作用
@Parameter(
title: "客戶變更 Token",
description: "用於在對話重試期間強制執行變更冪等性的持久化客戶 Token。"
)
public var mutationToken: String?
public init() {}
public init(targetBooking: BookingEntity, mutationToken: String? = nil) {
self.targetBooking = targetBooking
self.mutationToken = mutationToken
}
// 與前台 UI 階層隔離的無頭執行 (Headless execution)
public func perform() async throws -> some IntentResult & ReturnsValue<Bool> & ProvidesDialog {
// 防禦性驗證:若省略實體參數,則提示系統協調者
guard let booking = targetBooking else {
throw $targetBooking.needsValueError(
"您想確認哪一個有效預約?請指定參考代碼或服務名稱。"
)
}
// 領域驗證:驗證必要的營運參數
guard !booking.id.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty else {
throw BookingDomainError.invalidIdentifier
}
// 對於破壞性或高影響力的狀態變更,呼叫已記載的確認 API:
// try await requestConfirmation()
// 強制執行持久化冪等性:若已提供 Token,拒絕重複變更
if let token = mutationToken {
let alreadyProcessed = await BookingStateManager.shared.isTokenProcessed(token)
if alreadyProcessed {
return .result(
value: true,
dialog: "此預約已確認。未執行進一步操作。"
)
}
}
// 在隔離的執行者 (Actor) 內部執行核心領域邏輯
do {
let confirmationSuccess = try await BookingExecutionService.shared.executeConfirmation(
bookingId: booking.id
)
// 狀態變更成功後保留 Token
if let token = mutationToken, confirmationSuccess {
await BookingStateManager.shared.recordToken(token)
}
return .result(
value: confirmationSuccess,
dialog: "已成功為您確認 \(booking.serviceName) 的預約。"
)
} catch let domainError as BookingDomainError {
// 傳遞符合 LocalizedError 的型別化領域失敗
throw domainError
}
}
}
// MARK: - 支援領域執行者與隔離基礎架構
public enum BookingDomainError: Error, LocalizedError {
case invalidIdentifier
case reservationExpired
case networkUnavailable
public var errorDescription: String? {
switch self {
case .invalidIdentifier:
return "提供的預約識別碼無效或格式錯誤。"
case .reservationExpired:
return "此預約已過期,無法再進行確認。"
case .networkUnavailable:
return "無法連線至預約服務。請檢查您的連線。"
}
}
}
public actor BookingStateManager {
public static let shared = BookingStateManager()
private var processedTokens = Set<String>()
public func isTokenProcessed(_ token: String) -> Bool {
return processedTokens.contains(token)
}
public func recordToken(_ token: String) {
processedTokens.insert(token)
}
}
public actor BookingExecutionService {
public static let shared = BookingExecutionService()
public func executeConfirmation(bookingId: String) async throws -> Bool {
// 模擬非同步遠端服務變更
try await Task.sleep(nanoseconds: 80_000_000)
return true
}
}
public actor BookingDataSource {
public static let shared = BookingDataSource()
public func fetchBooking(byId id: String) -> BookingEntity? {
if id == "TC-2026-01" {
return BookingEntity(id: id, serviceName: "技術諮詢", referenceCode: "TC-2026-01")
}
return nil
}
public func searchBookings(matching query: String) -> [BookingEntity] {
let all = fetchAllActiveBookings()
let normalized = query.trimmingCharacters(in: .whitespacesAndNewlines).lowercased()
return all.filter {
$0.serviceName.lowercased().contains(normalized) ||
$0.referenceCode.lowercased().contains(normalized)
}
}
public func fetchAllActiveBookings() -> [BookingEntity] {
return [
BookingEntity(id: "TC-2026-01", serviceName: "技術諮詢", referenceCode: "TC-2026-01"),
BookingEntity(id: "HD-2026-88", serviceName: "硬體診斷", referenceCode: "HD-2026-88")
]
}
}
系統操作邊界與意圖消歧
多模型協調中的一個基礎挑戰,是如何在用戶請求無法清楚映射至明確的應用狀態時管理模糊性。當助理將解譯權委派給外部基礎模型時,語義分歧的風險會增加:例如「確認我的預約」這類用戶請求,可能會產生包含相對日期字串、商號或非正式服務描述的意圖參數。在 Apple 的 App Intents 架構中,系統協調者透過應用發布的結構與主動助理介面之間的持續回饋迴圈來處理參數解析。若缺乏適當的澄清或消歧掛鉤,系統可能無法可靠地解析目標實體,並可能退回至失敗或降級的互動狀態。

+-------------------------------------------------------------------------+ | 防禦性參數消歧序列 | +-------------------------------------------------------------------------+ | | | [ 上游模型合成候選參數 ] | | | | | v | | [ 原生 App EntityStringQuery 評估輸入識別碼 / 搜尋 ] | | | | | +---------------------------------------+ | | | 找到精確識別碼匹配 | 模糊或多個匹配 | | v v | | [ 進行驗證 ] [ 查詢產生多個結果 ] | | | | | | | v | | | [ 拋出 needsDisambiguationError() ] | | | | | | | v | | | [ 系統呈現選擇選單 ] | | | | | | | v | | | [ 用戶選擇目標實體 ] | | | | | | +<--------------------------------------+ | | | | | v | | [ 執行帶有確認實體情境的副作用意圖 ] | | | +-------------------------------------------------------------------------+
為建構可預測的消歧機制,開發者必須利用 App Intents 架構的互動功能:
- 結構化候選呈現:
EntityStringQuery.entities(matching:)應返回一個候選AppEntity執行個體陣列,並填入描述性標題與副標題。若運行時有多個候選項目在語義上仍合理,拋出needsDisambiguationError(among:dialog:)可指示系統呈現原生選擇對話框。 - 意圖對話整合:處理器應利用
ProvidesDialog將對話情境傳回給協調者。當操作成功或遇到可恢復的業務狀況時,返回客製化的對話容器可確保無論初始指令由哪個模型處理,用戶都能獲得準確的回饋。 - 優雅的領域錯誤傳遞:當動作因後端業務規則(如預約視窗過期或庫存不足)而無法完成時,拋出符合
LocalizedError的型別化 Swift 錯誤,可確保助理提供可操作、在地化的解釋,而非隱晦的系統代碼。
透過投入精力在細粒度的查詢解析與溝通式錯誤傳遞上,開發者可以確保無論是經由 Apple 的整合模型還是未來的第三方委派助理,其應用程式都能保持韌性。
常見問題 (FAQ)
Siri 模型委派功能與現有的 ChatGPT 整合有何不同?
歐盟《數位市場法案》(DMA) 是否強制要求 Apple 允許第三方 AI 模型取代 Siri?
第三方模型在處理委派意圖時,可以直接存取私人應用數據嗎?
針對行動工程團隊的策略指導
為使應用程式代碼庫適應日益模組化的作業系統智慧,工程組織應採用以下技術里程碑:
-
審核並現代化 App Intent 覆蓋範圍:針對支援的使用場景,在公開新功能時優先考慮現代 Swift
AppIntent架構,並審核舊有的 SiriKit 整合以尋求遷移機會。每個主要動作都應附帶清晰、描述性的語義中繼資料。 -
實作基於識別碼與字串的實體解析:使用
EntityStringQuery來支援繼承自EntityQuery的識別碼檢索以及任意文字匹配。解析器應處理正規化、小寫以及部分字串輸入,以適應不同推理引擎生成的多元參數格式。 -
將狀態變更隔離在背景執行者 (Actors) 之後:重構業務執行方法,使意圖對無頭、執行緒安全的領域服務進行操作。意圖執行不應假定存在活動視窗場景,除非其宣告的執行模式明確要求或過渡至前台情境。
-
強制執行兩階段變更驗證:對於涉及財務承諾、帳戶修改或不可逆刪除的敏感動作,利用
requestConfirmation()確保在執行狀態變更前獲得明確的用戶同意。 -
建立端到端意圖測試套件:建立自動化單元與整合測試,驗證
AppIntent處理器在提供邊界案例輸入、空字串以及格式錯誤的實體參考時,表現是否正確。
參考資料
-
Apple. (2026). Siri AI:由新一代 Apple Intelligence 驅動、功能更強大且更個人化的助理現已推出. Apple Newsroom.
-
Apple Developer Documentation. (2026). 使用 App Intents 整合您的應用與 Siri 及 Apple Intelligence. Apple Developer.
-
European Commission. (2022). 關於數位領域可競爭且公平市場的法規 (EU) 2022/1925 (數位市場法案). 歐盟官方公報。
-
MacRumors. (2026). 代碼顯示 Apple 的 Siri AI 可替換為 Claude、ChatGPT.
Share this article



