멀티모달 AI를 활용한 이미지 이해의 실전 기법 — 시각적 질의응답, 이미지 분석 프롬프트 설계, 정확도 향상 전략, 그리고 다양한 활용 패턴을 다룹니다.
2장에서 VLM의 아키텍처를 분석했습니다. 이 장에서는 멀티모달 모델을 활용하여 이미지를 이해하고 분석하는 실전 기법을 다룹니다. API 호출 패턴, 시각적 질의응답을 위한 프롬프트 설계, 정확도 향상 전략, 그리고 다양한 활용 사례를 살펴봅니다.
멀티모달 모델에 이미지를 전달하는 방법은 크게 세 가지입니다.
import anthropic
import base64
from pathlib import Path
client = anthropic.Anthropic()
image_data = base64.standard_b64encode(
Path("screenshot.png").read_bytes()
).decode("utf-8")
response = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
messages=[{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/png",
"data": image_data,
},
},
{"type": "text", "text": "이 이미지에서 무엇이 보이나요?"},
],
}],
)response = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
messages=[{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "url",
"url": "https://example.com/chart.png",
},
},
{"type": "text", "text": "이 차트의 주요 트렌드를 분석해주세요."},
],
}],
)response = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=2048,
messages=[{
"role": "user",
"content": [
{"type": "image", "source": {"type": "base64", "media_type": "image/png", "data": before_data}},
{"type": "image", "source": {"type": "base64", "media_type": "image/png", "data": after_data}},
{"type": "text", "text": "두 이미지를 비교하여 변경된 부분을 상세히 설명해주세요."},
],
}],
)이미지 해상도는 비용과 직결됩니다. 전체적인 내용 파악에는 저해상도(512px 이하)로 충분하지만, 텍스트 읽기나 세밀한 분석에는 고해상도가 필요합니다. 불필요하게 높은 해상도를 전달하면 토큰 소비만 늘어납니다. 작업에 맞는 해상도를 선택하세요.
analysis_prompt = """이 이미지를 다음 관점에서 분석해주세요:
1. **전체 개요**: 이미지가 무엇을 나타내는지 한 문장으로 요약
2. **핵심 요소**: 식별 가능한 주요 요소 나열
3. **관계 분석**: 요소 간의 관계나 패턴
4. **인사이트**: 이미지에서 도출할 수 있는 핵심 시사점
JSON 형식으로 응답해주세요."""# UI/UX 분석
ux_prompt = """당신은 10년 경력의 UI/UX 디자이너입니다.
이 웹 페이지 스크린샷을 분석하여 다음을 평가해주세요:
- 시각적 계층 구조 (Visual Hierarchy)
- 색상 대비와 접근성
- 여백과 정렬의 일관성
- CTA(Call to Action)의 명확성
- 모바일 반응성 예상
각 항목에 대해 1-10 점수와 구체적 개선 제안을 포함해주세요."""
# 보안 분석
security_prompt = """당신은 보안 전문가입니다.
이 네트워크 다이어그램을 분석하여 잠재적 보안 취약점을 식별해주세요:
- 단일 장애점 (SPOF)
- 암호화되지 않은 통신 경로
- 접근 제어 부재 지점
- 공격 표면 (Attack Surface) 분석"""cot_prompt = """이 차트 이미지를 분석합니다. 단계별로 추론해주세요.
1단계: 차트의 유형과 축 정보를 파악합니다.
2단계: 데이터 포인트와 값을 읽습니다.
3단계: 트렌드와 패턴을 식별합니다.
4단계: 이상점(anomaly)이 있는지 확인합니다.
5단계: 결론과 시사점을 도출합니다.
각 단계의 추론 과정을 명시적으로 보여주세요."""def compare_images(client, image1_data: str, image2_data: str, context: str):
"""두 이미지를 비교 분석"""
response = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=2048,
messages=[{
"role": "user",
"content": [
{"type": "image", "source": {"type": "base64", "media_type": "image/png", "data": image1_data}},
{"type": "image", "source": {"type": "base64", "media_type": "image/png", "data": image2_data}},
{"type": "text", "text": f"""두 이미지를 비교하여 분석해주세요.
컨텍스트: {context}
다음을 포함해주세요:
- 공통점
- 차이점 (구체적 위치와 내용)
- 변경의 의미나 영향"""},
],
}],
)
return response.content[0].textchart_extraction_prompt = """이 차트에서 데이터를 추출하여 JSON 형식으로 반환해주세요.
요구사항:
1. 차트 유형 식별 (막대, 선, 파이 등)
2. 모든 레이블과 범례 텍스트 추출
3. 각 데이터 포인트의 값을 가능한 정확하게 읽기
4. 단위 정보 포함
출력 형식:
{
"chart_type": "bar",
"title": "...",
"x_axis": {"label": "...", "values": [...]},
"y_axis": {"label": "...", "unit": "..."},
"series": [
{"name": "...", "values": [...]}
]
}"""ui_analysis_prompt = """이 모바일 앱 스크린샷에서 모든 인터랙티브 UI 요소를 식별해주세요.
각 요소에 대해:
- 유형 (버튼, 입력 필드, 체크박스, 탭, 스위치 등)
- 대략적인 위치 (상단/중앙/하단, 좌/우)
- 현재 상태 (활성/비활성, 선택됨/미선택 등)
- 레이블 또는 텍스트 내용
- 접근성 이슈 (있다면)
표 형식으로 정리해주세요."""code_analysis_prompt = """이 코드 스크린샷을 분석해주세요.
1. 코드를 텍스트로 정확하게 전사(transcribe)
2. 프로그래밍 언어 식별
3. 코드의 목적과 동작 설명
4. 잠재적 버그나 개선 사항 식별
5. 보안 취약점 검사"""from PIL import Image
import io
def preprocess_for_analysis(image_path: str, task: str = "general") -> bytes:
"""작업 유형에 맞는 이미지 전처리"""
img = Image.open(image_path)
if task == "text_extraction":
# 텍스트 추출: 고해상도 유지, 대비 강화
img = img.convert("L") # 그레이스케일
# 대비 강화
from PIL import ImageEnhance
enhancer = ImageEnhance.Contrast(img)
img = enhancer.enhance(1.5)
elif task == "overview":
# 전체 개요: 적절한 크기로 리사이즈
img.thumbnail((1024, 1024), Image.LANCZOS)
elif task == "detail":
# 세부 분석: 원본 해상도 유지
pass
buffer = io.BytesIO()
img.save(buffer, format="PNG")
return buffer.getvalue()async def multi_perspective_analysis(client, image_data: str):
"""여러 관점에서 분석 후 종합"""
perspectives = [
"기술적 관점에서 이 다이어그램을 분석해주세요.",
"비즈니스 관점에서 이 다이어그램의 시사점을 분석해주세요.",
"보안 관점에서 이 다이어그램의 취약점을 분석해주세요.",
]
analyses = []
for prompt in perspectives:
response = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
messages=[{
"role": "user",
"content": [
{"type": "image", "source": {"type": "base64", "media_type": "image/png", "data": image_data}},
{"type": "text", "text": prompt},
],
}],
)
analyses.append(response.content[0].text)
# 종합 분석
synthesis = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=2048,
messages=[{
"role": "user",
"content": f"""다음 세 가지 관점의 분석을 종합하여 핵심 인사이트를 도출해주세요.
기술적 분석:
{analyses[0]}
비즈니스 분석:
{analyses[1]}
보안 분석:
{analyses[2]}
종합적인 결론과 우선순위 기반 권고사항을 제시해주세요.""",
}],
)
return synthesis.content[0].text멀티모달 모델의 이미지 이해에는 다음 한계가 있습니다:
이미지 분석 결과를 비즈니스 의사결정에 사용할 때는 반드시 인간 검증을 포함하세요.
이미지 이해는 멀티모달 AI의 가장 성숙한 능력입니다. 구조화된 프롬프트, 적절한 전처리, 다중 시점 분석을 통해 높은 정확도의 시각적 분석을 달성할 수 있습니다. 핵심은 작업의 성격에 맞는 해상도와 프롬프트 전략을 선택하는 것입니다.
다음 장에서는 이미지 이해의 특수한 영역인 문서 이해와 OCR 통합을 다룹니다. PDF, 스캔 문서, 표, 양식 등 구조화된 시각 데이터를 처리하는 기법을 배웁니다.
이 글이 도움이 되셨나요?
관련 주제 더 보기
멀티모달 AI를 활용한 문서 이해 기법 — PDF 분석, 표 추출, 양식 처리, OCR 통합, 그리고 문서 처리 파이프라인 설계를 실전 중심으로 다룹니다.
CLIP에서 GPT-4o까지, Vision-Language 모델의 핵심 아키텍처를 분석합니다. 이미지 인코딩, 크로스모달 정렬, 통합 모델의 설계 원리를 다룹니다.
음성 인식(STT), 음성 합성(TTS), 실시간 음성 대화 시스템의 원리와 구현을 다룹니다. Whisper, OpenAI Audio API, 음성 에이전트 설계 패턴을 배웁니다.