Post

07 Spring AI 이미지

07 Spring AI 이미지

1. Note

  • 이미지를 분석하거나 파악하는 용도에 가까운듯
    • 사용하는 방법이나 요령은 조금더 찾아봐야할 듯 하고
    • 예시로 보여준 것은 이미지 여러개를 던지고 이미지에 텍스트 출력
    • 이것도 뭔가 잘만하면 분석쪽에서 활용할 수 있을지도 ?

2. 멀티모달 (Multimodal)

1. 멀티모달

  • 텍스트, 이미지, 오디오, 비디오 등 서로 다른 형태의 데이터를 동시에 입력받아 관계를 이해하고 추론하는 AI 기능
  • 패턴비교
    • 전통적인 AI (Single-modal): 텍스트 입력 : 텍스트 출력 (텍스트 전용 모델)
    • 멀티모달 (Native Multimodal): 입력: 텍스트 + 이미지 + 오디오 + 비디오 + 코드 등 복합 입력
  • 지원하는 모달리티
    • 텍스트 (Text): 방대한 문서 분석 및 대화
    • 이미지 (Image): 고해상도 사진 및 그래픽 분석
    • 오디오 (Audio): 녹음 파일, 음악, 음성 대화 직접 이해
    • 비디오 (Video): 최대 수 시간 분량의 영상 흐름 및 특정 장면 파악

2. 주요멀티모달 AI 비교

모델입력 (Input)출력 (Output)특징실무 포인트
OpenAI (GPT-4o 계열)텍스트, 이미지, 음성, 영상텍스트, 이미지, 음성진짜 “올인원 멀티모달”가장 범용적
Google (Gemini)텍스트, 이미지, 음성, 영상, 문서텍스트, 이미지문서 이해 강함PDF, 코드 분석 강점
Anthropic (Claude)텍스트, 이미지, 문서텍스트긴 컨텍스트 최강대용량 분석
Meta (LLaMA 계열)텍스트 (확장 시 이미지)텍스트오픈소스커스터마이징
Stability AI (Stable Diffusion)텍스트, 이미지이미지이미지 생성 특화디자인, 생성

3. 모달 구현

1. Request

1
2
3
4
5
6
7
8
9
  @Getter
  @FieldDefaults(level = AccessLevel.PRIVATE)
  public class ImageAnalysisRequest {
    String message;
  
    //멀티파트파일 타입
    MultipartFile image;
  
  }

2. Response

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 public class ImageAnalysisResponse {

  String analysis;

  String imageType; // 이미지 타입

  Long imageSize; // 사이즈 타입

  TokenUsage tokenUsage;

  @Getter
  @Builder
  @FieldDefaults(level = AccessLevel.PRIVATE)
  public static class TokenUsage {

    Integer promptTokens;

    Integer completionTokens;

    Integer totalTokens;
  }

3. Service(☆)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
  public ImageAnalysisResponse analyzeImage(String message, MultipartFile image) throws IOException {

    String contentType = image.getContentType();
    if (contentType == null) {
      contentType = "image/jpeg";
    }

    try {
      String finalContentType = contentType;
      
      // repsponse 받을때
      // 유저에서 media로 추가해야함 (☆☆☆☆)
      // 그외에 발송하는 패턴은 전부 동일함
      // 기존에 text로 말송하던 것에 추가로 media로 추가하는 것!
      var response = chatClient.prompt()
          .user(u -> u
              .text(message)
              .media(MimeTypeUtils.parseMimeType(finalContentType), image.getResource())
          )
          .call()
          .chatResponse();

      String analysis = response.getResult().getOutput().getText();
    ~~~~~~~~~~~~
     

4. Controller

1
2
3
4
5
6
7
  // Mapping에 추가 인자로 consumes 추가 필요!
  @PostMapping(value = "/analyze", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
  public ApiResponse<ImageAnalysisResponse> analyzeImage(
      @RequestParam String message,
      @RequestParam MultipartFile image) throws IOException {
    return ApiResponse.ok(visionChatService.analyzeImage(message, image));
  }
This post is licensed under CC BY 4.0 by the author.