16.Python으로 OpenAI API 연동하기 — GPT를 내 코드에 붙이는 완벽 가이드

저도 처음에는 ChatGPT 웹사이트에 들어가서 질문을 입력하고 답변을 받는 식으로만 사용했어요. 그러다 문득 '이 강력한 인공지능을 내 파이썬 코드 안으로 직접 가져올 수 없을까?'라는 생각이 들었고, OpenAI API의 존재를 알게 되면서 개발의 신세계가 열렸습니다. 하지만 처음엔 시행착오도 컸어요. API 키를 환경변수로 관리하지 않고 코드에 그대로 노출한 채 GitHub에 올리거나, 무한 루프 코드 때문에 순식간에 API 요금이 폭탄처럼 청구되는 아찔한 경험을 했거든요. 그때 보안과 비용 제어의 중요성을 뼈저리게 배웠는데, 여러분은 저 같은 실수를 하지 않도록 안전하게 API를 연동하는 노하우를 모두 공유해 드릴게요.

이 글에서는 OpenAI API 키 발급부터 Python 연동, 핵심 파라미터 이해, 실전 활용 예제, 그리고 비용을 예측하고 관리하는 방법까지 — 처음 시작하는 분도 바로 따라 할 수 있도록 안내해 드리겠습니다.


OpenAI API란 무엇인가 — ChatGPT를 내 프로그램 안으로 데려오는 일

ChatGPT는 브라우저에서 대화창에 질문을 입력하면 답변을 받는 방식입니다. 편리하지만 한계가 있습니다. 매번 직접 입력해야 하고, 다른 프로그램과 연결하거나 자동화하기 어렵습니다.

OpenAI API는 이 ChatGPT의 두뇌를 내 Python 코드에서 직접 호출할 수 있게 해주는 통로입니다. 레스토랑에 비유하면, 지금까지는 홀에 앉아 직접 주문했다면, API는 주방과 직접 연결된 전용 통화선을 갖는 것과 같습니다. 내 프로그램이 원하는 시점에 원하는 내용을 GPT에게 물어보고, 결과를 받아 다음 작업에 바로 활용할 수 있습니다.

API 연동으로 가능해지는 것들

  • 문서 자동 요약 — 매일 쌓이는 보고서를 GPT가 자동으로 3줄 요약
  • 이메일 초안 자동 생성 — 입력된 키워드만으로 비즈니스 메일 작성
  • CSV 데이터 분류 — 수백 개 고객 피드백을 카테고리별로 자동 분류
  • 챗봇 구축 — Streamlit과 결합해 사내 전용 AI 어시스턴트 제작
  • 코드 리뷰 자동화 — 작성한 코드를 GPT에게 보내 문제점 피드백 수신

API 키 발급하기 — 가장 먼저 해야 할 일

발급 순서

  1. platform.openai.com 에 접속해 로그인합니다.
  2. 우측 상단 계정 메뉴 → API Keys 를 선택합니다.
  3. Create new secret key 버튼을 클릭합니다.
  4. 키 이름을 입력하고 생성합니다.
  5. 생성된 키를 즉시 복사해 안전한 곳에 저장합니다.

⚠️ 절대 주의사항: 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.comUsage 메뉴에서 **월 사용 한도(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의 메시지는 항상 rolecontent 쌍으로 구성됩니다.

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 연동 체크리스트

  1. API 키 발급platform.openai.com에서 발급 후 즉시 복사
  2. Spending Limit 설정 — 요금 폭탄 방지를 위해 반드시 설정
  3. API 키는 .env 파일로 관리 — 코드에 직접 입력 절대 금지
  4. 테스트는 gpt-4o-mini로 — 비용이 gpt-4o 대비 30~40배 저렴
  5. max_tokens 항상 지정 — 출력 길이를 제어해 비용을 예측 가능하게 유지
  6. temperature는 용도에 맞게 — 정확성 필요 시 낮게, 창의성 필요 시 높게

다음으로 알아두면 좋은 것

OpenAI API에 익숙해졌다면, 이전 편에서 배운 Streamlit과 결합해 사내 전용 AI 챗봇 대시보드를 만들어 보시길 권장합니다. st.chat_message()st.chat_input()을 활용하면 ChatGPT와 유사한 인터페이스를 몇십 줄의 코드로 구현할 수 있습니다. 외부 LLM에 의존하지 않고 싶다면 Ollama로 로컬에서 오픈소스 모델을 실행하는 방향도 함께 검토해 보시길 권장합니다.



댓글

이 블로그의 인기 게시물

1.Python 설치부터 실행까지 10분 만에 끝내기 — 초보자도 바로 따라 하는 완벽 가이드

30.Python pyautogui로 마우스와 키보드 자동화하기: VSCode 실전 가이드

29.Python subprocess로 외부 명령어 실행하기: VSCode 실전 활용법