⚙️ LLM
⚙️ Swagger

▲ 더 좋은 prompt 작성을 DRF가 아니라 LLM을 통해서 사용자가 작성할 수 있도록 기능을 구현해 봅시다!
※ 완성본 아니에요. 작동 잘 되는지 확인하는 과정 중의 게시물입니다. ※
시스템 프롬프트 ▶ [⚙️AI] 시스템 프롬프트(System Prompt)란?
▶️ 초기 설정
1. OpenAI API 키 설정
1.1. install openai
# bash
pip install openai
1.2. API 키 관리를 위해 .env 파일 생성
# ini
OPENAI_API_KEY=
1.3. Django에서 dotenv로 API KEY 불러오기
# bash
pip install python-dotenv
1.4. core/settings.py에서 로드
# core/settings.py
import os
from dotenv import load_dotenv
load_dotenv() # 환경변수 로드
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
2. OpenAI API 연동 API 만들기
DRF와 Swagger에서 OpenAI API를 활용할 수 있는 API 엔드포인트 작성
# prompts/views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from openai import AsyncOpenAI
import asyncio
import os
import openai
from drf_yasg.utils import swagger_auto_schema
from .serializers import GeneratePromptSerializer
api_key = os.getenv("OPENAI_API_KEY")
if not api_key:
raise ValueError("Missing OpenAI API Key")
aclient = AsyncOpenAI(api_key=api_key)
# OpenAI 프롬프트 생성 함수
async def generate_3d_prompt(user_input):
system_prompt = (
"너는 3D 모델을 생성하기 위한 최적의 프롬프트를 만드는 AI야. "
"사용자의 요청을 분석하여 디테일한 프롬프트를 제공해야 해. "
"프롬프트는 구체적인 특징(색상, 분위기, 배경, 스타일 등)을 포함해야 하며, "
"모델링에 적합한 키워드 중심으로 작성해야 해."
)
try:
response = await aclient.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": user_input}
]
)
return response.choices[0].message.content
except openai.APIConnectionError as e:
print(f"OpenAI 서버 연결 오류: {e}")
return "OpenAI 서버 연결에 실패했습니다. 잠시 후 다시 시도해주세요."
except openai.RateLimitError as e:
print(f"OpenAI API Rate Limit 초과: {e}")
return "OpenAI API Rate Limit이 초과되었습니다. 잠시 후 다시 시도해주세요."
except Exception as e:
print(f"OpenAI API 호출 중 오류 발생: {e}")
return "OpenAI API 호출 중 오류가 발생했습니다."
# Django REST Framework API 엔드포인트
class GeneratePromptAPI(APIView):
def get(self, request):
message = "API is running"
return Response({"status": message}, status=status.HTTP_200_OK)
@swagger_auto_schema(
request_body=GeneratePromptSerializer,
operation_description="3D 모델 생성을 위한 프롬프트 생성 API",
)
def post(self, request):
serializer = GeneratePromptSerializer(data=request.data)
if serializer.is_valid():
user_input = serializer.validated_data['user_input']
# OpenAI API 호출을 위한 사용자 입력
user_request = "Create a 3D model based on 3D Model Prompt: {}".format(user_input)
# OpenAI API 호출을 비동기적으로 실행하고 결과를 얻음
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
optimized_prompt = loop.run_until_complete(generate_3d_prompt(user_request))
loop.close()
# JSON 형태로 응답 반환
return Response({"generated_prompt": optimized_prompt}, status=status.HTTP_200_OK)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
3. URL 설정
# prompts/urls.py
from django.urls import path
from myapp.views import GeneratePromptAPI
urlpatterns = [
path("", GeneratePromptAPI.as_view(), name="generate-prompt-api"),
]
core/urls.py에서 prompts 앱의 url 시작을
path("api/prompts/", include("prompts.urls")),
이렇게 설정해 두었어요.
Swagger 서버

일단 되는지부터 확인해 보았어요.

"LOL 게임 캐릭터인 룰루를 생성하는 프롬프트를 작성해 줘."

굿.
작동은 잘 되니까, 시스템 프롬프트 설정을 점점 수정하도록 할게요.
다음 게시물에서 봐요~!
'👥 최종 팀 프로젝트(250227~250331) > 구현 과정 ▶️' 카테고리의 다른 글
[▶️Back-end] 사용자 입력의 Prompt를 다듬는 기능 구현 5차_LLM 完 (0) | 2025.03.21 |
---|---|
[▶️Back-end] 사용자 입력의 Prompt를 다듬는 기능 구현 4차_LLM (5) | 2025.03.20 |
[▶️Back-end] 사용자 입력의 Prompt를 다듬는 기능 구현 2차 (1) | 2025.03.18 |
[▶️Back-end] 사용자 입력의 Prompt를 다듬는 기능 구현 1차 (0) | 2025.03.17 |
[▶️중간 점검] 2주 동안의 구현된 현황 (2) | 2025.03.17 |