AI & ML

Claude API Python 완전 가이드
— Anthropic SDK로 AI 앱 개발하기 2026

설치부터 스트리밍·멀티턴 대화·비전 API까지, 실전 코드로 배우는 Claude API 완전 정복

2026-02-21 ⏱ 약 12분 junetapa Claude API · Python · Anthropic SDK
이 글에서 다루는 내용: Anthropic의 공식 Python SDK를 사용해 Claude API를 연동하는 방법을 처음부터 끝까지 설명합니다. ChatGPT의 OpenAI API와 비슷하지만 몇 가지 중요한 차이점이 있고, Claude Sonnet·Haiku·Opus 모델 선택 전략도 함께 다룹니다.

1. Claude 모델 라인업과 선택 기준

2026년 기준 Anthropic의 주요 모델은 다음과 같습니다. 프로젝트 요구 사항에 맞는 모델을 선택하는 것이 비용 최적화의 핵심입니다.

모델 ID 특징 권장 용도 상대 비용
claude-opus-4-6 최고 성능, 복잡한 추론 코드 리뷰, 복잡한 분석 높음
claude-sonnet-4-6 균형 잡힌 성능·속도 범용 앱, 일반 챗봇 중간
claude-haiku-4-5 초고속, 저비용 분류, 간단한 요약, 실시간 낮음
선택 가이드: 대부분의 프로덕션 앱에서는 claude-sonnet-4-6이 가장 좋은 선택입니다. 비용이 중요하다면 Haiku, 복잡한 논리적 추론이 필요하다면 Opus를 사용하세요.

2. SDK 설치 & API 키 설정

Anthropic 공식 Python 패키지를 pip으로 설치합니다.

bash # Anthropic SDK 설치 pip install anthropic # 환경변수에 API 키 저장 (보안 필수) export ANTHROPIC_API_KEY="sk-ant-..."
보안 주의: API 키는 절대 소스코드에 하드코딩하지 마세요. 환경변수 또는 .env 파일을 사용하고, .gitignore에 반드시 추가하세요.

python-dotenv로 .env 파일 관리

python # .env 파일 ANTHROPIC_API_KEY=sk-ant-... # main.py from dotenv import load_dotenv import os import anthropic load_dotenv() client = anthropic.Anthropic( api_key=os.getenv("ANTHROPIC_API_KEY") )

3. 기본 메시지 API 사용법

Anthropic SDK의 핵심은 messages.create()입니다. OpenAI의 chat.completions.create()와 유사하지만 구조가 약간 다릅니다.

python import anthropic client = anthropic.Anthropic() # 기본 메시지 요청 message = client.messages.create( model="claude-sonnet-4-6", max_tokens=1024, messages=[ {"role": "user", "content": "Python으로 피보나치 수열을 구현해줘"} ] ) print(message.content[0].text) print(f"입력 토큰: {message.usage.input_tokens}") print(f"출력 토큰: {message.usage.output_tokens}")
OpenAI API와의 차이: Anthropic API는 system 메시지를 messages 배열이 아닌 별도의 system 파라미터로 전달합니다. 또한 응답은 message.content[0].text로 접근합니다.

4. 스트리밍 응답 구현

사용자 경험을 향상시키기 위해 응답을 실시간으로 출력하는 스트리밍을 구현합니다. 특히 긴 응답을 생성할 때 필수적입니다.

python import anthropic client = anthropic.Anthropic() # 스트리밍 방식 1: stream 컨텍스트 매니저 (권장) with client.messages.stream( model="claude-sonnet-4-6", 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총 토큰: {final_message.usage.input_tokens + final_message.usage.output_tokens}")

5. 멀티턴 대화 (대화 히스토리)

Claude API는 stateless입니다. 이전 대화 맥락을 유지하려면 직접 messages 배열에 히스토리를 누적해야 합니다.

python 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-sonnet-4-6", max_tokens=1024, system="당신은 친절한 Python 전문가입니다. 한국어로 답변해주세요.", messages=conversation_history ) assistant_text = response.content[0].text conversation_history.append({ "role": "assistant", "content": assistant_text }) return assistant_text # 대화 진행 print(chat("리스트 컴프리헨션이 뭐야?")) print(chat("방금 설명한 것을 실제 예제로 보여줘")) # 이전 맥락 유지됨

6. 시스템 프롬프트 활용법

시스템 프롬프트는 AI의 역할과 행동 방식을 설정하는 핵심 기능입니다. Anthropic API는 system 파라미터를 별도로 제공합니다.

python # 다양한 시스템 프롬프트 예시 # 1. 코드 리뷰 봇 code_reviewer = """당신은 시니어 Python 개발자입니다. 코드를 검토할 때: 1. 버그와 잠재적 문제점을 먼저 지적하세요 2. PEP8 준수 여부를 확인하세요 3. 성능 개선 방안을 제안하세요 4. 한국어로 구체적인 피드백을 제공하세요""" # 2. 고객 서비스 봇 customer_service = """당신은 junetapa.com의 친절한 고객 서비스 담당자입니다. - 항상 공손하고 도움이 되는 태도를 유지하세요 - 모르는 것은 솔직하게 모른다고 말하세요 - 답변은 간결하게 3문장 이내로 작성하세요""" response = client.messages.create( model="claude-sonnet-4-6", max_tokens=2048, system=code_reviewer, # 시스템 프롬프트 적용 messages=[ {"role": "user", "content": "def add(a,b): return a+b 이 코드 어때?"} ] ) print(response.content[0].text)

7. 비전 API — 이미지 분석

Claude는 이미지를 이해하고 분석하는 멀티모달 기능을 지원합니다. URL 또는 Base64 인코딩 방식으로 이미지를 전달할 수 있습니다.

python import anthropic import base64 client = anthropic.Anthropic() # 방법 1: 이미지 URL로 전달 response = client.messages.create( model="claude-sonnet-4-6", 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.b64encode(f.read()).decode("utf-8") response = client.messages.create( model="claude-sonnet-4-6", max_tokens=1024, messages=[{ "role": "user", "content": [ { "type": "image", "source": { "type": "base64", "media_type": "image/jpeg", "data": image_data } }, {"type": "text", "text": "이 이미지를 설명해줘"} ] }] ) print(response.content[0].text)

8. 토큰 사용량 & 비용 관리

API 비용은 입력+출력 토큰 수로 청구됩니다. 비용을 효율적으로 관리하는 전략을 알아봅니다.

모델 입력 (MTok당) 출력 (MTok당) Context
claude-opus-4-6 $15 $75 200K
claude-sonnet-4-6 $3 $15 200K
claude-haiku-4-5 $0.80 $4 200K
python # 토큰 사용량 추적 및 비용 계산 def estimate_cost(usage, model="claude-sonnet-4-6") -> float: pricing = { "claude-opus-4-6": {"input": 15.0, "output": 75.0}, "claude-sonnet-4-6": {"input": 3.0, "output": 15.0}, "claude-haiku-4-5": {"input": 0.8, "output": 4.0}, } p = pricing.get(model, pricing["claude-sonnet-4-6"]) cost = (usage.input_tokens * p["input"] + usage.output_tokens * p["output"]) / 1_000_000 return cost response = client.messages.create( model="claude-sonnet-4-6", max_tokens=1024, messages=[{"role": "user", "content": "REST API가 뭔지 설명해줘"}] ) cost = estimate_cost(response.usage) print(f"예상 비용: ${cost:.6f}")
비용 절약 팁: (1) 간단한 작업은 Haiku 사용, (2) max_tokens를 적절히 제한, (3) 시스템 프롬프트를 간결하게 유지, (4) 불필요한 대화 히스토리 제거.

9. 실전 예제: 문서 요약 앱

긴 문서를 자동으로 요약하는 실전 Python 앱을 만들어봅니다. 스트리밍과 비용 추적 기능을 포함합니다.

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-sonnet-4-6") -> None: print("요약 생성 중...\n") total_tokens = {"input": 0, "output": 0} 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() total_tokens["input"] = final.usage.input_tokens total_tokens["output"] = final.usage.output_tokens cost = (total_tokens["input"] * 3.0 + total_tokens["output"] * 15.0) / 1_000_000 print(f"\n\n[토큰: 입력 {total_tokens['input']} / 출력 {total_tokens['output']} | 비용: ${cost:.5f}]") if __name__ == "__main__": # 파일에서 텍스트 읽기 doc_text = Path("document.txt").read_text(encoding="utf-8") summarize_document(doc_text)
다음 단계: 이 예제를 확장하면 FastAPI 웹 서버와 연동하거나, 여러 파일을 배치 처리하거나, Slack 봇으로 만들 수 있습니다. Claude API의 200K 컨텍스트 윈도우 덕분에 매우 긴 문서도 한 번에 처리가 가능합니다.
← AI & ML 카테고리 OpenAI API 가이드 →