빅데이터 전문가 되기
[OpenAI] GPT api 활용하여 나만의 챗봇 만들기 본문
인공지능하면 제일많이 사용하는 Chat-gpt입니다.
다른 오픈소스 LLM에 비해 한국어 인식을 잘할 뿐아니라 쓰임새도 간편해서 가장 대중화되어 있습니다.
오늘은 이러한 OpenAI의 api key를 발급받아 나만의 챗봇을 간단하게 만들어보도록 하겠습니다.
😸 OpenAI API의 key 발급받기
OpenAI Platform
Explore developer resources, tutorials, API docs, and dynamic examples to get the most out of OpenAI's platform.
platform.openai.com
- 본인의 계정으로 로그인한 후에 +Create new secret key를 눌러 key를 발급받습니다.
- 이때 key는 처음에 발급을 받은 이후에 생성된 key값은 확인하지 못하니 잘 적어두는 게 좋습니다.
👉 ChatGPT api 가격 및 토큰
- 처음 무료로 이용할 수 있는 크레딧은 18달러라고 합니다.
- 이는 Usage의 게이지에서 사용량을 확인할 수 있습니다.
- 일반적으로 많은 모델이 있지만 채팅에 대부분 이용하는 모델은 gpt-3.5-turbo 입니다.
- 현재 gpt-3.5-turbo는 1000토큰당 2.2원 정도로 1082만 토큰을 사용할 수 있습니다.
👉 ChatGPT의 프롬프트 작성 방법
import openai
openai.api_key ='본인이 발급받은 key값'
response = openai.ChatCompletion.create(
model='gpt-3.5-turbo',
messages = [{'role':'system', 'content':'content'},
{'role':'user', 'content':'content'}])
- 기본적인 채팅을 이용한 프롬프트 작성 방법입니다.
1. 메세지의 유형
- system messages : AI 비서의 동작을 설명
- user messages : AI 어시스턴트가 말하길 원하는 내용 설명
- assistant messages : 대화의 이전 응답을 설명
만약 assistant messages를 포함할 경우 user messages와 번갈아서 나타나야 함.
-> 이 때 어시스턴트의 응답은 response['choices'][0]['message']['content']가 포함되야 함.
2. 텍스트 완성 (openai.Completion.create() 메서드 활용 시)
- model : gpt-4 (현재 결제 후 wait list를 작성해야 사용 가능), gpt-3.5-turbo, text-davinci-003 등..
- prompt : 모델이 출력을 생성하도록 안내하는 텍스트
- max_tokens : 텍스트 생성시 소비하는 토큰 수 (프롬프트 포함하여 4096 미만 가능)
- temperature :모델의 창의성 수준을 지정 ( 0~1의 값 중 더 낮은 값을 설정할 경우 정확하고 간결한 답변 생성)
👉 ChatGPT 활용 예시
1. User에 원하는 내용을 입력하여 나만의 챗봇 생성
# openai 다운
!pip install openai
import openai
openai.api_key = "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"
messages=[]
while True:
content = input('User:')
messages.append({'role':'user','content':content})
completion = openai.ChatCompletion.create(
model='gpt-3.5-turbo', messages = messages)
chat_response = completion.choices[0].message.content
print(f'ChatGPT: {chat_response}')
messages.append({'role':'assistant', 'content':chat_response})
- User의 내용에 질문을 했을 경우, 그에 대한 대답을 Chat GPT가 해준다는 것을 알 수 있습니다.
- 단, GPT-3.5는 2021년까지의 데이터를 축적하여 만든 오픈소스로 현재나 실시간의 질문에는 엉뚱하거나 잘못된 지식을 전하기도 합니다.
2. content안의 내용을 입력하여 출력
- 사전에 user message를 활용하여 출력할 수도 있습니다.
import openai
openai.api_key ="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"
response = openai.ChatCompletion.create(
model= 'gpt-3.5-turbo',
messages = [{'role':'user', 'content':'챗 GPT가 뭔지 설명해줘'}])
print(response.choices[0].message.content)
3. 프롬프트를 좀 더 상세히 작성하여 출력
- 이번에는 GPT에게 역할을 부여하여 예시를 생성해보도록 하겠습니다.
import openai
openai.api_key="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"
system_msg = "너는 데이터 과학을 이해하는데 유용한 조력자야"
user_msg = "작년 판매액에 대하여 작은 예시로 데이터셋을 만들어줘"
response = openai.ChatCompletion.create(
model='gpt-3.5-turbo',
messages = [{'role':'system', 'content':system_msg},
{'role':'user', 'content':user_msg}])
print(response['choices'][0]['message']['content'])
4. 함수를 생성하여 출력
import openai
openai.api_key="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"
def chat(system, user_assistant):
# assert문을 사용하여 system을 문자열, user_assistant는 list로 지정
assert isinstance(system, str), "'system'은 문자열입니다"
assert isinstance(user_assistant, list), "'user_assistant'는 리스트입니다"
system_msg = [{'role':'system', 'content':system}]
user_assistant_msgs = [{'role':'assistant', 'content':user_assistant[i]}
if i % 2 else {'role':'user', 'content':user_assistant[i]}
for i in range(len(user_assistant))]
msgs = system_msg + user_assistant_msgs
response = openai.ChatCompletion.create(model='gpt-3.5-turbo',
messages=msgs)
return response['choices'][0]['message']['content']
response_fn_test = chat('너는 머신러닝 전문가야',['인공 신경망에 대해서 설명해줘'])
print(response_fn_test)
-> 인공 신경망에 대해서 설명해준다는 것을 알 수 있습니다.
5. AI Assistant의 응답을 재사용하여 출력
- 3번에서 만들었던 작년 판매액에 대한 내용을 활용하여 샘플 데이터 세트를 분석해보도록 하겠습니다.
import openai
openai.api_key ="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"
system_msg = "너는 데이터 과학을 이해하는데 유용한 조력자야"
user_msg = "작년 판매액에 대하여 작은 예시로 데이터셋을 만들어줘"
response = openai.ChatCompletion.create(
model='gpt-3.5-turbo',
messages = [{'role':'system', 'content':system_msg},
{'role':'user', 'content':user_msg}])
assistant_msg = response['choices'][0]['message']['content']
user_msg2= "방금 만든 데이터 집합을 이용하여 평균을 계산하는 컬럼을 '전체_판매평균' 이름으로 추가하고, 계산 결과를 포함해줘"
def chat(system, user_assistant):
# assert문을 사용하여 system을 문자열, user_assistant는 list로 지정
assert isinstance(system, str), "'system'은 문자열입니다"
assert isinstance(user_assistant, list), "'user_assistant'는 리스트입니다"
system_msg = [{'role':'system', 'content':system}]
user_assistant_msgs = [{'role':'assistant', 'content':user_assistant[i]}
if i % 2 else {'role':'user', 'content':user_assistant[i]}
for i in range(len(user_assistant))]
msgs = system_msg + user_assistant_msgs
response = openai.ChatCompletion.create(model='gpt-3.5-turbo',
messages=msgs)
return response['choices'][0]['message']['content']
user_assistant_msgs = [user_msg, assistant_msg, user_msg2]
response_calc = chat(system_msg, user_assistant_msgs)
print(response_calc)
-> 함수를 이용하여 이전의 만들었던 내용을 불러와서 추가로 원하는 내용을 적용시킬 수 있었습니다.