본문 바로가기
AI 도구 비교

GPT-4o vs Claude 3.5 vs Gemini Pro 이미지 분석 능력 비교

by 소개왕 탑백귀 2026. 4. 5.

GPT-4o vs Claude 3.5 vs Gemini Pro 이미지 분석 능력 비교

2026년 4월 기준 | AI 도구 비교 · Vision API 실측 테스트

요약: 동일한 이미지 5장을 GPT-4o, Claude 3.5 Sonnet, Gemini 1.5 Pro 세 모델에 넣고 이미지 분석 품질을 직접 비교했습니다. 영수증 OCR, 차트 해석, 한국어 간판 인식 등 실무에서 자주 쓰는 시나리오 위주로 테스트한 결과를 정리합니다.

왜 Vision API를 비교하게 됐나

사내에서 영수증 자동 정리 시스템을 만들고 있었습니다. 처음에는 GPT-4o만 쓰다가, 한국어 영수증에서 금액 인식 오류가 꽤 발생하길래 "다른 모델은 어떨까?" 싶어서 비교를 시작했습니다.

단순히 "어떤 모델이 좋다"가 아니라, 어떤 작업에 어떤 모델이 강한지를 알고 싶었습니다. 결론부터 말하면, 모델마다 확실히 강점이 다릅니다. 그래서 지금은 작업 유형에 따라 모델을 바꿔가며 쓰고 있습니다.

테스트 환경과 조건

비교의 공정성을 위해 최대한 조건을 맞췄습니다.

항목 GPT-4o Claude 3.5 Sonnet Gemini 1.5 Pro
API 버전 gpt-4o-2024-11-20 claude-3-5-sonnet-20241022 gemini-1.5-pro-002
이미지 전달 방식 base64 인코딩 base64 인코딩 base64 인코딩
Max Tokens 2048 2048 2048
Temperature 0 0 0
프롬프트 세 모델 동일한 한국어 프롬프트 사용

테스트 이미지는 총 5장입니다. 직접 촬영한 영수증, 엑셀 차트 캡처, 거리 간판 사진, VS Code 스크린샷, 시스템 아키텍처 다이어그램. 각 이미지를 동일 프롬프트와 함께 세 모델에 보내고 응답 품질과 속도를 측정했습니다.

각 모델별 이미지 분석 코드

먼저 세 모델을 호출하는 코드부터 공유합니다. 실제로 사용한 코드에서 핵심만 뽑았습니다.

GPT-4o 이미지 분석

import base64
import time
from openai import OpenAI

client = OpenAI()

def analyze_with_gpt4o(image_path, prompt):
    with open(image_path, "rb") as f:
        img_b64 = base64.b64encode(f.read()).decode()

    start = time.time()
    response = client.chat.completions.create(
        model="gpt-4o",
        messages=[{
            "role": "user",
            "content": [
                {"type": "text", "text": prompt},
                {"type": "image_url",
                 "image_url": {"url": f"data:image/png;base64,{img_b64}"}}
            ]
        }],
        max_tokens=2048,
        temperature=0
    )
    elapsed = time.time() - start

    return {
        "text": response.choices[0].message.content,
        "time": round(elapsed, 2),
        "tokens": response.usage.total_tokens
    }

Claude 3.5 Sonnet 이미지 분석

import anthropic
import base64
import time

client = anthropic.Anthropic()

def analyze_with_claude(image_path, prompt):
    with open(image_path, "rb") as f:
        img_b64 = base64.b64encode(f.read()).decode()

    start = time.time()
    response = client.messages.create(
        model="claude-3-5-sonnet-20241022",
        max_tokens=2048,
        messages=[{
            "role": "user",
            "content": [
                {"type": "image",
                 "source": {
                     "type": "base64",
                     "media_type": "image/png",
                     "data": img_b64
                 }},
                {"type": "text", "text": prompt}
            ]
        }]
    )
    elapsed = time.time() - start

    return {
        "text": response.content[0].text,
        "time": round(elapsed, 2),
        "tokens": response.usage.input_tokens + response.usage.output_tokens
    }

Gemini 1.5 Pro 이미지 분석

import google.generativeai as genai
import time
from PIL import Image

genai.configure(api_key="YOUR_API_KEY")
model = genai.GenerativeModel("gemini-1.5-pro-002")

def analyze_with_gemini(image_path, prompt):
    img = Image.open(image_path)

    start = time.time()
    response = model.generate_content(
        [prompt, img],
        generation_config=genai.GenerationConfig(
            max_output_tokens=2048,
            temperature=0
        )
    )
    elapsed = time.time() - start

    return {
        "text": response.text,
        "time": round(elapsed, 2),
        "tokens": response.usage_metadata.total_token_count
    }

코드 구조는 거의 동일합니다. 차이점은 이미지 전달 포맷뿐입니다. GPT-4o는 image_url 안에 base64를 넣고, Claude는 source 객체에, Gemini는 PIL Image 객체를 직접 넘깁니다.

테스트 1: 영수증 OCR

편의점 영수증 사진을 넣고 "이 영수증의 모든 항목과 금액을 JSON으로 추출해줘"라고 요청했습니다.

결과 요약

GPT-4o: 항목명은 거의 정확하게 읽었는데, 금액에서 작은 실수가 있었습니다. "1,800원"을 "1,300원"으로 읽은 부분이 있었고, 할인 금액 표시를 놓쳤습니다. JSON 포맷은 깔끔하게 나왔습니다.

Claude 3.5 Sonnet: 금액 인식 정확도가 가장 높았습니다. 할인 항목까지 별도로 분리해서 추출했고, 합계 금액도 정확했습니다. 다만 상품명에서 약어를 풀어쓰려고 시도하다가 오히려 원래 표기와 달라진 부분이 있었습니다. 예를 들어 "삼각김밥참치"를 "삼각김밥 (참치맛)"으로 바꿔버렸습니다.

Gemini 1.5 Pro: 전체적으로 무난했습니다. 금액 인식은 GPT-4o와 비슷한 수준이었고, 특이하게 영수증 하단의 바코드 번호까지 읽어냈습니다. 하지만 할인 전/후 금액 구분이 좀 모호하게 나왔습니다.

핵심 발견: 영수증 OCR에서는 Claude가 숫자 인식 정확도가 가장 높았습니다. 특히 한국어 영수증에서 "원" 단위 금액 추출에 강합니다. 다만 상품명을 임의로 수정하는 습관이 있어서 프롬프트에 "원문 그대로 추출"을 명시해야 합니다.

테스트 2: 차트/그래프 분석

엑셀에서 만든 월별 매출 막대 그래프 캡처를 넣고 "이 차트의 데이터를 분석하고 트렌드를 설명해줘"라고 요청했습니다.

결과 요약

GPT-4o: 차트 해석 능력이 확실히 좋았습니다. 각 막대의 수치를 꽤 정확하게 읽었고, "3월과 7월에 매출이 급증하는 패턴이 보이며, 이는 계절적 요인일 수 있습니다"라는 인사이트까지 제공했습니다. Y축 단위(백만원)도 정확히 파악했습니다.

Claude 3.5 Sonnet: 수치 읽기는 GPT-4o보다 살짝 부정확했습니다. 8월 매출을 420만원으로 읽어야 하는데 450만원으로 읽었습니다. 하지만 분석의 깊이는 좋았습니다. 전월 대비 증감률을 직접 계산해서 표로 정리해주는 건 인상적이었습니다.

Gemini 1.5 Pro: 차트 분석에서 가장 뛰어났습니다. 수치 정확도도 높았고, "상반기 평균 대비 하반기 평균이 23% 증가"라는 요약까지 붙여줬습니다. 색상 구분이 있는 복합 차트에서도 범례를 정확히 매칭했습니다.

핵심 발견: 차트/그래프 분석은 Gemini가 가장 강합니다. Google Sheets, 엑셀 차트 등 정형화된 시각 자료 해석에 최적화된 느낌입니다. GPT-4o도 준수하고, Claude는 수치 읽기보다는 분석/해석 쪽에 강합니다.

테스트 3: 한국어 간판 인식

이게 제일 궁금했던 테스트입니다. 서울 거리에서 찍은 사진에 여러 한국어 간판이 포함되어 있습니다. "이 사진에 보이는 모든 간판의 텍스트를 읽어줘"라고 요청했습니다.

결과 요약

GPT-4o: 큰 글씨 간판은 잘 읽었지만, 작은 부제목이나 전화번호가 적힌 부분은 상당수 놓쳤습니다. "맛있는 갈비집"은 읽었는데 그 아래 "since 1995"나 전화번호는 인식하지 못했습니다. 간판 7개 중 5개를 읽어냈습니다.

Claude 3.5 Sonnet: 한국어 텍스트 인식률이 가장 높았습니다. 간판 7개를 모두 찾아냈고, 부제목과 작은 글씨까지 읽어냈습니다. "24시 영업"이라는 작은 스티커 문구까지 잡아낸 건 놀라웠습니다. 다만 멀리 있는 간판 하나에서 "미용실"을 "미술실"로 오독한 부분이 있었습니다.

Gemini 1.5 Pro: 6개 간판을 인식했고 정확도도 괜찮았습니다. 특이한 점은 간판의 위치를 "좌측 상단", "중앙 하단" 등으로 설명해준 것입니다. 하지만 세로로 쓰인 한글을 가로로 읽어서 순서가 뒤바뀐 경우가 있었습니다.

핵심 발견: 한국어 텍스트 인식은 Claude가 가장 강합니다. 작은 글씨, 다양한 폰트, 손글씨 스타일까지 잘 잡아냅니다. GPT-4o는 큰 글씨 위주로 안정적이고, Gemini는 위치 정보를 함께 제공하는 게 차별점입니다.

테스트 4: 코드 스크린샷 해석

VS Code에서 파이썬 코드가 열려있는 스크린샷을 넣고 "이 코드에서 버그를 찾아줘"라고 요청했습니다. 의도적으로 off-by-one 에러와 타입 에러를 넣어둔 코드입니다.

결과 요약

GPT-4o: 두 가지 버그를 모두 찾았습니다. off-by-one 에러를 정확히 짚었고, 타입 에러도 설명과 함께 수정 코드를 제안했습니다. 코드를 텍스트로 정확하게 옮겨적은 뒤 분석하는 방식이었습니다.

Claude 3.5 Sonnet: 역시 두 가지 버그를 모두 찾았고, 추가로 잠재적인 예외 처리 누락까지 지적했습니다. 코드를 읽는 정확도가 매우 높았고, 줄 번호까지 정확히 매칭해서 "Line 14의 range(len(data))를 range(len(data) - 1)로 수정"처럼 구체적으로 알려줬습니다.

Gemini 1.5 Pro: off-by-one 에러는 찾았지만, 타입 에러는 놓쳤습니다. 대신 코드 스타일에 대한 피드백(변수명 개선 등)을 추가로 제공했는데, 질문 의도와는 좀 달랐습니다.

테스트 5: 복잡한 다이어그램 분석

마이크로서비스 아키텍처 다이어그램 (서비스 8개, 화살표 다수)을 넣고 "이 아키텍처를 설명하고 잠재적 병목 지점을 찾아줘"라고 요청했습니다.

결과 요약

GPT-4o: 서비스 간 관계를 정확하게 파악했습니다. 8개 서비스 중 7개를 식별했고, 화살표 방향도 대부분 맞혔습니다. 병목 지점으로 API Gateway와 인증 서비스를 지목한 건 적절했습니다.

Claude 3.5 Sonnet: 8개 서비스를 모두 식별했고, 각 서비스 간 통신 프로토콜(REST, gRPC, 메시지 큐)까지 다이어그램에서 읽어냈습니다. 병목 분석도 가장 상세했는데, "주문 서비스가 4개의 다른 서비스에 동기 호출을 하고 있어 장애 전파 위험이 높다"는 분석이 정확했습니다.

Gemini 1.5 Pro: 서비스 6개를 식별했고, 나머지 2개는 하나로 합쳐서 인식했습니다. 전체적인 흐름 설명은 괜찮았지만 세부 사항에서 GPT-4o와 Claude보다 부족했습니다.

종합 비교표

5개 테스트 결과를 종합 정리한 표입니다. 점수는 5점 만점 기준으로 제가 직접 매겼습니다.

항목 GPT-4o Claude 3.5 Sonnet Gemini 1.5 Pro
영수증 OCR 3.5 4.5 3.5
차트 분석 4.0 3.5 4.5
한국어 간판 인식 3.0 4.5 3.5
코드 스크린샷 4.5 4.5 3.0
다이어그램 분석 4.0 4.5 3.0
평균 3.8 4.3 3.5

속도 비교 (5회 평균, 동일 이미지 기준)

모델 평균 응답 시간 첫 토큰까지
GPT-4o 4.2초 1.1초
Claude 3.5 Sonnet 5.8초 1.8초
Gemini 1.5 Pro 3.1초 0.7초

비용 비교 (이미지 1장 + 응답 2048토큰 기준)

모델 입력 비용 (이미지 포함) 출력 비용 건당 총 비용
GPT-4o ~$0.01 ~$0.02 ~$0.03
Claude 3.5 Sonnet ~$0.01 ~$0.03 ~$0.04
Gemini 1.5 Pro ~$0.005 ~$0.01 ~$0.015

Gemini가 비용 면에서 압도적으로 저렴합니다. 대량 처리가 필요한 경우 비용 차이가 상당히 커집니다. 이미지 1,000장 기준으로 GPT-4o는 약 $30, Claude는 약 $40, Gemini는 약 $15 정도입니다.

모델별 장단점 정리

GPT-4o

장점

  • 차트, 그래프 등 정형 데이터 시각화 분석에 강함
  • 코드 스크린샷 해석 정확도 높음
  • 응답 포맷이 일관성 있음
  • 생태계가 넓어서 참고 자료 많음

단점

  • 한국어 텍스트 인식 정확도 상대적으로 낮음
  • 작은 글씨를 자주 놓침
  • 가끔 이미지에 없는 내용을 만들어냄 (할루시네이션)
  • 이미지 해상도 제한이 있음

Claude 3.5 Sonnet

장점

  • 한국어 텍스트 인식 정확도 최상
  • 세밀한 부분까지 놓치지 않는 관찰력
  • 분석의 깊이가 가장 좋음
  • 코드 분석과 다이어그램 해석에 강함
  • 할루시네이션이 상대적으로 적음

단점

  • 응답 속도가 가장 느림
  • 비용이 가장 비쌈
  • 원문을 임의로 수정하려는 경향
  • 숫자 읽기에서 차트 해석은 보통 수준

Gemini 1.5 Pro

장점

  • 응답 속도가 가장 빠름
  • 비용이 가장 저렴함
  • 차트/그래프 분석에 가장 강함
  • 이미지 내 위치 정보 제공
  • 무료 티어가 넉넉함

단점

  • 복잡한 다이어그램에서 세부 사항 누락
  • 한국어 세로 쓰기 인식 취약
  • 코드 분석에서 버그 놓치는 경우 있음
  • 분석 깊이가 다른 두 모델보다 얕음

결론: 용도별 추천

세 모델 다 써보고 내린 결론은 이렇습니다.

한국어 문서/텍스트 추출이 중요한 경우Claude 3.5 Sonnet

차트/그래프 데이터 분석이 주 목적인 경우Gemini 1.5 Pro

코드 리뷰/기술 문서 분석인 경우GPT-4o 또는 Claude 3.5 Sonnet

대량 이미지 처리 (비용 중요)Gemini 1.5 Pro

범용 이미지 분석 (밸런스)GPT-4o

개인적으로는 한국어 처리가 많아서 Claude를 메인으로 쓰고, 대량 처리할 때만 Gemini로 전환하는 방식을 택했습니다. GPT-4o는 팀원들이 이미 익숙해서 공동 작업할 때 주로 씁니다.

한 가지 팁을 더 드리자면, 프로덕션에서는 모델 하나만 쓰기보다 폴백 전략을 세우는 게 좋습니다. 메인 모델이 에러나 타임아웃 나면 다른 모델로 넘기는 식입니다. 아래처럼 구현할 수 있습니다.

def analyze_image_with_fallback(image_path, prompt):
    """메인 모델 실패 시 자동으로 다음 모델로 폴백"""
    models = [
        ("claude", analyze_with_claude),
        ("gpt4o", analyze_with_gpt4o),
        ("gemini", analyze_with_gemini),
    ]

    for name, func in models:
        try:
            result = func(image_path, prompt)
            result["model_used"] = name
            return result
        except Exception as e:
            print(f"[{name}] 실패: {e}, 다음 모델로 전환")
            continue

    raise Exception("모든 모델이 실패했습니다")

이 글이 Vision API 선택에 도움이 됐으면 합니다. 모델들이 빠르게 업데이트되고 있어서, 이 비교 결과도 몇 달 후에는 달라질 수 있습니다. 새 버전 나오면 다시 테스트해서 업데이트하겠습니다.

이 글은 2026년 4월 기준으로 작성되었습니다. API 가격과 성능은 수시로 변경될 수 있으니 공식 문서를 함께 확인해주세요. 테스트에 사용한 이미지와 전체 코드는 추후 GitHub에 공개할 예정입니다.