Server

[Server] - 파이썬으로 ChatGPT와 대화하는 서버 구축

강철곰탱이 2025. 3. 9. 17:41

ChatGPT와 대화할 수 있는 앱을 만들어보고 싶어서 서버를 구축해보려고 한다.

 

AI를 직접 만들어서 적용하기에는 너무 공부할 내용이 많아져서 일단 ChatGPT를 사용해서 AI 모델을 앱에서 사용하는 방법을 알아보자.


1. 서버 구축 배경

 

API 키를 PC에서 요청할 때마다 사용해야 하는데, 이 키가 유출되면 매우 위험하다.

 

왜 유출되면 위험할까?


→ API 키가 유출되면 누구나 이를 이용해 API를 무단으로 사용할 수 있으며, 과금이 발생하거나 서비스가 악용될 위험이 있기 때문이다.

 

그래서 iOS에서 직접 GPT 서버에 요청하지 않고, iOS와 GPT 서버 사이에 중간 서버를 두는 방법을 택하려고 했다.
이렇게 하면 iOS에서 API 키를 관리하지 않고, 중간 서버에서 API 키를 관리해 더 안전해진다.

 

왜 iOS에서 API 키를 관리하면 위험하고, 서버에서 관리하면 안전할까?

 

→ iOS 앱에 API 키를 포함하면, 앱이 디컴파일될 때 키가 노출될 위험이 있다. 반면, 서버에서 API 키를 관리하면 서버 측 코드와 키가 외부에 노출되지 않으므로 보안이 더 강력해진다.

 

디컴파일을 모른다면 여기 ✋

더보기

디컴파일(decompile)은 이미 컴파일되어 기계어(바이너리) 형태로 된 프로그램을 다시 사람이 읽을 수 있는 소스 코드 형태로 변환하는 과정이다.

 

보통 iOS 앱은 빌드되면서 바이너리 형태(기계어)로 변환돼서 App Store에 올라가는데, 이걸 해커나 악의적인 사용자가 디컴파일하면 앱에 포함된 API 키, 비밀 토큰, 알고리즘 같은 민감한 정보가 노출될 수 있다.

쉽게 말해, 디컴파일 = 컴파일의 반대 과정이다.

 


2. 서버 구축 과정

 

 

서버 구축 시작하기 전에 가상환경이 무엇인지 알아보자.

 

가상환경이 없으면, 어떤 패키지를 pc에 설치하게 되면 만들게 되는 모든 프로젝트에 설치한 패키지 버전이 다 적용된다.

 

가상환경을 쓰면, 가상환경 안에서 패키지를 설치하게 되어서 해당 프로젝트에만 적용이 되고 다른 프로젝트에는 적용이 되지 않는다. 

 

정리하자면

 

  • 가상환경이 없으면, 전역 Python 환경에서 버전이 충돌해 문제가 생김.
  • 가상환경을 쓰면, 각 프로젝트가 독립적으로 라이브러리와 버전을 관리 가능!

 

즉, 가상환경은 프로젝트마다 독립적인 실행 환경을 만들어준다!

 

그래서 이번 프로젝트에서도 가상환경을 만들어 구현해보려고 한다.

 

1️⃣ 가상환경 만들기

 

 

python3 -m venv venv

 

명령어를 터미널에 입력하면 현재 폴더에 venv라는 가상환경 폴더가 생긴다. 

 

 

 

2️⃣ 가상환경 실행하기

 

만들었으니 이제 실행도 해보자!

 

source venv/bin/activate

 

 

명령어를 입력해 주면 (venv)라고 표시된 걸 확인할 수 있는데 이러면 가상환경이 만들어진 것이다!

 

3️⃣ 라이브러리 설치

 

pip install fastapi uvicorn openai python-dotenv

 

총 4개의 라이브러리를 설치했다.

 

 

  • fastapi: 빠르고 간편하게 API를 만들 수 있는 웹 프레임워크.
  • uvicorn: FastAPI를 실행시킬 때 사용.
  • openai: OpenAI API를 사용하기 위한 라이브러리.
  • python-dotenv: .env 파일에서 환경 변수를 쉽게 불러오기 위한 라이브러리.

 

 

 

4️⃣ fastapi 서버 실행

 

 

3개의 파일을 만들어줘야 한다.

 

(1) .gitignore

 

venv
*.DS_Store
.env

 

 

(2) .env

 

https://platform.openai.com/settings/organization/api-keys

 

위의 링크에서 api key를 발급한 다음 .env 파일에 넣어주자

 

OPENAI_API_KEY=발급받은 key 넣기

 

(3) main.py

 

from fastapi import FastAPI, Depends
import openai
import os
from dotenv import load_dotenv

# 환경 변수 로드
load_dotenv()
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")

# OpenAI API 설정
openai.api_key = OPENAI_API_KEY

# FastAPI 앱 생성
app = FastAPI()

@app.get("/")
def read_root():
    return {"message": "FastAPI ChatGPT 서버 동작 중"}

 

파일을 생성했다면 터미널에 다음 명령어를 입력한다. 

 

uvicorn main:app --reload

 

 

  • uvicorn: FastAPI 앱을 실행시키기 위한 서버.
  • main:app:
    • main: FastAPI 애플리케이션이 있는 Python 파일 이름 (main.py).
    • app: main.py 파일에 정의된 FastAPI 인스턴스 (app = FastAPI()).
  • --reload: 코드가 변경될 때마다 서버를 자동으로 재시작. 

 

 

 

그럼 이렇게 url이 나오고 서버가 실행된 걸 확인할 수 있다.

해당 url(http://127.0.0.1:8000)에 들어가 보면 다음과 같이 나온다.

 

 

그리고 /docs 경로를 추가해 주면 이렇게 swagger도 확인할 수 있다 ㅎㅎ

 

만약 서버를 종료하고 싶다면 맥북 기준으로 Control + C를 눌러주면 된다.

 

 


3. GPT 서버와 대화 구현

 

 

자 이제 서버 구축까지는 완료했으니 GPT 서버와 대화를 구현해 보자!

 

https://platform.openai.com/docs/api-reference/making-requests

 

위의 링크에서 해당 코드를 발견할 수 있다.

 

이 코드는 서버에 어떻게 요청하면 되는지 알려주고 있다.

 

🤔 postman으로 테스트

 

    • url: https://api.openai.com/v1/chat/completions  
    • header: [Content-Type: application/json,Authorization: Bearer $OPENAI_API_KEY]
    • body: {
       "model": "gpt-4o-mini",   
       "messages": [{"role": "user", "content": "Say this is a test!"}],
       "temperature": 0.7"
      }

요청했는데 이런 오류 발생!!!

왜 이런가 확인해 봤더니 결제를 안 해서 그렇다 ㅜㅠㅜㅠ

 

 

https://platform.openai.com/settings/organization/billing/overview

여기서 결제를 해줘야 한다 ㅎㅎㅎㅎ

 

간단하게 테스트해볼 거라서 최소 금액인 5달러를 결제했다

 

 

이렇게 결제하니까 드디어 성공!!!

 

 

postman으로 성공하는 걸 확인했으니 이제 프로젝트에 적용해 보자!!

 

📄 프로젝트에 적용해 보자

 

위에서 만든 main.py 코드에 추가하면 된다.

@app.post("/chat/")
def chat(prompt: str):
    """ChatGPT API와 연결하여 답변을 반환하는 엔드포인트"""
    try:
        response = client.chat.completions.create(
            model="gpt-4o-mini",  # 필요 시 최신 모델로 변경 가능
            messages=[{"role": "user", "content": prompt}]
        )
        return {"response": response.choices[0].message.content}
    except Exception as e:
        return {"error": str(e)}

 

prompt가 GPT 서버에 요청하고 싶은 내용이다.

서버 실행해서 확인해 보면 chat이 추가되었다.

 

 

그리고 prompt에 안녕을 넣어서 실행해 보면

 

이렇게 GPT의 응답을 받을 수가 있다.

 

만약 GPT 응답을 영어 문장을 교정해 주는 용도로만 만들고 싶다면, GPT에게 요청 보내는데 규칙을 넣어줘야 한다. 

 

다음과 같이 영어 문장 교정에 대한 문구를 포함한 함수를 만들어주고

def get_correction_prompt() -> str:
    """영어 문장의 교정을 위한 간단한 프롬프트를 생성합니다."""
    return """
As an AI English correction assistant, analyze the following sentence.

Respond only in JSON format with these keys:
- "original": the original sentence
- "needs_correction": true or false
- "corrected": the corrected sentence (or the original if no correction is needed)

Example:
{
  "original": "She go to school everyday.",
  "needs_correction": true,
  "corrected": "She goes to school every day."
}
"""

 

role에 developer도 추가해 준다. 

@app.post("/chat/")
def chat(input_text: str):
    """ChatGPT API와 연결하여 답변을 반환하는 엔드포인트"""
    try:
        response = client.chat.completions.create(
            model="gpt-4o-mini",
            messages=[{"role": "developer", "content": get_correction_prompt()},
                      {"role": "user", "content": input_text}
                      ]
        )
        print(response)

        return {"response": response.choices[0].message.content}
    except Exception as e:
        return {"error": str(e)}

 

그럼 사용자가 입력한 값 input_text에 교정 프롬프트가 추가되어 GPT에 전달된다.

 

 

 

이렇게 틀린 문장을 넣으면 교정된 문장을 반환해 준다.

 

 

 

이렇게 GPT 서버에 요청을 보내고 받을 수 있는 나만의 서버를 만들어봤는데 나름 재밌었고, 나중에 앱 만들어서 꼭 적용해 봐야지!!