포스트

[Python 100일 챌린지] Day 97 - ChatGPT API 활용하기

[Python 100일 챌린지] Day 97 - ChatGPT API 활용하기

드디어 진짜 AI와 대화한다! ChatGPT API를 Python에서 사용하는 방법을 배웁니다. 나만의 AI 비서, 번역기, 요약봇… 무엇이든 만들 수 있어요! 오늘부터 여러분도 AI 개발자입니다!

(40분 완독 ⭐⭐⭐⭐)

🎯 오늘의 학습 목표

📚 사전 지식


🎯 학습 목표 1: OpenAI API 키 발급받기

1단계: OpenAI 계정 생성

  1. OpenAI 웹사이트 접속
  2. 계정 생성 (이메일, Google, Microsoft 계정)
  3. 전화번호 인증

2단계: API 키 생성

  1. API Keys 페이지 이동
  2. “Create new secret key” 클릭
  3. API 키 복사 및 안전하게 보관

⚠️ 중요: API 키는 절대 공개하지 마세요!

3단계: 라이브러리 설치

1
pip install openai

4단계: API 키 관리

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# ❌ 잘못된 방법: 코드에 직접 작성
api_key = "sk-proj-xxxxx"  # 절대 이렇게 하지 마세요!

# ✅ 올바른 방법 1: 환경 변수
import os
api_key = os.getenv("OPENAI_API_KEY")

# ✅ 올바른 방법 2: .env 파일 (추천!)
# .env 파일 생성
# OPENAI_API_KEY=sk-proj-xxxxx

from dotenv import load_dotenv
load_dotenv()
api_key = os.getenv("OPENAI_API_KEY")

.env 파일 사용하기

1
2
3
4
# pip install python-dotenv 설치 후

# .env 파일 생성 (프로젝트 루트)
OPENAI_API_KEY=your-api-key-here
1
2
3
4
5
6
7
# Python 코드
from dotenv import load_dotenv
import os

load_dotenv()  # .env 파일 로드
api_key = os.getenv("OPENAI_API_KEY")
print("API 키 로드 완료!" if api_key else "API 키 없음!")

🎯 학습 목표 2: ChatGPT API로 대화하기

모델 선택하기

OpenAI API에서는 용도에 따라 GPT-5 시리즈에서 선택할 수 있습니다:

모델 특징 추천 용도
gpt-5-nano 가장 빠르고 저렴 ($0.05 / 1M 입력 토큰) 학습, 프로토타입, 분류, 요약
gpt-5-mini 빠르고 저렴하면서 똑똑 ($0.25 / 1M 입력 토큰) 일반 작업, 프로덕션 워크로드
gpt-5 최고 성능 ($1.25 / 1M 입력 토큰) 고품질 답변, 복잡한 추론

오늘 학습에서는 가장 코스파가 좋은 gpt-5-nano를 사용합니다!

최신 모델 목록은 OpenAI 공식 문서에서 확인하세요. ※ 이전의 gpt-3.5-turbo, gpt-4o 시리즈는 구세대 모델이 되었습니다.

첫 번째 대화 (Responses API)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from openai import OpenAI
import os

# 클라이언트 생성
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))

# ChatGPT에게 질문하기
response = client.responses.create(
    model="gpt-5-nano",
    instructions="You are a helpful assistant.",
    input="Python이 뭔가요?"
)

# 답변 출력
print(response.output_text)

출력 예시:

1
2
Python은 1991년 귀도 반 로썸이 개발한 고급 프로그래밍 언어입니다.
배우기 쉽고, 읽기 쉬운 문법을 가지고 있어 초보자에게 인기가 많습니다...

참고: instructions는 AI의 역할/성격을 설정하는 파라미터입니다. 이전의 system role에 해당합니다.

메시지 역할으로 대화하기

더 세밀한 제어가 필요할 때는 input에 메시지 배열을 전달할 수 있습니다:

1
2
3
4
5
6
7
8
9
10
11
12
response = client.responses.create(
    model="gpt-5-nano",
    input=[
        # developer: AI의 성격/역할 설정 (= 이전의 system)
        {"role": "developer", "content": "당신은 친절한 Python 선생님입니다."},

        # user: 사용자 질문
        {"role": "user", "content": "for 루프가 뭐예요?"}
    ]
)

print(response.output_text)

대화 이어가기

Responses API는 previous_response_id로 대화를 자동으로 이어갈 수 있습니다:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from openai import OpenAI
import os

client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))

# 첫 번째 질문
response = client.responses.create(
    model="gpt-5-nano",
    instructions="당신은 Python 전문가입니다.",
    input="리스트란 무엇인가요?"
)

print("AI:", response.output_text)

# 두 번째 질문 (이전 대화를 자동으로 기억!)
response = client.responses.create(
    model="gpt-5-nano",
    previous_response_id=response.id,
    input="예제 코드 보여주세요"
)

print("\nAI:", response.output_text)

포인트: previous_response_id를 전달하면 이전 대화 내용을 자동으로 기억합니다. 직접 메시지 히스토리를 관리할 필요가 없어요!

참고: Chat Completions API (이전 방식)

기존 튜토리얼이나 코드에서 아래 방식을 볼 수 있습니다. 여전히 지원되지만, 새 프로젝트에는 위의 Responses API를 권장합니다:

1
2
3
4
5
6
7
8
9
# Chat Completions API (이전 방식)
response = client.chat.completions.create(
    model="gpt-5-nano",
    messages=[
        {"role": "system", "content": "역할 설정"},
        {"role": "user", "content": "질문"}
    ]
)
answer = response.choices[0].message.content

Responses API와의 차이점:

  • messages=input= / instructions=
  • "role": "system"instructions 파라미터 또는 "role": "developer"
  • response.choices[0].message.contentresponse.output_text
  • 대화 관리를 수동으로 해야 함 → previous_response_id로 자동 관리

🎯 학습 목표 3: 실전 AI 애플리케이션 만들기

예제 1: AI 번역기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from openai import OpenAI
import os

client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))

def translate(text, target_language):
    """텍스트를 목표 언어로 번역"""
    response = client.responses.create(
        model="gpt-5-nano",
        instructions=f"당신은 전문 번역가입니다. 모든 텍스트를 {target_language}로 번역하세요.",
        input=text
    )
    return response.output_text

# 사용 예시
korean_text = "안녕하세요. Python을 공부하고 있습니다."
english = translate(korean_text, "영어")
print(f"영어: {english}")

japanese = translate(korean_text, "일본어")
print(f"일본어: {japanese}")

출력:

1
2
영어: Hello. I am studying Python.
일본어: こんにちは。Pythonを勉強しています。

예제 2: 문서 요약기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def summarize(text, max_sentences=3):
    """긴 텍스트를 요약"""
    response = client.responses.create(
        model="gpt-5-nano",
        instructions=f"다음 텍스트를 {max_sentences}문장으로 요약하세요.",
        input=text
    )
    return response.output_text

# 긴 텍스트
long_text = """
Python은 1991년 귀도 반 로썸이 개발한 프로그래밍 언어입니다.
문법이 간결하고 읽기 쉬워 초보자에게 인기가 많습니다.
데이터 분석, 웹 개발, 인공지능 등 다양한 분야에서 사용됩니다.
NumPy, Pandas, Django, TensorFlow 등 강력한 라이브러리가 있습니다.
전 세계적으로 가장 인기 있는 프로그래밍 언어 중 하나입니다.
"""

summary = summarize(long_text, max_sentences=2)
print("요약:", summary)

예제 3: AI 챗봇 (대화형)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
from openai import OpenAI
import os

client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))

def chatbot():
    """간단한 AI 챗봇"""
    print("AI 챗봇 시작! ('quit'으로 종료)")
    print("-" * 50)

    previous_id = None  # 대화 이력 추적용

    while True:
        # 사용자 입력
        user_input = input("\n나: ")

        if user_input.lower() in ['quit', 'exit', '종료']:
            print("챗봇을 종료합니다.")
            break

        # AI 응답 (이전 대화를 자동으로 이어감)
        response = client.responses.create(
            model="gpt-5-nano",
            instructions="당신은 친근한 AI 친구입니다. 짧고 명확하게 답변하세요.",
            input=user_input,
            **({"previous_response_id": previous_id} if previous_id else {})
        )

        print(f"AI: {response.output_text}")
        previous_id = response.id  # 다음 대화를 위해 ID 저장

# 실행
# chatbot()  # 주석 해제하고 실행하세요

예제 4: 코드 설명기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def explain_code(code):
    """Python 코드를 자연어로 설명"""
    response = client.responses.create(
        model="gpt-5-nano",
        instructions="당신은 Python 코드를 초보자에게 쉽게 설명하는 전문가입니다.",
        input=f"다음 코드를 설명해주세요:\n\n{code}"
    )
    return response.output_text

# 사용 예시
code = """
def factorial(n):
    if n == 0:
        return 1
    return n * factorial(n-1)
"""

explanation = explain_code(code)
print(explanation)

출력 예시:

1
2
3
4
이 함수는 팩토리얼을 계산합니다.
- n이 0이면 1을 반환합니다 (기저 사례).
- 그렇지 않으면 n과 factorial(n-1)을 곱합니다 (재귀 호출).
예: factorial(5) = 5 × 4 × 3 × 2 × 1 = 120

💻 고급 기능

1. 온도(Temperature) 조절

창의성 vs 일관성

1
2
3
4
5
6
7
8
9
10
11
12
13
# 온도 낮음 (0.0~0.3): 일관적, 예측 가능
response = client.responses.create(
    model="gpt-5-nano",
    temperature=0.1,
    input="Python이란?"
)

# 온도 높음 (0.7~1.0): 창의적, 다양함
response = client.responses.create(
    model="gpt-5-nano",
    temperature=0.9,
    input="Python이란?"
)

2. 최대 토큰 제한

1
2
3
4
5
response = client.responses.create(
    model="gpt-5-nano",
    max_output_tokens=50,  # 최대 50토큰 (약 37단어)
    input="Python 설명해줘"
)

3. 스트리밍 (실시간 출력)

1
2
3
4
5
6
7
8
9
10
11
stream = client.responses.create(
    model="gpt-5-nano",
    input="Python의 장점 5가지",
    stream=True
)

print("AI: ", end="")
for event in stream:
    if event.type == "response.output_text.delta":
        print(event.delta, end="", flush=True)
print()

💰 비용 관리

토큰 계산

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def count_tokens(text):
    """대략적인 토큰 수 계산 (한국어: 1글자 ≈ 2토큰)"""
    # 실제로는 tiktoken 라이브러리 사용 권장
    return len(text) * 2

text = "안녕하세요"
tokens = count_tokens(text)
print(f"{text}: 약 {tokens} 토큰")

# gpt-5-nano 가격 (2026년 기준, 변동 가능)
# 입력: $0.05 / 1M tokens
# 출력: $0.40 / 1M tokens
cost = (tokens / 1_000_000) * 0.05
print(f"예상 비용: ${cost:.6f}")

비용 절약 팁

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 1. 짧은 프롬프트 사용
# ❌ 긴 프롬프트
prompt = "Python is a programming language... (긴 설명)"

# ✅ 짧은 프롬프트
prompt = "Python 설명해줘"

# 2. max_output_tokens 제한
response = client.responses.create(
    model="gpt-5-nano",
    max_output_tokens=100,  # 최대 토큰 제한
    input="..."
)

# 3. 대화 히스토리 관리
# 오래된 대화는 삭제
if len(conversation) > 10:
    conversation = conversation[-10:]  # 최근 10개만 유지

⚠️ 주의사항

1. API 키 보안

1
2
3
4
5
6
7
# ❌ GitHub에 업로드 금지!
# - .env 파일
# - API 키가 들어간 코드

# ✅ .gitignore에 추가
# .env
# config.py

2. 에러 처리

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from openai import OpenAI
import os

client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))

try:
    response = client.responses.create(
        model="gpt-5-nano",
        input="Hello"
    )
    print(response.output_text)

except Exception as e:
    print(f"오류 발생: {e}")
    print("API 키를 확인하세요!")

3. 비용 모니터링

OpenAI Usage 페이지에서 사용량 확인!


📝 요약

  1. API 키: .env 파일로 안전하게 관리
  2. 기본 사용: client.responses.create() (Responses API)
  3. 역할 설정: instructions 파라미터 또는 "role": "developer"
  4. 대화 이어가기: previous_response_id로 대화 히스토리 자동 관리
  5. 고급 옵션: temperature(창의성), max_output_tokens(길이 제한)
  6. 비용: 토큰 단위로 과금, 사용량 모니터링 필수

🤔 자주 묻는 질문 (FAQ)

Q1: API 키는 어디서 받나요? 무료인가요?

A:

  1. OpenAI 웹사이트에서 가입
  2. 이전에는 무료 크레딧이 있었지만 현재는 폐지되었습니다
  3. 최소 $5 크레딧을 구매하여 API 이용을 시작합니다
  4. 사용한 만큼만 과금되는 종량제입니다

비용 예시 (2026년 기준, 변동 가능):

  • gpt-5-nano: $0.05 / 1M 입력 토큰 (놀랄 만큼 저렴!)
  • gpt-5-mini: $0.25 / 1M 입력 토큰
  • gpt-5: $1.25 / 1M 입력 토큰
  • 간단한 질문 1000개 (gpt-5-nano) ≈ 약 $0.01 정도

: gpt-5-nano는 놀랍도록 저렴해서 $5면 엄청난 양을 실험할 수 있어요!

Q2: API 키를 GitHub에 올렸어요. 어떻게 하나요?

A: 🚨 즉시 조치해야 합니다!

1단계: API 키 삭제

  • OpenAI 웹사이트 → API Keys → 해당 키 Delete

2단계: 새 키 생성

  • Create new secret key 클릭

3단계: 올라간 코드 수정

  • .env 파일 사용으로 변경
  • .gitignore에 .env 추가
    1
    2
    3
    4
    
    # .gitignore
    .env
    *.env
    config.py
    

4단계: Git 히스토리에서 완전 제거 (고급)

1
2
3
git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch .env' \
--prune-empty --tag-name-filter cat -- --all

중요: 삭제 후 다시 커밋하는 것만으로는 부족합니다. Git 히스토리에 남아있어요!

Q3: “Rate limit exceeded” 에러가 나와요!

A: API 호출 횟수 제한에 걸렸습니다.

제한 기준 (변동 가능):

  • Free Tier: 분당 3회 요청
  • Tier 1 ($5 이상 충전): 분당 500회 요청
  • 사용량에 따라 자동으로 Tier가 올라갑니다

해결 방법:

  1. 잠시 기다리기: 1분 후 다시 시도
  2. 크레딧 충전: Tier 1 이상에서 제한이 대폭 완화됩니다
  3. 요청 간격 두기: ```python import time

for i in range(10): response = client.responses.create(…) time.sleep(20) # 20초 대기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
### Q4: temperature를 얼마로 설정해야 하나요?

**A**: 용도에 따라 다릅니다!

| Temperature | 용도 | 특징 |
|-------------|------|------|
| **0.0 ~ 0.3** | 정확한 답변, 번역, 요약 | 일관적, 예측 가능 |
| **0.5 ~ 0.7** | 일반적인 대화 | 균형잡힌 답변 |
| **0.8 ~ 1.0** | 창작, 브레인스토밍 | 창의적, 다양함 |

**추천**:
- 처음엔 **0.7** (기본값)로 시작
- 너무 창의적이면 낮추고, 지루하면 높이세요!

### Q5: 한국어로 질문해도 되나요?

**A**: 네! ChatGPT는 한국어를 잘 이해합니다. 하지만:

**프롬프트는 영어가 더 좋은 경우**:
```python
# ✅ 영어 instructions (추천)
response = client.responses.create(
    model="gpt-5-nano",
    instructions="You are a helpful assistant. Answer in Korean.",
    input="Python이 뭔가요?"
)

# ✅ 한국어 instructions (괜찮음)
response = client.responses.create(
    model="gpt-5-nano",
    instructions="당신은 친절한 어시스턴트입니다.",
    input="Python이 뭔가요?"
)

이유: OpenAI 모델은 영어로 학습된 데이터가 훨씬 많아서 영어 프롬프트가 더 정확할 수 있어요. 하지만 한국어도 충분히 잘 작동합니다!

Q6: 비용을 어떻게 절약하나요?

A: 다음 팁들을 따라해보세요!

  1. max_output_tokens 설정:
    1
    2
    3
    4
    5
    
    response = client.responses.create(
     model="gpt-5-nano",
     max_output_tokens=100,  # 짧은 답변만
     input="..."
    )
    
  2. 짧은 프롬프트 사용: ```python

    ❌ 비효율: 긴 설명

    “당신은 매우 친절하고 상세하게 설명하는 전문가입니다. 사용자의 질문에 최선을 다해…”

✅ 효율적: 짧고 명확

“당신은 Python 전문가입니다.”

1
2
3
4
5
6
3. **대화 이력 관리**:
```python
# 최근 10개 메시지만 유지
if len(conversation) > 10:
    conversation = conversation[-10:]
  1. gpt-5-nano 사용: GPT-5 시리즈에서 가장 코스파가 좋아요!

🧪 연습 문제

문제: 감정 분석기 만들기

주어진 텍스트의 감정을 분석하는 함수를 만들어보세요.

1
2
3
4
5
6
7
8
9
def analyze_sentiment(text):
    # TODO:
    # 텍스트의 감정을 "긍정", "부정", "중립" 중 하나로 분석
    # ChatGPT API 사용
    pass

# 테스트
print(analyze_sentiment("오늘 너무 행복해요!"))  # 긍정
print(analyze_sentiment("최악이야..."))  # 부정
✅ 정답
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from openai import OpenAI
import os

client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))

def analyze_sentiment(text):
    response = client.responses.create(
        model="gpt-5-nano",
        instructions="텍스트의 감정을 '긍정', '부정', '중립' 중 하나로만 답변하세요.",
        input=text
    )
    return response.output_text.strip()

# 테스트
print(analyze_sentiment("오늘 너무 행복해요!"))  # 긍정
print(analyze_sentiment("최악이야..."))  # 부정
print(analyze_sentiment("날씨가 흐리네요"))  # 중립

📚 이전 학습

Day 96: 모델 평가하기 ⭐⭐⭐


📚 다음 학습

Day 98: 종합 프로젝트 1 - 주식 예측 시스템 ⭐⭐⭐⭐

내일은 지금까지 배운 모든 것을 활용한 실전 프로젝트를 시작합니다!


“늦었다고 생각할 때가 가장 빠른 때입니다. 오늘도 한 걸음 성장했어요!” 🚀

Day 97/100 Phase 10: AI/ML 입문 #100DaysOfPython
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.