SwiftUI에서 로컬 AI 구현하기: Foundation Models와 스트리밍 통합
Apple의 Foundation Models 프레임워크를 사용하면 SwiftUI 애플리케이션에 로컬 언어 모델을 통합할 수 있습니다. 이 모델들은 텍스트 생성, 요약, 분류 작업을 완전히 기기 내에서 수행하므로 클라우드 요청이 필요하지 않습니다. LanguageModelSession 클래스는 streamResponse(to:) 메서드를 통해 스트리밍 응답을 제공하며, 이는 반응형 인터페이스에 필수적입니다.
구현은 실시간 사용자 질의 처리에 중점을 둡니다: 텍스트 입력, 프롬프트 제출, 그리고 모델이 텍스트 청크를 생성할 때마다 동적으로 출력을 업데이트합니다.
채팅 상호작용을 위한 인터페이스 구조
앱은 AI 응답을 위한 ScrollView와 하단 입력 패널이 있는 NavigationStack을 중심으로 구축됩니다. 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에 로드합니다. 세션 풀링이나 인스턴스 재사용을 고려하세요. Neural Engine이 탑재된 기기(A17+ 또는 M3+)에서 테스트하세요. 스트리밍은 최대 CPU 사용량을 줄이지만 배치 모드에 비해 지속 시간이 증가합니다.
프로덕션 환경에서는 입력 디바운싱, 히스토리 컨텍스트, 저성능 기기를 위한 대체 방안을 추가하세요.
— Editorial Team
아직 댓글이 없습니다.