Meet the Foundation Models framework
2025年6月9日
一句话判断
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 的类型,提供 name、description 和 call 方法就行。参数也必须是 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 设计与安全最佳实践,建议系列观看。