WWDC 2026 Foundation Models 深度实战:当苹果把大模型塞进 Swift——从端侧推理到 Gemini 兜底的生产级 AI 应用开发完全指南(2026)
一、引言:WWDC 2026 不再是"功能堆叠",而是苹果 AI 的成人礼
2026 年 6 月 9 日凌晨 1 点,Apple Park 的 McEnery Auditorium 再次坐满了开发者。但这一次,发布会没有新硬件,没有折叠屏,甚至连一个让人尖叫的系统动画都没有。取而代之的,是一个苹果用了三年时间才找到答案的问题:如何把大语言模型变成操作系统的一部分?
如果你是开发者,这次 WWDC 的信号非常明确:苹果不再把 AI 当作一个需要外部 SDK 接入的"附加功能",而是把它变成了与 UIKit、SwiftUI 同等地位的系统级基础设施。Foundation Models framework、Siri AI 独立应用、Gemini 三层智能架构、App Intents 语义桥接……这些不是孤立的新 API,而是苹果精心铺设的一套完整的 AI 应用开发链路。
这篇文章,我将从程序员的视角,把 WWDC 2026 的 AI 相关技术全部拆开讲透——从底层架构到代码实战,从端侧推理到云端兜底,从单一文本生成到多模态任务流。这不是一篇"新闻速递",而是一份你能直接拿来写代码的生产级指南。
二、Foundation Models Framework:Swift 原生 AI API 的核心架构
2.1 为什么要造一个 Foundation Models Framework?
在 WWDC 2026 之前,iOS/macOS 开发者接入大模型的方式极其割裂:
- 方案 A:接入 OpenAI/Claude 的 REST API,自己处理鉴权、流式响应、错误重试、Token 计费——纯体力活。
- 方案 B:接入 Core ML 推理自家模型,需要自己搞定模型转换(onnx → mlprogram)、量化、内存管理——门槛极高。
- 方案 C:用第三方 SDK(LangChain 之类的),但这些 SDK 都是 Python 生态的,Swift 端要么没有,要么是残次品。
苹果显然看不下去了。Foundation Models framework 的设计哲学极其清晰:让 Swift 开发者用写原生代码的方式调用大模型,同时把模型层做成一个可替换的基础设施。
2.2 三层智能架构:端侧 → Private Cloud → Gemini
WWDC 2026 公布的 Apple Intelligence 架构已经不再是最初的"端侧小模型 + 云端大模型"二元结构。苹果设计了一套三层智能架构:
┌─────────────────────────────────────────────────┐
│ 第三层:Cloud Intelligence │
│ Gemini 大模型兜底(复杂推理任务) │
│ 适合:长文本生成、复杂推理、多轮深度对话 │
├─────────────────────────────────────────────────┤
│ 第二层:Private Cloud Compute │
│ Apple 自有云端推理(隐私敏感任务) │
│ 适合:需要更强算力但不能离开苹果生态的数据 │
├─────────────────────────────────────────────────┤
│ 第一层:On-Device Foundation Models │
│ A20/M4 芯片端侧推理(零延迟、完全离线) │
│ 适合:意图识别、简单问答、文本补全、摘要 │
└─────────────────────────────────────────────────┘
这套架构对开发者最大的好处是:你不需要关心模型在哪里跑。 Foundation Models framework 会在运行时自动决定走端侧还是云端。你的代码里只有一个统一的 API。
2.3 核心协议:Language Model Protocol
Foundation Models framework 最精妙的设计,是它的协议驱动架构。苹果定义了一个 LanguageModel 协议,任何模型只要遵循这个协议,就能无缝接入整个框架:
import FoundationModels
/// 苹果定义的语言模型协议
/// 任何模型(Apple Foundation Models、Claude、Gemini、自定义模型)
/// 只要遵循这个协议,就能接入 Foundation Models framework
public protocol LanguageModel {
/// 生成文本响应
func generate(
prompt: LanguageModelPrompt,
configuration: GenerationConfiguration
) async throws -> LanguageModelResponse
/// 流式生成文本响应
func generateStream(
prompt: LanguageModelPrompt,
configuration: GenerationConfiguration
) async throws -> AsyncThrowingStream<LanguageModelResponseChunk, Error>
/// 模型能力描述
var capabilities: ModelCapabilities { get }
/// 模型元信息
var metadata: ModelMetadata { get }
}
这个协议设计的意义在于:苹果把模型层做成了可替换的插件。 你可以用 Apple 自家的 Foundation Models,也可以切换到 Claude,也可以用 Gemini,甚至可以自己实现一个自定义模型——代码不需要任何改动。
2.4 Apple Foundation Models:端侧推理的实战能力
让我们看看端侧模型在实际中能做什么。根据 WWDC 2026 公开的信息,A20 芯片上的端侧模型已经达到了相当可用的水平:
- 意图识别准确率:97.3%(完全离线)
- 响应延迟:< 50ms(大多数简单任务)
- 上下文窗口:支持多轮对话
- 多模态能力:文本 + 视觉(OCR、条码识别)
import FoundationModels
/// 最简示例:用端侧模型进行意图识别
func classifyUserIntent(text: String) async throws -> String {
// 使用默认的端侧 Foundation Model
let model = FoundationModel.default
let prompt = LanguageModelPrompt("""
你是一个意图分类器。请将以下用户输入分类为以下类别之一:
- 查询天气
- 设置提醒
- 发送消息
- 搜索信息
- 其他
用户输入:\(text)
只返回类别名称,不要返回其他内容。
""")
let configuration = GenerationConfiguration(
temperature: 0.0, // 分类任务用 0 温度
maxTokens: 20 // 只需要极短的输出
)
let response = try await model.generate(
prompt: prompt,
configuration: configuration
)
return response.content
}
三、多模态 Prompt:不只是文字,还能"看"
3.1 多模态输入架构
Foundation Models framework 不只是一个文本生成 API。它的 LanguageModelPrompt 支持多种输入模态:
import FoundationModels
import Vision
/// 多模态 Prompt 构建器
struct MultimodalPromptBuilder {
/// 构建一个包含文本和图片的混合 Prompt
static func buildImageAnalysisPrompt(
instruction: String,
image: CGImage
) -> LanguageModelPrompt {
var prompt = LanguageModelPrompt()
// 添加系统指令
prompt.addSystemMessage(instruction)
// 添加图片(通过 Vision 框架转换)
let imageAttachment = VisionAttachment(image: image)
prompt.addUserContent([
.text("请分析这张图片中的内容。"),
.image(imageAttachment)
])
return prompt
}
/// 构建一个包含屏幕截图的 Prompt
/// 利用 View Annotations API 获取上下文
static func buildScreenContextPrompt(
screenDescription: String,
userQuery: String
) -> LanguageModelPrompt {
var prompt = LanguageModelPrompt()
prompt.addSystemMessage("""
你是一个能理解屏幕内容的 AI 助手。
当前用户看到的屏幕内容如下:
\(screenDescription)
请根据屏幕内容和用户的问题,提供精准的回答。
""")
prompt.addUserMessage(userQuery)
return prompt
}
}
3.2 OCR 与条码识别的深度集成
Vision 框架在 WWDC 2026 中获得了与 Foundation Models 的深度集成。你可以把 OCR 结果直接喂给模型做二次推理:
import FoundationModels
import Vision
/// 实战场景:从文档照片中提取结构化信息
func extractStructuredData(from imageURL: URL) async throws -> [String: String] {
// 第一步:Vision OCR 提取文本
let ocrRequest = VNRecognizeTextRequest()
ocrRequest.recognitionLevel = .accurate
ocrRequest.recognitionLanguages = ["zh-Hans", "en"]
let imageSource = CGImageSourceCreateWithURL(imageURL as CFURL, nil)!
let cgImage = CGImageSourceCreateImageAtIndex(imageSource, 0, nil)!
let visionHandler = VNImageRequestHandler(cgImage: cgImage)
try visionHandler.perform([ocrRequest])
let ocrText = ocrRequest.results?
.compactMap { $0.topCandidates(1).first?.string }
.joined(separator: "\n") ?? ""
// 第二步:把 OCR 文本喂给 Foundation Model 做结构化提取
let model = FoundationModel.default
let prompt = LanguageModelPrompt("""
请从以下 OCR 识别的文本中,提取以下信息并以 JSON 格式返回:
- 金额(amount)
- 日期(date)
- 收款方(payee)
- 备注(memo)
OCR 文本:
\(ocrText)
只返回 JSON,不要返回其他内容。
""")
let response = try await model.generate(
prompt: prompt,
configuration: GenerationConfiguration(temperature: 0.0)
)
// 解析 JSON 响应
let decoder = JSONDecoder()
return try decoder.decode(
[String: String].self,
from: Data(response.content.utf8)
)
}
四、模型切换与 Gemini 兜底:生产环境的智能路由
4.1 Dynamic Profiles 动态切换
苹果引入了 Dynamic Profiles 机制,允许在运行时动态切换模型配置。这对生产环境至关重要——你可以根据任务类型自动选择最优模型:
import FoundationModels
/// 模型路由策略:根据任务复杂度自动选择模型层级
enum ModelRoutingStrategy {
case onDevice // 端侧模型,零延迟
case privateCloud // Apple 私有云,隐私优先
case geminiCloud // Gemini 兜底,复杂推理
/// 根据任务特征自动判断路由策略
static func route(for task: AITask) -> ModelRoutingStrategy {
switch task.complexity {
case .simple:
// 意图识别、简单问答、文本补全 → 端侧
return .onDevice
case .moderate:
// 中等长度摘要、代码生成 → 私有云
return .privateCloud
case .complex:
// 长文本推理、多步推理、创意生成 → Gemini
return .geminiCloud
}
}
}
/// 任务复杂度评估器
struct TaskComplexityEvaluator {
static func evaluate(prompt: String, maxTokens: Int) -> AITask.Complexity {
let promptLength = prompt.utf8.count
let estimatedOutputTokens = maxTokens
// 简单启发式规则
if promptLength < 200 && estimatedOutputTokens < 100 {
return .simple
} else if promptLength < 2000 && estimatedOutputTokens < 1000 {
return .moderate
} else {
return .complex
}
}
}
/// 统一的 AI 服务层
class AIService {
private let onDeviceModel: LanguageModel = FoundationModel.default
private let geminiModel: LanguageModel // 通过协议接入 Gemini
func execute(task: AITask) async throws -> LanguageModelResponse {
let strategy = ModelRoutingStrategy.route(for: task)
let model: LanguageModel
switch strategy {
case .onDevice:
model = onDeviceModel
case .privateCloud, .geminiCloud:
model = geminiModel
}
return try await model.generate(
prompt: task.prompt,
configuration: task.configuration
)
}
}
4.2 Gemini 接入的实战细节
苹果与 Google 的深度合作为开发者带来了一个重要能力:当端侧模型力不从心时,可以无缝切换到 Gemini。从架构角度看,Gemini 不是一个"特殊 API",而是 LanguageModel 协议的又一个实现:
import FoundationModels
/// Gemini 模型的 LanguageModel 协议实现
/// (示意代码,实际 SDK 由 Apple 提供)
final class GeminiModel: LanguageModel {
private let apiEndpoint: URL
private let apiKey: String
init(apiKey: String) {
self.apiKey = apiKey
self.apiEndpoint = URL(string: "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent")!
}
var capabilities: ModelCapabilities {
.init(
supportsVision: true,
supportsStreaming: true,
maxContextTokens: 1_000_000,
maxOutputTokens: 8192
)
}
var metadata: ModelMetadata {
.init(
name: "gemini-2.0-flash",
provider: "Google",
version: "2.0"
)
}
func generate(
prompt: LanguageModelPrompt,
configuration: GenerationConfiguration
) async throws -> LanguageModelResponse {
// 将 Foundation Models 的 Prompt 转换为 Gemini API 格式
let geminiRequest = try convertToGeminiRequest(prompt, configuration)
// 发送请求
var urlRequest = URLRequest(url: apiEndpoint)
urlRequest.httpMethod = "POST"
urlRequest.setValue("Bearer \(apiKey)", forHTTPHeaderField: "Authorization")
urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
urlRequest.httpBody = try JSONEncoder().encode(geminiRequest)
let (data, response) = try await URLSession.shared.data(for: urlRequest)
guard let httpResponse = response as? HTTPURLResponse,
(200...299).contains(httpResponse.statusCode) else {
throw AIServiceError.geminiRequestFailed
}
// 将 Gemini 响应转换回 Foundation Models 格式
return try convertFromGeminiResponse(data)
}
func generateStream(
prompt: LanguageModelPrompt,
configuration: GenerationConfiguration
) async throws -> AsyncThrowingStream<LanguageModelResponseChunk, Error> {
// 流式响应实现(省略)
fatalError("Streaming not implemented in this example")
}
// ... 转换方法省略
}
五、App Intents 语义桥接:让 Siri AI 发现你的应用能力
5.1 App Intents 的角色演变
在 WWDC 2026 中,App Intents 从一个"让 Siri 能说你的 App"的工具,进化成了Apple Intelligence 和 Siri AI 与应用之间的语义桥梁。
核心变化在于:
- Entity Schema 进入 Spotlight 语义索引:你定义的实体类型会被系统索引,用户可以直接通过 Spotlight 或自然语言搜索到。
- Intent Schema 触发自然语言操作:用户可以用任意自然语言描述意图,系统自动匹配到你的 App Intent。
- View Annotations API 提供屏幕上下文:用户说"把这个图片发给她"时,Siri AI 能通过 View Annotations 知道"这个图片"指的是屏幕上的哪个 UI 元素。
5.2 实战:构建可被 Siri AI 发现的应用能力
import AppIntents
import FoundationModels
/// 定义一个"发送消息"的 Intent
struct SendMessageIntent: AppIntent {
static var title: LocalizedStringResource = "发送消息"
static var description: IntentDescription = """
通过 AI 助手向指定联系人发送消息。
可以通过自然语言触发,例如:
"告诉小明我五分钟后到"
"帮我给老板发条消息说我今天请假"
"""
/// 参数:收件人(使用 Entity 类型,会被 Spotlight 索引)
@Parameter(title: "收件人")
var recipient: ContactEntity
/// 参数:消息内容
@Parameter(title: "消息内容")
var messageContent: String
/// 执行发送
func perform() async throws -> some IntentResult {
// 实际业务逻辑
let service = MessageService()
try await service.send(to: recipient.id, content: messageContent)
return .result(value: "消息已发送给 \(recipient.name)")
}
}
/// 定义联系人实体(会被 Spotlight 索引)
struct ContactEntity: AppEntity {
static var typeDisplayRepresentation: TypeDisplayRepresentation =
"联系人"
static var defaultQuery = ContactEntityQuery()
var id: UUID
var name: String
var avatar: Data?
var displayRepresentation: DisplayRepresentation {
DisplayRepresentation(
title: "\(name)",
subtitle: "联系人",
image: .init(data: avatar)
)
}
}
/// 联系人查询(Spotlight 索引用)
struct ContactEntityQuery: EntityQuery {
func entities(for identifiers: [UUID]) async throws -> [ContactEntity] {
let database = ContactDatabase.shared
return try await database.fetchContacts(with: identifiers)
}
func suggestedEntities() async throws -> [ContactEntity] {
let database = ContactDatabase.shared
return try await database.fetchRecentContacts(limit: 10)
}
func entities(matching query: String) async throws -> [ContactEntity] {
let database = ContactDatabase.shared
return try await database.searchContacts(query: query)
}
}
5.3 View Annotations:让 AI "看见"你的界面
View Annotations API 是 WWDC 2026 中最容易被低估的特性。它允许你为 UI 元素附加语义标注,让 Siri AI 知道屏幕上的每个元素"是什么":
import SwiftUI
import AppIntents
struct ChatView: View {
@State private var messages: [Message] = []
@State private var inputText: String = ""
var body: some View {
VStack {
// 消息列表
ScrollView {
LazyVStack(spacing: 12) {
ForEach(messages) { message in
MessageBubble(message: message)
// View Annotation:告诉 AI 这个元素是一条消息
.contentAttachment {
EntityAnnotation(message)
}
}
}
}
// 输入框
TextField("输入消息...", text: $inputText)
.textFieldStyle(.roundedBorder)
// View Annotation:告诉 AI 这是一个文本输入框
.contentAttachment {
UIElementAnnotation(
type: "textInput",
purpose: "用户消息输入"
)
}
Button("发送") {
sendMessage()
}
}
}
}
/// 消息的 Entity Annotation
struct EntityAnnotation: UIElementAnnotation {
let message: Message
var elements: [SemanticElement] {
[
.init(
description: "\(message.sender.name)发来的消息:\(message.content)",
type: "message",
role: "content"
)
]
}
}
有了 View Annotations,当用户对 Siri AI 说"把刚才那张图片转发给小明"时,Siri AI 能准确知道"刚才那张图片"指的是屏幕上的哪个消息中的哪张图片。
六、Evaluations Framework:AI 功能的可验证性
6.1 为什么 AI 功能需要专门的测试框架?
传统软件测试是确定性的——同样的输入,同样的输出。但 AI 功能是概率性的——同样的输入,不同次的输出可能不同。这让传统单元测试几乎失效。
Evaluations framework 是苹果给出的答案:不是断言"输出必须等于某个值",而是定义"输出应该在什么范围内是好的"。
6.2 实战:构建 AI 功能的评估流水线
import Evaluations
import FoundationModels
/// 意图分类的评估套件
struct IntentClassificationEvaluation: EvaluationSuite {
let name = "Intent Classification"
let model: LanguageModel
/// 定义测试用例
var testCases: [EvaluationTestCase] {
[
.init(
input: "明天北京天气怎么样",
expectedCategory: "查询天气",
tolerance: .exactMatch
),
.init(
input: "帮我设一个明早八点的闹钟",
expectedCategory: "设置提醒",
tolerance: .exactMatch
),
.init(
input: "给张三发个微信说我到楼下了",
expectedCategory: "发送消息",
tolerance: .exactMatch
),
.init(
input: "附近有什么好吃的餐厅",
expectedCategory: "搜索信息",
tolerance: .exactMatch
),
.init(
input: "帮我翻译这句话成日语",
expectedCategory: "其他",
tolerance: .exactMatch
),
]
}
/// 执行评估
func evaluate() async throws -> EvaluationReport {
var results: [EvaluationResult] = []
for testCase in testCases {
let prompt = buildClassificationPrompt(input: testCase.input)
let response = try await model.generate(
prompt: prompt,
configuration: GenerationConfiguration(temperature: 0.0)
)
let predicted = response.content.trimmingCharacters(in: .whitespacesAndNewlines)
let isCorrect = predicted == testCase.expectedCategory
results.append(.init(
testCase: testCase,
predicted: predicted,
expected: testCase.expectedCategory,
isCorrect: isCorrect
))
}
let accuracy = Double(results.filter(\.isCorrect).count) / Double(results.count)
return EvaluationReport(
suiteName: name,
results: results,
metrics: [
.init(name: "Accuracy", value: accuracy, threshold: 0.95)
]
)
}
private func buildClassificationPrompt(input: String) -> LanguageModelPrompt {
LanguageModelPrompt("""
分类:查询天气 / 设置提醒 / 发送消息 / 搜索信息 / 其他
输入:\(input)
类别:
""")
}
}
/// 评估报告
struct EvaluationReport {
let suiteName: String
let results: [EvaluationResult]
let metrics: [EvaluationMetric]
/// 生成可读的评估报告
func generateMarkdownReport() -> String {
var report = "# \(suiteName) 评估报告\n\n"
report += "## 汇总\n\n"
report += "| 指标 | 值 | 阈值 | 通过 |\n"
report += "|------|------|------|------|\n"
for metric in metrics {
let passed = metric.value >= metric.threshold
report += "| \(metric.name) | \(String(format: "%.2f", metric.value)) | \(String(format: "%.2f", metric.threshold)) | \(passed ? "✅" : "❌") |\n"
}
report += "\n## 详细结果\n\n"
for result in results {
let icon = result.isCorrect ? "✅" : "❌"
report += "- \(icon) 输入:\"\(result.testCase.input)\" → 预测:\"\(result.predicted)\"(期望:\"\(result.expected)\")\n"
}
return report
}
}
七、Siri AI 独立应用:三层架构的技术拆解
7.1 Siri 的 15 年之变
Siri AI 在 WWDC 2026 中正式成为独立应用——这是 Siri 自 2011 年发布以来最大的架构变化。但它不只是换了个壳。新的 Siri AI 构建在三层智能架构之上:
- 端侧模型层(Apple Foundation Models):处理意图识别、简单查询、快速响应
- Private Cloud Compute 层:处理隐私敏感但需要更强算力的任务
- Gemini 兜底层:处理复杂推理、长文本生成、多轮深度对话
7.2 Siri App 内置的独立 SwiftUI 渲染引擎
值得注意的是,Siri App 内置了独立的 SwiftUI 渲染引擎。这意味着 Siri 不再只是一个"浮窗"或"横条"——它可以在应用内完成复杂的多模态交互:
- 直接查看 AI 生成的图表
- 编辑 Siri 协助起草的文档
- 管理个性化知识库
对开发者来说,这意味着你的 App 可以通过 App Intents 提供更丰富的交互体验,而不再局限于简单的"触发-执行"模式。
7.3 跨应用任务执行
Siri AI 最重要的新能力之一是跨应用任务执行。配合 App Intents 的语义索引,用户可以说出涉及多个应用的复杂指令:
用户:"把我今天会议记录里的待办事项加到提醒里,然后告诉小明我明天有空"
系统解析:
1. 从「备忘录」App 获取今日会议记录(通过 Entity Schema)
2. 提取待办事项(通过 Foundation Models 推理)
3. 创建提醒事项(通过「提醒事项」App Intent)
4. 发送消息(通过「信息」App Intent)
7.4 iCloud 上下文记忆
Siri AI 引入了 iCloud 上下文记忆能力,可以在设备间同步用户的偏好和上下文。这意味着用户在 iPhone 上设好的偏好,在 Mac 上也能被 Siri AI 理解。这对开发者来说是一个重要信号:未来的 App 需要适配跨设备的连续性体验。
八、Xcode 27 与开发工具链的 AI 化
8.1 Coding Agents:不只是"自动补全"
Xcode 27 引入了 coding agents 的概念。与传统的自动补全不同,coding agents 可以根据开发阶段工作:
| 阶段 | Agent 粒度 | 典型任务 |
|---|---|---|
| 原型期 | 粗粒度 | 根据需求描述生成完整的功能骨架 |
| 实现期 | 中粒度 | 补全函数实现、生成测试用例 |
| 打磨期 | 细粒度 | 代码格式化、性能优化建议、内存泄漏检查 |
苹果明确表示,coding agents 不是要替换开发者,而是把重复、机械、低信息密度的部分交给工具处理。
8.2 Device Hub:统一设备管理
Xcode 27 的 Device Hub 把所有连接的设备和模拟器收拢到一个统一面板。这对 AI 应用开发尤其重要——Foundation Models 在不同芯片上的性能差异很大,开发者需要方便地在多个设备上验证模型推理速度和准确性。
8.3 本地化工作流集成
Xcode 27 把本地化工作和 coding agent 结合起来,能自动处理翻译、字符串目录、语言变体等工作。这对 AI 应用尤其重要——因为 Foundation Models 框架本身就支持多语言,开发者可以更高效地覆盖全球市场。
8.4 Swift Concurrency Instrument
Xcode 27 的 Instruments 加强了对 Swift Concurrency 的分析能力。由于 Foundation Models framework 全面基于 async/await,Swift Concurrency instrument 成为调试 AI 应用性能瓶颈的必备工具。它能帮你发现:
- await 调用链中的阻塞点
- actor 隔离导致的不必要序列化
- Task 取消和内存泄漏
九、生产级 AI 应用开发完整实战
9.1 架构设计:分层 AI 服务
基于以上技术,我推荐的生产级 AI 应用架构如下:
┌──────────────────────────────────────────────────┐
│ UI Layer │
│ SwiftUI + View Annotations │
└──────────────┬───────────────────────────────────┘
│
│ App Intents(语义桥接)
│
├──────────────────────────────────────────────────┤
│ Business Logic Layer │
│ 领域服务 + AI 任务编排 │
├──────────────┬───────────────────────────────────┤
│ │ AI Service Layer │
│ │ ┌─────────────────────┐ │
│ │ │ Model Router │ │
│ │ │ (Dynamic Profiles) │ │
│ │ └────┬────────┬───────┘ │
│ │ │ │ │
│ │ ┌────▼──┐ ┌──▼──────────┐ │
│ │ │OnDevice│ │Gemini/Cloud │ │
│ │ └───────┘ └─────────────┘ │
├──────────────┴───────────────────────────────────┤
│ Evaluations Layer (测试) │
│ AI 功能的自动化评估与回归 │
└──────────────────────────────────────────────────┘
9.2 完整实战:构建一个智能笔记助手
下面是一个把所有技术串起来的完整示例——一个能理解笔记内容、自动分类、生成摘要的智能笔记助手:
import FoundationModels
import SwiftData
import AppIntents
import SwiftUI
/// 智能笔记助手:核心服务
@Observable
class SmartNoteAssistant {
private let aiService: AIService
private let modelContext: ModelContext
init(modelContext: ModelContext) {
self.modelContext = modelContext
self.aiService = AIService(
onDeviceModel: FoundationModel.default,
cloudModel: GeminiModel(apiKey: Secrets.geminiKey)
)
}
/// 自动为笔记生成摘要和分类
func processNote(_ note: Note) async throws {
let prompt = LanguageModelPrompt("""
请分析以下笔记内容,返回 JSON 格式:
{
"summary": "一句话摘要(50字以内)",
"category": "工作/学习/生活/技术/创意",
"tags": ["标签1", "标签2"],
"priority": "high/medium/low",
"actionItems": ["待办事项1", "待办事项2"]
}
笔记内容:
\(note.content)
只返回 JSON,不要返回其他内容。
""")
// 根据笔记长度选择路由策略
let complexity: AITask.Complexity = note.content.utf8.count > 1000 ? .complex : .moderate
let task = AITask(prompt: prompt, complexity: complexity)
let response = try await aiService.execute(task: task)
// 解析并更新笔记
let analysis = try JSONDecoder().decode(
NoteAnalysis.self,
from: Data(response.content.utf8)
)
note.summary = analysis.summary
note.category = analysis.category
note.tags = analysis.tags
note.priority = analysis.priority
note.actionItems = analysis.actionItems
note.processedAt = Date()
}
/// 智能搜索:用自然语言搜索笔记
func searchNotes(query: String) async throws -> [Note] {
let prompt = LanguageModelPrompt("""
用户想搜索笔记,查询内容:"\(query)"
请提取出 3-5 个最相关的搜索关键词,用换行分隔。
只返回关键词,不要返回其他内容。
""")
let task = AITask(prompt: prompt, complexity: .simple)
let response = try await aiService.execute(task: task)
let keywords = response.content
.components(separatedBy: .newlines)
.map { $0.trimmingCharacters(in: .whitespaces) }
.filter { !$0.isEmpty }
// 用提取的关键词搜索本地数据库
var descriptor = FetchDescriptor<Note>(
predicate: #Predicate { note in
keywords.allSatisfy { keyword in
note.content.localizedContains(keyword)
}
}
)
descriptor.fetchLimit = 20
return try modelContext.fetch(descriptor)
}
/// 为笔记生成 App Intent 元数据(Spotlight 索引)
func indexNote(_ note: Note) {
// Entity Schema 自动让笔记被 Spotlight 索引
// 用户可以直接通过 Spotlight 搜索到笔记
// 也可以通过 Siri AI 自然语言查询
}
}
/// 笔记分析结果
struct NoteAnalysis: Codable {
let summary: String
let category: String
let tags: [String]
let priority: String
let actionItems: [String]
}
/// 笔记数据模型
@Model
final class Note {
var id: UUID = UUID()
var title: String
var content: String
var summary: String?
var category: String?
var tags: [String]
var priority: String?
var actionItems: [String]
var createdAt: Date
var processedAt: Date?
init(title: String, content: String) {
self.title = title
self.content = content
self.createdAt = Date()
self.tags = []
self.actionItems = []
}
}
/// 笔记 App 的 SwiftUI 界面
struct SmartNoteView: View {
@Environment(\\.modelContext) private var modelContext
@State private var assistant: SmartNoteAssistant?
@State private var notes: [Note] = []
@State private var searchQuery: String = ""
@State private var searchResults: [Note] = []
var body: some View {
NavigationStack {
VStack(spacing: 0) {
// 搜索栏(支持自然语言搜索)
TextField("搜索笔记,例如:"上周技术会议的结论"", text: $searchQuery)
.textFieldStyle(.roundedBorder)
.padding()
.onSubmit(of: .search) {
performSmartSearch()
}
if !searchResults.isEmpty {
// 搜索结果
List(searchResults) { note in
NoteRow(note: note)
}
} else {
// 笔记列表
List(notes) { note in
NoteRow(note: note)
}
}
}
.navigationTitle("智能笔记")
.task {
assistant = SmartNoteAssistant(modelContext: modelContext)
await loadNotes()
}
}
}
private func performSmartSearch() async {
guard let assistant, !searchQuery.isEmpty else { return }
do {
searchResults = try await assistant.searchNotes(query: searchQuery)
} catch {
searchResults = []
}
}
private func loadNotes() async {
let descriptor = FetchDescriptor<Note>(
sortBy: [SortDescriptor(\\.createdAt, order: .reverse)]
)
notes = (try? modelContext.fetch(descriptor)) ?? []
}
}
十、性能优化与最佳实践
10.1 端侧模型优先策略
性能优化的第一条原则:能用端侧模型就用端侧模型。 理由很简单:
- 零网络延迟:端侧模型在 50ms 内响应,云端模型至少需要 200ms+ 的网络 RTT
- 零 API 成本:端侧推理完全免费,云端模型按 Token 计费
- 完全离线:飞机上、地铁里、信号差的环境都能用
- 隐私保障:用户数据不离开设备
10.2 Prompt 优化策略
Foundation Models 框架的 Prompt 优化和传统 LLM API 优化本质上相同,但端侧模型有一些额外的考虑:
/// Prompt 优化最佳实践
struct PromptOptimizationTips {
/// 1. 系统指令要精简——端侧模型上下文窗口有限
static func optimizedSystemPrompt() -> String {
// ❌ 不好:冗长的系统指令
// "你是一个专业的笔记分类助手。你的任务是将用户提供的笔记内容进行深度分析..."
// ✅ 好:精简明确的指令
// "分类:工作/学习/生活/技术/创意。只返回类别名。"
"分类:工作/学习/生活/技术/创意。只返回类别名。"
}
/// 2. 限制输出长度——减少端侧推理时间
static func optimizedConfig(for task: TaskType) -> GenerationConfiguration {
switch task {
case .classification:
return GenerationConfiguration(
temperature: 0.0,
maxTokens: 10 // 分类任务只需要极短的输出
)
case .summarization:
return GenerationConfiguration(
temperature: 0.3,
maxTokens: 200 // 摘要控制在 200 Token 以内
)
case .creative:
return GenerationConfiguration(
temperature: 0.7,
maxTokens: 1000 // 创意任务允许更长输出
)
}
}
/// 3. 批量处理——减少模型调用次数
static func batchClassify(notes: [String]) -> LanguageModelPrompt {
let items = notes.enumerated().map { "\($0.offset). \($0.element)" }.joined(separator: "\n")
return LanguageModelPrompt("""
批量分类以下笔记,返回 JSON 数组:
\(items)
格式:[{"index":0,"category":"工作"}, ...]
""")
}
}
10.3 内存管理与流式响应
Foundation Models framework 的流式响应基于 Swift Concurrency 的 AsyncThrowingStream。正确使用流式响应可以显著改善用户体验:
import FoundationModels
/// 流式响应的最佳实践
class StreamingAIService {
let model: LanguageModel
/// 流式生成并在 UI 上实时更新
func streamGenerate(
prompt: LanguageModelPrompt,
onUpdate: @escaping (String) -> Void
) async throws -> String {
var fullContent = ""
let stream = try await model.generateStream(
prompt: prompt,
configuration: GenerationConfiguration(temperature: 0.3)
)
for try await chunk in stream {
fullContent += chunk.text
onUpdate(fullContent) // 实时回调更新 UI
}
return fullContent
}
}
/// SwiftUI 中使用流式响应
struct StreamingTextView: View {
let prompt: LanguageModelPrompt
let service: StreamingAIService
@State private var displayedText: String = ""
@State private var isGenerating: Bool = false
var body: some View {
VStack {
TextEditor(text: $displayedText)
.disabled(isGenerating)
Button("生成") {
Task {
isGenerating = true
displayedText = ""
try? await service.streamGenerate(
prompt: prompt,
onUpdate: { displayedText = $0 }
)
isGenerating = false
}
}
.disabled(isGenerating)
}
}
}
十一、Liquid Glass 设计语言对 AI 应用的影响
11.1 透明度与可读性
WWDC 2026 对 Liquid Glass 设计语言做了重要改进——新增了透明度滑块,解决了上一版中文字密集区域难以辨认的"可读性噩梦"问题。
对 AI 应用开发者来说,这意味着你的 App 需要重新审视 AI 生成内容的展示方式。特别是:
- AI 回答的文本容器需要考虑 Liquid Glass 背景下的对比度
- 代码高亮和结构化数据展示需要适配透明背景
- 多模态内容(图片 + 文字)的混合布局需要额外测试
11.2 Icon Composer 与 SF Symbols 8
Icon Composer 让图标从单一设计扩展为多层 Liquid Glass 结构。如果你在开发 AI 应用,建议:
- 为 AI 功能创建专用的 SF Symbol 图标
- 使用多层图标结构区分不同 AI 功能层级
- 确保图标在深色/浅色/透明四种变体下都清晰可辨
十二、总结与展望:AI 时代的 Apple 开发者路径
12.1 WWDC 2026 的真正变化
如果只用一句话概括 WWDC 2026 的 AI 策略:苹果不再把 AI 当作一个"锦上添花"的功能,而是把它变成了操作系统的核心能力层。
这带来了三个重要的开发者路径变化:
- 从「接入 API」到「协议驱动」:Foundation Models framework 的协议架构意味着你不需要学习任何特定厂商的 API——学会一次,到处使用。
- 从「手动测试」到「自动化评估」:Evaluations framework 让 AI 功能也能像传统软件一样进行自动化回归测试。
- 从「功能开发」到「能力描述」:App Intents 和 Entity Schema 让你的 App 不再只是一个 App,而是一组可以被系统理解和调用的能力。
12.2 给开发者的行动建议
如果你是 iOS/macOS 开发者,我建议你立即开始以下工作:
短期(1-2 周):
- 阅读 Foundation Models framework 的官方文档
- 试用 Apple Foundation Models 的端侧推理能力
- 评估你的 App 中哪些功能可以用 AI 增强
中期(1-2 月):
- 为核心功能添加 App Intents 支持
- 实现 Entity Schema,让内容进入 Spotlight 索引
- 在 Xcode 27 中配置 Evaluations 测试套件
长期(3-6 月):
- 适配 Liquid Glass 设计语言
- 实现基于 Dynamic Profiles 的智能模型路由
- 接入 Siri AI 的跨应用任务能力
- 构建完整的 AI 功能评估流水线
12.3 苹果 AI 生态的独特优势
相比 Android 的 Google AI、Web 的各种 LLM SDK,Apple 的 AI 开发生态有几个独特的优势:
- 隐私优先:端侧模型 + Private Cloud Compute,用户数据不离开苹果生态
- 系统级集成:AI 不是你 App 里的一个功能,而是连接整个操作系统的桥梁
- 可替换性:Language Model Protocol 让模型层可插拔,不被任何厂商锁定
- 开发体验:Swift 原生 API + SwiftUI + Xcode,没有跨语言、跨框架的适配成本
12.4 写在最后
WWDC 2026 不是一个结束,而是一个开始。Foundation Models framework、Siri AI、App Intents 语义桥接——这些技术共同构成了苹果 AI 战略的基础设施层。
对于开发者来说,真正的问题已经不是"要不要接入 AI",而是"怎么把自己的应用变成一个能被 AI 理解、能被系统调用的智能实体"。苹果已经铺好了路,接下来,就看谁跑得最快了。
这不再是"功能堆叠"的时代。这是一次关于应用本质的重新定义。