본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 15. 19:33

온디바이스 AI를 활용한 Apple Foundation Models 시도하기

요약

Apple의 Foundation Models 프레임워크를 사용하여 온디바이스 생성형 AI 기능을 구현하는 방법을 소개합니다. SwiftUI와 @Generable 매크로를 활용해 자연어 프롬프트를 구조화된 데이터로 변환하는 앰비언트 사운드 믹서 제작 과정을 다룹니다.

핵심 포인트

  • Apple Intelligence 기반의 온디바이스 언어 모델 활용법 안내
  • @Generable 매크로를 통한 구조화된 Swift 타입 생성(Guided Generation)
  • Xcode 27 및 Apple Intelligence 지원 기기 필요
  • 자연어 프롬프트를 사운드 구성 요소 목록으로 변환하는 실습

Apple의 Foundation Models 프레임워크는 iOS 개발자들에게 Apple Intelligence 이면에 있는 온디바이스 언어 모델(on-device language model)을 통해 생성형 AI (generative AI) 기능을 실험할 수 있는 네이티브한 방법을 제공합니다.

이 가이드에서는 작은 SwiftUI 실험을 진행해 보겠습니다. 자연어 프롬프트 (natural language prompt)를 다양한 볼륨 레벨을 가진 사운드 목록으로 변환하여 주변 환경음 (ambient soundscape)을 생성하는 앰비언트 사운드 믹서 (ambient sound mixer)입니다.

App screen with prompt to a cozy cabin in the woods during storm

App screen with generated sound mix

시작하기 전에

이를 시도하려면 다음이 필요합니다:

  • Foundation Models 프레임워크를 사용할 수 있는 Xcode 27.
  • Apple Intelligence를 지원하는 기기.
  • 기기에서 Apple Intelligence가 활성화된 상태.

우리는 다음을 구축할 것입니다:

  • 모델 출력을 설명하는 구조화된 Swift 타입 (structured Swift type).
  • 모델에 요청하기 전의 가용성 확인 (availability check).
  • 개발자 지침 (developer instructions)과 사용자 프롬프트 (user prompt)가 포함된 모델 세션 (model session).
  • 생성을 트리거하고 선택된 사운드를 재생하는 SwiftUI 버튼.

1단계: @Generable을 사용하여 응답 모델링하기

이 프레임워크에서 가장 흥미로운 부분은 가이드 생성 (guided generation)입니다. 모델에게 JSON을 반환하도록 요청하고 출력이 올바르게 형식화되기를 바라는 대신, 모델이 생성하기를 원하는 Swift 타입을 직접 설명합니다.

이 사운드 믹서의 경우 결과는 간단할 수 있습니다. 즉, 사운드 컴포넌트 (sound components)의 목록입니다. 각 컴포넌트는 로컬 파일 이름과 볼륨을 가집니다.

import FoundationModels

@Generable
...

@Generable 매크로 (macro)는 이 타입가 모델에 의해 생성될 수 있음을 프레임워크에 알려줍니다. @Guide 어노테이션 (annotations)은 모델에 추가적인 컨텍스트 (context)와 제약 조건 (constraints)을 제공합니다.

이 경우, 모델은 1개에서 4개 사이의 소리를 반환해야 합니다. 이는 20개의 소리가 포함된 앰비언트 믹스 (ambient mix)는 아마도 소음이 심하고 제어하기 어려울 것이기 때문에 중요합니다.

이 부분은 일반적인 클라우드 LLM (cloud LLM) 흐름과는 다르게 느껴지는 지점입니다. 보통이라면 저는 다음과 같이 작성했을 것입니다:

이러한 형태의 유효한 JSON 객체를 반환하세요...

그러면 저는 여전히 응답을 파싱 (parse)하고, 잘못된 형식의 JSON을 처리하며, 재시도하고, 누락된 필드를 검증하며, 잘못된 출력으로부터 앱을 보호해야 했을 것입니다.

가이드 생성 (guided generation)을 사용하면, 프레임워크가 제가 기술한 타입 (type)과 일치하는 Swift 값을 생성할 수 있습니다.

2단계: 모델 가용성 확인

모델을 사용하기 전에, 앱은 모델이 실제로 사용 가능한지 확인해야 합니다.

Foundation Models는 Apple Intelligence 지원 및 모델 준비 상태에 따라 달라집니다. 사용자가 지원되지 않는 기기를 사용 중이거나, Apple Intelligence가 활성화되지 않았거나, 또는 모델이 아직 준비되지 않았을 수 있습니다.

간단한 가용성 확인은 다음과 같이 작성할 수 있습니다:

import FoundationModels

func canUseFoundationModels() -> Bool {
...

실제 앱이라면, 단순히 이유를 출력하는 것만으로는 부족할 것입니다. 저는 이 결과를 사용하여 UI가 무엇을 해야 할지 결정할 것입니다.

예를 들어:

  • 지원되지 않는 경우 AI 기능을 숨깁니다.
  • Apple Intelligence가 필요하다는 메시지를 보여줍니다.
  • 수동 사운드 선택기 (manual sound picker)로 대체합니다.
  • 제품이 지원한다면 서버 기반 모델로 대체합니다.

중요한 점은 다음과 같습니다: 모델이 항상 사용 가능하다는 가정을 하지 마세요.

3단계: 언어 모델 세션 생성

이제 LanguageModelSession을 생성할 수 있습니다.

세션은 개발자가 제어하는 지침 (instructions)을 전달받습니다. 이 지침은 모델이 어떻게 행동해야 하는지, 그리고 어떤 제약 조건 (constraints)을 따라야 하는지를 알려주어야 합니다.

이 앱의 경우, 모델이 작은 사운드스케이프 어시스턴트 (soundscape assistant)처럼 동작하기를 원합니다. 모델은 제가 가진 로컬 사운드 카탈로그 (sound catalog)에서만 선택해야 하며, 존재하지 않는 파일 이름을 만들어내는 것을 피해야 합니다.

import FoundationModels

func generateAmbientMix(
...

중요한 줄은 바로 이 부분입니다:

let response = try await session.respond(
    to: prompt,
    generating: AmbientMix.self
...```

모델은 단순히 텍스트를 반환하는 것이 아닙니다. `AmbientMix`를 생성하고 있는 것입니다.

이는 앱의 나머지 부분이 일반적인 Swift 값(Swift values)으로 동작할 수 있음을 의미합니다:

```swift
let components = response.content.components

모델 응답을 위해 JSONDecoder나 정규 표현식(regex), 또는 수동 문자열 파싱(manual string parsing)을 사용할 필요가 없습니다.

프롬프팅 참고 사항 (Prompting note)

저는 지침(instructions)은 대부분 정적으로 유지하고, 사용자의 텍스트를 프롬프트(prompt)로 전달할 것입니다.

지침은 앱에 의해 제어됩니다. 프롬프트는 사용자에 의해 제어됩니다.

이러한 분리가 해당 기능을 더 이해하기 쉽게(easier to reason about) 만듭니다.

4단계: 생성된 결과 검증하기 (Validate the generated result)

가이드 생성(Guided generation)이 큰 도움이 되지만, 저는 여전히 무언가를 재생하기 전에 결과를 검증할 것입니다.

이 사운드 믹서의 경우, 제가 생략하지 않을 두 가지 간단한 확인 절차가 있습니다:

  1. 생성된 파일 이름이 로컬 카탈로그(local catalog)에 존재하는지 확인합니다.
  2. 볼륨을 앱이 지원하는 범위 내로 제한(Clamp)합니다.
func validatedComponents(
    from mix: AmbientMix,
    availableSounds: [String]
...```

출력 형태(output shape)가 올바르더라도, 앱은 여전히 자체적인 도메인 규칙(domain rules)을 보호해야 합니다.

모델은 제안할 수 있지만, 무엇이 허용되는지는 앱이 결정해야 합니다.

## 5단계: SwiftUI에서 사용하기

SwiftUI에서 우리는 `Task` 내부에서 생성을 트리거할 수 있습니다.

UI는 로딩 상태를 보여주어야 하고, 동시에 여러 요청이 발생하는 것을 방지해야 하며, 오류를 명확하게 처리해야 합니다.

다음은 단순화된 예시입니다:

```swift
import SwiftUI

struct AmbientMixerView: View {
...

이것이 프로젝트에 AI를 추가하는 새로운 네이티브 방식이었습니다.

나의 결론 (My takeaway)

Foundation Models가 모든 AI 기능을 대체하는 것은 아닙니다.

복잡한 추론(complex reasoning), 매우 큰 컨텍스트(large context), 무거운 멀티모달(multimodal) 작업, 또는 모든 기기에서 작동해야 하는 기능의 경우, 서버 측 모델(server-side model)이 아마 더 합리적일 것입니다.

하지만 명확한 입력과 구조화된 출력(structured outputs)을 가진, 집중적이고 개인정보 보호에 친화적인(privacy-friendly) 앱 기능의 경우, 이 프레임워크는 정말 멋집니다.

사운드 믹서 예제는 의도적으로 작게 구성되었지만, 핵심 흐름을 보여줍니다:

  1. @Generable을 사용하여 구조화된 출력 (structured output) 정의.
  2. 모델 가용성 (model availability) 확인.
  3. LanguageModelSession 생성.
  4. 생성된 Swift 값 요청.
  5. 결과 검증.
  6. UI에 연결.

이는 훌륭한 개발자 경험 (developer experience)이며, 저는 바로 이 지점이 Foundation Models가 실제 iOS 앱에서 유용하게 쓰일 수 있는 부분이라고 생각합니다.

출처:

Apple Developer Documentation — Foundation Models: https://developer.apple.com/documentation/FoundationModels
Apple WWDC25 — Meet the Foundation Models framework: https://developer.apple.com/videos/play/wwdc2025/286/
Apple Developer Documentation — Generable: https://developer.apple.com/documentation/foundationmodels/generable

AI 자동 생성 콘텐츠

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

원문 바로가기
0

댓글

0