16.Python으로 OpenAI API 연동하기 — GPT를 내 코드에 붙이는 완벽 가이드
이 글에서는 OpenAI API 키 발급부터 Python 연동, 핵심 파라미터 이해, 실전 활용 예제, 그리고 비용을 예측하고 관리하는 방법까지 — 처음 시작하는 분도 바로 따라 할 수 있도록 안내해 드리겠습니다.
OpenAI API란 무엇인가 — ChatGPT를 내 프로그램 안으로 데려오는 일
ChatGPT는 브라우저에서 대화창에 질문을 입력하면 답변을 받는 방식입니다. 편리하지만 한계가 있습니다. 매번 직접 입력해야 하고, 다른 프로그램과 연결하거나 자동화하기 어렵습니다.
OpenAI API는 이 ChatGPT의 두뇌를 내 Python 코드에서 직접 호출할 수 있게 해주는 통로입니다. 레스토랑에 비유하면, 지금까지는 홀에 앉아 직접 주문했다면, API는 주방과 직접 연결된 전용 통화선을 갖는 것과 같습니다. 내 프로그램이 원하는 시점에 원하는 내용을 GPT에게 물어보고, 결과를 받아 다음 작업에 바로 활용할 수 있습니다.
API 연동으로 가능해지는 것들
- 문서 자동 요약 — 매일 쌓이는 보고서를 GPT가 자동으로 3줄 요약
- 이메일 초안 자동 생성 — 입력된 키워드만으로 비즈니스 메일 작성
- CSV 데이터 분류 — 수백 개 고객 피드백을 카테고리별로 자동 분류
- 챗봇 구축 — Streamlit과 결합해 사내 전용 AI 어시스턴트 제작
- 코드 리뷰 자동화 — 작성한 코드를 GPT에게 보내 문제점 피드백 수신
API 키 발급하기 — 가장 먼저 해야 할 일
발급 순서
platform.openai.com에 접속해 로그인합니다.- 우측 상단 계정 메뉴 → API Keys 를 선택합니다.
- Create new secret key 버튼을 클릭합니다.
- 키 이름을 입력하고 생성합니다.
- 생성된 키를 즉시 복사해 안전한 곳에 저장합니다.
⚠️ 절대 주의사항: API 키는 생성 직후 한 번만 전체 내용을 볼 수 있습니다. 창을 닫으면 다시 확인할 수 없습니다. 반드시 복사해 두십시오.
요금 구조 이해하기 — 시작 전 반드시 확인
OpenAI API는 사용한 만큼 요금이 부과되는 종량제입니다. 요금 단위는 **토큰(Token)**입니다.
토큰은 텍스트를 쪼개는 단위입니다. 영어는 단어 하나가 대략 1~1.5토큰, 한국어는 글자 하나가 1~2토큰 정도입니다. "안녕하세요"는 약 5~7토큰입니다.
GPT-4o 기준 대략적인 요금 (2024년 기준, 변동 가능):
| 모델 | 입력 (1M 토큰당) | 출력 (1M 토큰당) |
|---|---|---|
| gpt-4o | $5.00 | $15.00 |
| gpt-4o-mini | $0.15 | $0.60 |
| gpt-3.5-turbo | $0.50 | $1.50 |
💡 입문자 추천: 테스트 단계에서는 반드시 gpt-4o-mini를 사용하십시오. gpt-4o 대비 성능은 크게 차이 나지 않으면서 비용이 약 30~40배 저렴합니다.
⚠️ 요금 폭탄 방지:
platform.openai.com→ Usage 메뉴에서 **월 사용 한도(Spending Limit)**를 반드시 설정하십시오. 잘못 작성한 반복문이 수천 번 API를 호출하는 사고를 방지할 수 있습니다.
환경 설정 — API 키를 안전하게 관리하기
라이브러리 설치
pip install openai python-dotenv
.env 파일로 API 키 관리하기
API 키를 코드에 직접 넣으면 GitHub에 실수로 올라갈 경우 즉시 악용될 수 있습니다. 반드시 별도 파일로 분리해 관리하십시오.
프로젝트 폴더에 .env 파일을 만들고 아래 내용을 저장합니다.
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
.gitignore 파일에 아래 한 줄을 추가해 GitHub에 올라가지 않도록 합니다.
.env
Python 코드에서는 아래와 같이 불러옵니다.
from dotenv import load_dotenv
import os
load_dotenv()
api_key = os.getenv("OPENAI_API_KEY")
OpenAI API 기본 호출하기
가장 단순한 호출 예제
from openai import OpenAI
from dotenv import load_dotenv
import os
load_dotenv()
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "user", "content": "Python이 뭔지 한 문장으로 설명해줘."}
]
)
print(response.choices[0].message.content)
실행하면 GPT의 답변이 터미널에 출력됩니다.
메시지 구조 이해하기 — role의 의미
OpenAI API의 메시지는 항상 role과 content 쌍으로 구성됩니다.
messages = [
{
"role": "system",
"content": "당신은 친절한 Python 튜터입니다. 항상 한국어로 답변하고, 초보자도 이해하기 쉽게 설명하세요."
},
{
"role": "user",
"content": "리스트와 튜플의 차이가 뭔가요?"
}
]
- system: GPT의 역할과 행동 방식을 정의합니다. 이 내용이 이후 모든 대화에 영향을 줍니다.
- user: 사용자가 입력하는 질문이나 요청입니다.
- assistant: GPT의 이전 답변입니다. 다중 턴 대화에서 맥락 유지에 사용합니다.
주요 파라미터 이해하기
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=messages,
max_tokens=500, # 최대 출력 토큰 수 (비용 제어)
temperature=0.7, # 창의성 조절 (0: 일관성, 1: 창의성)
top_p=1.0, # 다양성 조절 (temperature와 하나만 조정 권장)
)
💡 temperature 선택 기준:
0.0 ~ 0.3: 정확성이 중요한 작업 (코드 생성, 데이터 분류, 번역)0.5 ~ 0.7: 균형 잡힌 일반 대화나 요약0.8 ~ 1.0: 창의적인 글쓰기, 아이디어 브레인스토밍
실전 예제 1 — 문서 자동 요약기
from openai import OpenAI
from dotenv import load_dotenv
import os
load_dotenv()
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
def summarize(text: str, lines: int = 3) -> str:
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{
"role": "system",
"content": f"당신은 문서 요약 전문가입니다. 주어진 텍스트를 핵심만 {lines}줄로 요약하세요. 번호 매기기 형식으로 출력하세요."
},
{
"role": "user",
"content": text
}
],
max_tokens=300,
temperature=0.3
)
return response.choices[0].message.content
# 사용 예시
sample_text = """
Python은 1991년 귀도 반 로섬이 발표한 고급 프로그래밍 언어로,
간결하고 읽기 쉬운 문법을 특징으로 합니다.
데이터 과학, 인공지능, 웹 개발, 자동화 등 다양한 분야에서
전 세계적으로 가장 많이 사용되는 언어 중 하나로 자리 잡았습니다.
"""
print(summarize(sample_text))
실전 예제 2 — CSV 데이터 자동 분류기
고객 피드백 데이터를 GPT로 자동 분류하는 실무형 예제입니다.
from openai import OpenAI
from dotenv import load_dotenv
import os
import csv
load_dotenv()
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
feedbacks = [
"배송이 너무 늦었어요. 3일이나 걸렸습니다.",
"제품 품질이 정말 만족스럽습니다!",
"환불 처리가 어렵네요. 고객센터 연결도 안 되고요.",
"포장이 꼼꼼해서 좋았어요.",
"앱이 자꾸 튕겨서 주문하기 불편했습니다.",
]
def classify_feedback(text: str) -> str:
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{
"role": "system",
"content": "고객 피드백을 아래 카테고리 중 하나로만 분류하세요. 카테고리명만 출력하세요.\n카테고리: 배송, 품질, 고객서비스, 앱/기술, 기타"
},
{"role": "user", "content": text}
],
max_tokens=20,
temperature=0
)
return response.choices[0].message.content.strip()
# 분류 실행 및 저장
results = []
for feedback in feedbacks:
category = classify_feedback(feedback)
results.append({"피드백": feedback, "카테고리": category})
print(f"[{category}] {feedback}")
with open("classified_feedback.csv", "w", encoding="utf-8-sig", newline="") as f:
writer = csv.DictWriter(f, fieldnames=["피드백", "카테고리"])
writer.writeheader()
writer.writerows(results)
print("\n분류 완료. classified_feedback.csv에 저장되었습니다.")
실전 예제 3 — 다중 턴 대화 챗봇
대화 이력을 유지하면서 맥락을 기억하는 챗봇입니다.
from openai import OpenAI
from dotenv import load_dotenv
import os
load_dotenv()
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
messages = [
{
"role": "system",
"content": "당신은 친절한 Python 학습 도우미입니다. 항상 한국어로 답변하고, 코드 예시를 포함해 설명하세요."
}
]
print("Python 학습 챗봇입니다. 'quit'을 입력하면 종료됩니다.\n")
while True:
user_input = input("질문: ").strip()
if user_input.lower() == "quit":
print("종료합니다.")
break
if not user_input:
continue
messages.append({"role": "user", "content": user_input})
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=messages,
max_tokens=800,
temperature=0.5
)
answer = response.choices[0].message.content
messages.append({"role": "assistant", "content": answer})
print(f"\n답변: {answer}\n")
print(f"[사용 토큰: 입력 {response.usage.prompt_tokens} / 출력 {response.usage.completion_tokens}]\n")
💡 토큰 사용량 출력의 이유: 대화가 길어질수록 누적 토큰이 증가합니다. 매 응답마다 사용량을 확인하면 비용을 실시간으로 파악할 수 있습니다.
비용 최적화 — API를 저렴하게 쓰는 방법
API 비용은 사용 방식에 따라 수십 배 차이가 날 수 있습니다.
비용 절감 핵심 전략
- 모델 선택이 가장 중요합니다 — gpt-4o 대신 gpt-4o-mini로 먼저 테스트하고, 성능이 부족할 때만 상위 모델로 올립니다.
- max_tokens를 반드시 설정합니다 — 설정하지 않으면 GPT가 필요 이상으로 길게 출력해 비용이 증가합니다.
- system 프롬프트는 짧고 명확하게 작성합니다 — system 메시지도 매 요청마다 토큰으로 계산됩니다.
- 불필요한 대화 이력은 잘라냅니다 — 다중 턴 챗봇에서 이전 대화를 모두 유지하면 토큰이 급격히 쌓입니다. 최근 N개 메시지만 유지하는 방식을 고려하십시오.
- Spending Limit을 설정합니다 —
platform.openai.com→ Billing → Spending Limits에서 월 최대 사용 금액을 지정합니다.
자주 발생하는 오류와 해결법
오류 1 — AuthenticationError: API 키 인증 실패
원인: API 키가 잘못되었거나 .env 파일 로딩 실패
해결: load_dotenv() 호출 여부 확인, .env 파일이 스크립트와 같은 폴더에 있는지 확인
오류 2 — RateLimitError: 요청 한도 초과
원인: 짧은 시간에 너무 많은 요청을 보낸 경우
해결: 요청 사이에 time.sleep(1) 추가, 또는 tenacity 라이브러리로 재시도 로직 구현
오류 3 — openai.BadRequestError: 컨텍스트 길이 초과
원인: 입력 텍스트가 모델의 최대 컨텍스트 길이를 초과
해결: 입력 텍스트를 분할해서 처리하거나, 더 긴 컨텍스트를 지원하는 모델로 변경
마무리 — 핵심 요약
✅ OpenAI API 연동 체크리스트
- API 키 발급 —
platform.openai.com에서 발급 후 즉시 복사 - Spending Limit 설정 — 요금 폭탄 방지를 위해 반드시 설정
- API 키는
.env파일로 관리 — 코드에 직접 입력 절대 금지 - 테스트는 gpt-4o-mini로 — 비용이 gpt-4o 대비 30~40배 저렴
- max_tokens 항상 지정 — 출력 길이를 제어해 비용을 예측 가능하게 유지
- temperature는 용도에 맞게 — 정확성 필요 시 낮게, 창의성 필요 시 높게
다음으로 알아두면 좋은 것
OpenAI API에 익숙해졌다면, 이전 편에서 배운 Streamlit과 결합해 사내 전용 AI 챗봇 대시보드를 만들어 보시길 권장합니다. st.chat_message()와 st.chat_input()을 활용하면 ChatGPT와 유사한 인터페이스를 몇십 줄의 코드로 구현할 수 있습니다. 외부 LLM에 의존하지 않고 싶다면 Ollama로 로컬에서 오픈소스 모델을 실행하는 방향도 함께 검토해 보시길 권장합니다.
댓글
댓글 쓰기