※ 작성자가 작성한 내용이 일부 틀릴 수도 있음 주의
※ 작성자가 코드 쓰다가 계속 코드 수정함 주의
※ 내용이 너무 길어져서 디코 봇 코드와 설명은 다음 글에 작성 예정
※ 글쓰다가 레이드 도느라 다음 날 되어버림
OpenAI / ChatGPT / GPT-3
뭐... 요즘 한창 뜨겁게 달구고 있는 인공지능 분야의 세 단어 되시겠다.
그 중에 가운데 단어를 가장 많이 뉴스에서 봤지만...
전역한 이후로 간간히 주시는 하고 있었다만, 이렇게까지 주식시장이나 뉴스 등에서도
뜨겁게 달아오를거라고는 사실 생각지못했다.
사용해봤을 때 성능이 엄청 쩔기는 했었는데, 그냥 개발자들 사이에서 핫하겠구나 했는데
그러고 한 얼마였지 2주였나 그 이상이었나 지난 후에
처음 뉴스에 나온 이후로 대체 몇 달 째 관련 뉴스가 계속 나오는지를 모르겠다.
서론이 너무 길었다.
그래서 ChatGPT가 무엇인가?
'OpenAI' 사에서 만든 'GPT-3' 기반 '챗봇' 되시겠다.
ChatGPT 랑 GPT-3 랑 참 이야기가 많이 나오는데,
둘의 차이는 GPT-3 는 전반적으로 NLP (Natural Language Processing, 자연어 처리) 를 위해 학습되었고,
ChatGPT 는 거기에서 좀 더 챗봇에 맞는 기능으로 학습되어 팔리는 녀석 정도로 생각하면 되겠다.
그래서 무슨 API를 사용한다는 건가요?
사실 제목으로 쓴 세 단어 모두라고 하는 것이 맞겠다.
OpenAI 의 api 중에 GPT-3 를 이용하는, 그 중에서 특히 ChatGPT 를 위해 학습된 녀석을 이용할 것이기 때문이다.
근데 갑자기 이걸 왜 쓰죠?
지금은 많이 쓰이는 것처럼 보이지 않지만, 한때 인터넷에서 유행했던 '해병문학' 말투를 가르치는 글을 캡쳐해서
친구가 카톡으로 '이거 쩔더라' 하면서 보여준 것도 있고 (이 글을 쓴 기준 매우 최근),
그러고나서 이 친구놈이 갑자기 삘받아서 일명 '냥체' 를 가르치려하는걸 보고
오... 거 참 뭐같지만 멋진 생각이라는 생각이 들어서
디코 봇에 '냥체'를 학습시켜서 으윽 챗봇으로 두면 재밌겠다 으악 라는 결론을 내리고야 말았다.
일단 OpenAI 가 제공하는 API Reference, 예시를 보자.
딱 보면서 느낀건, API Reference 를 굳이 볼 필요없이,
Examples 만 봐도, 챗봇을 그냥 쓰는데에 있어 충분했다.
실제로도 그랬고,
그러니까 Reference는 잠시 제쳐두고 우리가 쓸 것만 확인해보자.
사이트 들어가면 상단에 Examples가 있다.
여기서 우리가 필요한 것을 쓸건데, 당연히 챗봇을 만들 것이기 때문에
밑에 "Chat"을 살펴보자.
https://platform.openai.com/examples/default-chat
그대로 캡쳐 / 코드를 가져오는 것은 옳지 않을 것 같아서
링크를 그대로 가져왔다. 여기에 있는 코드(주로 parameter)의 요소들을 보자.
그리고 실행하는 방법을 알아보자.
코드는 부분부분 나누어 약간의 설명을 추가했다.
import os
import openai # 설치 필요
일단 여기서 openai 만 pip로 깔아주자.
cmd를 켜서 아래를 입력하자.
pip install openai
openai 가 제공하는 api 가 모두 포함되어 있기 때문에,
챗봇 말고도 사용법은 많지만 일단은 챗봇 위주로 할 것이다.
이제 밑에 보면
API 키가 필요하다는 것을 직감할텐데,
다음의 과정을 따라주자.
※ 로그인이 필요하기 때문에 가입을 해야한다.
가입에 대한 내용은 기입하지 않겠다.
가입을 했으면 오른쪽 위에 계정이 뜰거다.
계정을 누르고 중간의 'View API keys' 를 클릭하자.
그러면 바로 API keys 가 나올텐데,
기본적으로 주어진 'Secret key' 는 없을 것이지만, 나는 이미 만들었기 때문에 있는 것이다.
그러니까 당황하지 말고 "Create new secret key" 를 눌러주자.
그러면 API key 가 생성되었다는 창이 뜰 것이다.
오른쪽 초록색 버튼은 "API key 복사" 이기 때문에 복사해두고, 개인적으로 저장해놓자.
생성된 놈을 다시 확인할 수는 없다. 지우고 새로 생성해야하기 때문에
귀찮게 다시 생성하지 말고 개인적으로 저장해놓자.
이제 API key를 코드에다가 넣어주면 된다.
openai.api_key = os.getenv("API 키")
openai.api_key = "API 키"
# 위의 것은 에러가 나는 경우가 있다. 아래의 방법으로 해도 된다.
개인적으로 돌렸을 때, 위의 방식으로 하면 API_key 를 인식할 수 없다고 한다.
이유는 모르겠는데, 아래로 바꿔서 했더니 잘 되었다.
되는 것으로 해주면 된다.
completion = openai.Completion.create(
model="text-davinci-003",
prompt="The following is a conversation with an AI assistant. The assistant is helpful, creative, clever, and very friendly.\n\nHuman: Hello, who are you?\nAI: I am an AI created by OpenAI. How can I help you today?\nHuman: I'd like to cancel my subscription.\nAI:",
temperature=0.9,
max_tokens=150,
top_p=1,
frequency_penalty=0.0,
presence_penalty=0.6,
stop=[" Human:", " AI:"]
) # 이것만으로는 completion의 선택들이 함수? 형태로 나온다.
response = completion.choices[0].text # 얘를 넣어줘야 가장 좋은 답변을 텍스트 형태로 얻을 수 있다.
print(response)
위는 OpenAI 에서 제공한 코드에서 잘 작동하게 수정한 코드다 (더 위의 코드들 포함. import openai etc.).
prompt 에는 "내가 걸고자 하는 말" 을 넣으면 되는데, 기존의 대화랑 함께 넣으면 그것도 답변 생성에 영향을 준다.
그래서 지금은 상황과 일부 대화를 넣어 그 다음 답변을 하도록 되어있다고 생각하면 된다.
사이트의 예시를 그대로 따라해서 출력하면 터미널에는 이상한 값들이 출력되더라...
그래서 조금 찾아봤더니, Completion을 생성한 후에
가장 좋은 선택답을 텍스트 형태로 출력해줘야 한다.
model # 사용할 AI 모델 선택. 챗봇은 'text-davinci-003' 추천
prompt # AI에 입력할 데이터
temperature # 낮을수록 더 딱딱한 정답지와 같은 답변, 높을수록 좀 더 무작위적인 부드러운 답변. 0.8~0.9 추천
max_tokens # AI가 보내줄 최대 토큰 값. 너무 긴 답변이 토큰을 많이 소모하는 걸 막는 용도. 작성자는 500으로 바꿨음
top_p # 정확한 의미를 모르겠으나, default가 1이고, 보통 안 건드림.
frequency_penalty # 높을수록 반복되는 말을 안 함. 다만, prompt를 기준으로 함. 0.0 이 기본, 추천
presence_penalty # 높을수록 새로운 주제로 말을 검. 0.6 이 기본, 추천
stop # 대화의 화자의 말 끝 기준점
각 요소의 요약은 다음과 같다.
값들은 필요에 따라 바꾸면 되지만, 굳이 바꿔줄 필요가 없을 정도의 성능이 나오기 때문에
걱정하지 말고 그대로 써주자.
그러면 일단은 기본적인 챗봇을 사용할 수는 있다.
하지만 가장 큰 문제가 하나 있으니....
Price
항상 대부분의 문제는 돈에서 있기 마련이다.
API는 공개되어있지만,
거기서 AI 를 사용하는 경우, 사용량만큼의 돈을 지불해야 한다.
Open source 지만, 그 Open source 가 회사의 VRAM(아마도)을 사용하다보니 그렇게 된 느낌이다.
https://openai.com/api/pricing/
들어가보면 알겠지만, 그림을 뽑아낼 수도 있고
원하는 문자열 등을 얻어낼 수 있는 대신 그만큼의 가격이 있다.
우린 챗봇을 위해 Language 모델 중에서 Davinci 모델을 사용한다.
1,000 token 당 $0.02. 1,000 token 당 영어 단어 약 750개 정도라고 한다. 언어에 따라 다르지만 비율적으로 비슷한듯.
무료 버전의 경우 API 로 사용 가능한 한계가 3달에 $18.
그니까 최대 900,000 token 을 사용할 수 있다. 조금 사용했는데 벌써 $1 이상 써버렸다.
그 이상 사용하려면, 카드 추가하고 사용량에 따라 요금이 부과된다.
찾아보니 개발자들을 위한 가격이 낮은 서비스를 구상 중이라고 하는 것 같아보이는데
정확히는 잘 모르겠다. 당장 유료 구독 모델이 최근에 나오다보니...
돈 아끼려고 Ada, Curie 모델도 써봤는데
챗봇에 전혀 어울리지 않는다.
단순한 번역 용도 정도면 추천하는데, 챗봇에는 전혀 좋지 않다.
(23.02.17 추가) 그리고 davinci 는 prompt + max_tokens 한계가 4000 tokens 까지 가능하며
Ada, Curie 등은 2048 tokens 까지 가능하니 꼭 알아야 한다.
그래서 그냥 한 번 디코 봇으로 학습세뇌시켜서 만들어보자는 느낌으로 만들었고
다 쓰면 봉인시켜야지.
냥체... 이거 참 끔찍하거든요......
내용이 너무 길어져서 코드 짠 것은 다음 글로 미루겠다.
레이드 트라이 하다가 새벽이 되었다.
양해를 바란다.
'개발일지 > 디스코드 봇' 카테고리의 다른 글
디스코드 봇 개발 일지 2023-02-21 - youtube_dl uploader_id 문제 (12) | 2023.02.22 |
---|---|
디스코드 봇 개발 일지 2023-02-17 - OpenAI / ChatGPT / GPT-3 로 챗봇 만들기 (0) | 2023.02.17 |
디스코드 봇 개발 일지 2023-01-26 - Embed (0) | 2023.01.26 |
디스코드 봇 개발 일지 2023-01-11 - 유튜브 검색 기능, 영상 정보 (0) | 2023.01.11 |
디스코드 봇 개발 일지 2023-01-09 - skip, MPD Manifest 문제 해결 (0) | 2023.01.09 |