Meet the Foundation Models framework
Machine Learning & AI 入门 2m

Meet the Foundation Models framework

2025年6月9日

在 Apple 官方观看视频

一句话判断

Apple 终于把 Apple Intelligence 背后那个 3B 参数的大模型开放给开发者了,而且是纯 Swift API、完全 on-device、零服务端依赖。这是今年 ML 方向最重磅的框架,没有之一。

这场 Session 讲了什么

Foundation Models framework 给了你直接调用 Apple Intelligence 端侧大模型的能力。整个框架围绕四个核心能力构建:

Guided Generation(引导式生成) 是灵魂。你不再需要 prompt 里写 “请返回 JSON”,然后写一堆解析逻辑。用 @Generable 宏标记你的 Swift struct,模型会直接生成类型安全的对象。底层用的是 constrained decoding 技术,从数学层面保证输出结构永远合法。@Guide 宏还能对每个字段加自然语言描述和约束。

Snapshot Streaming(快照式流式输出) 是体验关键。不同于传统的 delta streaming(逐 token 追加),框架会把每次增量生成变成一个完整的 PartiallyGenerated 快照。每个属性都是 Optional 的,随着生成逐渐填充。这对 SwiftUI 的声明式 UI 特别友好——直接绑定状态,UI 自动刷新。

Tool Calling(工具调用) 让模型能自主决定调用你定义的 Swift 代码。定义一个 conform Tool protocol 的类型,提供 namedescriptioncall 方法就行。参数也必须是 Generable 类型,所以工具调用也是类型安全的。框架会自动把工具输出插入 transcript,模型再基于此生成最终回复。

Stateful Session(有状态会话) 管理多轮对话上下文。Session 维护一个 transcript,模型能看到所有历史交互。还提供了内置的 specialized adapter,比如 content tagging adapter 做标签提取。

值得深挖的点

On-device 模型的定位很重要。 这是一个 3B 参数、2-bit 量化的设备级模型,Apple 明确说了它不是用来做世界知识问答或高级推理的。它的强项是:摘要、提取、分类、结构化生成。如果你试图让它做复杂推理,会失望。正确姿势是把复杂任务拆成小步骤。

@Generable 支持递归类型。 这意味着你可以让模型生成树形结构——比如一个嵌套的 UI 布局描述。这对生成式 UI 场景很有想象空间。

属性声明顺序影响生成质量。 模型按 struct 中属性的声明顺序逐个生成。如果你把 summary 放在最后一个属性,通常生成质量会更好,因为模型已经”看完”了其他字段再生成总结。

Streaming 快照和 SwiftUI 天生一对。 因为每个 snapshot 都是完整对象,你不需要手动拼接字符串。配合 SwiftUI 动画和 transition,可以把等待时间变成一种体验。

代码片段

定义一个 Generable 类型,模型直接生成 Swift 对象:

@Generable
struct TravelItinerary {
    @Guide(description: "旅行目的地")
    let destination: String

    @Guide(description: "行程天数", .range(3...14))
    let duration: Int

    @Guide(description: "每日安排")
    let dailyPlan: [DayPlan]
}

@Generable
struct DayPlan {
    @Guide(description: "当天主题")
    let theme: String
    let activities: [String]
}

// 使用:直接得到类型安全的结果
let session = LanguageModelSession()
let itinerary = try await session.respond(
    to: "帮我规划一次东京 5 天旅行",
    generating: TravelItinerary.self
)

定义一个 Tool 让模型自主调用天气 API:

struct WeatherTool: Tool {
    let name = "getWeather"
    let description = "获取指定城市的当前天气"

    @Generable
    struct Arguments {
        @Guide(description: "城市名称")
        let city: String
    }

    func call(arguments: Arguments) async throws -> ToolOutput {
        let weather = try await WeatherService.current(for: arguments.city)
        return .init("当前温度:\(weather.temperature)°C")
    }
}

let session = LanguageModelSession(tools: [WeatherTool()])

最佳实践

Instructions vs Prompts 要分清。 Instructions 来自开发者(定义模型角色和行为规范),Prompts 来自用户。模型被训练为优先遵循 Instructions,这提供了一定程度的 prompt injection 防护,但不是万无一失的。永远不要把不可信的用户输入直接拼进 instructions。

先检查可用性再使用。 模型只在开启 Apple Intelligence 且所在地区支持的设备上可用。用 SystemLanguageModel.default.availability 检查,返回 .unavailable(reason) 时要优雅降级。

用 Instruments 分析延迟。 大模型推理比传统 ML 模型慢得多,新的 Instruments profiling template 能帮你拆解每一帧的延迟来源。配合 prewarm() API 在合适的时机预热模型。

Streaming 时注意 SwiftUI 的 view identity。 生成数组时,如果元素没有稳定的 identity,列表动画会乱跳。

还有什么值得关注

  • 框架内置了 content tagging adapter,专门优化了标签提取和实体识别。配合 @Guide 和自定义 Generable 输出类型,还能检测动作和情感。
  • 支持运行时动态 schema,通过 DynamicGenerationSchema 在运行时构建 generable 类型——适合 schema 不确定的场景。
  • Apple 提供了 adapter training toolkit,可以用自有数据训练自定义 adapter,但需要随系统模型升级重新训练。
  • 所有数据处理都在设备端完成,完全离线可用,不会增加 app 包体积(模型内置于系统)。
  • 配套视频有深度拆解:guided generation 原理、prompt 设计与安全最佳实践,建议系列观看。
机器学习