[환경 셋팅]
- API 키 발급 (https://platform.openai.com/api-keys)
- 사용 tool: Visual Studio 코드
>> pip을 이용한 openai 라이브러리 설치
pip install openai
- 사용 언어: Python
import os
import openai
from dotenv import load_dotenv
load_dotenv()
openai.api_key = os.getenv('OPENAI_ACCESS_KEY') # 발급받은 키 입력
>> 니는 홈페이지에서 발급 받은 API 키를 .env 파일에 관리를 하고 있어 위와 같이 키를 입력함
[Chat Completion API 예시]
open ai 공식 홈페이지에서 제공하는 예시 (https://platform.openai.com/docs/guides/text-generation/chat-completions-api)
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Who won the world series in 2020?"},
{"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
{"role": "user", "content": "Where was it played?"}
]
)
Input parameter
- model: 사용할 gpt 모델로 버전이 높으면 업데이트된 데이터 양이 달라서 성능, 가격 차이가 있어 적절한 모델 선택 필요.
웬만하면 'gpt-3.5-turbo'를 사용하였을 때 성능이 괜찮았은데 트레이닝 데이터가 21년 9월까지의 데이터이기 때문에 최신 데이터에 대한 정보가 필요하면 추천하지 않음
- messages: role에는 역할을 content에는 내용을 입력
1. system: gpt에게 역할을 지시하는 역할로 content에 역할 뿐만아니라 상황에 대해서도 설명 함
2. user: 사용자의 입력
3. assistant: gpt의 대답 예시
system값만 넣어도 되는데, 위 처럼 대화에 대한 예시를 넣어줘서 gpt의 말투나 역할을 좀 더 분명하게 해줄 수 있음.
대화를 이어나가는 것 또한 messages에 계속 질문(user)과 대답(assistant)을 저장하면서 api를 호출하는 것임
- 이 외 파라미터들 값을 바꿀 수 잇는데 이번 예시에서는 default 값을 사용함
| parameter | 기본 값 | 설명 |
| temperature | 0.7 | - 다양성 정도 - 0 ~ 2 사이의 숫자를 갖고 높을 수록 랜덤한 결과 (창의적인 결과물)을 출력 - 값이 높을 수록 모델이 생성하는 문장이 더 다양해져 창의성이 필요한 경우 추천하고, 값이 낮을 수록 일관성 있는 문장이기 때문에 정보성인 글을 출력하고 싶을 때 추천함 |
| presence_penalty | 0 | - -2 ~ 2 사이 숫자 - 양수 값은 지금까지 텍스트에 나타내는지 여부에 따라 새 토큰에 패널티를 주어 모델이 새 주제에 대해 이야기할 가능성이 높음 |
| fequency_penalty | 0 | - -2 ~ 2 사이 숫자 - 양수 값은 지금까지 텍스트의 기본 빈도를 기반으로 새 토큰에 패널티를 주어 모델이 동일한 줄을 그대로 반복할 가능성을 줄임 |
위 파라미터 모두를 수정하면서 원하는 지점을 찾기는 어려워서 나는 보통 temperature 를 수정하면서 결과값을 확인하고 그 중 적당한 값으로 고정하여 사용함
[API를 이용한 ChatGPT 구현]
위 예시의 결과를 확인

결과 전체를 찍으면 model명, 결과, 토큰 수 모두 확인 할 수 있는데 이 부분에서 우리가 필요로 한는 것은 assistant 결과이므로 아래와 같이 print 확인
print(response['choices'][0]['message']['content'])
# 결과
# The 2020 World Series was played at Globe Life Field in Arlington, Texas.
[단순 대답 확인]
한국어로 다른 예시 구현
- 위 예시처럼 계속 호출 할 때 message 내에서 질문을 바꿔주는 것은 번거롭기 때문에 함수화하여 진행
import os
import openai
from dotenv import load_dotenv
load_dotenv()
openai.api_key = os.getenv('OPENAI_ACCESS_KEY')
def call_gpt(user_qst):
message = [{"role": "system", "content": "You are a helpful assistant."}]
message.append({"role":"user","content": user_qst})
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages= message
)
return response['choices'][0]['message']['content']
call_gpt('2018 월드컵 우승 국가는?')
# 결과
# '2018 월드컵에서 우승한 국가는 프랑스입니다.'
시스템 프롬프트(system content)의 경우는 한국어로 써도 무방하나, 번역을 해서 들어가기 때문에 한국어 또한 문법은 잘 지켜야함.
(참고) 최근 정보 확인
call_gpt('2022 월드컵 우승 국가는?')
# 결과
# '2022 월드컵 우승 국가는 현재 알 수 없습니다. 월드컵 대회는 예측이 어렵고 경기 결과에 따라 다를 수 있습니다. 대회가 시작되고 경기가 진행될 때까지 어떤 국가가 우승하게 될지 확인할 수 있습니다.'
위에 언급했던 것처럼 'gpt-3.5-turbo'의 경우 2021년 9월까지의 데이터이기 때문에 최근 정보에 대해서는 확인 할 수 없음
[대화 챗봇 구현]
위 결과는 한 질문에 대해서의 대답만을 출력하였고 이번에는 간단히 대화를 이어나갈 수 있는 챗봇을 구현.
import os
import openai
from dotenv import load_dotenv
load_dotenv()
openai.api_key = os.getenv('OPENAI_ACCESS_KEY')
message = [
{"role": "system", "content": "You are a helpful assistant."}
]
def call_gpt(user_qst):
message.append({"role":"user","content": user_qst})
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages= message
)
reply = response['choices'][0]['message']['content']
message.append({"role":"assistant","content": reply})
return reply
user_qst = input()
# 빈 값 입력할 때까지 계속 진행
while user_qst:
reply = call_gpt(user_qst)
print('질문::', user_qst)
print('답변::', reply)
user_qst = input() #재질문
결과
질문:: 안녕
답변:: 안녕하세요! 도움이 필요하신가요? 저는 여러분을 도와드릴 수 있는 인공지능 어시스턴트입니다. 무엇을 도와드릴까요?
질문:: 심심해.
답변:: 심심하신가요? 저도 함께 놀 수 있습니다! 저는 여러 가지 토론 주제, 노래 추천, 재미있는 퀴즈, 혹은 간단한 게임에 대해 대화할 수 있습니다. 무엇을 좋아하시나요? 저와 함께 무엇을 하실까요?
질문:: 재미있는 퀴즈 내줘!
답변:: 물론이죠! 재미있는 퀴즈 하나 준비했습니다. 준비되셨나요? 여기 질문입니다:
퀴즈: 대한민국의 수도는 어디일까요?
1. 서울
2. 부산
3. 제주도
4. 대전
답을 말씀해주세요!
질문:: 1. 서울!!
답변:: 정답입니다! 대한민국의 수도는 서울입니다. 멋지게 맞추셨네요! 이제 또 다른 퀴즈를 준비해드릴까요?
질문:: 웅웅
답변:: 좋아요! 이번에는 동물에 관한 퀴즈를 준비했습니다. 준비되셨나요? 그럼 시작해볼까요?
퀴즈: "포유류" 중에서 가장 크고 무거운 동물은 무엇일까요?
1. 코끼리
2. 고릴라
3. 돌고래
4. 사자
정답을 말씀해주세요!
질문:: 4. 사자!!
답변:: 아쉽지만, 정답은 1. 코끼리입니다. 코끼리는 평균적으로 가장 크고 무거운 포유류 동물 중 하나입니다. 그래도 잘 참여하셨네요! 또 다른 퀴즈가 필요하시면 말씀해주세요.
>> 이 전 질문과 이어서 답변을 이어나가는 간단한 챗봇을 구현해봄
'GPT' 카테고리의 다른 글
| [GPT] OpenAI GPT 1.x API 버전업데이트에 따른 변경사항 간단 정리 (Python) (0) | 2024.02.16 |
|---|