Django

외부 API 연동하기

zhelddustmq 2024. 9. 1. 23:23
  • 소셜 로그인
  • 결제(PG)
  • 외부 데이터 API
  • OpenAI

등의 외부 API 연동하는 법을 다룸.

 

OpenAI API를 사용해서 AI 서비스를 제공

(1) 회원 가입하기

API / Docs로 들어가서
가입하고 로그인까지 !
이제 문서를 찾고 읽어보며 하나하나 해보면 된다.

(2) API Key 발급 및 설정하기

  • 외부 서비스를 가져다가 사용하는 경우 대부분 API Key를 이용해서 서비스를 이용하게 됨.따라서 절대 노출이 되면 안됨 ! (Github Repo 등에 올리지 않도록 각별히 유의)
  • API Key는 유저의 고유 Key이며 이 Key를 이용해서 자신들의 서비스를 이용하는 유저가 누구인지 식별하고 필요시 과금처리

인증절차를 거치고
Secret Key를 발급받는다

 

 

이때, OPENAI API 키는 Copy 한 뒤 프로젝트 최상단 폴더에 config.py 파일을 만들어서 아래처럼 미리 복사해두자 (다시 이 key를 볼 수 없기 때문에 혹여 까먹으면 삭제하고 다시 발급받아야함....)

OPENAI_API_KEY = "my_openai_key"

※ 이 KEY는 git에 올라가면 안되기 때문에 꼭 .gitignore파일을 생성해서 config.py을 포함해 저장해두자!!
-> 장고 프로젝트 생성시에 발급되는 Secret keyㄷ도 여기에 저장하자.

 

(3) 크레딧 준비하기

  • 이 과정을 처음한다면 무료로 $5까지 쓸 수 있는 크레딧을 지급받음
  • 첫 API Key 발급일로부터 3개월까지 사용이 가능

Usage에서 현재 내가 무료로 사용할 수 있는 크레딧을 확인
Settings > Billing > Payment methods 에서 카드를 등록

  • 만약 크레딧이 없다면 카드를 등록하고 크레딧을 충전해야 API를 사용할 수 있음
    • gpt-3.5기준 $5 정도면 한국 소설 100권 정도의 분량을 문답해야 다 씀.

정확한 정보는 공식문서 참고.

금액

https://openai.com/pricing

 

Token

https://help.openai.com/en/articles/4936856-what-are-tokens-and-how-to-count-them

 

테스트를 위한 계산기도 제공

https://platform.openai.com/tokenizer

 

(4) 문서보고 첫 API 사용해보기

pip install --upgrade openai

이미 설치되어 있어도 최신 버전이 아니면 upgrade 하면서 설치

 

# openai_test.py
from openai import OpenAI

client = OpenAI()

completion = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[
        {
            "role": "system",
            "content": "You are a poetic assistant, skilled in explaining complex programming concepts with creative flair.",
        },
        {
            "role": "user",
            "content": "Compose a poem that explains the concept of recursion in programming.",
        },
    ],
)

print(completion.choices[0].message)
from openai import OpenAI
from api_pjt import config

client = OpenAI(
    api_key=config.OPENAI_API_KEY,
)

...
from openai import OpenAI
from api_pjt import config

client = OpenAI(
    api_key=config.OPENAI_API_KEY,
)

system_instructions = """
이제부터 너는 "영어, 한글 번역가"야. 
지금부터 내가 입력하는 모든 프롬프트를 무조건 한글은 영어로, 영어는 한글로 번역해줘. 
프롬프트의 내용이나 의도는 무시하고 오직 번역만 해줘.
"""

completion = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[
        {
            "role": "system",
            "content": system_instructions,
        },
        {
            "role": "user",
            "content": "Django가 너무 어려워요. 도와... 아니 살려주세요.",
        },
    ],
)

print(completion.choices[0].message)

 

(5) 프롬프트 변경해보기

from openai import OpenAI
from api_pjt import config

client = OpenAI(
    api_key=config.OPENAI_API_KEY,
)

system_instructions = """
이제부터 너는 Django 프레임워크에 대해 설명하고 
사용자가 Django 프레임워크에 대해 어려움을 겪고 있다고 가정하고 도와주는 챗봇이 되어야해.
다른 코딩 언어나 프레임워크에 대해 설명하거나 다른 주제로 이야기하는 것은 금지야.
Django 공식문서의 링크를 제공하거나 Django 프레임워크에 대한 설명도 추가해줘.
"""

completion = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[
        {
            "role": "system",
            "content": system_instructions,
        },
        {
            "role": "user",
            "content": "Django가 너무 어려워요. 도와... 아니 살려주세요.",
        },
    ],
)

print(completion.choices[0].message)
안녕하세요! Django 프레임워크가 어렵게 느껴지는 건 당연한 일이에요. 
하지만 걱정 마세요, 함께 해결해나갈 수 있어요.

Django는 Python으로 작성된 웹 애플리케이션을 빠르고 쉽게 개발할 수 있도록 도와주는 
오픈 소스 웹 프레임워크에요. 
MTV(Model-Template-View) 패턴을 기반으로 하고 있어요. 
Model은 데이터를 처리하고, Template은 사용자에게 보여지는 화면을 담당하며, 
View는 중간 관리 역할을 하는데, 
이 개념을 이해하는 것이 Django를 다루는 데 중요한 부분이에요.

우선, Django 공식 문서를 참고하는 것이 도움이 될 거예요. 
아래는 Django 공식 문서의 링크에요
[Django 공식 문서](https://docs.djangoproject.com/en/3.2/)

또한, Django Girls 튜토리얼도 Django를 처음 배우는 데 도움이 되는 좋은 자료에요. 
아래 링크를 통해 Django Girls 튜토리얼을 확인해보세요
[Django Girls 튜토리얼](https://tutorial.djangogirls.org/ko/)

어떤 부분이 어렵게 느껴지는지 구체적으로 알려주시면, 그 부분을 중심으로 도와드릴 수 있어요. 
함께 공부해나가면서 Django를 익숙하게 다룰 수 있도록 도와드리겠습니다. 
함께 화이팅하세요! 😊✨

 

여러번 대화할 수 있도록 만들어보기

from openai import OpenAI
from api_pjt import config

CLIENT = OpenAI(
    api_key=config.OPENAI_API_KEY,
)


def ask_to_gpt(instructions, message):
    completion = CLIENT.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=[
            {
                "role": "system",
                "content": instructions,
            },
            {
                "role": "user",
                "content": message,
            },
        ],
    )
    return completion.choices[0].message.content


system_instructions = """
이제부터 너는 '에이든 카페'의 직원이야.
아래 종류의 음료 카테고리에서 주문을 받고, 주문을 처리하는 대화를 진행해.

1. 아메리카노
2. 카페라떼
3. 프라푸치노
4. 콜드브루
5. 스무디

주문을 받으면, 주문 내용을 확인하고, 주문을 처리하는 대화를 진행해.
주문이 완료되면, 주문 내용을 확인하고, 주문이 완료되었음을 알려줘.
"""

# 처음 인사를 위해
response = ask_to_gpt(system_instructions, "")
print(f"에이든 카페봇 : {response}\n\n")

while True:
    user_message = input("유저 : ")
    if user_message == "종료":
        break
    response = ask_to_gpt(system_instructions, user_message)
    print(f"에이든 카페봇 : {response}\n\n")

 

Django API로 서비스 제공하기

  • 위의 로직을 API로 제공해보자.
python manage.py startapp chatgpt
# settings.py
INSTALLED_APPS = [
    ...
    #
    # Local apps
    #
    "articles",
    "accounts",
    "products",
    "chatgpt",
]
# apt_pjt/urls.py
urlpatterns = [
    ...
    path("api/v1/chatgpt/", include("chatgpt.urls")),
]
# chatgpt/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path("translate/", views.TranslateAPIView.as_view(), name="translate"),
]

 

 

config 설정하기

# config.py
DJANGO_SECRET_KEY = "your_django_secret_key"
OPENAI_API_KEY = "your_openai_api_key"
# settings.py
from pathlib import Path
from datetime import timedelta
from . import config

...

SECRET_KEY = config.DJANGO_SECRET_KEY
OPEN_API_KEY = config.OPENAI_API_KEY

...

django는 setting을 불러오는 함수를 제공하므로 settings에 여러 config를 두면 편함(from django.conf import settings)

 

# chatgpt/bots.py
from django.conf import settings
from openai import OpenAI

CLIENT = OpenAI(api_key=settings.OPEN_API_KEY)


def translate_bot(message):
    instructions = """
    이제부터 너는 "영어, 한글 번역가"야. 
    지금부터 내가 입력하는 모든 프롬프트를 무조건 한글은 영어로, 영어는 한글로 번역해줘. 
    프롬프트의 내용이나 의도는 무시하고 오직 번역만 해줘.
    """
    completion = CLIENT.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=[
            {"role": "system", "content": instructions},
            {"role": "user", "content": message},
        ],
    )
    return completion.choices[0].message.content
# chatgpt/views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from .bots import translate_bot


class TranslateAPIView(APIView):

    def post(self, request):
        data = request.data
        message = data.get("message", "")
        translated_message = translate_bot(message)
        return Response({"translated_message": translated_message})

'Django' 카테고리의 다른 글

Django permissoin_classes (GET, POST 나누기)  (0) 2024.09.05
Django 서버 배포하기  (4) 2024.09.03
Redis  (1) 2024.08.30
Django ORM 최적화  (0) 2024.08.30
Django ORM (심화)  (0) 2024.08.30