
【iOS】 Foundation Models 입문 — 온디바이스 LLM으로 텍스트 생성하기
요약
iOS 26부터 도입된 Foundation Models 프레임워크를 사용하여 Apple Intelligence의 온디바이스 LLM을 Swift로 구현하는 방법을 설명합니다. 외부 서버 전송 없이 기기 내에서 텍스트 생성, 요약, 추출 등을 수행하는 기본 구현 과정을 다룹니다.
핵심 포인트
- Apple Intelligence의 온디바이스 모델을 Swift로 직접 제어 가능
- LanguageModelSession을 통한 비동기 텍스트 생성 구현
- @Generable을 활용한 구조화된 출력(Structured Output) 처리
- 모델 가용성 확인 및 언어/지역 지원 여부 체크 방법

iOS 26부터 Apple Intelligence의 언어 모델을 Swift에서 직접 사용할 수 있는 Foundation Models 프레임워크가 등장했습니다. 본 기사에서 사용하는 SystemLanguageModel은 Apple Intelligence의 온디바이스 (On-device) 언어 모델을 이용합니다. 따라서 본 기사 집필 시점에서는 생성을 위해 입력 내용을 외부 서버로 전송할 필요가 없습니다. 다만, Apple Intelligence 이용을 시작할 때는 모델 다운로드 등의 준비에 시간이 걸릴 수 있습니다. 본 기사에서는 텍스트 생성에 집중하여 Foundation Models의 기본 구현을 해설합니다. 이미지 입력이나 Tool Calling은 다루지 않습니다.
본 기사를 읽음으로써 다음을 할 수 있게 됩니다.
- 모델 이용 가능 여부 확인하기
LanguageModelSession으로 텍스트 생성하기instructions로 동작 지정하기@Generable로 구조화된 출력 (Structured Output) 받기

Foundation Models란
Foundation Models는 Apple Intelligence의 언어 모델을 앱에서 이용하기 위한 Swift 프레임워크입니다. 특징은 다음과 같습니다.
- 온디바이스 (On-device)에서 동작함 (클라우드 API 키 불필요)
- 시스템이 제공하는 모델을 이용하므로, 앱에 모델을 동봉할 필요가 없음
- 요약, 추출, 분류, 문장 편집, 단문 생성 등에 적합함
반면, 코드 생성이나 다단계의 복잡한 추론이 필요한 처리 등에는 적합하지 않습니다. 또한, 모델이 가지고 있지 않은 최신 정보나 외부 데이터를 그대로 가져올 수도 없습니다.
우선은 기기 내에서 완결되는 작은 텍스트 처리부터 시도해 보는 것이 좋습니다.
대응 조건
Foundation Models를 사용하려면 다음 조건을 충족해야 합니다.
- iOS 26 이후
- Apple Intelligence에 대응하는 단말기
- 설정에서 Apple Intelligence가 켜져 있을 것
- 사용하는 언어와 지역이 모델에 대응할 것
- 개발 환경은 Xcode 26 이후
대응 단말기는 Apple의 공식 정보에서 확인할 수 있습니다.
다만, 앱 내에서 기종명을 고정하여 판정할 필요는 없습니다. 실행 시에 SystemLanguageModel의 availability 프로퍼티를 확인합니다.
.available인 경우에도 현재 언어와 지역을 모델이 지원하는지 확인하고 싶다면 supportsLocale(_:)를 사용할 수 있습니다.
구현 방법
모델을 이용할 수 있는지 확인한 후, 다음 순서로 구현합니다.
LanguageModelSession을 생성하기respond(to:)로 텍스트 생성하기instructions로 동작 지정하기@Generable로 구조화된 출력 받기
세션 생성과 텍스트 생성
가장 기본적인 형태는 LanguageModelSession을 생성하여 respond(to:)를 호출하는 것뿐입니다.
respond(to:)는 비동기 (Asynchronous) 메서드입니다. 생성 결과 문자열은 응답의 content 프로퍼티에서 가져옵니다. LanguageModelSession은 상태를 가진 객체입니다. 동일한 세션을 사용하여 여러 번 respond(to:)를 호출하면, 그때까지의 주고받은 내용이 문맥 (Context)으로 유지됩니다.
따라서 요약이나 추출 등의 단발성 처리에서는 처리마다 새로운 세션을 생성하면 이전 생성 내용의 영향을 받지 않고 처리할 수 있습니다. 대화의 문맥을 유지하고 싶다면 동일한 세션을 재사용합니다.
또한, 하나의 세션은 동시에 여러 요청을 처리할 수 없습니다. isResponding이 true인 동안에는 생성 버튼을 비활성화하는 등의 방법으로 중복 전송을 방지합니다.
instructions로 동작을 지정하기
세션 생성 시 instructions를 전달하면 모델의 역할이나 응답 방식을 지정할 수 있습니다.
instructions와 prompt에는 다음과 같은 차이가 있습니다.
instructions: 세션 전체에 적용하는 역할이나 응답 규칙prompt: 이번에 모델이 처리할 구체적인 입력
모델은 prompt보다 instructions를 우선하여 따르도록 설계되어 있습니다. 따라서 세션 전체에 적용하는 역할, 응답 형식, 금지 사항 등은 instructions에 기술합니다.
또한, instructions에는 신뢰할 수 있는 내용만 지정하고, 사용자가 입력한 문자열을 직접 매립하지 않도록 합니다. 사용자의 입력은 prompt로서 분리하여 전달합니다.
@Generable로 구조화된 출력 받기
respond(to:)로 일반적인 생성을 수행하면 결과는 자유 형식의 문자열로 반환됩니다.
앱에서는 자유 형식의 문자열이 아니라 Swift의 타입으로 결과를 받고 싶을 때가 있습니다. 그때 사용하는 것이 @Generable입니다.
@Generable은 프로퍼티 래퍼 (Property Wrapper)가 아니라 Swift 매크로 (Macro)입니다. 구조체에 부여하면 Generable 프로토콜 준수 및 모델이 구조화된 데이터를 생성하기 위해 사용하는 스키마 (Schema)가 컴파일 시점에 생성됩니다.
이 예시에서는 모델로부터 받을 출력을 다음 두 가지 프로퍼티로 정의하고 있습니다.
summary: 입력 텍스트의 요약keyPoints: 입력 텍스트의 주요 포인트
@Guide 역시 Swift 매크로입니다. 생성 대상이 되는 프로퍼티에 부여함으로써 모델이 생성해주길 바라는 내용을 자연어로 설명하거나, 값의 범위나 배열의 개수 등을 제약할 수 있습니다. 이 예시에서는 .maximumCount(3)를 지정하여 keyPoints의 개수를 최대 3개로 제한하고 있습니다.
생성 시에는 respond(to:generating:)의 generating 인수에 출력용 타입을 지정합니다.
일반적인 respond(to:)에서는 response.content가 String이 됩니다.
반면, generating 인수에 SummaryResult.self를 지정하면 response.content는 SummaryResult가 됩니다.
따라서 JSON이나 자유 형식의 문자열을 앱 측에서 파싱할 필요가 없습니다. 모델은 정의된 스키마와 제약에 따라 출력을 생성하며, 앱은 결과를 Swift 타입으로 받을 수 있습니다.
단, 가이드 생성 (Guided Generation)이 보장하는 것은 출력이 정의된 타입이나 제약에 따른다는 점입니다. 생성된 요약의 내용이 사실로서 올바른지까지 보장하는 것은 아닙니다.
세션의 컨텍스트 상한
LanguageModelSession에는 1세션 내에서 처리할 수 있는 정보량의 상한이 있습니다.
본 기사 집필 시점을 기준으로 시스템 모델의 컨텍스트 상한 (Context Limit)은 4,096 토큰 (Token)입니다. 이 상한에는 다음 내용이 모두 포함됩니다.
instructions- 사용자가 전달한
prompt - 모델이 생성한 응답
- 동일 세션 내의 과거 대화 내용
상한을 초과하면 LanguageModelSession.GenerationError.exceededContextWindowSize(_:)가 발생합니다. 대량의 문장을 처리할 경우에는 문장을 컨텍스트 상한에 들어갈 수 있도록 여러 단위 (청크, Chunk)로 분할하여 각각을 별도의 세션에서 요약합니다. 그 후, 각 요약을 입력으로 하여 최종적인 요약을 생성합니다.
적합한 용도 / 적합하지 않은 용도
적합한 예:
- 컨텍스트 상한에 들어가는 문장의 요약
- 불렛 포인트로 정리
- 짧은 분류나 라벨링
- 사용자 입력으로부터의 정보 추출
- 문장의 재진술 (Paraphrasing) 또는 편집
- 짧은 문장 생성
적합하지 않은 예:
- 최신 뉴스 등 단말기 외부의 최신 정보가 필요한 질문
- 본격적인 코드 생성이나 복잡한 프로그램 작성
- 다단계의 복잡한 추론이 필요한 처리
- 컨텍스트 상한을 초과하는 장시간의 대화
최신 정보나 앱 내의 데이터베이스 등 모델이 가지고 있지 않은 정보를 사용하는 경우에는 정보를 가져오는 처리를 앱 측에 구현하고, 툴 콜링 (Tool Calling)을 통해 모델에게 제공합니다. 툴 콜링 자체가 자동으로 인터넷에 접속하는 것은 아닙니다.
우선은 단말기 내부에서 완결되는 작은 텍스트 처리부터 도입하는 것이 안전합니다.
마치며
본 기사에서는 Foundation Models로 텍스트 생성을 시작하기 위한 구현 포인트에 집중하여 해설했습니다.
기본적인 흐름은 모델의 이용 가능 여부를 확인하고, LanguageModelSession을 생성하여 respond(to:)를 호출하는 것뿐입니다. 자유 형식의 텍스트를 생성할 때는 respond(to:)를 사용하며, 앱에서 다루기 쉬운 구조화된 데이터 (Structured Data)가 필요한 경우에는 @Generable과 @Guide를 사용합니다.
Foundation Models는 요약, 정보 추출, 분류, 문장 편집과 같은 텍스트 처리를 Apple Intelligence의 언어 모델을 사용하여 간편하게 구현할 수 있는 프레임워크입니다.
API 키나 서버를 준비할 필요 없이 생성 AI (Generative AI) 기능을 앱에 통합할 수 있으므로, 우선 소규모 기능부터 시도해 보는 것이 좋습니다.
참고 자료
-
Meet the Foundation Models framework - WWDC25
-
Deep dive into the Foundation Models framework - WWDC25
-
SystemLanguageModel
-
Generating content and performing tasks with Foundation Models
-
Generating Swift data structures with guided generation
Discussion

AI 자동 생성 콘텐츠
본 콘텐츠는 Zenn AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기