Claude 모델 라인업과 선택 기준
2026년 6월 기준 Anthropic의 주요 모델은 다음과 같다. 프로젝트 요구 사항에 맞는 모델을 선택하는 것이 비용 최적화의 핵심이다.
| 모델 ID | 특징 | 컨텍스트 | 권장 용도 |
|---|---|---|---|
claude-opus-4-8 | 플래그십, 최고 성능·복잡한 추론, 정직성 강화 | 1M | 코드 리뷰, 장기 에이전트, 복잡한 분석 |
claude-sonnet-4-6 | 균형 잡힌 성능·속도 ($3 입력 / $15 출력) | 1M | 범용 앱, 일반 챗봇 |
claude-haiku-4-5 | 초고속, 저비용 | 200K | 분류, 간단한 요약, 실시간 |
claude-sonnet-4-6이 가장 좋은 균형이다. 비용·속도가 중요하다면 Haiku, 복잡한 논리적 추론이나 장기 자율 작업이 필요하다면 플래그십claude-opus-4-8을 사용하자. Haiku 4.5의 정식 모델 ID는claude-haiku-4-5-20251001이며 별칭claude-haiku-4-5로도 호출할 수 있다.
SDK 설치 & API 키 설정
Anthropic 공식 Python 패키지를 pip으로 설치한다.
# Anthropic SDK 설치 pip install anthropic # 환경변수에 API 키 저장 (보안 필수) export ANTHROPIC_API_KEY="sk-ant-..."
.env파일을 사용하고,.gitignore에 반드시 추가하자.
python-dotenv로 .env 파일 관리
# .env 파일
# ANTHROPIC_API_KEY=sk-ant-...
# main.py
from dotenv import load_dotenv
import os
import anthropic
load_dotenv()
# 인자를 생략하면 SDK가 환경변수 ANTHROPIC_API_KEY를 자동으로 읽는다
client = anthropic.Anthropic(
api_key=os.getenv("ANTHROPIC_API_KEY")
)기본 메시지 API 사용법
Anthropic SDK의 핵심은messages.create()이다. OpenAI의chat.completions.create()와 유사하지만 구조가 약간 다르다. 응답content는 블록 리스트이므로block.type을 확인한 뒤text에 접근하는 것이 안전하다.
import anthropic
client = anthropic.Anthropic()
# 기본 메시지 요청
message = client.messages.create(
model="claude-opus-4-8",
max_tokens=1024,
messages=[
{"role": "user", "content": "Python으로 피보나치 수열을 구현해줘"}
],
)
# content는 블록 리스트 — type을 확인하고 text를 꺼낸다
for block in message.content:
if block.type == "text":
print(block.text)
print(f"입력 토큰: {message.usage.input_tokens}")
print(f"출력 토큰: {message.usage.output_tokens}")system메시지를 messages 배열이 아닌 별도의system파라미터로 전달한다. 또한 응답은 블록 리스트이므로message.content[0].text를 바로 쓰기보다block.type == "text"를 확인한 뒤 접근하는 것이 안전하다(확장 사고 사용 시 thinking 블록이 먼저 올 수 있음).
스트리밍 응답 구현
사용자 경험을 향상시키기 위해 응답을 실시간으로 출력하는 스트리밍을 구현한다. 긴 응답을 생성하거나max_tokens를 크게 잡을 때는 HTTP 타임아웃을 피하기 위해 스트리밍이 사실상 필수다.
import anthropic
client = anthropic.Anthropic()
# stream 컨텍스트 매니저 (권장) — 토큰을 받는 즉시 출력
with client.messages.stream(
model="claude-opus-4-8",
max_tokens=2048,
messages=[
{"role": "user", "content": "마이크로서비스 아키텍처 장단점을 설명해줘"}
],
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
print() # 줄바꿈
# 스트리밍이 끝난 뒤 최종 메시지/사용량 확인
final_message = stream.get_final_message()
print(f"\n총 토큰: "
f"{final_message.usage.input_tokens + final_message.usage.output_tokens}")멀티턴 대화 (대화 히스토리)
Claude API는 stateless이다. 이전 대화 맥락을 유지하려면 직접 messages 배열에 히스토리를 누적해야 한다.
import anthropic
client = anthropic.Anthropic()
# 대화 히스토리를 직접 관리
conversation_history = []
def chat(user_message: str) -> str:
conversation_history.append({"role": "user", "content": user_message})
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=1024,
system="당신은 친절한 Python 전문가다. 한국어로 답변하라.",
messages=conversation_history,
)
# 첫 text 블록을 안전하게 추출
assistant_text = next(
(b.text for b in response.content if b.type == "text"), ""
)
conversation_history.append({"role": "assistant", "content": assistant_text})
return assistant_text
# 대화 진행 — 이전 맥락이 유지된다
print(chat("리스트 컴프리헨션이 뭐야?"))
print(chat("방금 설명한 것을 실제 예제로 보여줘"))시스템 프롬프트 활용법
시스템 프롬프트는 AI의 역할과 행동 방식을 설정하는 핵심 기능이다. Anthropic API는system파라미터를 별도로 제공한다.
# 다양한 시스템 프롬프트 예시
# 1. 코드 리뷰 봇
code_reviewer = """당신은 시니어 Python 개발자다. 코드를 검토할 때:
1. 버그와 잠재적 문제점을 먼저 지적하라
2. PEP8 준수 여부를 확인하라
3. 성능 개선 방안을 제안하라
4. 한국어로 구체적인 피드백을 제공하라"""
# 2. 고객 서비스 봇
customer_service = """당신은 junetapa.com의 친절한 고객 서비스 담당자다.
- 항상 공손하고 도움이 되는 태도를 유지하라
- 모르는 것은 솔직하게 모른다고 말하라
- 답변은 간결하게 3문장 이내로 작성하라"""
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=2048,
system=code_reviewer, # 시스템 프롬프트 적용
messages=[
{"role": "user", "content": "def add(a,b): return a+b 이 코드 어때?"}
],
)
for block in response.content:
if block.type == "text":
print(block.text)비전 API — 이미지 분석
Claude는 이미지를 이해하고 분석하는 멀티모달 기능을 지원한다. URL 또는 Base64 인코딩 방식으로 이미지를 전달할 수 있다.
import anthropic
import base64
client = anthropic.Anthropic()
# 방법 1: 이미지 URL로 전달
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=1024,
messages=[{
"role": "user",
"content": [
{
"type": "image",
"source": {"type": "url", "url": "https://example.com/chart.png"},
},
{"type": "text", "text": "이 차트를 분석하고 핵심 인사이트를 3가지 알려줘"},
],
}],
)
# 방법 2: 로컬 파일을 Base64로 인코딩
with open("local_image.jpg", "rb") as f:
image_data = base64.standard_b64encode(f.read()).decode("utf-8")
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=1024,
messages=[{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/jpeg",
"data": image_data,
},
},
{"type": "text", "text": "이 이미지를 설명해줘"},
],
}],
)
for block in response.content:
if block.type == "text":
print(block.text)토큰 사용량 & 비용 관리
API 비용은 입력+출력 토큰 수로 청구된다. 2026년 6월 기준 주요 모델의 가격은 다음과 같다(100만 토큰당, USD).
| 모델 | 입력 (MTok당) | 출력 (MTok당) | Context |
|---|---|---|---|
| claude-opus-4-8 | $5 | $25 | 1M |
| claude-sonnet-4-6 | $3 | $15 | 1M |
| claude-haiku-4-5 | $1 | $5 | 200K |
참고로 Claude 구독 플랜은 Free / Pro $20 / Max 5x $100 / Max 20x $200 구성이며, 위 API 종량 과금과는 별개다.
# 토큰 사용량 추적 및 비용 계산
def estimate_cost(usage, model="claude-opus-4-8") -> float:
pricing = {
"claude-opus-4-8": {"input": 5.0, "output": 25.0},
"claude-sonnet-4-6": {"input": 3.0, "output": 15.0},
"claude-haiku-4-5": {"input": 1.0, "output": 5.0},
}
p = pricing.get(model, pricing["claude-opus-4-8"])
cost = (usage.input_tokens * p["input"]
+ usage.output_tokens * p["output"]) / 1_000_000
return cost
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=1024,
messages=[{"role": "user", "content": "REST API가 뭔지 설명해줘"}],
)
cost = estimate_cost(response.usage)
print(f"예상 비용: ${cost:.6f}")max_tokens를 적절히 제한, (3) 시스템 프롬프트를 간결하게 유지, (4) 불필요한 대화 히스토리 제거, (5) 반복되는 대용량 컨텍스트는 프롬프트 캐싱(cache_control)으로 최대 90% 절감.
실전 예제: 문서 요약 앱
긴 문서를 자동으로 요약하는 실전 Python 앱을 만들어본다. 스트리밍과 비용 추적 기능을 포함한다.
"""
document_summarizer.py
긴 문서를 Claude API로 자동 요약하는 실전 앱
"""
import anthropic
from pathlib import Path
client = anthropic.Anthropic()
SYSTEM_PROMPT = """당신은 전문 문서 요약 도우미다.
문서를 요약할 때 다음 형식을 사용하라:
## 핵심 요약 (3문장)
[핵심 내용을 3문장으로 요약]
## 주요 포인트
- [포인트 1]
- [포인트 2]
- [포인트 3]
## 결론
[문서의 결론 또는 시사점]"""
def summarize_document(text: str, model="claude-opus-4-8") -> None:
print("요약 생성 중...\n")
with client.messages.stream(
model=model,
max_tokens=1500,
system=SYSTEM_PROMPT,
messages=[{"role": "user", "content": f"다음 문서를 요약해줘:\n\n{text}"}],
) as stream:
for chunk in stream.text_stream:
print(chunk, end="", flush=True)
final = stream.get_final_message()
usage = final.usage
# Opus 4.8 기준 단가 ($5 입력 / $25 출력)
cost = (usage.input_tokens * 5.0 + usage.output_tokens * 25.0) / 1_000_000
print(f"\n\n[토큰: 입력 {usage.input_tokens} / "
f"출력 {usage.output_tokens} | 비용: ${cost:.5f}]")
if __name__ == "__main__":
doc_text = Path("document.txt").read_text(encoding="utf-8")
summarize_document(doc_text)