본문으로 건너뛰기

Foundation Models에 이미지와 파일 입력하기

Building AI features using Foundation Models. Multimodal input.

swiftwithmajid.com

핵심 요약

  1. Foundation Models의 multimodal input을 사용하면 텍스트 설명을 제공하는 대신 이미지나 파일을 직접 첨부해 내용 분류를 요청할 수 있다.
  2. PromptBuilder를 사용하는 respond 오버로드에 지시 문자열과 Attachment를 전달하면, Generable 타입으로 정의한 구조화 결과를 받을 수 있다.
  3. Attachment는 URL, pixel buffer, CGImage, CIImage로 만들 수 있으며, 예제에서는 식사 이미지에서 제목과 영양 성분 포함 여부를 반환한다.

도입

Foundation Models에 이미지 입력 기능이 추가되면서 모델에 텍스트로 상황을 설명하는 방식 외에 이미지나 파일을 직접 전달하는 흐름을 구성할 수 있다. 글에서는 음식 사진을 분석하는 앱을 예로 든다. 모델의 출력은 Generable 타입으로 정의하고, LanguageModelSession의 respond에 분류 지시와 Attachment를 함께 전달한다.

상세 요약

구조화된 결과 타입 정의

예제는 음식 사진을 분석하는 앱이다. 숫자나 칼로리를 보여주지 않고 식사 정보를 제공하는 용도다. 먼저 @Generable 매크로를 적용한 PlateClassification을 선언한다. 결과에는 식사 제목을 담는 title과 영양 성분의 포함 여부를 나타내는 Boolean 프로퍼티가 들어간다.

  • title: 식사 제목
  • sugar: 당 포함 여부
  • protein: 단백질 포함 여부
  • fiber: 섬유질 포함 여부
  • saturatedFat: 포화 지방 포함 여부

각 프로퍼티에는 @Guide 설명을 지정한다. 이 타입이 모델에서 받을 결과의 형태를 정한다.

지시와 이미지 전달

classifyPlate(imageURL:) 함수는 LanguageModelSession을 생성한 뒤, respond(generating:)를 호출한다. 새 오버로드는 PromptBuilder 결과 빌더를 사용하므로 지시와 입력을 한 블록 안에 함께 구성할 수 있다.

let result = try await session.respond(generating: PlateClassification.self) {
    "Classify the following meal and provide nutritional information"
    Attachment(imageURL: imageURL)
}

모델에는 식사를 분류하고 영양 정보를 제공하라는 문자열 지시와 이미지 Attachment가 전달된다. 호출 결과의 content는 PlateClassification 타입이다. 앱은 이 값을 사용해 식사 제목과 영양 성분 정보를 표시한다.

PromptBuilder와 Attachment

PromptBuilder는 PromptRepresentable을 준수하는 값을 처리한다. 프레임워크에는 String, Array, Optional, Generable 타입과 새 Attachment 타입의 기본 준수가 포함된다. 따라서 입력 지시 문자열과 구조화된 결과 타입을 함께 표현할 수 있다.

Attachment는 이미지뿐 아니라 다른 파일도 가리킬 수 있다. 생성 방법으로는 URL과 pixel buffer가 있으며, 이미지의 경우 CGImage 또는 CIImage 인스턴스를 사용할 수 있다. 예제는 URL을 이용해 이미지 파일을 첨부한다.

입력 방식의 확장

이 흐름에서는 모델에 이미지 내용을 텍스트로 먼저 묘사할 필요 없이, 이미지나 파일을 직접 제공하고 그 내용에 대한 처리를 요청한다. 결과 타입을 미리 선언하므로 앱이 필요로 하는 필드도 코드에 드러난다. 글은 음식 사진 분류를 사례로 들지만, 설명한 입력 방식은 Attachment를 통해 이미지 외의 파일도 전달할 수 있다고 명시한다.

결론

예제의 핵심은 입력과 출력을 각각 명시하는 데 있다. Attachment로 이미지 또는 다른 파일을 전달하고, PlateClassification으로 필요한 결과 필드를 제한한다. 응답은 해당 타입의 인스턴스로 반환되므로 앱에서 식사 제목과 sugar, protein, fiber, saturated fat 포함 여부를 활용할 수 있다.