WWDC Quick Look 💓 By SwiftGGTeam
Build with the new Apple Foundation Model on Private Cloud Compute

Build with the new Apple Foundation Model on Private Cloud Compute

观看原视频

Highlight

Apple 将运行在 Private Cloud Compute(PCC)上的服务器端大模型开放给第三方 App,开发者只需改一行代码(传入 PrivateCloudComputeLanguageModel())即可将端侧 LLM 调用无缝切换到 32K 上下文的云端模型,无需 API Key、无需鉴权、无 Token 费用,但需处理用户每日配额限制。

核心内容

端侧模型的天花板

去年 Apple 推出了 Foundation Models 框架,让开发者可以用 3 行代码调用端侧 LLM。但 4K 的上下文窗口和有限的算力,让稍微复杂一点的场景就捉襟见肘。比如你要做一个能分析长文档的助手,或者一个需要多次调用工具、生成大量输出的功能,端侧模型根本装不下。(00:16

开发者想突破这个限制,通常只能接入第三方云端 API。这意味着要自己管理 API Key、处理鉴权、承担 Token 费用,还要向用户解释数据隐私问题。对独立开发者和小团队来说,这是一笔不小的开销和心智负担。

改一行代码,获得云端算力

Apple 今年的答案是:把自家系统功能也在用的 Private Cloud Compute(PCC)开放给第三方 App。PCC 上的服务器模型提供 32K 上下文,支持更复杂的推理能力,而且调用方式与端侧模型完全统一。(00:39

最直观的体现是代码层面的零成本迁移。如果你已经在用 Foundation Models 框架,只需把 LanguageModelSession 的初始化参数改一行:

let session = LanguageModelSession(
    model: PrivateCloudComputeLanguageModel()
)

结构化输出(@Generable)和工具调用(Tool)的代码完全不用改。同一个 respond(to:) 方法,同一个 generating: 参数,端侧和云端的行为一致。(03:02

不需要 API Key,但需要处理配额

PCC 和 iCloud 深度集成。用户不需要注册新账号,开发者不需要配置 API Key。只要用户的设备支持 Apple Intelligence,就能直接使用。(02:02

天下没有免费的午餐。PCC 的调用是按用户 iCloud 账号计费的,每个用户有每日配额上限。用户可以通过升级 iCloud+ 获得更高额度,但开发者必须在 App 里优雅地处理配额耗尽的情况。如果用户当天额度用完,请求会直接抛错,这时弹一个 Alert 告诉用户”出错了”是很差的体验。(07:14

Apple 建议的做法是:在 UI 中实时检测配额状态,接近上限时给出温和的提示,额度耗尽时禁用请求按钮并引导用户升级。所有状态信息都通过 PrivateCloudComputeLanguageModelquotaUsage 属性暴露,几行代码就能实现。(08:07

详细内容

端侧 vs 云端:如何选择模型

04:06

两个模型各有适用场景:

维度端侧模型PCC 云端模型
网络依赖离线可用需要联网
请求限制无限制每日配额
上下文大小4K(旧设备)/ 8K(新设备)32K
推理能力不支持Light / Moderate / Deep 三级
隐私数据不出设备端到端加密,不存储

代码里可以用 contextSize 属性动态获取当前模型的上下文大小:

SystemLanguageModel().contextSize        // 4096 (旧设备) 或 8192 (新设备)
PrivateCloudComputeLanguageModel().contextSize  // 32768

05:58

检查可用性

PCC 只在支持 Apple Intelligence 的设备上可用。在 UI 中应先检查 isAvailable,再决定是否展示相关功能:

import FoundationModels

struct ArticleSummarizationView: View {
    private var model = PrivateCloudComputeLanguageModel()

    var body: some View {
        if model.isAvailable {
            // 展示 PCC 功能 UI
        } else {
            // 降级到端侧模型或其他方案
        }
    }
}

03:51

关键点:

  • isAvailable 在 View 的 body 中直接使用,SwiftUI 会自动响应状态变化
  • 不支持 Apple Intelligence 的设备(如非 A17 Pro / M 系列芯片)会返回 false
  • 不要假设可用性,始终提供降级方案

结构化输出和工具调用完全复用

端侧模型的 @GenerableTool 协议在 PCC 模型上行为完全一致:

import FoundationModels

@Generable
struct ArticleSummary {
    let oneLineSummary: String
    let keyPoints: [String]
}

struct FindRelatedArticlesTool: Tool {
    // Tool 实现...
}

let session = LanguageModelSession(
    model: PrivateCloudComputeLanguageModel(),
    tools: [FindRelatedArticlesTool.self]
)

let response = try await session.respond(
    to: "Summarize this article: \(article)",
    generating: ArticleSummary.self
)

03:25

关键点:

  • @Generable 宏标记的结构体定义不变
  • Tool 协议的工具实现不变
  • respond(to:generating:) 的调用方式不变
  • 切换模型只需改 LanguageModelSession 的初始化参数

设置推理级别

PCC 模型支持三级推理(Reasoning),让模型在生成最终答案前先”思考”:

let response = try await session.respond(
    to: prompt,
    contextOptions: ContextOptions(reasoningLevel: .light)
)
// .light: 模型收集少量额外上下文
// .moderate: 中等深度的推理
// .deep: 推理文本可能比最终答案还长

05:26

关键点:

  • 推理过程会生成额外的文本片段,存储在 session 的 transcript 中
  • 可以通过观察 transcript 显示推理进度,尤其在 .deep 模式下
  • 推理文本消耗 Token,计入 32K 上下文限制
  • 不要用 .deep 处理简单任务,避免浪费配额

优雅处理配额限制

配额耗尽时不应该弹 Alert,而是更新 UI 状态:

struct ArticleSummarizationView: View {
    private var model = PrivateCloudComputeLanguageModel()

    var body: some View {
        VStack {
            Button("生成摘要") {
                // 触发请求
            }
            .disabled(model.quotaUsage.isLimitReached)

            if case .belowLimit(let info) = model.quotaUsage.status,
               info.isApproachingLimit {
                Text("配额即将用完")
                    .foregroundStyle(Color.orange)
            }

            if model.quotaUsage.isLimitReached {
                Text("今日配额已用完")
                    .foregroundStyle(Color.red)
                if let suggestion = model.quotaUsage.limitIncreaseSuggestion {
                    Button("获取更多配额") {
                        suggestion.show()
                    }
                }
            }
        }
    }
}

09:41

关键点:

  • quotaUsage.status 返回 .belowLimit(info) 或配额耗尽状态
  • info.isApproachingLimit 表示接近上限,适合给出温和提示
  • isLimitReached 为 true 时应禁用请求按钮
  • limitIncreaseSuggestion 提供引导用户升级的按钮,调用 show() 即可展示系统界面
  • 避免使用 Alert,改用持久化的内联 UI

Xcode 调试配额状态

Xcode 提供了模拟配额状态的调试选项。在 Scheme 的 Debug > Options 中,选择 “Simulate Apple Foundation Models Availability”,可以模拟配额耗尽(Quota Usage Limit Reached)或接近上限(Nearing Usage Limit)的场景,无需等待真实用户触达上限。(09:12

核心启发

1. 做一个”智能文档助手”

端侧模型 4K 上下文只能处理几页文档,PCC 的 32K 可以吞下整本书。用 @Generable 定义结构化输出,让模型从长文档中提取关键信息、生成摘要、回答具体问题。

  • 做什么:一个支持 PDF/Word/Markdown 的智能阅读助手
  • 为什么值得做:PCC 的 32K 上下文首次让端侧 App 能处理真正的长文档,且数据不离开 Apple 生态
  • 怎么开始:用 PrivateCloudComputeLanguageModel() 创建 session,定义 @Generable 结构体描述输出格式,用 respond(to:generating:) 获取结构化结果

2. 多级推理的渐进式 AI 功能

不是所有任务都需要 .deep 推理。简单问题用端侧模型,复杂问题用 PCC 的 .light,深度分析用 .moderate,研究级任务用 .deep

  • 做什么:根据任务复杂度自动选择模型和推理级别的智能路由层
  • 为什么值得做:节省用户配额,提升响应速度,端侧离线时也能工作
  • 怎么开始:先用端侧模型尝试,如果置信度低或上下文不够,再切换到 PCC;通过 contextSize 属性动态判断

3. 带工具调用的个人知识库

PCC 支持 Tool 协议,可以让模型调用你的自定义工具。结合 32K 上下文,可以构建一个能搜索本地笔记、查询日历、检索联系人的个人助手。

  • 做什么:一个能调用 App 内多个数据源的个人 AI 助手
  • 为什么值得做:端侧 + PCC 的混合架构让隐私和性能兼得
  • 怎么开始:实现 Tool 协议定义搜索、查询等工具,在 LanguageModelSession 初始化时传入 tools 参数

4. 配额感知的渐进式降级

当用户配额耗尽时,不要直接报错。可以自动降级到端侧模型处理简单任务,同时在 UI 中提示用户升级 iCloud+。

  • 做什么:配额耗尽时自动切换模型的智能降级系统
  • 为什么值得做:保证核心功能始终可用,不因配额问题导致 App 不可用
  • 怎么开始:监听 quotaUsage.isLimitReached,为 true 时创建 LanguageModelSession()(不传 model 参数,默认端侧)处理简单请求

5. watchOS 上的 AI 功能

PCC 支持从 watchOS 调用。Apple Watch 的算力极其有限,但通过 PCC 可以让手表获得云端大模型的能力。

  • 做什么:在 Apple Watch 上实现语音摘要、健康数据分析等 AI 功能
  • 为什么值得做:watchOS 首次获得服务器级 LLM 能力,且无需手表独立联网(通过配对的 iPhone)
  • 怎么开始:在 watchOS App 中直接 import FoundationModels,使用与 iOS 完全相同的 API

关联 Session

评论

GitHub Issues · utterances