【免费下载链接】swift-ios-skills
Agent Skills for iOS 26+, Swift 6.3, SwiftUI, and modern Apple frameworks
本文面向 iOS 新手,讲清楚**端侧大模型推理(On-device LLM Inference)**这件事:怎么用 Apple 的Foundation Models框架在 iPhone 上零配置生成内容,又怎么用Core ML把你自己训练的模型搬进 App。全部内容来自开源技能库 swift-ios-skills,它专门收录了 iOS 26+ / Swift 6.3 / 现代 Apple 框架的实战技能,是本文所有结论的"知识来源"。
🧭 先搞懂:端侧大模型推理是什么,为什么值得做
"端侧大模型推理"就是让大语言模型直接在你的手机芯片上运行,而不是把数据发到云端服务器。它带来三个实打实的好处:
| 好处 | 说明 | 对你的意义 |
|---|---|---|
| 📵 离线可用 | 模型常驻本地,无网也能跑 | 地铁、飞机上照常工作 |
| 🔒 隐私内建 | 数据不出设备,不经过第三方服务器 | 用户日记、病历等敏感内容更安全 |
| ⚡ 低延迟 | 省去网络往返,响应更快 | 交互体验更跟手 |
Apple 在 iOS 26 上给了开发者两条主力路径:
- Foundation Models:系统级"开箱即用"的大模型,你不用管模型下载、不用管 API Key,直接调用。
- Core ML:把你的自定义训练模型(PyTorch / TensorFlow 训练的)转成
.mlpackage,高效跑在 Neural Engine(神经网络引擎)上。
下面我们就按"怎么选 → 怎么上手 → 怎么避坑"的顺序,一步步落地。
🎯 四选一:端侧 AI 推理框架到底怎么选?
新手最容易纠结的就是框架。其实按"你要做什么"就能定。下面是 swift-ios-skills 给出的选型速查表:
| 你的场景 | 推荐框架 | 关键点 |
|---|---|---|
| 文本生成 / 摘要 / 结构化输出(iOS 26+) | Foundation Models | 免 API Key、系统级隐私 |
| 图像分类、目标检测、分割 | Core ML | 部署自训练的视觉模型 |
| PyTorch / TensorFlow 模型迁移 | Core ML + coremltools | 一键转.mlpackage |
| 跑开源 LLM(Llama / Qwen / Mistral) | MLX Swift 或 llama.cpp | Apple Silicon 高吞吐 |
| 跨平台(iOS + Android) | llama.cpp | GGUF 量化模型生态 |
| OCR / 文本识别 | Vision | 系统框架自带 |
| 情感分析 / 分词 / 翻译 | Natural Language | 轻量系统模型 |
一句话总结:"用现成大模型做文本"→ Foundation Models;"部署自己训练的模型"→ Core ML。本文就聚焦这两条线。
🍳 Foundation Models 上手:零配置在 iPhone 上生成内容
我们用一个贯穿全文的例子——"食谱助手"。目标:用户输入"帮我推荐一道快手菜",App 直接返回一份结构化的菜单。
第一步:动手前先检查设备可用性 ⚠️
这是新手最常漏掉、也最重要的一步。Foundation Models 依赖设备的 Apple Intelligence 状态,每次调用前都要确认,否则老机型会直接报错:
import FoundationModels switch SystemLanguageModel.default.availability { case .available: // ✅ 可以继续用模型 case .unavailable(.deviceNotEligible): // 设备不支持 → 走降级方案(如云端或缓存) case .unavailable(.modelNotReady): // 系统模型还在下载 → 显示"准备中" case .unavailable(let reason): // 其它情况 → 记录日志并降级 }💡 记住一个原则:永远不要假设模型一定可用,永远准备好 fallback(降级)界面。
第二步:创建会话并预热
会话(Session)是有状态的,支持多轮对话。创建后记得调用prewarm()预热,让第一次响应更快:
let session = LanguageModelSession { "你是一个健康食谱助手,专注快速、少油烟的菜。" } session.prewarm() let response = try await session.respond(to: "推荐一道 10 分钟内能做完的菜")第三步:用@Generable拿到类型安全的结果 ✨
纯文本好接,但真实业务要的是结构化数据。@Generable宏会为你自动生成编译期 JSON Schema,模型直接吐出一个 Swift 结构体,类型安全、无需手写解析:
@Generable struct MealPlan { @Guide(description: "菜名") var name: String @Guide(description: "具体做法步骤", .count(3)) var steps: [String] @Guide(description: "准备时间(分钟)", .range(1...30)) var prepMinutes: Int }调用时只要传一个类型就行:
let response = try await session.respond(to: "推荐一道快手菜", generating: MealPlan.self) print(response.content.name) // "蒜香西兰花虾仁" print(response.content.steps) // ["…", "…", "…"]想要更完整的 API(流式输出、工具调用、错误处理、Prompt 设计),可以翻参考文档:references/foundation-models.md。
🧠 Core ML 实战:把训练好的模型搬上 iPhone
如果你有自己训练的模型(比如图片分类器),就走 Core ML 这条路。它的核心逻辑分两段:Python 侧转换+Swift 侧运行。
模型格式:认准.mlpackage
| 格式 | 类型 | 什么时候用 |
|---|---|---|
.mlpackage | mlprogram | ✅所有新模型(iOS 15+) |
.mlmodel | neuralnetwork | 仅历史项目 |
.mlmodelc | 已编译 | 预编译、加载更快 |
新项目一律用mlprogram(.mlpackage),老格式已停止演进。
三步转换管线(Python 侧)
用 coremltools 把 PyTorch 模型转过去,注意eval()这个新手必踩的坑:
import coremltools as ct model.eval() # ⚠️ 关键:trace 前必须切到 eval 模式 traced = torch.jit.trace(model, example_input) mlmodel = ct.convert(traced, convert_to='mlprogram') mlmodel.save("Model.mlpackage")📌 转换后一定要用同一批固定样本跑一遍"源模型 vs Core ML 模型",对比输出是否对齐(Parity Check),再谈压缩和上线。
Swift 侧加载与预测
把.mlpackage拖进 Xcode,它会自动生成带类型的 Swift 类,配置好计算单元即可:
import CoreML let config = MLModelConfiguration() config.computeUnits = .all // CPU + GPU + Neural Engine 交给系统择优 let model = try MyImageClassifier(configuration: config) let input = MyImageClassifierInput(image: pixelBuffer) let output = try model.prediction(input: input) print(output.classLabel) // "golden_retriever"量化压缩:体积减 4~8 倍 🔬
模型太大装不进 App、也吃内存。coreml-optimization.md 给出了压缩技术选型:
| 技术 | 体积缩减 | 精度影响 | 最优硬件 | 最低系统 |
|---|---|---|---|---|
| INT8 每通道 | ~4x | 低 | CPU / GPU | iOS 16 |
| 4-bit Palettization | ~8x | 中低 | Neural Engine | iOS 16 |
| INT4 每块 | ~8x | 中 | GPU | iOS 18 |
| W8A8(权重+激活) | ~4x | 低 | ANE(A17 Pro / M4+) | iOS 17 |
⚠️别盲目全量量化。压缩必须在"未压缩模型已通过验证"之后进行,且每改一次都要重新测精度,达标才保留。想追求 Neural Engine 上的极致,优先试4-bit 调色板(Palettization)。
🔀 两个技能如何分工:一个管"转",一个管"用"
这是 swift-ios-skills 一个很贴心的设计——两个技能各司其职、互不依赖,边界清晰:
| 技能 | 负责什么 |
|---|---|
| apple-on-device-ai | 框架选型、Python 侧转换 + 压缩 + 性能剖析 |
| coreml | Swift 侧模型加载、预测、MLTensor、内存管理 |
所以真实工作流是:转换、压缩在apple-on-device-ai里搞定 → 加载、预测、部署在coreml里完成。想深入 Swift 集成细节(Actor 缓存、批量推理、Vision 管线),看 coreml-swift-integration.md。
✅ 落地前自检清单:这些坑帮你提前排掉
结合两个技能里的"常见错误"总结,上线前过一遍:
- 可用性:每次调用前都检查了
availability,老机型有降级界面 - 不阻塞主线程:模型加载走异步 API(
MLModel.load异步版本) - 复用实例:模型只加载一次,别每次预测都 new 一个
- 上下文预算:Foundation Models 输入+输出共享 token 上限,用
contextSize盯住 - 序列并发:一个 Session 同时只处理一个请求,检查
isResponding - 物理设备验证:模拟器跑不了 Metal 推理,性能数据必须在真机上看
- 缓存编译产物:运行时编译的
.mlmodelc要持久缓存,别每次启动重编
📁 技能组文件路径速查
想知道每个结论出自哪里,直接跳过去读原文(都是仓库内的相对路径):
- 总入口与框架选型:skills/apple-on-device-ai/SKILL.md
- Foundation Models 完整 API:skills/apple-on-device-ai/references/foundation-models.md
- Core ML 模型转换(Python):skills/apple-on-device-ai/references/coreml-conversion.md
- Core ML 量化/压缩优化:skills/apple-on-device-ai/references/coreml-optimization.md
- MLX Swift 与 llama.cpp 集成:skills/apple-on-device-ai/references/mlx-swift.md
- Core ML Swift 集成:skills/coreml/SKILL.md
- Core ML 高级集成模式:skills/coreml/references/coreml-swift-integration.md
🏁 小结
把"端侧大模型推理"落到 iPhone 上,其实没那么玄:
- 文本生成、摘要、结构化输出→ 用Foundation Models,记得先查可用性、再预热、最后用
@Generable拿类型安全结果; - 自训练模型→ 走Core ML,认准
.mlpackage、转换后做 Parity 校验、再按需量化压缩; - 不确定怎么选→ 回看上面的选型表,按"你要做什么"直接对号入座。
swift-ios-skills 把这些散落的最佳实践、避坑经验和完整参考整理成了即取即用的技能文件,照着路径读、照着清单查,就能少走一大圈弯路。
【免费下载链接】swift-ios-skills
Agent Skills for iOS 26+, Swift 6.3, SwiftUI, and modern Apple frameworks
相关推荐
LiteRT-LM Swift API 实战:在 iOS 与 macOS 应用中集成端侧大模型
LiteRT LM Swift API 实战:在 iOS 与 macOS 应用中集成端侧大模型 本文以仓库 samples/ios_and_mac/README
大模型人工智能本地部署多模态Core ML模型压缩终极指南:如何在iOS应用中优化Awesome-CoreML-Models
Core ML模型压缩终极指南:如何在iOS应用中优化Awesome CoreML Models 在移动AI应用开发中,Core ML模型压缩技术是每个iOS开
文档教程Kai 9000端侧推理实战:用LiteRT在手机上离线跑大模型的完整指南
Kai 9000端侧推理实战:用LiteRT在手机上离线跑大模型的完整指南 Kai 9000 是一款开源的 AI 助手应用,它内置了强大的 端侧推理 能力:基于
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考