본문 바로가기
AI 웹개발반/AI

[AI] Chatgpt-3.5 와 DRF로 챗봇 만들기 - 1 -

by 째깍단 2023. 7. 3.

장고에서 openai를 활용하여 기초적인 ai챗봇을 만들었다

 

 

이전에 강의에서 따라 만들었던 openai를 기반으로 작성하되,

배포에 조금이나마 영향이 덜 가도록 streamlit을 빼고 django api로 만들고자 했다

streamlit을 사용하면 서버가 1개 더 있는 것이어서 배포 시 추가적인 작업이 필요했기 때문.

 

 

 

 

일단 Chatgpt를 활용하기 위해서는 openai api key가 필요하다!

 

[openai api 페이지] : https://openai.com/blog/openai-api

 

 

1) 사이트에  가입 혹은 로그인한다

 

2) 오른쪽 상단의 personal을 누르면 뜨는 메뉴 바에서  View API keys를 클릭

 

 

 

 

3) 이동한 곳에서  +Create new secret key를 클릭

 

 

 

4) 모달창이 뜨면서 새 key가 발급된다.  잘 복사해서 필요한 곳에 붙여두자.

 OK 누르면 다시는 볼 수 없음...

 

 

 

api key는 민감한 정보이니 git hub같은 곳에 올리지 않도록 주의하자!

 

 

 

++  왼쪽 메뉴의 Usage를 누르면 사용 요금이 얼마나 나왔는지(....) 확인할 수 있다.

 

 

 

 


 

 

 

 

공식문서를 보면서 이전에 배운 것을 복습하고, 따로 어떤 옵션들을 넣어줄 수 있는지 알아보았다.

기본적인 ai 봇 작성은 웬만하면 공식문서를 참고하자! 혹은 아래쪽에 예시가 있습니당

 

[참고]

openai Chatgpt 문서 : https://platform.openai.com/docs/guides/gpt

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

 

 

 

 

 

Chat completions Api 옵션

 

챗gpt에게 role을 부여한 프롬프트를 보내줄때(create할때),

해당 기능을 함께 활용하여 옵션이 추가된 형태의 답변을 받을 수 있다

 

[참고] : https://platform.openai.com/docs/api-reference/chat/create#chat/create-functions

 

 

 

기본 모델에 꼭 넣어야하는 부분

 

  • model : 사용할 모델의 id. 현재는 gpt-3.5-turbo모델 사용 중!
  • message : 채팅 형식으로 넣어줄 메세지. 
    - role : system, user, assistant 중 하나를 입력
                 system은 기본 동작 설정 /
                 user 는 user input /
                 assistant 는 이전 대화를 저장하거나 system에 도움이 되는 메세지를 따로 넣어줄 수 있다. 
    - content : 메세지로 보낼 내용

 

 

 

 

아래는 옵션

 

  • temperature : 0 ~ 2 사이로 설정. 기본값 1    ≫  값이 높을 수록 창의성  낮을 수록 일관성을 가진다
  • top_p : 0~1 사이로 설정.  기본값 1   
                ≫ 응답 문장에 사용되는 단어에 대한 유연성. 
                     값이 높을 수록 다양한 단어 낮을수록 일관된 단어
  • n :  입력 메세지에 대한 응답 수
  • stream : 흐르는 듯이 글자가 출력되는 것. True, False 로 작성한다
                  ≫  True로 설정하고 api요청을 보내면 한 글자만 돌아오는 것을 볼 수 있는데, 
                       공식문서에서 추가 코드를 소개하고있으니 참고바람
  • stop : 요청 시 지정한 값이 있으면 해당 지점까지만 문장을 생성해준다


    아래 둘은 반대 개념으로 사용하면 된다!
  • presence_penalty : -2 ~ 2 사이로 설정. 기본값 0 ≫  이전에 나온 단어, 구를 반복 하지 않도록 유도    
  • frequency_penalty : -2 ~ 2 사이로 설정. 기본값 0   ≫  생성된 문장의 일관성을 유지 =  비슷한 단어를 자주 사용

 

  • logit_bias : 응답 문장에 사용될 단어에 대한 강도, 감정 정도를 조절할 수 있다.
  • user : 요청 보낸 사용자를 식별하는데 쓰인다.

 

  • max_token : 최대 토큰 수 제어

유료를 쓰면 민감해지는 부분인 token!!

 

요청 + 반응을 포함해 token이 계산되므로 system에 설정해줄 기본 옵션은 최대한 짧고 간결하면서 원하는 정보가 담기도록 해야한다.

Shortly를 사용할 경우 요청에 대략 100, 반응에 50 ~ 60 정도의 토큰이 측정되는 듯하다

대화가 길어질 수록 Shortly를 무시하고 좀더 많은 토큰 요청을 보내게 되는듯..

 

 

 

매 요청마다 사용되는 token값이 궁금하다면 아래 ai 요청 함수에서 prompt를 print 해보자

usage에 뜨는것이 토큰!

 

{
  "id": "chatcmpl-0000",
  "object": "chat.completion",
  "created": 0000000000,
  "model": "gpt-3.5-turbo-0301",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "ai response"
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 153,
    "completion_tokens": 112,
    "total_tokens": 265
  }
}

 

[토큰 관리]:  https://platform.openai.com/docs/guides/gpt/managing-tokens

 

 

 

 


 

 

 

 

 기본적인 ai 요청 함수

 

def send_text(user_input):
    gpt_prompt: list[dict] = []
    gpt_prompt.append(
        {
            # 시스템 역할(기본설정) 주기
            "role": "system",
            "content": "Response Korean, Shortly.", #ai에게 조건을 준다.
        }
    )

    gpt_prompt.append(
        {
            # user_input을 넣어준다!
            "role": "user",
            "content": user_input,
        }
    )

    prompt = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=gpt_prompt,
    )

    # json response에서 필요한 부분만 불러옴
    return prompt["choices"][0]["message"]["content"]

 

 

위의 자료에는 정말 기본만 있고 prompt를 create할 때 위에서 언급한 여러가지 옵션을 넣어줄 수 있다.

 

 

 

 

 

► 기본적인 View 형태 및 url

 

class SendTextView(APIView):
    permission_classes = [permissions.IsAuthenticated]  # 입력 user값을 위한 세팅

    def post(self, request):
    	...
        user_input = request.data["user_input"]
        response = send_text(user_input) # ai함수에 user request정보를 입력하고 prompt받기 
        return Response(response, status=200)

 

from django.urls import path
from .views import SendTextView

urlpatterns = [
    path("", SendTextView.as_view(), name="send_text_view"),
]

 

 

 

 

이후 postman으로 쿼리 요청을 보내면 response가 string으로 표현된다!!

 

야호!