자주 묻는 질문 (FAQ)
일반적인 질문
Q1. Claude와 ChatGPT의 차이점은 무엇인가요?
A: Claude는 Anthropic이 개발한 AI 어시스턴트로, 다음과 같은 특징이 있습니다:
- 긴 컨텍스트 윈도우: 긴 문서/대화 처리를 위한 넓은 입력 범위
- 안전성 중심 설계: 안전을 고려한 정책과 가드레일
- 정확한 지시 따르기: 복잡한 구조화된 출력에 강점
- 코드 생성 능력: 코드 품질과 지시 준수에 강점
- 최신 지식: 모델/버전에 따라 범위가 다르므로 공식 문서 확인
Q2. 어떤 모델을 선택해야 하나요?
A: 사용 사례에 따라 선택하세요:
- 고성능 티어: 복잡한 분석, 고급 추론, 연구 작업
- 균형 티어: 대부분의 일반적인 사용 사례와 코딩
- 경량 티어: 빠른 응답, 간단한 작업, 대량 처리
대부분의 경우 균형 티어로 시작하고, 필요에 따라 조정하는 것을 권장합니다.
Q3. 비용이 얼마나 드나요?
A: 토큰 사용량에 따라 과금됩니다:
요금은 입력/출력 토큰, 선택한 티어, 캐싱 사용 여부에 따라 달라집니다. 최신 요금표는 공식 문서를 확인하세요.
Q4. API 키는 어떻게 발급받나요?
A: 다음 단계를 따르세요:
- Anthropic Console 방문
- 계정 생성 또는 로그인
- Settings → API Keys 메뉴 선택
- "Create Key" 버튼 클릭
- 키 이름 입력 후 생성
- 표시된 키를 안전한 곳에 저장 (재확인 불가)
주의: API 키는 한 번만 표시되므로 반드시 저장하세요. 노출되면 즉시 삭제하고 재발급받으세요.
Q5. 무료 체험이 가능한가요?
A: Anthropic은 신규 가입자에게 초기 크레딧을 제공합니다. Claude.ai 웹 인터페이스는 무료 플랜(Pro 플랜도 있음)이 있지만, API는 사용량에 따라 과금됩니다. 테스트 목적으로는 Haiku 모델을 사용하면 비용을 최소화할 수 있습니다.
기술적 질문
Q6. 컨텍스트 윈도우가 200K 토큰인데, 실제로는 더 적게 사용되는 것 같아요.
A: 몇 가지 이유가 있습니다:
- 출력 토큰 제한: 최대 출력은 모델에 따라 4K-8K 토큰으로 제한됩니다.
- 시스템 프롬프트: 시스템 프롬프트도 컨텍스트에 포함됩니다.
- 토큰 계산 방식: 실제 텍스트 길이와 토큰 수는 다릅니다.
# 토큰 수 계산 예시 (Python SDK)
import anthropic
client = anthropic.Anthropic(api_key="your-api-key")
token_count = client.count_tokens("Hello, Claude!")
print(f"토큰 수: {token_count}") # 3-4 토큰
Q7. 스트리밍 응답을 사용해야 하나요?
A: 사용자 경험을 개선하려면 스트리밍을 권장합니다:
- 장점: 실시간 피드백, 긴 응답에서 빠른 첫 토큰, 사용자 대기 시간 단축
- 단점: 구현 복잡도 증가, 에러 핸들링 어려움
- 권장 사용: 챗봇, 대화형 UI, 긴 텍스트 생성
- 불필요한 경우: 배치 처리, 자동화 스크립트, 구조화된 데이터 추출
# Python 스트리밍 예시
with client.messages.stream(
model="claude-" ,
max_tokens=1024,
messages=[{"role": "user", "content": "긴 이야기를 써주세요"}]
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
Q8. JSON 형식으로 응답을 받고 싶어요. JSON 모드가 있나요?
A: Claude API에는 별도의 JSON 모드가 없지만, 프롬프트로 구조화된 출력을 얻을 수 있습니다:
system_prompt = """당신은 데이터를 JSON 형식으로 추출하는 어시스턴트입니다.
항상 유효한 JSON만 출력하세요. 추가 설명이나 마크다운은 포함하지 마세요.
출력 형식:
{
"name": "문자열",
"age": 숫자,
"email": "문자열"
}"""
response = client.messages.create(
model="claude-" ,
max_tokens=1024,
system=system_prompt,
messages=[{
"role": "user",
"content": "이름: 홍길동, 나이: 30세, 연락처: hong@example.com"
}]
)
import json
data = json.loads(response.content[0].text)
팁: 더 안정적인 파싱을 위해 XML 태그나 Pydantic 모델을 사용할 수도 있습니다.
Q9. Tool Use와 Function Calling의 차이점은?
A: 같은 개념입니다. Anthropic은 "Tool Use"라는 용어를 사용하고, OpenAI는 "Function Calling"이라고 부릅니다. Claude의 Tool Use는:
- 외부 API 호출 (검색, 데이터베이스 쿼리)
- 계산 수행 (수학, 데이터 처리)
- 파일 시스템 작업
등의 작업을 Claude가 요청할 수 있게 합니다. 실제 실행은 개발자가 처리합니다.
tools = [{
"name": "get_weather",
"description": "특정 도시의 현재 날씨를 가져옵니다",
"input_schema": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "도시 이름"}
},
"required": ["city"]
}
}]
response = client.messages.create(
model="claude-" ,
max_tokens=1024,
tools=tools,
messages=[{"role": "user", "content": "서울 날씨 알려줘"}]
)
if response.stop_reason == "tool_use":
# tool_use 블록 처리
tool_use_block = next(b for b in response.content if b.type == "tool_use")
print(tool_use_block.name) # "get_weather"
print(tool_use_block.input) # {"city": "서울"}
Q10. 이미지 분석은 어떻게 하나요?
A: Vision API를 사용하여 이미지를 전송합니다:
import base64
with open("image.jpg", "rb") as f:
image_data = base64.standard_b64encode(f.read()).decode("utf-8")
response = client.messages.create(
model="claude-" ,
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)
지원 형식: JPEG, PNG, GIF, WebP (최대 5MB)
문제 해결
Q11. 429 Rate Limit Error가 계속 발생해요.
A: Rate Limit을 초과했습니다. 다음 방법으로 해결하세요:
1. 지수 백오프 재시도 구현:
import time
import random
def call_with_retry(max_retries=5):
for attempt in range(max_retries):
try:
response = client.messages.create(
model="claude-" ,
max_tokens=1024,
messages=[{"role": "user", "content": "Hello"}]
)
return response
except anthropic.RateLimitError as e:
if attempt == max_retries - 1:
raise
wait_time = (2 ** attempt) + random.uniform(0, 1)
time.sleep(wait_time)
2. 티어 확인 및 업그레이드:
- Build Tier: 50 RPM, 40K TPM, 400K TPD
- Scale Tier: 1000 RPM, 80K TPM, 2.5M TPD (구매액 증가 시 자동 상승)
3. 요청 분산:
- 배치 처리 시 요청 간 딜레이 추가
- 동시 요청 수 제한
- 비동기 처리 활용
Q12. 응답이 너무 느려요.
A: 성능 최적화 체크리스트:
1. 적절한 모델 선택:
- Haiku: 가장 빠름 (~1-3초)
- Sonnet: 중간 (~3-8초)
- Opus: 가장 느림 (~10-20초)
2. max_tokens 조정:
# 너무 큰 max_tokens는 응답 시간을 늘립니다
response = client.messages.create(
model="claude-" ,
max_tokens=500, # 필요한 만큼만 설정
messages=[{"role": "user", "content": "간단히 답해줘"}]
)
3. Prompt Caching 활용:
system_prompt = [{
"type": "text",
"text": "[긴 시스템 프롬프트나 문서]",
"cache_control": {"type": "ephemeral"}
}]
4. 컨텍스트 크기 줄이기:
- 불필요한 대화 히스토리 제거
- 긴 문서는 요약 후 전송
- 청킹 전략 사용
Q13. "Context length exceeded" 에러가 발생해요.
A: 입력 + 출력이 200K 토큰을 초과했습니다. 해결 방법:
1. 청킹 전략:
def chunk_text(text, chunk_size=100000):
"""텍스트를 청크로 분할"""
words = text.split()
chunks = []
for i in range(0, len(words), chunk_size):
chunk = " ".join(words[i:i+chunk_size])
chunks.append(chunk)
return chunks
def process_long_document(document):
chunks = chunk_text(document)
results = []
for chunk in chunks:
response = client.messages.create(
model="claude-" ,
max_tokens=2000,
messages=[{
"role": "user",
"content": f"다음 텍스트를 요약하세요:\n\n{chunk}"
}]
)
results.append(response.content[0].text)
return results
2. 대화 히스토리 관리:
def truncate_history(messages, max_messages=10):
"""최근 N개 메시지만 유지"""
return messages[-max_messages:]
def summarize_history(messages):
"""오래된 대화를 요약"""
if len(messages) > 20:
old_messages = messages[:-10]
summary = client.messages.create(
model="claude-" ,
max_tokens=500,
messages=[{
"role": "user",
"content": f"대화 요약:\n{old_messages}"
}]
)
return [{"role": "assistant", "content": summary.content[0].text}] + messages[-10:]
return messages
Q14. 같은 프롬프트인데 응답이 매번 달라요.
A: Claude는 생성형 AI이므로 결정론적이지 않습니다. 일관성을 높이려면:
1. temperature 조정:
response = client.messages.create(
model="claude-" ,
max_tokens=1024,
temperature=0, # 0에 가까울수록 일관성 증가 (기본값: 1)
messages=[{"role": "user", "content": "2+2는?"}]
)
2. 구체적인 형식 지정:
system_prompt = """다음 형식으로만 답변하세요:
정답: [숫자]
설명: [한 문장]
다른 형식이나 추가 내용은 포함하지 마세요."""
3. Few-shot 예제 제공:
messages = [
{"role": "user", "content": "긍정/부정: '이 제품 정말 좋아요!'"},
{"role": "assistant", "content": "긍정"},
{"role": "user", "content": "긍정/부정: '실망스러워요'"},
{"role": "assistant", "content": "부정"},
{"role": "user", "content": "긍정/부정: '배송이 빨라요'"}
]
Q15. API 키가 노출되었어요. 어떻게 해야 하나요?
A: 즉시 다음 조치를 취하세요:
- 키 삭제: Anthropic Console에서 해당 키 즉시 삭제
- 새 키 발급: 새 API 키 생성
- 사용 내역 확인: 비정상적인 사용량 체크
- 노출된 코드 수정: Git history에서 키 제거
# Git history에서 민감한 정보 제거 git filter-branch --force --index-filter \ "git rm --cached --ignore-unmatch config.py" \ --prune-empty --tag-name-filter cat -- --all - 향후 예방:
- 환경 변수 사용 (
ANTHROPIC_API_KEY) .env파일을.gitignore에 추가- Secret manager 사용 (AWS Secrets Manager, GitHub Secrets)
- 코드 리뷰 시 키 노출 여부 확인
- 환경 변수 사용 (
Claude Code 관련 질문
Q16. Claude Code란 무엇인가요?
A: Claude Code는 Anthropic의 공식 CLI(Command Line Interface) 도구로, 터미널에서 Claude를 사용할 수 있게 해줍니다:
- 코드 생성 및 수정: 자연어로 코드 작성/리팩토링 요청
- 파일 읽기/쓰기: 프로젝트 파일 자동 분석 및 수정
- 명령어 실행: git, npm, pip 등 자동 실행
- 멀티파일 편집: 여러 파일을 동시에 수정
- 컨텍스트 인식: 전체 프로젝트 구조 이해
설치: npm install -g @anthropic-ai/claude-code
Q17. Claude Code와 Claude API의 차이는?
A:
- Claude API: HTTP 기반 프로그래밍 인터페이스, 애플리케이션에 통합
- Claude Code: 터미널 기반 대화형 도구, 개발자가 직접 사용
| 특징 | Claude API | Claude Code |
|---|---|---|
| 사용 방식 | 프로그래밍 (Python, TS) | 터미널 명령어 |
| 대상 | 앱 개발자 | 소프트웨어 엔지니어 |
| 파일 접근 | 직접 구현 필요 | 자동 지원 |
| 명령 실행 | 별도 구현 | 자동 실행 |
| 비용 | 토큰 사용량 기반 | 토큰 사용량 기반 |
Q18. Claude Code가 내 파일을 마음대로 수정하지는 않나요?
A: 안전합니다. Claude Code는 다음과 같이 작동합니다:
- 명시적 권한: 파일 읽기/쓰기 전 사용자 승인 요청
- Diff 확인: 변경사항을 먼저 보여주고 승인 후 적용
- Git 통합: 변경사항은 Git으로 추적 가능
- 실행 확인: 명령어 실행 전 확인 프롬프트
- 읽기 전용 모드:
--read-only플래그로 쓰기 방지
권장 사항: 항상 Git을 사용하고, 중요한 변경 전에는 브랜치를 생성하세요.
Q19. Claude Code로 무엇을 할 수 있나요?
A: 다양한 개발 작업을 자동화할 수 있습니다:
코드 작성 및 수정:
$ claude "Python으로 FastAPI 서버 만들어줘"
$ claude "이 함수를 TypeScript로 변환해줘"
$ claude "main.py의 버그 찾아서 고쳐줘"
리팩토링:
$ claude "utils.py를 여러 모듈로 분리해줘"
$ claude "이 코드에 타입 힌트 추가해줘"
테스트 작성:
$ claude "auth.py에 대한 pytest 테스트 작성해줘"
$ claude "커버리지 90% 이상 달성하도록 테스트 추가해줘"
문서화:
$ claude "모든 함수에 docstring 추가해줘"
$ claude "README.md 작성해줘"
Git 작업:
$ claude "변경사항 커밋하고 의미있는 커밋 메시지 작성해줘"
$ claude "main 브랜치와 충돌 해결해줘"
Q20. Claude Code의 한계는 무엇인가요?
A: 다음과 같은 제약이 있습니다:
- 컨텍스트 제한: 매우 큰 프로젝트(수천 개 파일)는 처리가 어려울 수 있음
- 복잡한 리팩토링: 전체 아키텍처 변경은 사람의 감독이 필요
- 도메인 지식: 특정 비즈니스 로직은 명확한 설명이 필요
- 실시간 협업: 여러 개발자가 동시에 같은 파일 수정 시 충돌 가능
- 디버깅: 런타임 버그는 실행 환경 정보가 필요
권장: Claude Code는 보조 도구로 사용하고, 중요한 결정은 직접 검토하세요.
Vibe Coding
Q21. Vibe Coding이란 무엇인가요?
A: Vibe Coding은 자연어 대화로 코드를 작성하는 새로운 개발 패러다임입니다:
- 정의: 세부 구문이나 API를 암기하지 않고 "의도"만 전달하면 AI가 완전한 코드를 생성
- 배경: Anthropic이 Claude Opus (고성능) 출시와 함께 공식적으로 강조한 개념
- 핵심 특징: 낮은 진입장벽, 빠른 프로토타이핑, 맥락 이해, 반복 개선
- 지원 언어: Python, TypeScript, JavaScript, Rust, Go 등 모든 주요 프로그래밍 언어
예시:
# 전통적 코딩
1. Stack Overflow 검색 → API 문서 읽기 → 구문 학습 → 코드 작성 → 디버깅
# Vibe Coding
You: "FastAPI로 JWT 인증 시스템 만들어줘"
Claude: [완전한 코드 생성 + 설명]
You: "이제 리프레시 토큰 기능 추가해줘"
Claude: [기존 코드 개선]
자세한 내용은 Vibe Coding 가이드를 참조하세요.
Q22. Vibe Coding과 일반 프롬프팅의 차이는?
A: Vibe Coding은 프롬프팅을 넘어 전체 개발 워크플로우를 포함합니다:
| 구분 | 일반 프롬프팅 | Vibe Coding |
|---|---|---|
| 목적 | 단일 작업 (함수 생성 등) | 전체 개발 워크플로우 |
| 스코프 | 코드 스니펫 | 프로젝트 전체 (멀티파일) |
| 컨텍스트 | 프롬프트 내용만 | 전체 코드베이스 이해 |
| 반복 개선 | 수동으로 재요청 | 대화로 자연스럽게 개선 |
| 도구 | 웹 인터페이스, API | Claude Code CLI (권장) |
| 학습 곡선 | 프롬프트 작성법 학습 | 자연어 대화만으로 충분 |
핵심 차이: 일반 프롬프팅은 "코드 조각 요청"이고, Vibe Coding은 "AI와 협업하는 개발 방식"입니다.
Q23. Vibe Coding 사용 시 주의사항은?
A: 효과적인 Vibe Coding을 위한 권장 사항:
✅ DO (권장 사항):
- 구체적인 의도 전달: "사용자 인증" 대신 "JWT 기반 사용자 인증, 로그인/로그아웃 엔드포인트 포함"
- 맥락 제공: 프로젝트 구조, 기존 코딩 스타일, 사용 중인 프레임워크 언급
- 점진적 개선: 작은 기능부터 시작해서 대화로 확장
- 코드 리뷰: 생성된 코드를 항상 검토하고 이해하기
- Git 사용: 변경사항 추적 및 롤백 가능하도록 버전 관리
❌ DON'T (피해야 할 것):
- 맹목적 신뢰: 생성된 코드를 검증 없이 프로덕션에 배포
- 모호한 요청: "좋은 코드 만들어줘" 같은 불명확한 지시
- 보안 무시: API 키, 비밀번호 등 민감 정보를 프롬프트에 포함
- 복잡한 전체 시스템: 한 번에 대규모 아키텍처 변경 요청 (단계별로 진행)
- 디버깅 위임: 에러 메시지만 전달하고 컨텍스트 생략
예시 (좋은 Vibe Coding 요청):
"현재 Express.js 프로젝트에 Redis 캐싱 레이어를 추가하고 싶어.
- 모든 GET 요청은 5분간 캐싱
- POST/PUT/DELETE는 관련 캐시 무효화
- 환경 변수로 Redis 연결 설정
- 기존 코드 스타일(TypeScript, async/await) 유지"
Q24. Codex는 어떤 도구인가요?
A: Codex는 코딩 작업을 실행하고 변경 사항을 제안하는 코딩 에이전트입니다.
- 작업 범위 지정: 수정할 파일/폴더와 목표를 명확히 지정할수록 품질이 높습니다.
- 검증 흐름: 테스트 실행과 결과 확인을 함께 요청하는 것이 안전합니다.
- 보안: 민감한 작업은 승인 흐름과 권한 제한을 적용하세요.
자세한 내용은 Codex 가이드를 참조하세요.
모범 사례
Q25. 더 나은 응답을 받으려면 어떻게 프롬프트를 작성해야 하나요?
A: 효과적인 프롬프트 작성 팁:
1. 구체적으로 작성:
# 나쁜 예
"코드 작성해줘"
# 좋은 예
"Python FastAPI로 사용자 인증 API를 작성해줘.
JWT 토큰 사용, 로그인/로그아웃 엔드포인트 포함,
SQLAlchemy로 PostgreSQL 연결"
2. 형식 지정:
"다음 형식으로 답변해줘:
1. 요약 (3줄 이내)
2. 상세 설명
3. 코드 예제
4. 주의사항"
3. 컨텍스트 제공:
"Django REST Framework 프로젝트에서 사용자 모델을 확장하려고 합니다.
현재 AbstractUser를 상속받고 있고, 프로필 이미지와 생일 필드를 추가하고 싶습니다."
4. 단계별 요청:
"다음 순서로 작업해줘:
1. 먼저 requirements.txt 확인
2. 필요한 패키지 설치 명령어 제시
3. 코드 작성
4. 테스트 코드 작성"
5. 제약사항 명시:
"Python 3.8 호환, 외부 라이브러리 사용 금지,
타입 힌트 필수, 최대 100줄 이내"
Q26. 비용을 절감하려면 어떻게 해야 하나요?
A: 종합 비용 최적화 전략:
1. 적절한 모델 선택:
# 간단한 작업 → Haiku
response = client.messages.create(
model="claude-" ,
messages=[{"role": "user", "content": "감정 분석: 좋아요"}]
)
# 복잡한 작업 → Sonnet/Opus
response = client.messages.create(
model="claude-" ,
messages=[{"role": "user", "content": "복잡한 비즈니스 로직 분석"}]
)
2. max_tokens 최적화:
# 필요한 만큼만 요청
response = client.messages.create(
model="claude-" ,
max_tokens=100, # 짧은 답변만 필요한 경우
messages=[{"role": "user", "content": "YES 또는 NO로만 답해줘"}]
)
3. Prompt Caching 활용:
# 동일한 시스템 프롬프트/문서를 반복 사용 시
system = [{
"type": "text",
"text": large_document,
"cache_control": {"type": "ephemeral"}
}]
# 첫 요청: 캐시 쓰기 비용
# 이후 요청: 90% 비용 절감
4. 컨텍스트 압축:
def compress_context(messages):
# 오래된 메시지 요약
if len(messages) > 10:
old = messages[:-5]
summary = summarize(old) # Haiku 사용
return [summary] + messages[-5:]
return messages
5. 배치 처리:
# 여러 질문을 한 번에
questions = ["질문1", "질문2", "질문3"]
combined = "\n\n".join(f"{i+1}. {q}" for i, q in enumerate(questions))
response = client.messages.create(
model="claude-" ,
max_tokens=1000,
messages=[{"role": "user", "content": combined}]
)
Q27. 프로덕션 환경에서 주의할 점은?
A: 프로덕션 배포 체크리스트:
1. 에러 핸들링:
import anthropic
import logging
logger = logging.getLogger(__name__)
try:
response = client.messages.create(...)
except anthropic.RateLimitError as e:
logger.error(f"Rate limit: {e}")
# 재시도 로직
except anthropic.APIError as e:
logger.error(f"API error: {e}")
# 사용자에게 친절한 메시지
except Exception as e:
logger.critical(f"Unexpected error: {e}")
# 알림 전송
2. 타임아웃 설정:
client = anthropic.Anthropic(
api_key=os.environ["ANTHROPIC_API_KEY"],
timeout=30.0, # 30초 타임아웃
max_retries=3
)
3. 모니터링:
- 응답 시간 추적
- 토큰 사용량 모니터링
- 에러율 측정
- 비용 추적
4. 보안:
- API 키를 환경 변수나 Secret Manager에 저장
- 사용자 입력 검증 (프롬프트 인젝션 방지)
- 출력 필터링 (민감 정보 노출 방지)
- Rate limiting 구현
5. 캐싱 및 최적화:
from functools import lru_cache
# 동일 질문에 대한 캐싱
@lru_cache(maxsize=100)
def get_cached_response(prompt: str):
response = client.messages.create(
model="claude-" ,
max_tokens=1024,
messages=[{"role": "user", "content": prompt}]
)
return response.content[0].text
추가 도움말
더 많은 정보가 필요하시면 다음 리소스를 참고하세요:
- 공식 문서: docs.anthropic.com
- API 레퍼런스: API Reference
- Discord 커뮤니티: Anthropic Discord
- GitHub: github.com/anthropics
- 지원팀: support@anthropic.com
이 FAQ에 없는 질문이 있으시면 GitHub Issues에 문의해주세요.
핵심 정리
- 자주 묻는 질문 (FAQ)의 핵심 개념과 흐름을 정리합니다.
- 일반적인 질문를 단계별로 이해합니다.
- 실전 적용 시 기준과 주의점을 확인합니다.
실무 팁
- 입력/출력 예시를 고정해 재현성을 확보하세요.
- 자주 묻는 질문 (FAQ) 범위를 작게 잡고 단계적으로 확장하세요.
- 일반적인 질문 조건을 문서화해 대응 시간을 줄이세요.