본문 바로가기

GPT

[GPT] ChatGPT API 사용 법 (Python)

[환경 셋팅]

- 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. 코끼리입니다. 코끼리는 평균적으로 가장 크고 무거운 포유류 동물 중 하나입니다. 그래도 잘 참여하셨네요! 또 다른 퀴즈가 필요하시면 말씀해주세요.

>> 이 전 질문과 이어서 답변을 이어나가는 간단한 챗봇을 구현해봄