Apple 测试 Siri 模型代理?App Intents 需要如何应对

opoinstall
2026-09-16
5 min read

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 高级模型,以及运行在 Private Cloud Compute 集群中的服务端模型。在这一环境中,Siri AI 充当跨 App 的编排器,通过调用邮件、短信、照片中的个人情境,利用视图标注(View Annotations)实现屏幕感知,并结合 Spotlight 提供语义索引。

概览

  • 内部代理机制:根据 iOS 27 和 macOS 27 的泄露文件,系统内部存在一种“模型代理”机制及模型管理服务中的推理提供协议,旨在将请求路由至 Claude 和 ChatGPT 等第三方模型。
  • 未开放的系统权限:这些多模型代理功能目前仅限于私有系统框架,Apple 尚未向第三方开发者或终端用户开放相关接口。
  • App Intents 作为标准合同:无论上游提示词由 Apple 基础模型解析还是由外部推理代理处理,App Intents 始终是 Apple 规定的程序化边界,用于向系统暴露第三方 App 的操作能力。

Apple iOS 27 Siri AI 界面演示在邮件 App 中处理个人语境

MacRumors 发布的分析显示,开发者在研究私有框架时发现了两个架构层级。第一层是模型代理机制,允许 Claude 等第三方模型作为集成式助手插件运行。在技术演示中,Claude 可以解读非限制性的自然语言提示并提取用户目标,当任务需要访问系统数据或进行本地执行时,外部模型会将结构化操作委托给 Siri。第二层则是更深层的推理提供协议,代码路径具备以其他基础模型替代 Apple 服务端推理后端的潜力。

欧洲的监管环境为这一发展提供了制度背景。根据欧盟《数字市场法案》(DMA)第 6(7) 条,守门人操作系统必须满足互操作性要求,确保核心平台功能享有平等准入权。尽管 Apple 因数据隐私和安全合规原因暂时未向欧盟市场推送 Siri AI 的相关功能,但系统二进制文件中模型无关的编排钩子表明,Apple 工程师正在测试模块化技术,以应对未来可能出现的交叉模型互操作性需求。

工程范围说明: 公共证据证实了私有模型代理机制的存在,并确认 App Intents 是 Apple 目前支持的第三方应用操作接入接口。Apple 尚未公开记录连接这两层逻辑的内部桥接方式。下方拓扑结构仅作为参考示意。

+-------------------------------------------------------------------------+
| 参考模型:围绕私有代理的公共 App Intents 边界  |
+-------------------------------------------------------------------------+
|                                                                         |
|  [ 用户自然语言输入 (语音 / 灵动岛 / 键盘输入 Siri) ]|
|                                |                                        |
|                                v                                        |
|  [ 系统编排器:情境解析 & Spotlight 语义索引 ] |
|                                |                                        |
|         +----------------------+----------------------+                 |
|         |                                             |                 |
|         v                                             v                 |
|  [ 系统主智能引擎 ]            [ 私有代理路径 ] |
|  - 本地 AFM 核心模型                - 模型代理路径     |
|  - 私有云计算 (Private Cloud Compute)     - 模型管理服务    |
|         |                                     (Claude / GPT 路径)      |
|         |                                             |                 |
|         +----------------------+----------------------+                 |
|                                |                                        |
|                                v                                        |
|             [ 未公开的内部操作桥接 ]                     |
|                                |                                        |
|                                v                                        |
|  [ 公共 App Intents 边界:AppIntent & EntityQuery ]   |
|                                |                                        |
|         +----------------------+----------------------+                 |
|         |                                             |                 |
|         v                                             v                 |
|  [ 类型化原生验证 ]                [ 参数消歧 ]|
|  (边界检查, Actor 隔离)            (用户对话与选择)   |
|                                                                         |
+-------------------------------------------------------------------------+

解析模型代理层:系统编排与 App Intent 合同

自然语言推理与应用执行之间的架构区别,是理解 iOS 如何处理助手工作流的关键。在传统的移动助手实现中,语音处理和功能调度通过 SiriKit 下的静态领域类进行协调。随着开发者版本的演进,Apple 已将这一接口转型为声明式的 App Intents 框架。

在这种现代范式下,原生 App 无需解析音频流或维护音素字典。相反,App 向系统运行时的注册表暴露两个核心组件:

  1. AppEntity 声明:内部业务模型(如订单记录、账户信息或文档引用)的类型化表示。App 还可以通过专用的索引和视图标注 API 将可选实体暴露给 Spotlight 搜索或屏幕感知机制。
  2. AppIntent 规格:包含强类型参数、本地化提示摘要及返回合同的可执行程序逻辑。

Siri AI 展示屏幕感知能力以回答 iPhone 上的上下文特定问题

当内部框架将用户语音路由至外部推理模型时,代理层将提示理解与操作执行进行了拆分。在演示的工作流中,外部模型作为上游语义解释器,并将操作返回给 Siri。对于第三方 App,Apple 的 App Intents 框架定义了通过哪些类型化契约向系统暴露支持的操作。

简化版概念比较:助手演进

传统模式匹配调度:
用户输入 -> 语法领域规则 -> 槽位填充 -> 处理器调用

多模型编排流水线:
用户输入 -> 主动模型提供商 (AFM / Claude / GPT)
            -> 语义参数合成
            -> 正式 Swift AppIntent 合同
            -> 防御性验证 & 实体解析
            -> 领域业务逻辑

这种结构性分离揭示了一个重要的工程现实:自然语言推理模型会引入语义差异。Apple 将 App Intents 作为类型化契约,用于向 Siri 和 Apple Intelligence 暴露支持的 App 操作。不同的上游推理模型在到达该契约前,对相同用户语言的解释可能存在差异,从而导致 Token 化细微差别和不同的语义假设。在假设的多模型架构中,一个模型可能合成精确的字母数字参考代码,而另一个则可能提供间接描述性字符串或部分实体名称。

因此,移动开发者不能假定上游模型转换能保证有效输入。App Intents 框架提供了结构化接口,但验证输入参数是否符合业务逻辑的责任完全在于原生 App 代码。

Swift AppIntents 的防御性工程标准

在多种推理模型可能触发上游意图的环境中,适配 iOS 应用需要采用防御性编程技术。工程团队不应将收到的意图调用视为已预验证的系统事件,而应像对待外部 REST API 控制器或公共 RPC 接口那样处理意图处理器。

App Intents 根据其声明的运行时配置,可能在后台或前台执行。因此,除非意图明确需要前台执行上下文,否则开发者应避免假定存在活动的窗口层级或展示同步 UI 视图控制器。对于修改共享状态或远程状态的意图,将业务逻辑封装在异步且线程安全的领域 Actor 之后是一种稳健的防御模式。

工程维度 基础模式(示意) 防御性多模型 App Intent 模式
参数摄取 假定匹配字符串或原始类型 验证字符集、字符串长度及领域常量
实体解析 通过 EntityQuery 直接查找键值 实现 EntityStringQuery 进行标准化文本搜索
消歧流程 失败时抛出通用系统错误 区分缺失值 (needsValueError) 与多选歧义 (needsDisambiguationError)
副作用控制 立即执行状态变更 针对高风险操作引入 requestConfirmation() 确认机制
并发模型 非受限异步任务 通过领域 Actor 隔离防止重试期间的竞争条件

为在处理来自不同模型提供商的合成输入时保持运营完整性,架构必须集成四种防御性实现模式:

  • 基于标识符与字符串的实体解析:实现 EntityStringQuery 以支持唯一标识符查询与任意文本搜索。当外部模型提供描述性标签而非精确键值时,标准化字符串匹配可从容处理部分短语。
  • 交互式参数澄清:若上游推理提供商忽略了必需参数,处理器应调用交互式值提示 (needsValueError)。当多个实体与模糊短语匹配时,系统必须触发消歧流程 (needsDisambiguationError)。
  • 持久化突变幂等性:由于对话助手可能在网络超时或用户确认模糊后重新发出请求,事务性意图应接受或派生持久化操作 Token,以防止产生重复的副作用。
  • 高影响突变的显式确认:对于涉及财务结算、账户修改或不可逆删除的操作,务必利用 requestConfirmation() 确保在执行状态变更前获得显式的用户同意。
// 工程范围说明:以下 Swift 示例为参考架构,演示了防御性 AppIntent 验证、实体查询消歧和幂等性业务执行。
// 这并非 Apple 针对未发布模型代理框架所规定的实现标准。

import Foundation
import AppIntents

// MARK: - 语义化 App 实体表示
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?

    @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 层级的执行逻辑
    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 {
            throw domainError
        }
    }
}

// MARK: - 辅助领域 Actor 与基础设施
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")
        ]
    }
}

系统操作边界与意图消歧

多模型编排中的核心挑战在于,当用户请求无法精确映射到明确的 App 状态时如何管理歧义。当助手将解释权交给外部基础模型时,语义发散的风险会增加:如“确认我的预约”这样的请求,可能产生包含相对日期字符串、商业名称或非正式服务描述的意图参数。在 Apple 的 App Intents 架构中,系统编排器通过 App 发布架构与主动助手接口之间的连续反馈循环来处理参数解析。缺乏适当的澄清或消歧钩子,系统可能无法可靠解析预期实体,从而导致失败或交互降级。

iPhone 上的 Siri App 展示跨设备同步的对话历史记录

+-------------------------------------------------------------------------+
|               防御性参数消歧序列               |
+-------------------------------------------------------------------------+
|                                                                         |
|  [ 上游模型合成候选参数 ]                     |
|         |                                                               |
|         v                                                               |
|  [ 原生 App EntityStringQuery 评估输入标识符 / 搜索 ]   |
|         |                                                               |
|         +---------------------------------------+                       |
|         | 找到精确标识符匹配          | 歧义或多个匹配 |
|         v                                       v                       |
|  [ 进入验证流程 ]             [ 查询结果包含多项匹配 ]|
|         |                                       |                       |
|         |                                       v                       |
|         |                        [ 抛出 needsDisambiguationError() ]   |
|         |                                       |                       |
|         |                                       v                       |
|         |                              [ 系统弹出选择菜单 ]|
|         |                                       |                       |
|         |                                       v                       |
|         |                              [ 用户选择目标实体 ]   |
|         |                                       |                       |
|         +<--------------------------------------+                       |
|         |                                                               |
|         v                                                               |
|  [ 执行带有确认实体语境的副作用意图 ]           |
|                                                                         |
+-------------------------------------------------------------------------+

为构建可预测的消歧机制,开发者必须利用 App Intents 框架的交互功能:

  1. 结构化候选方案展示EntityStringQuery.entities(matching:) 应返回填充有描述性标题和副标题的 AppEntity 实例数组。若在运行时多个候选者在语义上均合理,抛出 needsDisambiguationError(among:dialog:) 可触发原生选择对话框。
  2. 意图对话集成:处理器应利用 ProvidesDialog 向编排器提供对话上下文。当操作成功或遇到可恢复的业务情况时,返回定制的对话容器确保无论由哪个模型处理初始提示,用户都能获得准确反馈。
  3. 优雅的领域错误传播:当因后端业务规则(如预约窗口过期或库存枯竭)无法完成操作时,抛出遵循 LocalizedError 的类型化 Swift 错误,确保助手提供可操作的本地化解释,而非晦涩的系统代码。

通过投资于细粒度的查询解析和通用的错误传播,开发者能够确保应用在被 Apple 集成模型或未来第三方代理助手调用时保持稳健性。

常见问题解答 (FAQ)

Siri 模型代理与现有的 ChatGPT 集成有何不同?
iOS 现有的 ChatGPT 插件提供的是浅层查询移交:当 Siri 无法回答广泛的事实性问题时,它会请求用户授权将提示转交给 ChatGPT,并直接返回文本或图像响应。iOS 27 私有框架中发现的模型代理机制代表了更深层次的集成。在此架构下,外部 AI 代理可以接收用户提示、解读对话目标,并协调 Siri 请求原生系统操作;而 Apple 公共的 App Intents 框架则独立定义了第三方 App 如何向 Siri 和 Apple Intelligence 暴露支持的操作。
欧盟《数字市场法案》是否强制要求 Apple 允许第三方 AI 模型取代 Siri?
《数字市场法案》第 6(7) 条要求守门人以公平、合理且无歧视的条款为第三方提供操作系统互操作性。欧洲监管机构已依据这些规定审查了平台级语音助手和默认服务捆绑。尽管 DMA 确立了要求获得系统级功能技术准入的法律框架,但 Apple 尚未正式确认 iOS 27 中发现的模型代理代码是专门为满足 DMA 的特定执法要求而开发的。
第三方模型在处理代理意图时能否直接访问私有 App 数据?
目前尚无公共证据建立未发布第三方推理提供商的数据访问合同。Apple 已发布的 App Intents 和 Siri API 保留了正常的 App 沙盒和权限边界,但泄露的演示显示,被代理的推理提供商可以通过 Siri 的编排层接收规划器定义的工具输出及产生的个人情境。因此,开发者应区分已记录的 App 沙盒保护与私有代理框架中尚未记录的隐私合同。

移动研发团队的战略指导

为使应用代码库适配日益模块化的操作系统智能,研发团队应采取以下技术里程碑:

  1. 审计并现代化 App Intent 覆盖范围:针对相关使用场景,在暴露新功能时优先考虑使用现代 Swift AppIntent 模式,并审计旧有的 SiriKit 集成以寻求迁移机会。每个主要操作都应配有清晰的描述性语义元数据。

  2. 实施基于标识符与字符串的实体解析:使用 EntityStringQuery 以支持从 EntityQuery 继承的标识符检索及任意文本匹配。解析器应处理标准化、小写化及部分字符串输入,以适应不同推理引擎产生的多样化参数格式。

  3. 将状态变更封装在后台 Actor 中:重构业务执行方法,使意图针对无界面的线程安全领域服务运行。意图执行不应假定存在活动窗口,除非其声明的执行模式明确要求或已过渡至前台环境。

  4. 执行两阶段变更验证:对于涉及财务结算、账户修改或不可逆删除的敏感操作,利用 requestConfirmation() 确保在执行状态变更前获得显式的用户同意。

  5. 建立端到端意图测试套件:构建自动化单元和集成测试,验证 AppIntent 处理器在处理边界情况输入、空字符串及畸形实体引用时的正确行为。

参考文献

Share this article