포스트

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

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

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

(40분 완독 ⭐⭐⭐⭐)

🎯 오늘의 학습 목표

📚 사전 지식

  • Day 59: requests 라이브러리 기초
  • Day 38: JSON 파일 다루기
  • 영어 기초 (API 문서 읽기)

🎯 학습 목표 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로 대화하기

첫 번째 대화 (최신 방식)

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

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

# ChatGPT에게 질문하기
response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Python이 뭔가요?"}
    ]
)

# 답변 출력
answer = response.choices[0].message.content
print(answer)

출력 예시:

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

메시지 역할 이해하기

1
2
3
4
5
6
7
8
9
10
11
12
13
messages = [
    # system: AI의 성격/역할 설정
    {"role": "system", "content": "당신은 친절한 Python 선생님입니다."},

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

    # assistant: AI 답변 (대화 히스토리)
    {"role": "assistant", "content": "for 루프는 반복문입니다..."},

    # 다음 질문
    {"role": "user", "content": "예제 보여주세요"}
]

대화 이어가기

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
from openai import OpenAI
import os

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

# 대화 히스토리 저장
conversation = [
    {"role": "system", "content": "당신은 Python 전문가입니다."}
]

# 첫 번째 질문
conversation.append({"role": "user", "content": "리스트란 무엇인가요?"})

response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=conversation
)

answer = response.choices[0].message.content
print("AI:", answer)

# 답변을 대화에 추가
conversation.append({"role": "assistant", "content": answer})

# 두 번째 질문 (이전 대화 기억)
conversation.append({"role": "user", "content": "예제 코드 보여주세요"})

response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=conversation
)

answer = response.choices[0].message.content
print("\nAI:", answer)

🎯 학습 목표 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
22
23
from openai import OpenAI
import os

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

def translate(text, target_language):
    """텍스트를 목표 언어로 번역"""
    response = client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=[
            {"role": "system", "content": f"당신은 전문 번역가입니다. 모든 텍스트를 {target_language}로 번역하세요."},
            {"role": "user", "content": text}
        ]
    )
    return response.choices[0].message.content

# 사용 예시
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
21
22
def summarize(text, max_sentences=3):
    """긴 텍스트를 요약"""
    response = client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=[
            {"role": "system", "content": f"다음 텍스트를 {max_sentences}문장으로 요약하세요."},
            {"role": "user", "content": text}
        ]
    )
    return response.choices[0].message.content

# 긴 텍스트
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
34
35
36
37
38
39
from openai import OpenAI
import os

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

def chatbot():
    """간단한 AI 챗봇"""
    conversation = [
        {"role": "system", "content": "당신은 친근한 AI 친구입니다. 짧고 명확하게 답변하세요."}
    ]

    print("AI 챗봇 시작! ('quit'으로 종료)")
    print("-" * 50)

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

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

        # 대화에 추가
        conversation.append({"role": "user", "content": user_input})

        # AI 응답
        response = client.chat.completions.create(
            model="gpt-3.5-turbo",
            messages=conversation
        )

        answer = response.choices[0].message.content
        print(f"AI: {answer}")

        # 응답을 대화에 추가
        conversation.append({"role": "assistant", "content": answer})

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

예제 4: 코드 설명기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def explain_code(code):
    """Python 코드를 자연어로 설명"""
    response = client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=[
            {"role": "system", "content": "당신은 Python 코드를 초보자에게 쉽게 설명하는 전문가입니다."},
            {"role": "user", "content": f"다음 코드를 설명해주세요:\n\n{code}"}
        ]
    )
    return response.choices[0].message.content

# 사용 예시
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.chat.completions.create(
    model="gpt-3.5-turbo",
    temperature=0.1,
    messages=[{"role": "user", "content": "Python이란?"}]
)

# 온도 높음 (0.7~1.0): 창의적, 다양함
response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    temperature=0.9,
    messages=[{"role": "user", "content": "Python이란?"}]
)

2. 최대 토큰 제한

1
2
3
4
5
response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    max_tokens=50,  # 최대 50토큰 (약 37단어)
    messages=[{"role": "user", "content": "Python 설명해줘"}]
)

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

1
2
3
4
5
6
7
8
9
10
11
response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    stream=True,
    messages=[{"role": "user", "content": "Python의 장점 5가지"}]
)

print("AI: ", end="")
for chunk in response:
    if chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, 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-3.5-turbo 가격 (2025년 기준, 변동 가능)
# 입력: $0.0005 / 1K tokens
# 출력: $0.0015 / 1K tokens
cost = (tokens / 1000) * 0.0005
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_tokens 제한
response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    max_tokens=100,  # 최대 토큰 제한
    messages=[...]
)

# 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.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=[{"role": "user", "content": "Hello"}]
    )
    print(response.choices[0].message.content)

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

3. 비용 모니터링

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


📝 요약

  1. API 키: .env 파일로 안전하게 관리
  2. 기본 사용: client.chat.completions.create()
  3. 메시지 역할: system(설정), user(질문), assistant(답변)
  4. 고급 옵션: temperature(창의성), max_tokens(길이 제한)
  5. 비용: 토큰 단위로 과금, 사용량 모니터링 필수

🤔 자주 묻는 질문 (FAQ)

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

A:

  1. OpenAI 웹사이트에서 가입
  2. 신규 가입 시 $5 무료 크레딧 제공 (변동 가능)
  3. 무료 크레딧 소진 후에는 사용한 만큼 결제

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

  • GPT-3.5-turbo: $0.0005 / 1K 입력 토큰
  • 간단한 질문 1000개 ≈ $1 정도

: 처음엔 무료 크레딧으로 충분히 연습할 수 있어요! 😊

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 호출 횟수 제한에 걸렸습니다.

무료 계정 제한:

  • 분당 3회 요청
  • 일당 200회 요청 (변동 가능)

해결 방법:

  1. 잠시 기다리기: 1분 후 다시 시도
  2. 유료 플랜: 제한이 훨씬 높아집니다
  3. 요청 간격 두기: ```python import time

for i in range(10): response = client.chat.completions.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
### Q4: temperature를 얼마로 설정해야 하나요?

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

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

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

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

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

**프롬프트는 영어가 더 좋은 경우**:
```python
# ✅ 영어 프롬프트 (추천)
{"role": "system", "content": "You are a helpful assistant. Answer in Korean."}

# ✅ 한국어 프롬프트 (괜찮음)
{"role": "system", "content": "당신은 친절한 어시스턴트입니다."}

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

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

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

  1. max_tokens 설정:
    1
    2
    3
    
    response = client.chat.completions.create(
     max_tokens=100  # 짧은 답변만
    )
    
  2. 짧은 프롬프트 사용: ```python

    ❌ 비효율: 긴 설명

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

✅ 효율적: 짧고 명확

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

1
2
3
4
5
6
3. **대화 이력 관리**:
```python
# 최근 10개 메시지만 유지
if len(conversation) > 10:
    conversation = conversation[-10:]
  1. GPT-3.5-turbo 사용: GPT-4보다 10배 저렴!

🧪 연습 문제

문제: 감정 분석기 만들기

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

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
18
19
from openai import OpenAI
import os

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

def analyze_sentiment(text):
    response = client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=[
            {"role": "system", "content": "텍스트의 감정을 '긍정', '부정', '중립' 중 하나로만 답변하세요."},
            {"role": "user", "content": text}
        ]
    )
    return response.choices[0].message.content.strip()

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

📚 다음 학습

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

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


“ChatGPT API로 무엇이든 만들 수 있습니다. 상상력이 한계입니다!” 🚀

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