返回首页

SwiftUI 中的 Foundation Models:本地 AI

Foundation Models 框架允许将 Apple 的本地语言模型集成到 SwiftUI 应用中,支持流式响应生成。该示例实现了一个带有设备上推理的聊天界面,确保隐私和低延迟。支持 iOS 26 及更高版本。

SwiftUI + Foundation Models:本地实时 AI
Advertisement 728x90

在 SwiftUI 中集成本地 AI:基础模型与流式响应

苹果的基础模型框架允许将本地语言模型集成到 SwiftUI 应用中。这些模型完全在设备上执行文本生成、摘要和分类任务,无需云端请求。LanguageModelSession 类通过 streamResponse(to:) 方法支持流式响应,这对于实现响应式界面至关重要。

实现重点在于实时处理用户查询:文本输入、提示提交,以及模型生成文本块时的动态输出更新。

聊天交互的界面结构

应用围绕 NavigationStack 构建,使用 ScrollView 显示 AI 响应,底部为输入面板。带有 glassEffect 修饰符的 TextField 符合 iOS 26 设计风格。发送按钮触发异步任务,通过 inputDisabled 状态防止重复请求。

Google AdInline article slot

完整示例代码:

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 并重新启用输入字段。

Google AdInline article slot

关键集成方面

  • 流式处理:文本块逐步生成,适合长篇响应;需要精确的状态管理以避免竞态条件。
  • 隐私保护:所有计算在设备上进行,数据永不离开设备。
  • 平台支持: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

Google AdInline article slot
Advertisement 728x90

继续阅读