Apple Foundation Models: 온디바이스 LLM 프레임워크 완전 해설
Foundation Models 프레임워크를 쓰면 앱이 Apple Intelligence를 구동하는 바로 그 온디바이스 대규모 언어 모델에 직접, 무료로, 오프라인으로 접근할 수 있습니다1. API 키도, 토큰당 과금도, 네트워크 왕복도 없고, 기기 밖으로 나가는 데이터도 없습니다. 예전 같으면 클라우드 LLM 호출과 개인정보 검토를 의미했던 부류의 기능들이, 이제는 비용이 사실상 0에 수렴합니다. 대신 내주는 것은 능력입니다. 온디바이스 모델은 작고, 컨텍스트 윈도는 유한하며, 프레임워크는 할 수 있는 일과 하지 않을 일 사이에 분명한 선을 긋습니다. 그 선이 어디에 있는지 아는 것이 이 프레임워크를 다루는 일의 전부입니다.
이 글은 프레임워크 자체에 대한 레퍼런스입니다. 실제로 호출하게 되는 타입들, 이 프레임워크를 쓸 이유가 되는 단 하나의 기능, 그리고 여기서 멈추고 더 큰 무언가로 옮겨가야 하는 지점을 다룹니다.
핵심 요약
LanguageModelSession이 진입점입니다. 하나 만들고respond(to:)를 호출하면 텍스트가 돌아옵니다. 여러 턴에 걸친 맥락은 세션이 들고 있으므로, 단발성 작업은 매번 새 세션을 만들어 처리합니다2.- 가이드 생성(guided generation)이야말로 이 프레임워크를 쓰는 이유입니다. Swift 타입에
@Generable을 붙이면, 직접 파싱해야 하는 문자열 대신 값이 채워지고 타입까지 검증된 그 타입 자체가 돌아옵니다3. Tool프로토콜을 쓰면 모델이 생성 도중에 여러분의 코드를 호출해 데이터를 가져오거나 동작을 실행하고, 그 결과를 다시 답변에 녹여 넣을 수 있습니다4.- 무엇을 하든 그전에
SystemLanguageModel.default.availability부터 확인하세요. 자격이 없는 기기, Apple Intelligence가 꺼진 상태, 모델을 내려받는 중에는 모델이 존재하지 않습니다5. - 컨텍스트 윈도는 실재하고, 작습니다.
SystemLanguageModel.default.contextSize는 프롬프트와 응답이 함께 나눠 쓰는 토큰 예산을 알려 줍니다6. 온디바이스에서는 4K 토큰이고, Private Cloud Compute 모델에서는 32K로 늘어납니다14. 이 예산을 염두에 두고 설계하지 않으면 세션이 오류를 던집니다. - iOS 26과 Apple Intelligence를 지원하는 기기가 필요합니다. 그 아래에서는 프레임워크 자체가 존재하지 않습니다. iOS 27 베타는 같은 API 위에 이미지 입력, 요청 단위 도구 호출 제어, Private Cloud Compute의 서버 모델을 더합니다121314.
이 프레임워크가 무엇이고, 무엇이 아닌가
Foundation Models는 클라우드 엔드포인트를 감싼 래퍼가 아닙니다. 모델은 기기 안에 있고, 운영체제와 함께 배포되며, Neural Engine 위에서 돌아갑니다. 이 하나의 사실이 API 설계의 모든 결정을, 그리고 그것을 쓰는 여러분의 모든 결정을 좌우합니다.
얻는 것은 텍스트 생성, 요약, 분류, 정보 추출, 짧은 글 다듬기, 그리고 구조화된 출력입니다. 전부 온디바이스에서, 전부 무료로요. 얻지 못하는 것은 프런티어 모델입니다. Apple은 이 온디바이스 모델을 앱 안에서 처리하는 좁고 분명한 언어 작업용으로 만들었습니다. 개방형 추론용도, 긴 문서 분석용도, 시험 보듯 물어볼 수 있는 세상 지식용도 아닙니다. Apple도 그렇게 밝히고 있습니다. 이렇게 용도를 못 박아 두는 일이 중요한 이유는, API만 보고 있으면 얼마든지 넘어설 수 있는 기대치를 여기서 대신 정해 주기 때문입니다1.
문제를 피하게 해 주는 사고 모델은 이렇습니다. 온디바이스 모델을 빠르고, 사생활을 지켜 주고, 공짜인 인턴이라고 생각하세요. 글을 다듬는 데는 탁월하지만 사실을 아는 데는 형편없는 인턴입니다. 재료와 분명한 과제를 함께 건네주세요. 답할 방법이 없는 질문은 던지지 마세요.
LanguageModelSession: 진입점
모든 상호작용은 세션에서 시작합니다.
import FoundationModels
let session = LanguageModelSession()
let response = try await session.respond(to: "Summarize this review in one sentence: \(reviewText)")
print(response.content)
세션은 대화 상태를 들고 있습니다. respond(to:)를 호출할 때마다 진행 중인 대화 기록에 내용이 덧붙기 때문에, 계속 들고 있는 세션은 앞서 오간 내용을 기억합니다. 채팅 기능이라면 바로 그것이 원하는 동작입니다. 반면 서로 무관한 단발 작업(이건 요약해, 저건 분류해)이라면 호출마다 새 세션을 만드세요. 그래야 지난 맥락이 흘러들어와 토큰 예산을 잡아먹는 일이 없습니다2.
respond(to:)는 async throws입니다. 모델이 작업하는 동안 실행을 중단하고, 요청이 컨텍스트 윈도를 넘어서거나 모델을 쓸 수 없거나 가드레일이 내용을 거부하면 오류를 던집니다. 이 셋은 모두 무시해도 되는 예외적 상황이 아니라, 실제로 처리해야 하는 분기입니다.
반응이 살아 있는 UI를 만들려면 기다리지 말고 스트리밍하세요. streamResponse(to:)는 모델이 만들어 내는 대로 부분 출력을 흘려보내므로, 3초 동안 멈춰 있던 화면이 글자가 실시간으로 돋아나는 화면으로 바뀝니다7.
가이드 생성: 이 프레임워크가 값을 하게 만드는 기능
여기가 입장료 값을 하는 대목입니다. 대부분의 LLM 연동은 코드의 3분의 1을 모델에서 유효한 JSON을 받아 내려고 어르는 데 쓰고, 나머지 3분의 2를 그럼에도 실패했을 때를 방어하는 데 씁니다. Foundation Models는 그 일을 통째로 없앱니다.
Swift 타입에 @Generable을 붙이고 세션에 그 타입을 생성해 달라고 요청하면, 모델은 값이 채워지고 타입 안전성이 보장된 해당 타입의 인스턴스를 돌려줍니다3.
@Generable
struct Recipe {
@Guide(description: "The dish name")
let title: String
@Guide(description: "Ingredients, each as 'quantity item'")
let ingredients: [String]
@Guide(description: "Total minutes, start to finish", .range(5...240))
let minutes: Int
}
let session = LanguageModelSession()
let response = try await session.respond(
to: "A weeknight pasta for two.",
generating: Recipe.self
)
let recipe = response.content // a Recipe, not a String
파싱도 없고, JSONDecoder도 없고, 잘못된 출력에 대비한 재시도 루프도 없습니다. @Guide 매크로는 필드 하나하나를 제약합니다. 모델이 지시문으로 읽는 설명, 그리고 숫자 범위나 출력이 반드시 일치해야 하는 정규식 같은 선택적 제한을 걸 수 있습니다8. 프레임워크는 5에서 240 사이의 숫자를 달라고 모델에게 정중히 부탁하지 않습니다. 디코딩 자체를 제약해서 그 필드가 다른 값으로는 돌아올 수 없게 만듭니다.
여기서 강제되는 규율이 진짜 가치입니다. 출력 타입을 Swift로 먼저 설계하고, 컴파일러가 그것을 검사합니다. 모델은 여러분이 역으로 해석해야 하는 산문을 뱉는 대신, 여러분이 정의한 계약을 채웁니다. 정보 추출, 양식 채우기, 그리고 언어를 데이터로 바꾸는 모든 기능에서 가이드 생성은 데모와 출시 가능한 코드를 가르는 차이입니다.
알아 둘 만한 제어가 하나 있습니다. respond(to:generating:)는 includeSchemaInPrompt의 기본값이 true이며, 이 옵션은 타입의 형태를 프롬프트에 주입해 모델이 그쪽으로 기울도록 만듭니다. 모델이 학습 과정이나 세션의 앞선 턴에서 이미 그 형식을 알고 있는 경우가 아니라면 켜 둔 채로 두세요. 모델이 본 적 없는 형식인데 토큰을 아끼겠다고 이 옵션을 끄면, 돌아오는 것은 쓰레기입니다9.
도구 호출: 모델이 여러분의 코드에 손을 뻗게 하기
가이드 생성이 나오는 것의 형태를 정한다면, 도구 호출은 들어가는 것을 바꿉니다. 도구는 모델이 생성 도중에 호출할 수 있는 여러분의 코드 조각으로, 모델은 이를 통해 자신이 갖고 있지 않은 정보를 가져오거나 동작을 실행한 뒤 그 결과를 이용해 답변을 이어 갑니다4.
도구는 Tool 프로토콜을 따릅니다. name, 모델이 언제 호출할지 판단하려고 읽는 description, @Generable로 선언한 Arguments 타입, 그리고 실제 일을 수행하는 call(arguments:) 메서드로 구성됩니다4.
struct FindContacts: Tool {
let name = "findContacts"
let description = "Find a specific number of contacts from the address book"
@Generable
struct Arguments {
@Guide(description: "How many contacts to return", .range(1...10))
let count: Int
}
func call(arguments: Arguments) async throws -> [String] {
// Fetch contacts, return formatted names.
}
}
let session = LanguageModelSession(tools: [FindContacts()])
let response = try await session.respond(to: "Draft a dinner invite to three of my contacts.")
흐름은 이렇습니다. 모델이 연락처가 필요하다고 판단하고, 검증된 count와 함께 여러분의 도구를 호출하고, 여러분이 데이터를 돌려주면, 모델이 실제 이름을 써서 초대장을 씁니다. 인자는 가이드 생성과 똑같은 장치를 거쳐 타입이 검증된 채로 도착하므로, 자유 형식 텍스트에서 모델의 의도를 파싱할 일이 전혀 없습니다. 모델이 언제 그 도구에 손을 뻗을지 조절할 수단은 설명문뿐입니다. 그러니 아무 배경 지식 없는 다른 엔지니어가 읽고 정확히 쓸 수 있어야 하는 함수 문서를 쓰듯 작성하세요.
여기가 Foundation Models와 에이전트 이야기의 나머지 부분이 맞물리는 이음매이기도 합니다. 온디바이스 모델이 호출하는 도구와 Apple Intelligence가 호출하는 App Intent11는 표면만 다를 뿐 형태는 같습니다. 이름이 붙어 있고, 설명이 달려 있고, 타입이 정의된 기능이라는 점에서요. 기능을 한 번만 설계해 두면 양쪽 모두로 노출할 수 있습니다.
가용성: 건너뛸 수 없는 확인
모델이 항상 거기에 있는 것은 아닙니다. Apple Intelligence를 지원하지 않는 기기에는 없고, 사용자가 기능을 꺼 둔 경우에도 없으며, 운영체제가 모델 자산을 아직 내려받고 있는 구간에도 없습니다. 모델이 당연히 있다고 전제한 코드를 내보내면, 여러분이 한 번도 테스트해 보지 않은 사용자 집단에서 앱이 죽거나, 조용히 망가지거나, 멈춰 있게 됩니다.
SystemLanguageModel.default.availability를 확인하고 사유별로 분기하세요5.
switch SystemLanguageModel.default.availability {
case .available:
// Show the intelligence feature.
case .unavailable(.deviceNotEligible):
// Hide it. This device will never have the model.
case .unavailable(.appleIntelligenceNotEnabled):
// Prompt the user to turn on Apple Intelligence.
case .unavailable(.modelNotReady):
// Downloading or otherwise not ready yet. Try again later.
case .unavailable(let other):
// Unknown reason. Fail closed.
}
세 가지 사유는 각각 다른 제품적 대응을 요구하며, 이를 뭉뚱그리는 것이야말로 이런 기능이 고장 난 것처럼 느껴지는 가장 흔한 원인입니다. deviceNotEligible은 영구적입니다. 기능을 숨기고, 사용자를 성가시게 하지 마세요. appleIntelligenceNotEnabled는 사용자가 직접 조절하는 설정입니다. 한 번 안내하는 정도는 정당합니다. modelNotReady는 일시적입니다. 다시 시도하되 오류를 보여 주지는 마세요. 모델을 쓸 수 없는 경로도 정상 경로와 똑같은 정성으로 만드세요. 적지 않은 비율의 기기에서는 그쪽이 유일한 경로이기 때문입니다.
모델을 쓸 수 있고 곧 요청이 들어올 것을 안다면, 세션의 prewarm()이 모델을 미리 데워 두어 첫 응답이 더 빨리 도착하게 해 줍니다10. 사용자가 곧 무언가를 실행할 화면에서는 값어치를 하지만, 짐작만으로 호출하면 낭비입니다.
실습: 파일 하나로 완성하는 기능
위의 조각들을 조합하면, 대부분의 네트워킹 계층이 엔드포인트 하나를 다루는 데 쓰는 것보다 적은 코드로 실제 기능이 완성됩니다. 아래 예제는 형식 없이 적은 회의 메모를 구조화된 실행 항목으로 바꾸는, 그대로 컴파일되는 완전한 SwiftUI 화면입니다. 가용성 확인, @Generable 출력 타입, 가이드 생성 호출 한 번, 그리고 모델을 쓸 수 없는 세 가지 분기 처리가 모두 들어 있습니다. 등장하는 모든 심벌은 위에서 설명한 프레임워크 표면에서 온 것입니다2358.
import SwiftUI
import FoundationModels
@Generable
struct ActionItems {
@Guide(description: "One-sentence summary of the meeting")
let summary: String
@Guide(description: "Concrete follow-up tasks, each starting with a verb")
let tasks: [String]
@Guide(description: "How urgent the follow-ups are overall", .anyOf(["low", "medium", "high"]))
let urgency: String
}
struct MeetingNotesView: View {
@State private var notes = ""
@State private var result: ActionItems?
@State private var errorMessage: String?
var body: some View {
Form {
TextField("Paste meeting notes", text: $notes, axis: .vertical)
.lineLimit(6...12)
Button("Extract action items") {
Task { await extract() }
}
.disabled(notes.isEmpty)
if let result {
Section(result.summary) {
ForEach(result.tasks, id: \.self) { Text($0) }
Text("Urgency: \(result.urgency)")
}
}
if let errorMessage {
Text(errorMessage).foregroundStyle(.secondary)
}
}
}
private func extract() async {
switch SystemLanguageModel.default.availability {
case .available:
do {
let session = LanguageModelSession()
let response = try await session.respond(
to: "Extract the action items from these notes: \(notes)",
generating: ActionItems.self
)
result = response.content
} catch {
errorMessage = "The model could not process these notes."
}
case .unavailable(.appleIntelligenceNotEnabled):
errorMessage = "Turn on Apple Intelligence in Settings to use this feature."
case .unavailable(.modelNotReady):
errorMessage = "The model is still downloading. Try again shortly."
case .unavailable:
errorMessage = "This feature needs an Apple Intelligence-capable device."
}
}
}
이 정도로 작은 예제에서도 눈여겨볼 지점이 셋 있습니다. 첫째, 출력 타입이 곧 API입니다. ActionItems가 이 기능이 만들어 내는 결과물을 정확히 정의하고, urgency에 걸린 @Guide 제약 덕분에 그 문자열은 허용된 세 값 바깥으로는 돌아올 수 없습니다8. 둘째, 추출 작업 하나하나가 서로 독립적이므로 세션을 호출마다 새로 만듭니다. 세션을 계속 들고 있으면 이전 메모까지 토큰 예산으로 끌고 들어옵니다2. 셋째, 모델을 쓸 수 없는 분기들이 뭉뚱그린 오류 하나가 아니라 서로 다른 세 가지 사용자 경험을 만들어 냅니다. 기능이 정직하게 한 단계 물러서는 것과 고장 난 것처럼 보이는 것의 차이가 바로 여기서 갈립니다. 이 파일을 iOS 26 프로젝트에 붙여 넣고 Apple Intelligence를 지원하는 기기에서 실행하면 그대로 동작합니다.
컨텍스트 윈도, 그리고 그것이 부족해지는 지점
SystemLanguageModel.default.contextSize는 모델이 그 안에서 작업하는 토큰 예산을 알려 주며, 이 예산은 공유됩니다. 프롬프트와 응답이 함께 그 안에 들어가야 합니다6. 이 숫자는 클라우드 모델에 비하면 작고, 실제 입력을 넣어 보면 금방 체감됩니다. 긴 문서, 통째로 쌓인 대화 기록, 덩치 큰 도구 실행 결과 — 어느 하나만으로도 예산을 터뜨려 respond가 오류를 던지게 만들 수 있습니다.
여기서 두 가지 실패 양상이 나오는데, 둘 다 막아야 하는 쪽은 여러분입니다. 첫째는 서서히 차오르는 경우입니다. 여러 턴이 이어지는 세션은 대화 기록을 쌓아 가다가 어느 한 턴에서 넘쳐 버립니다. 서로 무관한 작업은 새 세션으로 시작하고, 턴마다 넣는 입력을 가볍게 유지해서 관리하세요. 둘째는 한 번에 너무 큰 요청입니다. 20쪽짜리 PDF는 들어가지 않습니다. 예외 없습니다. 잘게 나눠 조각별로 요약한 뒤 그 요약들을 대상으로 추론하거나(LLM 엔지니어라면 익숙한 map-reduce입니다), 아니면 그 작업이 온디바이스 모델에 맞지 않는 형태임을 인정하세요.
컨텍스트 윈도는 이 프레임워크에서 정말 중요한 결정, 즉 언제 기기 위에 남고 언제 떠날지를 판단하는 가장 깨끗한 신호입니다. 이제 수치도 공개되어 있습니다. 온디바이스 모델은 4K 토큰 예산 안에서 동작하고, Private Cloud Compute의 서버 모델은 이를 32K로 끌어올립니다14. 여기서 말한 분할 전략은 모두 이 수치를 전제로 읽으면 됩니다.
iOS 27 베타가 더한 것
지금까지의 설명은 iOS 26에 출시된 그대로의 프레임워크이며, 그 내용은 지금도 전부 유효합니다. iOS 27 베타는 같은 표면을 네 방향으로 확장하는데, 그중 어느 것도 iOS 26에서 세운 사고 모델을 깨뜨리지 않습니다12.
프롬프트가 이미지를 받습니다. 온디바이스 모델에 Vision 능력이 붙습니다. 프롬프트에 텍스트와 함께 이미지 첨부를 넣으면 모델이 둘 모두를 놓고 답합니다. 새로 추가된 타입은 Attachment, ImageAttachmentContent, ImageReference이고, 첨부는 UIImage, NSImage, CGImage, Core Image 타입, CoreVideo 픽셀 버퍼, 파일 URL을 받습니다1213. 이미지는 크기나 화면비에 상관없이 동작하지만 텍스트와 같은 토큰 예산에서 비용을 치르므로, 4K짜리 온디바이스 윈도가 순식간에 설계 제약으로 떠오릅니다13. 전체 과정은 iOS 27의 Foundation Models 이미지 입력에서 다룹니다.
도구 호출에 조절 장치가 생깁니다. GenerationOptions에 요청 단위로 지정하는 toolCallingMode가 추가되어, 모델이 여러분이 붙여 둔 도구와 어떻게 상호작용할지 제어할 수 있습니다. 또한 Vision 프레임워크가 완성된 OCRTool과 BarcodeReaderTool 구현을 제공하므로, 인식 코드를 직접 짜는 대신 이들을 세션에 붙이면 됩니다15. 동작의 세부 내용은 iOS 27의 도구 호출 제어에서 다룹니다.
한 줄이면 닿는 더 큰 모델. PrivateCloudComputeLanguageModel은 같은 API를 Private Cloud Compute 위의 Apple 서버 모델에 대고 실행합니다. 엔타이틀먼트가 필요하고, 32K 컨텍스트 윈도와 온디바이스 모델에는 없는 추론 능력을 갖췄습니다1214. 가이드 생성과 도구는 그대로 동작하며, 모델을 바꾸는 일은 세션의 model 인자 하나로 끝납니다.
세션에 제어 수단이 늘어납니다. 베타는 ContextOptions, TranscriptErrorHandlingPolicy, 동적 프로필(DynamicInstructions, LanguageModelSession.DynamicProfile), 그리고 시스템 모델 대신 여러분이 제공한 모델을 세션이 구동하게 해 주는 커스텀 언어 모델 제공자 프로토콜(LanguageModel, LanguageModelExecutor)을 추가합니다12. watchOS도 27.0부터 지원 플랫폼 목록에 합류합니다12.
기억해 둘 관점은 이렇습니다. iOS 26용 코드는 iOS 27에서도 그대로 컴파일되고 똑같이 동작합니다. 베타는 프롬프트가 실어 나를 수 있는 것과 모델이 돌아갈 수 있는 곳을 넓혔을 뿐, 이 프레임워크의 정체를 바꾸지는 않았습니다.
Foundation Models를 쓰지 말아야 할 때
이 프레임워크는 무료이고, 사생활을 지켜 주고, 오프라인에서 돌아갑니다. 그래서 어디에나 손을 뻗고 싶어집니다. 참으세요. 다음과 같은 경우에는 이 프레임워크를 지나쳐 다른 것을 잡아야 합니다.
- 제대로 된 추론이나 폭넓은 세상 지식이 필요할 때. 온디바이스 모델은 의도적으로 작게 만들어졌습니다. 개방형 추론, 코드 생성, 깊이 있는 분석은 프런티어급 클라우드 모델의 몫입니다. 온디바이스 모델에 그것을 요구하면 자신만만하게 틀린 답이 돌아옵니다.
- 입력이 컨텍스트 윈도에 들어가지 않고, 잘게 나누면 의미가 무너질 때. 어떤 작업은 전체를 한 번에 봐야만 합니다.
- 직접 통제하는 모델이 필요할 때. 특정 체크포인트, 파인튜닝, 커스텀 가중치, OS가 업데이트되어도 흔들리지 않는 결정적 버전 관리 같은 것들 말입니다. Apple은 자신의 일정에 맞춰 모델을 배포하고 갱신합니다. 여러분의 일정이 아니고요.
- iOS 26 미만이거나 자격이 없는 기기일 때. 프레임워크가 아예 존재하지 않으며, 가용성 확인이 실행할 때마다 그 사실을 알려 줍니다.
이 프레임워크가 다루지 않는 온디바이스 영역(커스텀 모델, 직접 보유한 가중치, 기기 위에서의 학습)에는 아래 계층이 있습니다. 변환해 고정한 모델에는 Core ML, 오픈 웨이트 모델과 직접 소유한 파인튜닝에는 MLX, 특화와 스케줄링을 명시적으로 제어해야 할 때는 iOS 27의 Core AI입니다. 정말로 규모가 필요한 경우라면 Private Cloud Compute나 개인정보 경계 뒤에 둔 클라우드 LLM 쪽이 여전히 정직한 답입니다. Foundation Models는 그중 무엇의 대체재도 아닙니다. 이미 손에 쥔 텍스트를 대상으로 하는 좁고 분명한 언어 작업이라면 가장 먼저 잡아야 할 도구이고, 그 밖의 모든 일에는 잘못된 선택입니다.
이 프레임워크가 보상하는 기술은 프롬프트 기교가 아닙니다. 범위를 가늠하는 안목입니다. 모델이 잘하는 일을 골라 먹이고, 필요한 것을 정확히 담아내는 @Generable 타입을 설계하고, 이 작업이 기기의 그릇을 넘어서는 순간을 알아보는 것 말입니다. 그런 감각으로 만들면 온디바이스 모델은 놀랄 만큼 많은 실제 일을 공짜로 해냅니다. 그 감각을 무시하면, 입력이 토큰 하나만큼 길었던 모든 사용자에게서 망가지는 기능을 내보내게 됩니다.
자주 묻는 질문
Apple의 Foundation Models 프레임워크는 무료로 쓸 수 있나요?
네. 이 프레임워크를 통해 앱은 Apple Intelligence를 구동하는 바로 그 온디바이스 모델에 직접, 무료로, 오프라인으로 접근합니다. API 키도, 토큰당 과금도, 네트워크 왕복도 없습니다1.
Foundation Models를 쓰려면 어떤 기기와 iOS 버전이 필요한가요?
iOS 26과 Apple Intelligence를 지원하는 기기가 필요합니다. 그 아래에서는 프레임워크 자체가 존재하지 않고, 지원되는 OS에서도 자격이 없는 기기, Apple Intelligence가 꺼진 상태, 모델을 내려받는 중에는 모델이 없습니다. 쓰기 전에 항상 SystemLanguageModel.default.availability를 확인하세요5.
문자열 대신 구조화되고 타입 안전한 출력을 받으려면 어떻게 하나요?
Swift 타입에 @Generable을 붙이면, 직접 파싱해야 하는 문자열 대신 값이 채워지고 타입이 검증된 그 타입이 돌아옵니다. 이 가이드 생성이야말로 이 프레임워크를 쓸 가치를 만드는 단 하나의 기능입니다3.
Apple 온디바이스 모델의 컨텍스트 윈도는 얼마나 되나요?
SystemLanguageModel.default.contextSize가 토큰 예산을 알려 주며, 이 예산은 프롬프트와 생성된 응답이 함께 나눠 씁니다6. 온디바이스 모델은 4K 토큰, Private Cloud Compute 모델은 32K를 제공합니다14. 긴 문서와 길게 이어진 여러 턴의 기록은 온디바이스 예산을 넘어서므로, 한계를 감안해 설계하지 않으면 세션이 오류를 던집니다.
Foundation Models는 오프라인에서 동작하나요? 데이터를 Apple로 보내나요?
전적으로 기기 안에서 Neural Engine을 이용해 실행됩니다. 어떤 데이터도 기기를 벗어나지 않고 네트워크 왕복도 필요 없으며, 바로 그 점이 예전에는 클라우드 LLM 호출과 개인정보 검토가 필요했던 기능에 이 프레임워크가 적합한 이유입니다1.
온디바이스 모델이 생성 도중에 제 코드를 호출할 수 있나요?
네. Tool 프로토콜을 쓰면 모델이 생성 중에 여러분의 코드를 호출해 데이터를 가져오거나 동작을 실행하고, 그 결과를 다시 답변에 녹여 넣습니다4.
Foundation Models를 쓰지 말아야 할 때는 언제인가요?
프런티어 모델이 필요할 때는 이 프레임워크를 지나치세요. 개방형 추론, 코드 생성, 긴 문서 분석, 세상 지식이 그런 경우입니다. Apple은 이 온디바이스 모델을 앱 안에서 처리하는 좁고 분명한 언어 작업용으로 만들었기 때문에, 범용 지능을 요구하면 자신만만하게 틀린 답이 돌아옵니다1.
iOS 27은 Foundation Models에 무엇을 더하나요?
iOS 27 베타는 이미지 입력(UIImage, CGImage, 픽셀 버퍼 등으로 만든 프롬프트 첨부), GenerationOptions를 통한 요청 단위 도구 호출 제어, 바로 쓸 수 있는 Vision 도구 OCRTool과 BarcodeReaderTool, 그리고 Apple의 32K 컨텍스트 서버 모델에 같은 API를 그대로 사용하는 PrivateCloudComputeLanguageModel을 추가합니다12131415. iOS 26용 코드는 수정 없이 그대로 돌아갑니다.
-
Apple Developer, “Foundation Models” framework overview. Apple은 이 프레임워크를 Apple Intelligence를 구동하는 온디바이스 모델에 접근하는 수단으로 설명하며, 개방형 추론이나 세상 지식보다는 텍스트 생성, 요약, 분류, 구조화된 출력 같은 좁고 분명한 언어 작업에 적합하다고 밝힙니다. ↩↩↩↩↩
-
Apple Developer, “LanguageModelSession” 및 “Generating content and performing tasks with Foundation Models”. 세션은 여러 턴에 걸친 맥락을 들고 있으며, Apple은 서로 구분되는 단발 상호작용마다 새 세션을 만들 것을 권장합니다. ↩↩↩↩
-
Apple Developer, “Generable” 및 “Prompting an on-device foundation model”.
@Generable매크로 덕분에 프레임워크는 문자열이 아니라 값이 채워지고 타입이 검증된 Swift 값을 반환할 수 있습니다. ↩↩↩↩ -
Apple Developer, “Tool” protocol.
protocol Tool<Arguments, Output>: Sendable을 정의하며name,description,parameters: GenerationSchema와 함께call(arguments:) async throws -> Output을 요구합니다.Arguments타입은ConvertibleFromGeneratedContent를 따르며 보통@Generable로 선언합니다. ↩↩↩↩ -
Apple Developer, “SystemLanguageModel.Availability” 및 해당
UnavailableReason. 케이스는.available과.unavailable(...)이며, 사유로는deviceNotEligible,appleIntelligenceNotEnabled,modelNotReady가 있습니다.SystemLanguageModel.default.isAvailable은 이를 간편하게 확인하는 불리언 값입니다. ↩↩↩↩ -
Apple Developer, “SystemLanguageModel.contextSize”.
SystemLanguageModel.default를 통해 접근하는 인스턴스 프로퍼티로, 최대 컨텍스트 크기, 즉 입력 프롬프트와 생성된 응답을 합한 총 토큰 수로 문서화되어 있습니다. ↩↩↩ -
Apple Developer, “LanguageModelSession.streamResponse(to:)”. 모델이 만들어 내는 대로 부분 출력을 스트리밍해 UI를 점진적으로 갱신할 수 있게 합니다. ↩
-
Apple Developer, “Guide(description:_:)”.
@Generable프로퍼티에 자연어 설명과 선택적 제약(숫자 범위, 정규식 가이드)을 붙이는 피어 매크로입니다. iOS 26.0 이상이 필요합니다. ↩↩↩ -
Apple Developer, “respond(to:schema:includeSchemaInPrompt:options:)”.
includeSchemaInPrompt의 기본값은true이며, Apple의 설명은 모델이 기대되는 형식을 이미 알고 있는 경우가 아니라면 기본값을 유지할 것을 권장합니다. ↩ -
Apple Developer, “LanguageModelSession.prewarm()”. 곧 들어올 것이 확실한 요청에 대비해 프레임워크가 모델 리소스를 미리 로드하도록 요청하여 첫 응답 지연을 줄입니다. ↩
-
필자의 관련 분석: Apple Foundation Models로 만드는 온디바이스 LLM, Foundation Models용 커스텀 어댑터, Foundation Models 활용 사례, Foundation Models 위에서 만드는 에이전트 워크플로. App Intents와 도구 표면에 관한 논지는 App Intents는 여러분의 앱으로 통하는 Apple의 새로운 API입니다에서 전개합니다. ↩
-
Apple Developer, 2026년 7월 기준 “Foundation Models” 프레임워크 항목. 27.0 릴리스에서 베타로 표시된 타입에는
Attachment,ImageAttachmentContent,ImageReference(프롬프트 첨부),ContextOptions와TranscriptErrorHandlingPolicy,DynamicInstructions와LanguageModelSession.DynamicProfile(동적 프로필),com.apple.developer.private-cloud-compute엔타이틀먼트가 필요한PrivateCloudComputeLanguageModel, 그리고 커스텀 제공자 표면인LanguageModel,LanguageModelCapabilities,LanguageModelExecutor가 포함됩니다. 프레임워크의 지원 플랫폼 목록에는 watchOS 27.0(베타)이 추가되었습니다. ↩↩↩↩↩↩↩ -
Apple, WWDC26 세션 241, “What’s new in the Foundation Models framework”. 이미지 첨부는 “UIImage, NSImage, CGImage, Core Image 타입, CoreVideo 픽셀 버퍼, 파일 URL을 비롯한 다양한 타입에서 생성할 수 있으며”, “모델은 모든 크기와 화면비의 이미지를 지원”하지만 “이미지가 클수록 더 많은 토큰을 소비하고 지연도 커집니다”. ↩↩↩↩
-
Apple, WWDC26 세션 319, “Build with the new Apple Foundation Model on Private Cloud Compute”. “온디바이스 모델은 4K를 제공하고, PCC에서는 32K를 얻습니다.” 이 세션은 한 줄만 바꿔 온디바이스 모델에서 PCC 서버 모델로 전환하는 과정을 시연하며, 가이드 생성과 도구 호출은 양쪽에서 동일하게 동작합니다. ↩↩↩↩↩↩
-
Apple Developer, “GenerationOptions.ToolCallingMode”(iOS 27 베타.
toolCallingMode프로퍼티와init(samplingMode:temperature:maximumResponseTokens:toolCallingMode:)이니셜라이저), 그리고 Foundation Models의Tool프로토콜을 따르는 Vision 프레임워크의 “OCRTool”과 “BarcodeReaderTool”(iOS 27 베타). ↩↩