Highlight
Core AI 让开发者可以用 Foundation Models 的同一套 API 加载和运行第三方开源模型(如 Qwen、SAM3),数据不出设备,无需服务器,且支持 AOT 预编译消除首次加载卡顿。
核心内容
从手动编卡片到 AI 自动生成
你正在做一款语言学习 App,帮学生记单词。传统做法是预先编好一堆词汇卡片,包含单词、翻译和例句,打包进 App。问题是:学生走在街上看到一只蜂鸟,想立刻学这个词,你预先编好的卡片里没有。学生的求知欲和现实世界是无限的,静态卡片永远追不上。
(00:17)Core AI 解决的就是这个问题。学生打开相机,对准蜂鸟,说”我要学这个”,App 在本地完成图像分割、识别物体、生成词汇卡片,全程不需要联网。没有 token 费用,没有云端延迟,学生的照片数据也不会离开设备。
两个模型分工协作
(02:56)这个场景需要两个能力:从图片中抠出目标物体,以及根据物体名称生成多语言的词汇信息。Apple 的解法是把问题拆成两个专用模型,每个控制在 10 亿参数以内,总占用可控。
第一个模型是 SAM 3(Segment Anything Model 3),一个基于 Vision Transformer 的图像分割模型。学生用文本提示”flower”,SAM 3 就从照片里精确抠出花朵,同时输出英文标签。
第二个模型是多语言大语言模型。英文标签”Hummingbird”进去,模型输出中文词汇、翻译和例句。讲者选的是 Qwen,支持 119 种语言,0.6B 参数版本刚好能塞进 iPhone。
(04:57)为什么用两个模型而不是一个?任务专用模型质量更好,单个体积更小,还能独立升级。SAM 3 专注分割,Qwen 专注语言,各干各的。
模型从哪里来
(07:02)模型可以从 HuggingFace 或 GitHub 获取原始 PyTorch 版本,然后用 Core AI PyTorch 扩展包转换。更简单的路径是直接使用 Core AI Models 仓库,里面已经提供了 SAM 3、Qwen 等热门模型的转换脚本和预编译的 .aimodel 文件。
仓库还包含一个 Swift Package,封装了文本编码、掩码提取等前后处理逻辑。你不需要自己处理张量形状,调用 Swift API 就行。
首次加载的卡顿怎么解决
(13:08)模型第一次加载时,Core AI 会执行 Specialization:把通用模型编译成当前设备 Neural Engine 专用的格式。这个过程可能很慢,用户拍完照盯着转圈,体验很差。
Apple 的解法分两步。第一步,不要把模型塞进 App Bundle。SAM 3 加 Qwen 超过 1GB,所有更新用户都要下载,不管他们用不用这个功能。改用 Background Assets 按需下载,用户主动开启功能时才拉取模型。
第二步,用 coreai-build 在开发机上做 Ahead-of-Time(AOT)编译。编译后的模型仍需针对具体设备做最终特化,但工作量大幅减少,用户等待时间从几十秒降到几秒。
同一套代码跑在 macOS 上
(19:57)iOS 上的代码可以直接复用到 macOS。Mac 内存和算力更充裕,可以把 Qwen 0.6B 换成 Qwen3 8B,获得更强的推理能力和更长的上下文。
讲者在 Mac 版 App 里加了批量处理:导入一整趟旅行的照片,SAM 3 并行分割所有图片找出物体,然后 8B 模型一次性生成所有词汇卡片,还能按难度排序、编课程计划。以前手动输入一下午的工作量,现在一次 prompt 完成。
详细内容
加载并运行 SAM3 图像分割
(11:01)Core AI Models 仓库里的 CoreAIImageSegmenter 模块把 SAM 3 的 tensor 前后处理全部封装好了。
import CoreAIImageSegmenter
// 从磁盘加载 SAM3 模型
let segmenter = try await ImageSegmenter(resourcesAt: sam3ModelURL)
// 传入图片和文本提示词,直接拿到分割结果
let response = try await segmenter.segment(image: inputImage, prompt: "flower")
// 提取最优的分割 Mask
let mask = response.segments.first?.mask
关键点:
ImageSegmenter是coreai-modelsSwift Package 提供的高层 API,底层自动处理图像编码、特征提取、掩码解码segment(image:prompt:)接受UIImage或CGImage和文本提示,返回按置信度排序的分割结果数组response.segments.first?.mask拿到的是最匹配提示词的掩码,可直接用于图像合成或裁剪
加载语言模型并创建 Session
(11:28)第三方语言模型的加载和调用,复用了 Foundation Models 框架的同一套 API。
import FoundationModels
import CoreAILanguageModels
// 创建模型实例,一行代码完成资源加载、引擎创建、Tokenizer 设置
let model = try await CoreAILanguageModel(resourcesAt: qwen3ModelURL)
// 用熟悉的 LanguageModelSession API
let session = LanguageModelSession(model: model)
// 生成回复
let response = try await session.respond(to: "...")
关键点:
CoreAILanguageModel是 Core AI 对第三方模型的封装,构造函数接收.aimodel文件路径LanguageModelSession和调用 Apple 自带大模型时用的 API 完全一致,respond(to:)和流式输出都支持- 导入
FoundationModels框架是因为LanguageModelSession定义在这个框架里,第三方模型和 AFM 共享同一套会话抽象
用 @Generable 生成结构化输出
(12:29)词汇卡片需要严格的字段结构,不能靠自由文本解析。@Generable 宏让模型直接输出符合 Swift 类型的结构化数据。
import FoundationModels
import CoreAILanguageModels
@Generable
struct VocabCard {
let chineseWord: String
let englishMeaning: String
let exampleSentence: String
}
let model = try await CoreAILanguageModel(resourcesAt: modelURL)
let session = LanguageModelSession(model: model)
let response = try await session.respond(
to: "Create a vocab card for flower",
generating: VocabCard.self
)
let card: VocabCard = response.content
关键点:
@Generable宏在编译期生成 JSON Schema 约束,模型输出会被强制解析成VocabCard类型session.respond(to:generating:)的第二个参数传入类型,框架自动处理 prompt 包装、JSON 生成和类型转换- 如果模型输出不符合 Schema,调用会抛出解码错误,需要在调用处用
try处理
AOT 预编译模型
(17:22)coreai-build 命令行工具在开发机上预先完成最耗时的编译步骤。
$ xcrun coreai-build compile MyModel.aimodel --platform iOS
关键点:
coreai-build是 Core AI 工具链的一部分,随 Xcode 27 一起安装--platform iOS指定目标平台,可以生成针对特定芯片架构的编译产物- 编译后的模型仍需在设备上做最终特化,但耗时从数十秒降到数秒
- 实际部署时,需要根据设备架构(A17、M2、M3 等)分发对应的编译版本
核心启发
1. 拍照即学:任意物体的实时词汇卡片
做什么:做一个语言学习 App,用户对准任何物体拍照,App 自动分割物体并生成该语言的词汇卡片。
为什么值得做:Core AI 把 SAM 3 和 Qwen 的调用简化到了几行代码,以前需要云端视觉 API + 翻译 API 的功能,现在完全本地运行,零网络依赖、零 token 成本。
怎么开始:从 Core AI Models 仓库导入 CoreAIImageSegmenter 和 CoreAILanguageModels,用 ImageSegmenter.segment(image:prompt:) 抠图,再用 LanguageModelSession.respond(to:generating:) 生成结构化卡片数据。
2. 旅行相册批量生成学习材料
做什么:Mac 端工具,导入一整趟旅行的照片文件夹,自动识别所有物体、生成词汇卡片,并按主题编组。
为什么值得做:Mac 上可以用更大的 Qwen3 8B 模型,同一套 Swift 代码直接复用。批量并行处理 + 长上下文课程规划,以前手动做几个小时的工作现在几分钟完成。
怎么开始:在 iOS 代码基础上加 NSFileCoordinator 批量读取照片,用 TaskGroup 并行调用 SAM 3 分割,最后把结果汇总成一个大 prompt 交给 8B 模型生成课程结构。
3. 离线隐私优先的 AI 功能模块
做什么:在现有 App 里加一个可选的 AI 功能模块,所有推理本地完成,敏感数据(如用户照片、文档)不上传。
为什么值得做:Core AI 的按需下载 + AOT 编译机制,让大模型功能不会拖累 App 包体积和启动速度。Background Assets 只在用户主动开启时下载模型,不影响普通用户。
怎么开始:设计一个 First-run 引导页,用户点击”开启 AI 功能”后触发 BGDownloadingRequest,下载完成后在后台执行模型加载和特化,下次使用直接走缓存。
4. 跨平台统一 AI 架构
做什么:一套 Swift 代码同时支持 iOS 和 macOS,iOS 用小模型保证流畅,Mac 自动切换大模型提升质量。
为什么值得做:CoreAILanguageModel 和 LanguageModelSession 的 API 在不同平台完全一致,运行时根据 ProcessInfo 判断平台加载不同尺寸的模型即可。不需要维护两套代码,Mac 上可以利用更大内存跑更强的模型。
怎么开始:在 App 启动时检测设备型号和内存大小,iPhone 加载 Qwen 0.6B,Mac 加载 Qwen3 8B,业务逻辑代码完全不变。入口:ProcessInfo.processInfo.operatingSystemVersion + 条件加载模型
5. 用 AOT 编译消除首次使用卡顿
做什么:在开发阶段用 coreai-build 预先编译模型,减少用户端的特化等待时间。
为什么值得做:模型首次加载时的 Specialization 可能耗时数十秒,用户在拍照后盯着转圈体验极差。AOT 编译把最耗时的步骤提前到开发阶段,用户端只需做最终的设备特化,等待时间从几十秒降到几秒。
怎么开始:在 CI 中集成 xcrun coreai-build compile MyModel.aimodel --platform iOS,把编译产物随 App 分发。入口:xcrun coreai-build compile
关联 Session
- Meet Core AI — Core AI 框架的设计理念和基础 API 介绍
- Dive into Core AI model authoring and optimization — 模型转换、压缩和优化,包含 SAM 3 的完整转换流程
- Build agentic apps with Apple Intelligence — 结合 Core AI 的本地模型能力构建 Agent 应用
- SwiftUI — 用 SwiftUI 构建相机界面和词汇卡片 UI
- Discover Apple-Hosted Background Assets — 按需下载模型资源的具体实现
评论
GitHub Issues · utterances