안녕하세요! 피피아노입니다 🎵
이번에 WWDC25를 생방송으로 봤었는데 이번 발표에서 가장 인상 깊었던 것 중 하나는 Foundation Models 프레임워크의 공개였습니다. 이 프레임워크는 iOS, iPadOS, macOS, visionOS에서 on-device LLM (Large Language Model)을 활용할 수 있게 해주는 새로운 API입니다.
지금까지는 서버 기반의 LLM 사용이 일반적이었지만, 애플은 이를 디바이스 내에서 실행함으로써 개인 정보 보호, 저지연, 오프라인 처리까지 모두 잡는 혁신적인 접근을 제시했습니다.
이제 개발자들은 서버 기반 LLM 없이도, Swift 코드 몇 줄만으로 on-device에서 대화형 AI 기능을 구현할 수 있게 되었습니다.
Foundation Models란?
Foundation Models란 서론에서도 언급했듯이 Apple이 자체적으로 훈련한 3B 파라미터의 온디바이스 LLM을 Swift API로 사용할 수 있도록 지원하는 프레임워크입니다.
모델 자체는 30억 파라미터 규모의 LLM이며, 모든 파라미터는 2-bit로 양자화되어 효율성을 극대화했다고 합니다. 또한 텍스트 요약, 분류, 추출, 태깅 등 다양한 작업에 적합하며, 디바이스 스케일 모델로 설계된 만큼 빠르고 가볍게 동작한다고 합니다.
https://developer.apple.com/documentation/foundationmodels
Foundation Models | Apple Developer Documentation
Perform tasks with the on-device model that specializes in language understanding, structured output, and tool calling.
developer.apple.com
이 프레임워크의 특징으로는 애플 생태계 운영체제(iOS, macOS, iPadOS, VisionOS) 전반에서 사용이 가능하다는 점과 온디바이스, 즉 기기 내에서 모델이 실행되기 때문에 데이터 유출이 없어서 보안적으로 더 안전하다는 점입니다. 그리고 온디바이스로 구동이 되기 때문에 오프라인 환경에서도 동작할 수 있고 OS 자체에 내장이 되기 때문에 앱 크기 증가도 없다고 합니다.
Apple은 이 모델을 "디바이스 스케일 모델"이라고 부르며, 거대한 웹 지식보다도 로컬 환경에서의 유용한 작업들에 최적화되어 있습니다.
또한, Xcode의 새로운 Playgrounds 기능을 통해 손쉽게 프롬프트를 실험하고, 앱과 통합할 수 있습니다.
Guided Generation - 구조화된 Swift 출력 만들기
Foundation Models의 핵심 기능은 Guided Generation입니다.
모델에게 자연어로 명령을 내리고, Swift 타입 구조로 결과를 받아올 수 있습니다.
@Generable
struct TravelPlan {
var title: String
var date: String
var destination: String
}
위처럼 @Generable로 타입을 정의하고 프롬프트를 날리면, 결과가 JSON도 아닌, 직접 정의한 Swift 객체로 돌아옵니다.
이제 프롬프트에 “일본 여행 일정을 만들어줘”라고만 해도, 위에 정의한 TravelPlan 구조체에 맞는 형태로 결과를 돌려줍니다.
직접 파싱하거나 예외 처리를 할 필요 없이, 곧바로 UI에 연결할 수 있습니다.
Streaming - 실시간으로 응답 받기
LLM 출력은 일반적으로 "토큰" 단위로 스트리밍됩니다. 하지만 Apple은 Snapshot 방식의 Streaming을 도입했습니다.
- PartiallyGenerated 타입 제공
- 응답이 생성되는 동안, SwiftUI에 즉시 업데이트 가능
- 애니메이션/전환 효과 활용해 사용자 경험 향상 가능
for await snapshot in session.streamResponse(...) {
self.partial = snapshot
}
델타 누적이 아닌 부분적으로 채워지는 구조체를 활용함으로써, 코드가 훨씬 더 단순해지고 안정적이라는 특징이 있습니다.
Tool Calling - 모델이 앱의 기능을 직접 실행
LLM은 모든 지식을 스스로 갖고 있지는 않습니다.
그래서 Apple은 Tool Calling 기능을 도입해, 모델이 앱 내 정의된 코드를 호출할 수 있도록 만들었습니다.
예를 들어 사용자가 “파리 날씨 알려줘”라고 하면, 모델은 자동으로 날씨 API를 호출하고, 응답을 대화에 반영할 수 있습니다.
struct WeatherTool: Tool {
var description = "Get current weather in a city"
func call(arguments: CityInput) async throws -> ToolOutput {
// CoreLocation, WeatherKit 등 사용
return .text("현재 기온은 24도입니다.")
}
}
- Tool 프로토콜을 따르는 타입을 정의
- 입력 값은 @Generable 타입으로 안전하게 처리
- 결과는 자연어 또는 구조화된 데이터로 반환 가능
이 기능 덕분에, 모델은 단순히 말만 하는 것이 아니라 실제로 앱 기능을 실행하는 주체가 될 수 있습니다.
Stateful Session - 문맥을 기억하는 대화형 모델
Foundation Models는 기본적으로 stateful session 방식으로 작동합니다.
즉, 대화의 맥락을 기억하며, 이전 대화 내용을 바탕으로 자연스럽게 이어지는 대화를 만들 수 있습니다.
- Instruction: 개발자가 모델에게 주는 역할 지침
- Prompt: 사용자의 입력
- Transcript: 세션 내 전체 대화 기록
예를 들어, 사용자가 “Swift 튜토리얼 예제 하나 만들어줘” → “하나 더”라고 하면, 모델은 이전 요청을 기억하고 맥락에 맞는 새로운 예제를 만들어냅니다.
개발자 도구와 최적화 팁
Apple은 Foundation Models를 더 쉽게 개발하고 테스트할 수 있도록 다양한 도구도 함께 제공합니다.
Xcode Playgrounds
#Playground 매크로를 사용하면 Swift 파일 안에서 바로 모델 프롬프트 실험 가능
Instruments 템플릿
LLM 응답 속도 분석, prewarm 최적화 등 성능 튜닝에 활용
Feedback Assistant
API나 모델에 대한 피드백을 공식적으로 전달할 수 있도록 Encodable 포맷 지원
어댑터 훈련
특화된 데이터셋이 있다면 Adapter Training Toolkit으로 맞춤형 모델 학습 가능
(단, Apple이 모델 업데이트할 때마다 재학습 필요)
마무리
이번 WWDC25에서 소개된 Foundation Models 프레임워크는 단순히 "애플도 LLM을 도입했구나" 수준이 아니라, Swift 개발자가 실제 앱에 적용해볼 수 있을 정도로 구체적인 사용 방식까지 제시했다는 점에서 꽤 흥미로웠습니다.
특히 가장 기대되는 기능은 Tool Calling이 가장 기대되고 빨리 써보고 싶었습니다 ㅎㅎ
저처럼 Swift 기반 iOS 앱을 만드는 입장에서,
이제는 "AI 기능은 서버에서 처리해야 한다"는 고정관념 없이, 기기 내부에서 바로 작동하는 lightweight한 LLM을 활용할 수 있다는 부분이 굉장히 매력적이라서 얼른 공부하고 사용해보고 싶었습니다.
물론 아직은 모델 크기나 추론 능력에 제한이 있고, 경쟁사에 비해서는 많이 부족하긴 하지만 여러가지 특징들과 프라이버시, UX 통합, Swift 연동성을 고려하면, 사용해볼 만한 가치가 개인적으로는 충분하다고 생각합니다.
앞으로 작은 사이드 프로젝트나 기능 실험에서 Foundation Models를 조금씩 써보면서 감을 익혀보면서 Foundation Models를 제대로 활용할 수 있도록 공부해야 할 것 같습니다..!
LLM 기반 기능을 Swift로 직접 구현해보고 싶은 분들에게는 꽤 좋은 출발점이 될 수 있을 것 같아요!
아래에 관련 링크도 남겨 둘테니 관심 있으신 분들은 참고하시면 좋을 것 같습니다!
참고 링크
감사합니다.
잘못된 내용이 있거나 더 좋은 내용 피드백은 언제나 환영합니다!
궁금하신 부분은 댓글로 질문 부탁드립니다!
'Apple > Swift' 카테고리의 다른 글
[Swift] suffix()로 인한 시간 초과 문제 해결하기 (4) | 2025.06.27 |
---|---|
[Swift] Core ML과 MFCC를 활용한 감정 추론 (7) | 2025.05.14 |
[Swift] Tuist 살펴보기 (0) | 2025.04.27 |
[Swift] 의존성 주입(Dependency Injection)이란? (0) | 2025.04.18 |
[Swift] Combine에서 map과 flatMap 살펴보기 (2) | 2025.04.08 |