![[파이썬 15] 파이썬으로 Claude/ChatGPT API 써보기](https://img.thenullpage.com/posts/5394/5394_1_6d51df.webp)
지금까지는 AI를 웹사이트나 앱에서 대화하듯 썼다면, 이번 편은 그 AI를 내가 만드는 프로그램 안에 직접 붙이는 방법이다. Claude나 ChatGPT 같은 모델은 API(응용 프로그램 인터페이스)로 제공되며, 파이썬 코드에서 이 API를 호출하면 AI의 응답을 자동으로 받아 다른 로직과 조합할 수 있다.
1. API 키 발급받기
Claude API를 쓰려면 Anthropic 콘솔에 가입하고 API 키를 발급받아야 한다. 새 계정에는 무료 크레딧이 제공되어 곧바로 테스트해볼 수 있다. 발급받은 키는 sk-ant-로 시작하는 문자열 형태이며, 코드에 직접 적지 않고 환경변수(ANTHROPIC_API_KEY)로 저장해서 쓰는 것이 표준적인 방식으로 안내된다. 키가 코드나 깃허브에 그대로 노출되면 다른 사람이 그 키로 요청을 보내고 비용이 내 계정에 청구될 수 있기 때문에, 이 보안 수칙은 반드시 지켜야 한다.
2. 라이브러리 설치와 첫 호출
pip install anthropic
import os
from anthropic import Anthropic
client = Anthropic(api_key=os.environ.get("ANTHROPIC_API_KEY"))
message = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=[
{"role": "user", "content": "파이썬으로 크롤링하는 법 3줄로 설명해줘"}
]
)
print(message.content[0].text)
max_tokens는 응답으로 받을 수 있는 최대 길이를 지정하는 값이고, messages는 대화 내용을 리스트 형태로 담는 부분이다. 앞서 배운 "리스트 안에 딕셔너리" 구조가 여기서도 그대로 쓰이는 걸 볼 수 있다.
3. 시스템 프롬프트로 AI의 역할 지정하기
system 파라미터를 쓰면 AI가 어떤 역할로 답변할지 미리 지정할 수 있다.
message = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
system="당신은 친절한 고객상담 직원입니다. 항상 공손하고 간결하게 답하세요.",
messages=[
{"role": "user", "content": "환불 규정이 어떻게 되나요?"}
]
)
4. 대화 맥락 유지하기, 멀티턴 대화
API 자체는 상태를 저장하지 않기 때문에, 이전 대화 내용을 기억하게 하려면 매 요청마다 지금까지의 대화 기록 전체를 함께 보내야 한다. 사용자와 AI가 주고받은 메시지를 리스트에 계속 쌓아가면서 전체를 통째로 보내는 방식이다.
conversation = []
def chat(user_input):
conversation.append({"role": "user", "content": user_input})
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=conversation
)
reply = response.content[0].text
conversation.append({"role": "assistant", "content": reply})
return reply
print(chat("파이썬이 뭐야?"))
print(chat("그럼 자바스크립트랑 차이가 뭐야?")) # 이전 대화 맥락 기억함
대화가 길어질수록 매번 보내는 토큰(글자 단위 처리량) 수도 늘어나서 비용과 처리 시간이 증가하기 때문에, 오래된 메시지를 요약해서 대체하거나 최근 몇 개 메시지만 유지하는 방식으로 관리하는 게 실무에서 흔히 쓰이는 전략으로 소개된다.
5. 오류 처리하기
API 호출은 네트워크나 요청 한도 문제로 실패할 수 있기 때문에, try-except로 감싸서 오류에 대응하는 코드를 짜는 게 일반적이다.
from anthropic import APIError, RateLimitError
import time
try:
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": "안녕"}]
)
except RateLimitError:
time.sleep(60) # 요청 한도 초과시 잠시 대기 후 재시도
except APIError as e:
print(f"API 오류: {e}")
6. 정리
AI API를 쓰는 흐름은 키 발급 → 환경변수로 안전하게 보관 → messages.create()로 호출 → 응답 텍스트 추출, 이 네 단계로 요약된다. 대화 맥락을 유지하려면 이전 메시지 전체를 매번 함께 보내야 한다는 점, 그리고 API는 클라우드 사용량 기반 과금이라 무분별한 반복 호출은 비용으로 이어진다는 점을 유의해야 한다.