LLMLLM API 개발강의 5개 중 1번째난이도 기초

OpenAI API 기초 — 코드로 LLM 호출하기

발행 읽는 시간 약 2 분

  • LLM
  • OpenAI
  • API
  • Python
  • ChatGPT
  • 개발

강의 소개

Python으로 OpenAI API를 호출하는 방법을 처음부터 배웁니다. API 키 설정, 기본 호출, 메시지 구조, 응답 파싱까지 실제 코드와 함께 익힙니다.

프롬프트 창을 벗어나 코드로#

지금까지는 ChatGPT 웹 인터페이스에 직접 입력했습니다. 이제 코드로 LLM을 제어합니다.

API를 통해 LLM을 사용하면:

  • 자동화된 파이프라인 구축
  • 자체 서비스에 AI 기능 탑재
  • 대량 데이터 처리
  • 다른 시스템과 통합

이 모든 것이 가능해집니다.


API 호출 흐름#

Diagram · Mermaid

환경 설정#

Bash
# 패키지 설치
pip install openai python-dotenv

# .env 파일 생성
OPENAI_API_KEY=sk-proj-...

API 키는 절대 코드에 직접 쓰지 마세요. .env 파일에 저장하고 .gitignore에 추가합니다.

Python
# config.py
from dotenv import load_dotenv
import os

load_dotenv()
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")

첫 번째 API 호출#

Python
from openai import OpenAI

client = OpenAI()  # 환경변수에서 API 키 자동 로드

response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[
        {"role": "system", "content": "당신은 친절한 한국어 어시스턴트입니다."},
        {"role": "user", "content": "파이썬이란 무엇인가요? 한 문장으로 설명해줘."}
    ]
)

print(response.choices[0].message.content)
# 출력: 파이썬은 문법이 간결하고 읽기 쉬운 범용 프로그래밍 언어로,
#       데이터 분석, 웹 개발, AI 등 다양한 분야에서 활용됩니다.

메시지 구조 이해하기#

Diagram · Mermaid

대화 기록을 배열로 유지하면 멀티턴 대화가 가능합니다.

Python
# 멀티턴 대화 예시
messages = [
    {"role": "system", "content": "당신은 파이썬 튜터입니다."}
]

while True:
    user_input = input("질문: ")
    if user_input == "exit":
        break
    
    messages.append({"role": "user", "content": user_input})
    
    response = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=messages
    )
    
    assistant_message = response.choices[0].message.content
    messages.append({"role": "assistant", "content": assistant_message})
    
    print(f"답변: {assistant_message}\n")

핵심 파라미터#

Diagram · Mermaid
Python
response = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=messages,
    temperature=0.7,     # 창의성 (0: 결정적, 1: 균형, 2: 매우 창의적)
    max_tokens=500,      # 응답 최대 길이
    top_p=0.9,           # 확률 상위 90% 토큰만 사용
)

temperature 선택 가이드#

작업 유형권장 temperature
코드 생성, SQL 쿼리0~0.2
데이터 추출, 분류0~0.3
일반 질의응답0.5~0.7
창의적 글쓰기0.8~1.2
브레인스토밍1.0~1.5

응답 구조 파싱#

Python
response = client.chat.completions.create(...)

# 응답 텍스트
text = response.choices[0].message.content

# 사용된 토큰 (비용 추적)
input_tokens = response.usage.prompt_tokens
output_tokens = response.usage.completion_tokens
total_tokens = response.usage.total_tokens

# 모델 정보
model_used = response.model

print(f"응답: {text}")
print(f"토큰: 입력 {input_tokens} + 출력 {output_tokens} = {total_tokens}")

비용 계산#

Python
# gpt-4o-mini 기준 (2024년, USD)
INPUT_PRICE = 0.15 / 1_000_000   # $0.15 per 1M tokens
OUTPUT_PRICE = 0.60 / 1_000_000  # $0.60 per 1M tokens

def calculate_cost(usage):
    cost = (
        usage.prompt_tokens * INPUT_PRICE +
        usage.completion_tokens * OUTPUT_PRICE
    )
    return cost

cost = calculate_cost(response.usage)
print(f"이번 호출 비용: ${cost:.6f}")

에러 처리#

Python
from openai import OpenAI, RateLimitError, APIError
import time

client = OpenAI()

def call_with_retry(messages, max_retries=3):
    for attempt in range(max_retries):
        try:
            response = client.chat.completions.create(
                model="gpt-4o-mini",
                messages=messages
            )
            return response.choices[0].message.content
            
        except RateLimitError:
            wait_time = 2 ** attempt  # 지수 백오프
            print(f"요청 한도 초과. {wait_time}초 후 재시도...")
            time.sleep(wait_time)
            
        except APIError as e:
            print(f"API 오류: {e}")
            raise
    
    raise Exception("최대 재시도 횟수 초과")

실전 예시: 텍스트 분류기#

Python
def classify_sentiment(text: str) -> dict:
    response = client.chat.completions.create(
        model="gpt-4o-mini",
        temperature=0,  # 분류는 일관성이 중요
        messages=[
            {
                "role": "system",
                "content": """텍스트의 감정을 분석하고 JSON으로만 응답하세요.
형식: {"sentiment": "positive|negative|neutral", "confidence": 0.0~1.0}"""
            },
            {"role": "user", "content": f"텍스트: {text}"}
        ]
    )
    
    import json
    return json.loads(response.choices[0].message.content)

# 테스트
result = classify_sentiment("이 제품 정말 마음에 들어요! 다음에 또 살게요.")
print(result)  # {'sentiment': 'positive', 'confidence': 0.97}

주요 모델 비교#

모델특징추천 용도
gpt-4o최고 성능복잡한 추론, 코딩
gpt-4o-mini빠르고 저렴대부분의 작업
o1-mini수학·논리복잡한 수학, 알고리즘

정리#

개념내용
OpenAI 클라이언트OpenAI() 인스턴스로 API 호출
messages 배열system/user/assistant 역할로 대화 구성
temperature응답 무작위성 조절 (0~2)
usage입력/출력 토큰 수 및 비용 추적
에러 처리RateLimitError 지수 백오프 재시도

다음 편에서는 스트리밍과 비동기 — 실시간으로 응답을 받아 UX를 개선하는 방법을 배웁니다.

Follow · Ask · Work

이 글이 도움이 됐다면

짧은 작업 기록과 데모는 인스타그램에 올립니다. 만들고 싶은 것이 있다면 프로젝트 의뢰나 협업 제안도 편하게 보내 주세요.

글쓴이

파란여우

직접 만든 AI 앱·제품의 개발·배포를 공개하는 실전형 테크 크리에이터

파란여우 소개 Instagram @bluefox._.hi

이어서 보기

만들고 싶은 것이 있다면 프로젝트 의뢰로 알려 주세요.