장고에서 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으로 표현된다!!
야호!
'AI 웹개발반 > AI' 카테고리의 다른 글
[AI] Chatgpt-3.5 와 DRF로 챗봇 만들기 - 2 - (0) | 2023.07.05 |
---|---|
[AI] 머신러닝 개념 정리(2) **수정중 (0) | 2023.05.19 |
[AI] 머신러닝 개념 정리 (0) | 2023.05.17 |