Highlight
Jaimin Upadhyay 按从高到低五层结构梳理 Apple ML/AI 栈:Platform Intelligence、ML-powered APIs、领域框架、Core ML、MLX,新增的 Foundation Models 框架让开发者用三行 Swift 即可调用设备端语言模型。
核心内容
iOS 18 之后,开发者要把 AI 能力塞进 app,常见做法是接 OpenAI 或 Gemini 的云端 API:要管理 API key、要承担每次请求的成本、用户数据要离开设备、网络不好就用不了。对很多「轻量、本地化」的功能——比如行程摘要、智能搜索建议、游戏对话生成——这套云端方案显得过重。
Jaimin Upadhyay 在这次 session 里给出的答案是:把整个 Apple ML/AI 栈按「从高到低」分成五层,让你按需取用。最上层是系统已经内置的 Writing Tools、Genmoji、Image Playground,标准 UI 控件自动支持,几乎不用写代码(02:03);再往下是 iOS 26 新增的 Foundation Models 框架,三行 Swift 就能调用设备端语言模型,完全离线、零成本、隐私不出设备(05:05);再往下是 Vision、Speech、Natural Language 等领域框架,每个都内置任务专属的优化模型;底层是 Core ML 部署任意自定义模型,以及 MLX 这种面向研究前沿的开源数组计算框架。每一层都为 Apple Silicon 做了优化,调度 CPU / GPU / Neural Engine。
详细内容
第一层:Platform Intelligence(01:16)
Writing Tools 与 Genmoji 内置在标准文本控件里,几乎零代码就能接入。Image Playground 框架则通过 SwiftUI 扩展 imagePlaygroundSheet 弹出图片生成面板。
第二层:ML-powered APIs(02:45)
iOS 18.4 引入的 ImageCreator 让你绕开系统面板、直接基于文本 prompt 生成图片(03:08):
let creator = ImageCreator()
let images = try await creator.images(
for: [.text("a corgi surfing at sunset")],
style: .illustration,
limit: 1
)
// 拿到 images 后自己决定怎么展示
关键点:
ImageCreator()直接实例化,无需 entitlement 申请。- 第一个参数是
ImagePlaygroundConcept数组,.text(...)表示用文本 prompt;也可传入起始图片作为 concept。 style选择风格(.illustration/.animation/.sketch),limit控制返回张数。- 返回值是异步序列/数组,images 拿到后由 app 自己决定展示方式,完全不弹系统 UI。
Smart Reply API(03:29)通过把对话上下文「捐」给键盘,让系统在候选区生成智能回复:
// 在 messages 场景的输入视图里
let context = UIMessageConversationContext(messages: recentMessages)
textView.conversationContext = context
// 邮件场景需要实现 delegate 自己生成回复
func insertInputSuggestion(_ suggestion: UIInputSuggestion) {
let reply = await generateLongerReply(from: suggestion)
textView.insertText(reply)
}
关键点:
UIMessageConversationContext/UIMailConversationContext携带对话历史,必须在键盘弹出前设置到 entry view 上。- 即时消息场景,用户选中的回复直接被插入文档,app 无需处理。
- 邮件场景由系统回调
insertInputSuggestion,让 app 基于 suggestion 生成更长正文。 - 所有推理在设备端完成,使用 Apple foundation model。
Foundation Models 框架(04:24)是 iOS 26 新增的设备端语言模型 API,三行代码就能跑起来:
import FoundationModels
let session = LanguageModelSession()
let response = try await session.respond(to: "Summarize this trip in 3 bullets: ...")
关键点:
import FoundationModels引入模块,不需要额外初始化。LanguageModelSession()创建一次会话,可复用,自动维护上下文。respond(to:)是异步方法,返回结构化结果,文本在response.content。- 全程设备端,没有 API key、没有网络请求、对用户和开发者零成本。
Guided Generation(05:38)让 Swift 类型直接当作输出 schema,省掉 JSON 解析:
@Generable
struct Itinerary {
@Guide("城市名称") var city: String
@Guide("3 到 7 天的日程") var days: [DayPlan]
}
@Generable
struct DayPlan {
@Guide("当天主题,例如美食、博物馆") var theme: String
@Guide("当天活动列表") var activities: [String]
}
let itinerary = try await session.respond(
to: "Plan a 5-day trip to Kyoto",
generating: Itinerary.self
)
关键点:
@Generable把现有 Swift 类型标成可生成;嵌套类型也要各自标注。@Guide("...")给每个属性写自然语言说明,模型据此理解字段含义。respond(to:generating:)指定输出类型,框架定制解码循环,阻止生成不合 schema 的结构。- 拿到的是强类型实例,无需手写 JSON schema、也无需写解析与容错。
Tool Calling(07:02)让模型按需访问实时/个人数据并执行真实动作。引用数据源的能力让用户能事实核查输出,绕开训练数据时间截止的局限。
第三层:领域专用框架(08:21)
Vision 今年新增 Document Recognition(在「读出文字行」之上识别标题、段落、表格分组)与 Lens Smudge Detection(09:13)。Speech 框架推出 SpeechAnalyzer 替代旧的 SFSpeechRecognizer(09:56),配套新语音模型对 lecture、meeting、conversation 这类长音频与远场录音显著更准更快。用法是把音频 buffer 喂给 analyzer 实例,由它路由到模型:
let analyzer = SpeechAnalyzer(modules: [transcriber])
try await analyzer.start(inputAudioFile: audioFile)
for try await result in transcriber.results {
print(result.text)
}
关键点:
SpeechAnalyzer(modules:)用模块化结构组合不同分析能力,transcriber负责语音转文字。start(inputAudioFile:)接受文件输入;实时场景可改用音频 buffer 喂入。transcriber.results是异步序列,流式返回识别结果,适合实时显示。- 完全设备端运行,对长音频与远场场景做了专门优化。
Natural Language、Translation、Sound Analysis 各自针对语种识别、文本翻译、声音分类。Create ML(10:55)让你用自己的数据微调系统模型——Vision 用的图像分类器、Natural Language 用的 word tagger,甚至 Vision Pro 上带 6DOF 跟踪的特定物体识别。
第四层:Core ML 与底层(11:16)
模型来源有两个:developer.apple.com 上有按类别整理、附设备性能数据的 Core ML 模型库;Hugging Face 上的 Apple space 同时提供 Core ML 格式与 PyTorch 源定义。Core ML Tools 把 PyTorch 模型转成 Core ML,自动融合算子、消除冗余,可选剪枝、量化做 trade-off。Xcode 集成(13:09)能在任意连接设备上看预测延迟、加载时间、各 op 落在 CPU / GPU / ANE 上的位置;今年新增完整架构可视化,可下钻每个 op。
更细粒度的控制有两层:MPS Graph + Metal 把 Core ML 模型嵌入图形管线;Accelerate 的 BNNS Graph API 在 CPU 上做严格延迟与内存控制的实时信号处理。BNNS Graph 新增 Graph Builder(14:36),允许直接构建算子图,写预/后处理或小型 ML 模型在 CPU 上实时跑。
第五层:MLX(15:33)
Apple ML 研究团队设计、完全开源的数组计算框架。一条命令行就能跑 Mistral 这类 LLM 推理(演示中生成 quicksort 代码,max token = 1024)。Hugging Face 上的 MLX 社区已有数百个前沿模型,一行代码即可加载。利用 Apple Silicon 统一内存(16:30),MLX 中数组不绑定设备、操作绑定设备,可在同一 buffer 上让 CPU/GPU 并行跑不同操作。提供 Python / Swift / C++ / C 多语言绑定,支持一行代码微调与分布式训练扩展。如果你用 PyTorch 或 JAX,Apple 提供 Metal 后端,不切换框架即可在 Apple Silicon 上探索前沿。
核心启发
-
做什么:给 app 加 Foundation Models 驱动的「智能摘要 / 智能分类」功能。
- 为什么值得做:完全设备端运行,零 API 成本,离线可用,用户数据不出设备——比接云端 LLM 在合规和成本上都更划算。
- 怎么开始:
import FoundationModels,创建LanguageModelSession,发 prompt。先用三行代码把最简版本跑通,再把领域数据塞进 prompt 验证质量。
-
做什么:用
@Generable+ Guided Generation 替换现有的「LLM + JSON 解析」管线。- 为什么值得做:定制解码循环阻止结构性错误,省掉手写 schema、写解析器、处理 LLM 偶发不合法 JSON 的工作;Swift 类型即 schema,更新数据结构就是更新 prompt 输出。
- 怎么开始:把你现有的 Codable 结构体加上
@Generable,给字段加@Guide("...")描述,必要时加.range、.count等约束。
-
做什么:把旧
SFSpeechRecognizer的长录音/会议功能迁到SpeechAnalyzer。- 为什么值得做:新 API 配套的新模型对长音频与远场(lecture、meeting、conversation)显著更准更快;旧 API 是为短句口述设计的,长录音体验差。
- 怎么开始:建立
SpeechAnalyzer实例,配置transcriber模块,把音频 buffer 流式喂进去,从results序列里收文本。
-
做什么:用 Tool Calling 替代「把所有上下文塞进 prompt」。
- 为什么值得做:设备端模型知识有时间截止点,靠 prompt 喂全量数据既慢又超 context window;tool calling 让模型按需查询天气、日历、你的 app 数据,并能引用来源、执行真实动作。
- 怎么开始:定义 Tool(带描述、参数 schema、执行闭包),把 tools 数组传给 session;prompt 里描述任务,让模型自己决定何时调用哪个 tool。
-
做什么:上线前用 Xcode 的 Core ML 性能 / 架构可视化做模型体检。
- 为什么值得做:能看到每个 op 落在 CPU / GPU / ANE 上、各设备的预测延迟与加载时间——避免上线后才发现某个 op 不支持 ANE、拖累整体延迟。
- 怎么开始:把
.mlpackage拖进 Xcode,打开 Performance 标签连接真机跑分;用今年新增的架构视图下钻可疑算子。
关联 Session
- Meet the Foundation Models framework — Foundation Models 入门,深入 session、guided generation、tool calling、streaming
- Explore prompt design and safety for on-device Foundation models — 写好 prompt、AI 安全、评估测试质量与安全的实操指南
- Bring advanced speech-to-text to your app with SpeechAnalyzer — SpeechAnalyzer API + 新语音模型,长音频与远场专用
- Explore large language models on Apple silicon with MLX — 用 MLX 在 Apple Silicon 跑 DeepSeek-R1 等大模型
- What’s new in BNNS Graph — BNNS Graph Builder 在 CPU 上构建实时 ML / 信号处理管线
评论
GitHub Issues · utterances