⚙️ 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 게임 캐릭터인 룰루를 생성하는 프롬프트를 작성해 줘."

굿.
작동은 잘 되니까, 시스템 프롬프트 설정을 점점 수정하도록 할게요.
다음 게시물에서 봐요~!

🐾Recent posts