포스팅 개요
최근 OpenAI chatGPT가 각광을 받으면서, 저도 ChatGPT에 대해서 관심이 많아졌습니다. 이미 OpenAI에서 GPT 계열의 모델들은 API를 제공해주고 있고 그 중 ChatGPT의 전신이 되는 GPT3.5의 버전의 모델을 API로 활용할 수 있습니다. 그리고 글을 작성하는 현 시점(23년 2월 2째주)에는 chatgpt가 api로 나오진 않았고 web에서 사용해볼 수 있습니다. 그리고 이제 한국에서도 ChatGPT plus로도 사용해볼 수도 있게 나왔네요. 본 포스팅에서는 이러한 OpenAI GPT3 모델들의 API를 사용할 수 있는 방법을 파이썬 예제(Python example)로 살펴봅니다. 그리고 간단하게 slack으로 GPT3를 활용하는 응용 예제도 살펴보겠습니다.
OpenAI에서 ChatGPT API를 공개 하였습니다!
해당 포스팅을 작성한 지 3주가 지난, 3월 2일 openai에서 chatgpt api를 공개하였습니다. 본 포스팅은 gpt3.5 기준이므로, 꼭 참고해주세요!
chatgpt api 소개 : https://openai.com/blog/introducing-chatgpt-and-whisper-apis
제가 본 포스팅을 작성하면서 참고한 자료는 다음과 같습니다.
- https://beta.openai.com/docs/models/gpt-3
- https://openai.com/blog/gpt-3-apps/
- https://help.openai.com/en/articles/6779149-how-do-text-davinci-002-and-text-davinci-003-differ
- https://api.slack.com/apps
- https://platform.openai.com/docs/model-index-for-researchers
- https://openai.com/blog/chatgpt/
본 포스팅에 있는 코드들은 아래 github repository에서 확인할 수 있습니다.
포스팅 본문
포스팅 개요에서도 말씀드린 것처럼 최근 ChatGPT가 각광을 받으며 여러 사용법 예제가 나오고 있습니다. 글을 쓰고 있는 현시점 기준(23년 2월 2째주)으로는 chatgpt 공식 api는 나오지 않았습니다. (위에 작성하였듯이 글 작성 후 openai에서 chatgpt api를 공개하였습니다! 본 포스팅은 gpt3.5 기준으로 작성되었음을 다시 명시합니다.) 다만, 무료로 web에서 사용해볼 수 있고 더 빠른 속도 등의 장점을 활용하고 싶으면 결제해서 chatgpt plus로 사용해볼 수도 있습니다. (github에는 chatgpt를 python selenium으로 돌려볼 수 있는 예제 코드도 존재하긴 합니다.) 현재는, openai API에서는 ChatGPT가 Fine-tuning으로 활용한 GPT3.5 버전의 모델을 OpenAI에서 활용할 수 있습니다. 본 포스팅에서는 GPT3.5 버전에 해당되는 모델을 API 형식으로 불러와 Python으로 활용할 수 있는 방법과 예제(example)을 살펴보겠습니다.
OpenAI GPT 모델 버전의 차이점
ChatGPT와 GPT3, 그리고 GPT3.5
가장먼저, ChatGPT와 GPT3 계열(GPT3.5)들에 대해서 정리해보겠습니다. openai의 chatgpt 자료(https://openai.com/blog/chatgpt/)를 보면 chatgpt는 다음과 같이 GPT3.5에서 fine-tuned했다고 설명이 되어 있습니다.
ChatGPT is fine-tuned from a model in the GPT-3.5 series, which finished training in early 2022.
즉, GPT3.5는 ChatGPT의 일종의 전신(?)이라고 표현할 수 있겠습니다. 따라서, ChatGPT와 유사한 성능의 모델을 사용하려면 GPT3.5 기준의 모델을 사용해야 한다는 것을 유추할 수 있습니다. 그럼 OpenAI에서는 GPT3.5를 지원해줄까요? openai의 공식 자료를 보면 아래 사진과 같은 내용이 담겨져 있습니다.
여러가지 내용이 담겨져 있지만, 핵심은 text-davinci-003 모델을 사용하면 GPT3.5를 사용해볼 수 있습니다. text-davinci-003은 text-davinci-002를 향상시킨 모델입니다.
참고사항
참고로, OpenAI에서 제공해주는 GPT3 계열의 모델들은 text-davinci-003 외에도 다양한 모델들이 존재합니다. 아래 사진을 참고해보면,
text-davinci-003 외에도 text-curie-001, text-babbage-001, text-ada-001과 같은 모델들이 있습니다. 그리고 우측 사진 gpt3.5 기준으로 gpt-3.5-turbo가 있는데요. 이게 chatgpt model입니다! chatgpt api가 추가된 후 해당 사진을 추가하였음을 참고바랍니다.
각 특징을 보면 가볍거나, 값이 좀 더 싸거나 등등의 특징이 있습니다. 따라서, 해당 표에 나와 있는 openai에서 제공해주는 다양한 gpt3 계열 모델들을 참고하셔서 상황에 맞게 활용해보세요!
저는 openai에서 제공해주는 text-davinci-003 모델을 활용해서 본 포스팅의 내용을 이어가겠습니다.
OpenAI API 신청
먼저, OpenAI에서 제공해주는 api를 활용하기 위해 아래 사진과 같이 api key를 신청합니다. openai의 홈페이지에 들어가서 회원가입을 한 뒤 api key를 받으면 됩니다.
API key를 받는 방법은 간단합니다.
- 내 계정
- view API keys
- create new secret key
를 통해 나의 key를 받을 수 있습니다. 이렇게 OpenAI API key를 받으면 준비는 끝납니다. 참고로, 해당 Key를 기준으로 api 통신을 하게 되고 이 key를 활용해 가격 정책 등을 책정하게 됩니다. 아래 사진은 제 계정의 현 상태를 보여줍니다.
OpenAI GPT 활용하기
바로 OpenAI의 API를 활용해서 ChatGPT를 간접적으로 활용해볼 수 있는 GPT3.5 모델, davinci-003을 활용해 간단한 Python 예제를 살펴보겠습니다. 먼저, openai 패키지를 Python 환경에서 설치해줍니다.
pip install openai
위 명령어를 실행하면 openai와 관련된 패키지를 받을 수 있습니다. 이제 아래와 같이 기본 예제를 통해 코드를 작성하여 활용해볼 수 있습니다.
1. 기본 예제
import os
import openai
from dotenv import load_dotenv
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
response = openai.Completion.create(
model="text-davinci-003",
prompt="안녕. 내 이름은 이수진이야. \n\nQ: 이름이 뭘까?\nA:",
temperature=0,
max_tokens=100,
top_p=1,
frequency_penalty=0.0,
presence_penalty=0.0,
stop=["\n"]
)
print(response)
print(response.choices[0].text.strip())
위 파이썬(Python) 예제에서 중요하게 봐야할 부분은 다음과 같습니다.
- openai key : openai에서 받은 API key를 등록합니다. 이 Key는 노출되지 않도록 조심하셔야 합니다.
- model : openai에서 제공해주는 모델을 입력합니다. 저는 gpt3.5를 활용할 수 있는 text-davinci-003을 활용합니다.
- prompt : 제가 원하는 실행어를 입력합니다. 어떻게 하면 좋은 결과가 나오는지는 많은 테스트를 해보셔야합니다. 일단, 본 포스팅의 예제에서는 간단하게 이름이 뭔지 출력하도록 작성했습니다.
- max_tokens : 입력 + 출력 값으로 잡을 수 있는 max_tokens 값입니다. 해당 길이가 넘어가면 에러가 나오면서 api 통신이 안 될 수 있습니다.
- stop : stop 지점을 설정합니다. 저는 개행문자(\n)으로 두었습니다.
즉, 위 API 통신을 위해 설정한 각종 파라미터 값은 여러분들의 상황에 맞게 설정해주시면 됩니다. 위 코드의 예시는 정말 간단한 예시라서 저렇게 작성해 두었습니다.
그럼, 위 코드를 실행하면 어떤 결과가 나오는지 확인해보겠습니다.
제가 위 파이썬 파일을 실행하면서 gpt3에게 바라는 답은 '이름'을 답해주길 기대했습니다. 실제로 gpt 모델의 결과를 보면 제 이름을 답해주면서 그 기대값에 응하는 답을 준 것을 확인할 수 있습니다.
이렇게 Openai에서 제공해주는 API key 값으로 Python 코드를 구성해 간단하게 API 통신을 해볼 수 있습니다. text-davinci-003 모델이 chatgpt와 관련된 모델이다보니 성능이 정말 놀랍습니다. 저는 여러가지 테스트를 해보면서 깜짝깜짝 놀라는 결과를 봐왔네요.
2. Python slack sdk와 gpt3 연동해서 활용하기
만약, 위 gpt 모델을 slack과 연동해서 일종의 검색 flow를 만들면 어떨까요? 그러니까, slack에 제가 어떤 메세지를 작성하면 gpt3.5 모델이 해당 메새지를 읽어와 답을 도출하고 그 답을 slack 응답으로 다시 보내는 것이죠.
매우매우 간단하게 해당 flow를 구현해보겠습니다.
1. slack app과 bot token 부여 받기
가장 먼저, slack 예제를 살펴보려면 slack app을 생성하고 bot token을 부여받아야 합니다. 해당 과정은 제가 과거에 airflow 글을 작성하며 정리해두었습니다. 혹시 slack app이 아직 없으시거나 등등 하신다면 해당 글을 참고해주세요.
10분도 안걸리는 짦은 작업입니다! 해두시면 두루두루 요긴하게 사용할 수 있습니다 ㅎㅎ
2. slack 권한 부여하기
1번 과정에서 slack app 등을 부여 받았으면 이제 권한을 추가로 넣어줘야 합니다. 1번 글에서도 slack에 권한을 부여했지만, 이번 예제에서는 추가로 권한을 부여해야 합니다. 권한을 부여하지 않으면 다음과 같이 에러가 나오게 됩니다.
Error creating conversation: The request to the Slack API failed. (url: https://www.slack.com/api/conversations.history) The server responded with: {'ok': False, 'error': 'missing_scope', 'needed': 'channels:history,groups:history,mpim:history,im:history', 'provided': 'chat:write,im:write'}
위 메세지에서 나오는 channels:history, groups:history 등을 셋팅해줘야 slack의 내용을 읽고 통신할 수 있습니다. 해당 권한은 api slack의 OAuth & Permissions에서 설정할 수 있습니다.
3. Python 코드 작성
이제 다음과 같이 Python 코드를 작성해봅니다.
import os
import openai
import argparse
from dotenv import load_dotenv
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError
class OpenAIGpt:
def run(self, msg):
openai.api_key = os.getenv("OPENAI_API_KEY")
response = openai.Completion.create(
model="text-davinci-003",
prompt=f"{msg}.",
temperature=0.3,
max_tokens=512,
top_p=1,
frequency_penalty=0.0,
presence_penalty=0.0,
stop=None
)
return response.choices[0].text.strip()
load_dotenv()
client = WebClient(token=f"{os.getenv('slack_bot')}")
channel_id = os.getenv('slack_ch')
try:
result = client.conversations_history(channel=channel_id)
conversation_history = result["messages"]
openai_gpt = OpenAIGpt()
ans = openai_gpt.run(conversation_history[0]['text'])
print("conversation_history[0]['text'] : ", conversation_history[0]['text'])
print(ans)
client.chat_postMessage(channel='#alert_msg', text=f"{ans}")
except SlackApiError as e:
print("Error creating conversation: {}".format(e))
해당 코드에서 핵심적인 부분은 다음과 같습니다.
- 맨 처음 예제와 마찬가지로 Openai에서 제공해주는 API를 사용해 GPT 모델을 활용하기에 key 값을 셋팅해줍니다.
- 또한, GPT 모델의 API 파라미터 값을 설정해줍니다.
- slack_bot : slack에서 받은 bot api key를 넣어줍니다.
- slack_ch : slack -> python(GPT)으로 메세지를 전송 받을 채널을 설정해줍니다. channel id 값을 넣어줍니다.
- conversation_history에서 가장 최근 것을 가져와 openai gpt에 넣어줍니다.
- openai gpt의 응답값을 제 slack의 alert_msg 라는 채널에 보내줍니다.
여기서, slack_ch와 alert_msg라는 채널이 있음을 확인할 수 있습니다. 그리고 slack_ch에서는 메세지를 받아 이를 chatgpt에 넘겨주고 alert_msg는 gpt의 결과를 출력시켜주는 채널이라고 볼 수 있습니다.
결과를 보면 아래와 같이 됩니다.
저는 chat이라는 slack 채널에서 안녕하세요 라고 메세지를 남겼습니다. 이제 위 Python 코드에서는 chat이라는 slack channel에서 '안녕하세요' 라는 데이터를 받아 openai gpt에 값을 넣어줍니다. gpt 모델은 텍스트 입력 값을 받아 응답 메세지를 생성해 보내주고 코드에서는 이 응답 값을 alert_msg 채널에 보내주도록 만든 것입니다. 그리고 위 사진은 그 결과를 보여줍니다.
마무리 및 다음글
본 포스팅에서는 OpenAI에서 제공해주는 API를 활용해 GPT 모델을 활용해보는 예제를 작성하였습니다. 사용한 모델은 ChatGPT의 전신이 되는 모델인 GPT3.5 버전의 davinci-003이며, 성능도 놀라울 정도로 좋게 나오는 것을 확인할 수 있었습니다. 글을 올린 이후에 OpenAI에서 ChatGPT API를 공개하였기 때문에 여기서는 GPT3.5를 기준으로 진행했다고 보시면 될 것 같습니다. 파이썬(Python)으로 간단히 예제를 살펴보았는데 어떻게 응용하냐에 따라 정말 다양하게 사용을 확장할 수 있을 것 같습니다.
응용할 수 있는 방법 중 Fine-tuning 방법이 있는데 OpenAI GPT 모델을 Fine tuning 하는 방법을 (https://lsjsj92.tistory.com/656)에 작성해두었습니다. 필요하신 분들은 참고해보시길 바랍니다.
추후 여유가 된다면 ChatGPT API에 대해서도 작성하겠습니다.
그럼 긴 글 읽어주셔서 감사합니다.
저에게 연락을 주시고 싶으신 것이 있으시다면
- Linkedin : https://www.linkedin.com/in/lsjsj92/
- github : https://github.com/lsjsj92
- 블로그 댓글 또는 방명록
으로 연락주시면 감사하겠습니다.
'Data Engineering 및 Infra' 카테고리의 다른 글
OpenAI ChatGPT API를 활용해 추천 시스템 구현하기(feat. HuggingFace) (37) | 2023.03.14 |
---|---|
OpenAI GPT Fine-Tuning(파인튜닝) 방법 정리 - 나만의 GPT 모델 만들기 (57) | 2023.02.27 |
Apache 에어플로우(Airflow) 예제(example) - slack으로 알람, 메세지 받기 (8) | 2022.03.21 |
Apache airflow(에어플로우) 머신러닝(Machine Learning) 예제로 시작해보기 (13) | 2022.03.07 |
Apache 에어플로우(Airflow) - DAG branch(분기) 예제(example) 및 Python operator, XCom에 대해서 (0) | 2022.02.21 |