Meet with Apple: Foundation Models Framework 실습

Ios_Roy·2025년 10월 27일

WWDC

목록 보기
10/13
post-thumbnail

🍎 Meet with Apple: Foundation Models Framework 실전 코드 분석

Apple의 온디바이스 LLM에 직접 접근하는 Foundation Models Framework!
이 영상은 Swift 기반 프로젝트에 생성형 AI 기능을 추가하는 방법을, 실제 Xcode 프로젝트를 따라가며 실습 중심으로 상세히 알려줍니다.

🗂️ 전체 챕터/타임라인 목차

  • 0:00 Intro
  • 3:33 Resource & System Requirements
  • 5:04 Prerequisites & Setup
  • 6:30 Starter Project Tour
  • 10:32 Chapter 1: 프레임워크 기본
    • 세션 생성, 프롬프트, instruction 차이
    • Model Availability API
    • ViewModel과 View 연결
  • 32:43 Chapter 2: 구조화된 데이터
    • Swift 타입 구조, @Generable 매크로
    • Nested Struct 반환
  • 49:22 Chapter 3: 프롬프트 테크닉
    • PromptBuilder 동적 생성
    • One-shot Prompting
  • 59:11 Chapter 4: 스트리밍 응답 처리
    • streamResponse API
    • 라이브 UI 갱신
  • 1:08:16 Chapter 5: Tool Calling
    • Swift Tool 생성/적용
  • 1:27:39 Chapter 6: 퍼포먼스 최적화
    • Pre-warming, Token 관리
  • 1:41:16 Wrap up 및 자료 안내

1️⃣ 시작 준비: 환경, 프로젝트 구조, 세팅

실습 환경

  • 필수: Apple Silicon 기반 Mac, macOS Tahoe 26, Xcode 26, Apple Intelligence 활성화
  • Starter 프로젝트 다운로드
  • 프로젝트 열고, Team/Device 설정, 빌드 테스트
  • 폴더 구조:
    • Playground: 프롬프트/API 실험
    • ViewModels: 핵심 로직 (ItineraryGenerator.swift)
    • Views: UI 코드는 미리 준비/파일별 번호로 변경 진행
  • 마크다운 주석: // MARK: codealong chapter N (Xcode Find로 챕터별 변경 확인/진행)

2️⃣ Foundation Models Framework 기본

2-1. 언어 모델 세션과 프롬프트

import FoundationModels
let session = LanguageModelSession()
let response = try await session.respond(to: "파리 3일 여행 일정 만들어줘")
print(response.content) // ==> 3일 일정을 자연어로 생성
  • Session 객체가 전체 히스토리(프롬프트+응답) 유지
  • Instruction: 모델에 "항상" 적용되는 규칙(톤, 양식), Prompt: 사용자 입력
  • Instruction 예:
    let instructions = "각 날짜에 활동, 호텔, 레스토랑 포함, title/desc/day별 반환"
    LanguageModelSession(instruction: instructions)
  • Prompt Injection 방지: instruction에는 user input X, 프롬프트는 동적

2-2. Model Availability 처리

  • API로 모델 지원 상태 점검 (지원 X, 미설정, 다운로드 중 등)
  • Unavailable 시 UI 숨김/안내
  • Xcode: Scheme 설정에서 각 상태 시뮬레이션 가능
  • 코드:
    switch model.availability {
      case .available: // 정상
      case .notEligible: // 미지원
      case .intelligenceNotEnabled: // 설정 미적용
      case .modelNotReady: // 다운로드 중
    }

3️⃣ 구조화된 데이터 반환

3-1. Swift 타입 반환 - @Generable 적용

struct Itinerary: Generable {
  var title: String
  var description: String
  var days: [Day]
}

struct Day: Generable {
  var title: String
  var activities: [Activity]
}

// 프롬프트 응답을 구조화된 타입으로
let itinerary: Itinerary = try await session.respond(
  to: "세렝게티 3일 여행 일정",
  generating: Itinerary.self
)
  • 중첩 구조(여러 Day, Activity 등), SwiftUI 바인딩 효율 ↑
  • 자연어 파싱 無, 바로 타입 사용

4️⃣ 프롬프트 고도화 및 예시 데이터 활용

4-1. 동적 프롬프트 빌더

let kidFriendly = true
let prompt = PromptBuilder {
  "파리 3일 여행 일정 생성"
  if kidFriendly { "어린이 친화적 일정으로" }
}
  • 사용자 옵션/상황에 따라 프롬프트 조건 분기

4-2. One-shot Prompting (예시 데이터 포함)

  • “일본 여행 일정” 같은 Example 구조체를 프롬프트에 첨부
  • 원하는 톤/레이아웃/형태추론 개선
  • 코드에서 예시 데이터 삽입

5️⃣ 스트리밍 응답 처리와 실시간 UI

5-1. streamResponse API로 실시간 데이터 받기

for try await partial in session.streamResponse(...) {
  if let title = partial.title {
    // 부분적으로 완성될 때마다 UI 즉시 갱신
  }
}
  • PartiallyGenerated 타입 (모든 필드 Optional)로, 토큰 단위로 UI 반영
  • SwiftUI에서 if let 바인딩 패턴 활용
  • UX 극대화 (즉각 업데이트)

6️⃣ Tool Calling - 외부 데이터 활용 & 확장

6-1. 커스텀 Swift Tool 정의/적용

struct FindPointsOfInterestTool: Tool {
  let name = "find points of interest"
  func call(arguments: Arguments) async -> Output {
    // MapKit, 서버 API 등 실제 DB·지도 데이터 실시간 활용 가능
  }
}
  • LLM이 내부 함수/서버/API, 위치 정보 등 앱 데이터 활용
  • 인자 받아 즉시 결과 반영, "도구 호출" 방식으로 응답 확장 가능

7️⃣ 퍼포먼스 및 최적화 전략

  • 첫 호출 지연 ⇒ prewarm()로 미리 모델 적재
  • Prompt 내 schema 정의 최소화로 토큰 절감
  • Instruments로 세션 초기화/그래프/로딩 파악
  • 실습 환경 기준에서 최적화 적용 (프로젝트 코드 변경 추적)


이 블로그 포스트는 해당 영상의 모든 실습・세부 구조・코드・주석・비즈니스/UX 관점까지 100% 빠짐없이 담았습니다. 실제 Swift 프로젝트에서 그대로 활용 가능합니다.

profile
iOS 개발자 공부하는 Roy

0개의 댓글