10.1 Flask, FastAPI 기반 OpenAI 서비스 구축

10.1 Flask, FastAPI 기반 OpenAI 서비스 구축

OpenAI API를 실제 서비스로 구축하기 위해서는 웹 서버를 통해 외부로부터의 요청을 받고 이를 API 호출로 처리한 결과를 응답하는 과정을 설계해야 합니다. Python 기반 웹 프레임워크인 Flask와 FastAPI는 이러한 작업에 매우 적합한 도구입니다. 본 절에서는 다양한 환경에 적용할 수 있도록 두 프레임워크 기반에서의 실전 구축 방식을 상세히 다룹니다.

🔍 1. Flask vs FastAPI: 어떤 것을 선택할까?

항목
Flask
FastAPI

출시 시기

2010년

2018년

비동기 지원

미약 (추가 패키지 필요)

기본 지원 (async/await 기반)

문서화

수동 Swagger 생성

자동 Swagger (OpenAPI) 문서

학습 곡선

낮음

중간

성능

보통

빠름

커뮤니티/생태계

매우 큼

빠르게 성장 중

  • 간단한 프로토타입, 학습 목적 → Flask 추천

  • 비동기 API, 성능 중요, FastAPI 특화 기능 활용 → FastAPI 추천

두 프레임워크 모두 OpenAI API와 연동이 가능하며, 응답 처리, 라우팅, 에러 핸들링 등 핵심 기능을 충분히 지원합니다.

🧱 2. 서비스 구조 개요

OpenAI API를 활용한 Flask 또는 FastAPI 기반 서비스의 일반 구조는 다음과 같습니다:

 클라이언트 (브라우저/앱)

 Python 웹 서버 (Flask/FastAPI)

   OpenAI API 호출

  결과 반환 및 응답
  • 사용자의 입력을 POST 방식으로 서버에 전달

  • 서버는 OpenAI API에 전달 → 응답

  • 받은 응답을 적절히 가공하여 클라이언트에 반환

⚙️ 3. Flask 기반 OpenAI 챗봇 서버 구축

3.1 환경 설정 및 필요 패키지 설치

pip install flask openai python-dotenv

.env 파일을 생성하여 민감정보 저장:

OPENAI_API_KEY=sk-xxxxx

3.2 기본 서버 코드 구성

# app.py
import os
from flask import Flask, request, jsonify
import openai
from dotenv import load_dotenv

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

app = Flask(__name__)

@app.route("/chat", methods=["POST"])
def chat():
    data = request.get_json()
    user_input = data.get("message", "")

    try:
        response = openai.ChatCompletion.create(
            model="gpt-3.5-turbo",  # 또는 "gpt-4"
            messages=[
                {"role": "system", "content": "당신은 친절한 도우미입니다."},
                {"role": "user", "content": user_input}
            ]
        )
        result = response['choices'][0]['message']['content']
        return jsonify({"response": result})
    except Exception as e:
        return jsonify({"error": str(e)}), 500

if __name__ == "__main__":
    app.run(debug=True)

3.3 테스트 예시 (curl 또는 Postman)

curl -X POST http://localhost:5000/chat \
    -H "Content-Type: application/json" \
    -d '{"message": "GPT에게 자기소개를 해줘"}'

➡️ 반환 예시:

{
  "response": "안녕하세요! 저는 OpenAI가 만든 GPT입니다. 무엇을 도와드릴까요?"
}

⚙️ 4. FastAPI 기반 OpenAI 챗봇 서버 구축

FastAPI를 사용할 경우 비동기 처리와 문서 자동화의 이점을 누릴 수 있습니다.

4.1 설치 및 초기 설정

pip install fastapi uvicorn openai python-dotenv

4.2 기본 서버 코드 구성

# main.py
import os
import openai
from fastapi import FastAPI, Request
from pydantic import BaseModel
from dotenv import load_dotenv

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

app = FastAPI()

class ChatRequest(BaseModel):
    message: str

@app.post("/chat")
async def chat(request: ChatRequest):
    try:
        response = openai.ChatCompletion.create(
            model="gpt-3.5-turbo",
            messages=[
                {"role": "system", "content": "당신은 매우 유익한 챗봇입니다."},
                {"role": "user", "content": request.message}
            ]
        )
        result = response['choices'][0]['message']['content']
        return {"response": result}
    except Exception as e:
        return {"error": str(e)}

4.3 서버 실행

uvicorn main:app --reload

4.4 자동 문서 확인

FastAPI는 OpenAPI 문서를 자동으로 생성합니다:

  • 기본 문서: http://localhost:8000/docs

  • ReDoc 스타일: http://localhost:8000/redoc

🧯 5. 에러 처리 및 검증 강화 (FastAPI 기준)

from fastapi.responses import JSONResponse
from fastapi.exceptions import RequestValidationError
from fastapi.middleware.cors import CORSMiddleware

# CORS 허용 (for frontend)
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],  # 또는 특정 origin만
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request, exc):
    return JSONResponse(
        status_code=400,
        content={"error": "입력 형식이 잘못되었습니다."}
    )
  • 잘못된 입력 처리

  • 프론트엔드에서 접근 가능하도록 CORS 처리

  • 예외 리턴 시 JSON 형식 유지

🔐 6. 보안: API Key 보호를 위한 환경 파일 사용

절대 API 키를 코드에 직접 하드코딩하지 마십시오.

# 안전한 방식
from dotenv import load_dotenv
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
  • production 환경에서는 .env를 git에 포함하지 않도록 .gitignore에 포함해야 합니다.

🧪 7. 지속적 개선을 위한 구조 분리 (모듈화 예시)

추천 구조:

- app/
  - __init__.py
  - main.py
  - routes/
      - chat.py
  - services/
      - openai_service.py
- .env
- requirements.txt

services/openai_service.py 예시:

import openai
from typing import List, Dict

def ask_chatgpt(messages: List[Dict[str, str]], model="gpt-3.5-turbo"):
    response = openai.ChatCompletion.create(
        model=model,
        messages=messages
    )
    return response["choices"][0]["message"]["content"]

이러한 구조를 통해 배포 및 운영 규모가 커질 때 유지보수가 쉬워집니다.

🚀 8. 간단한 확장 예시: Chat History 유지

응답만 반환하는 것이 아닌, 이전 대화를 유지하려면 프론트에서 히스토리 배열을 유지하거나 서버에 세션 저장 기능이 필요합니다.

messages = [
    {"role": "system", "content": "당신은 기술 지원 도우미입니다."},
    {"role": "user", "content": "노트북이 부팅이 안돼요"},
    {"role": "assistant", "content": "전원이 켜지지 않나요? 충전기는 연결되어 있나요?"},
    {"role": "user", "content": "네, 연결되어 있어요"}
]

이처럼 message 배열을 누적하여 전달하면 보다 자연스러운 대화 흐름이 유지됩니다.

✅ 정리

항목
Flask
FastAPI

사용 난이도

쉬움

약간 더 복잡

비동기 지원

기본 미지원

비동기 기반 구조화

문서 자동화

없음

Swagger 자동 제공

추천 사용처

교육용, 간단한 백엔드

프로덕션, 성능 요구 큰 API

OpenAI 기반의 실제 서비스를 구축하려면 단순 API 호출뿐 아니라 보안, 에러 핸들링, 성능, 확장성을 함께 고려해야 합니다. Flask와 FastAPI는 각각의 장단점이 있으며, 목적에 따라 적절한 프레임워크를 선택해 OpenAI API 기반 AI 서비스를 구축할 수 있습니다. 본 절의 내용을 기반으로 챗봇, 요약기, 번역 서비스 등 실용적인 애플리케이션을 시작해 볼 수 있습니다.

Last updated