在 SwiftUI 中集成本地 AI:基础模型与流式响应
苹果的基础模型框架允许将本地语言模型集成到 SwiftUI 应用中。这些模型完全在设备上执行文本生成、摘要和分类任务,无需云端请求。LanguageModelSession 类通过 streamResponse(to:) 方法支持流式响应,这对于实现响应式界面至关重要。
实现重点在于实时处理用户查询:文本输入、提示提交,以及模型生成文本块时的动态输出更新。
聊天交互的界面结构
应用围绕 NavigationStack 构建,使用 ScrollView 显示 AI 响应,底部为输入面板。带有 glassEffect 修饰符的 TextField 符合 iOS 26 设计风格。发送按钮触发异步任务,通过 inputDisabled 状态防止重复请求。
完整示例代码:
import SwiftUI
import FoundationModels
struct ContentView: View {
@State private var input: String = ""
@State private var output: String = ""
@State private var inputDisabled: Bool = false
var body: some View {
NavigationStack {
ScrollView {
Text(output)
}
}
.safeAreaBar(edge: .bottom) {
inputAccessoryView
}
}
private var inputAccessoryView: some View {
HStack {
TextField("问我任何问题", text: $input)
.padding()
.glassEffect()
Button {
sendPrompt()
} label: {
Image(systemName: "paperplane")
.frame(width: 25, height: 25)
.rotationEffect(.degrees(40))
}
.buttonStyle(.borderedProminent)
.controlSize(.mini)
.disabled(inputDisabled)
.padding(8)
}
}
private func sendPrompt() {
Task {
guard input.isEmpty == false else { return }
do {
let session = LanguageModelSession()
inputDisabled = true
let streamResponse = session.streamResponse(to: input)
for try await chunk in streamResponse {
self.output = chunk
}
inputDisabled = false
} catch {
print(error.localizedDescription)
inputDisabled = false
}
}
}
}
流式生成机制
streamResponse(to:) 方法返回一个异步文本块序列。for try await chunk in streamResponse 循环在每一步更新 @State var output,触发 SwiftUI 重新渲染。这确保了流畅的用户体验,不会阻塞 UI 操作。
通过 do-catch 实现错误处理:如果会话失败,打印 localizedDescription 并重新启用输入字段。
关键集成方面
- 流式处理:文本块逐步生成,适合长篇响应;需要精确的状态管理以避免竞态条件。
- 隐私保护:所有计算在设备上进行,数据永不离开设备。
- 平台支持:iOS 26+、macOS 26+、tvOS 26+、watchOS 26+。
重要要点
LanguageModelSession是本地 LLM 会话的主要类,支持批处理和流式处理。streamResponse(to:)通过增量更新最小化 UI 延迟。- 设备端推理消除了网络延迟和 API 成本。
- SwiftUI
@State+Task无需 GCD 即可实现并发。 glassEffect是 iOS 26 玻璃态效果的原生修饰符。
性能优化
针对中高级开发者:监控会话内存占用——每个 LanguageModelSession 将模型加载到 RAM 中。考虑会话池或实例重用。在配备神经引擎的设备(A17+ 或 M3+)上测试。流式处理降低了峰值 CPU 使用率,但与批处理模式相比增加了持续时间。
在生产环境中,添加输入防抖、历史上下文和低性能设备的备用方案。
— Editorial Team
暂无评论。