본문 바로가기
IT/인공지능

GPT-3.5; OpenAI API in Python - colab 튜토리얼(1)

by 염옥지 2023. 7. 18.
반응형

최근에 핫했던, Chat-GPT로 그 후에 Open ai가 많은 주목을 받게 되었다. 

이번에 우연치 않은 기회로 회사로부터, 지원을 받아 open api의 유료버전을 접해볼 수 있었으며, 사실상, open api는 처음 해보는 분야(?) 이기 때문에 천천히 하나씩 진행해보고자 한다. 

 

유료버전인 gpt-3.5-turbo를 사용하여 파이썬으로 연결 및 테스트를 진행 예정이다. chat과 image 둘다 생성해보는 코드는 마지막 코드 참조.

목차

  • Open API key 발급 (Create API key) 
  • OpenAI-3.5 Create Chat 
  • OpenAI-3.5 Create Image

 

 

 

 

 

 

 

 

 

 

먼저 선행이 되어야 할 부분은 계정 생성이다. openai 사이트에 접속하여 좌측의 api 영역을 누르면, 위의 Welcome to the OpenAI platform이 보이는 것을 알 수 있다. 

Create API Key 

하단의 그림 중, [+ Create new secret key]  를 누르면 이름을 아무렇게나 누르고 키를 생성한다. 

Click [+ Create new secret key]

생성 후에 아래와 같이 리스트가 생성된 리스트가 보인다. 

 

Name : 220 

Key는 비공개이며, API reference를 보면서 한번 정리해보고자 한다. 

 

 

 

애플리케이션 통신에 가장 많이 쓰이는 통신 방법은 HTTP이다.

하지만 HTTP는 무상태성(Stateleses) 프로토콜로 누가 요청을 했는지, 인증된 클라이언트인지 확인이 불가능한데

이 부분을 해결하기 위해 나온 방법이 서버 측에 클라이언트의 접속 상태를 저장하는 세션 기반의 인증이다.

 

Open AI 의 API 문서에 따르면, Bearer라는 인증 타입을 사용하고 있는 것을 알고 있고, Bearer는 JWT 혹은 OAuth 에 대한 토큰을 사용한다. 

문서에서 가이드한 것은 아래와 같지만 위에 있는 os.getenv() 를 쓰면 Colab에서는 오류가 나는 상태여서 그냥 넣어서 사용하였다. 

import os
import openai
openai.organization = "***************"
openai.api_key = os.getenv("OPENAI_API_KEY")
openai.Model.list()

문서를 읽어보면, 각 날리는 API (link 속성) 이 다른데, 시도해본 것은 두가지로, Create chat & image 

 

OpenAI-3.5 Create Chat

기존에는 "prompt=String"을 통해 채팅 내용을 넣어주었는데,

gpt-3.5-turbo 는 "messages = List(Dict('role':(String), 'content':(String)))" 형태로 내용을 넣어줘야한다. 

messages 리스트에 들어가는 딕셔너리는 두 개의 key-value 원소를 가지며,

'role' 은 역할인데 'system', 'user', 'assistant', 'function' 로 나뉜다.  'system' 은 대화 상황, 'user' 는 사용자의 입력, 'assistant' 는 그에 따른 AI 의 답변을 의미한다. function은 검색을  좀 해본 결과, gpt-4-0613  gpt-3.5-turbo-0613 모델에서 사용이 가능하다고 하며, 이 두 모델은 입력에 따라 함수의 호출 여부를 탐지해 낼 수 있도록 fine-tune 되어 있다고 한다. (이 부분 사용은 조금 나중에 심화로 진행) 

'content' 에 해당하는 문장을 넣어주면 된다.

 

# 유료 버전l chatting
import requests
import json
headers={"Authorization":f"Bearer {OPENAI_API_KEY}","Content-Type":"application/json"}

link="https://api.openai.com/v1/chat/completions" # 질문에 해당하는 링크 

messages=[        
    {"role": "system", "content": "오늘 하루는 어땠어?"},
    {"role": "user", "content": "정말 최악의 하루였어, 시험는 망했고 벌써 오후 4시야"},
    {"role": "assistant", "content": "너무 힘들었겠다. 근데 내일 볼 시험이 있는데 준비했어?"},
    {"role": "user", "content": "아니... 하나도 안했어... 미칠것같아"}
    ]
data={"model": "gpt-3.5-turbo", "messages": messages, "top_p": 1, "max_tokens": 300} 
res=requests.post(link,data=json.dumps(data),headers=headers)

print(res.json()['choices'][0]['message'])
더보기

결과 
{'role': 'assistant', 'content': '안 좋은 상황이지만, 아직 하루가 끝나지 않았어. 일단 긍정적으로 생각해보자. 시간이 네 시인데, 아직 공부할 수 있는 시간이 남았어. 일단 마음을 가다듬고 집중해서 최선을 다해 보자. 또한, 시험이 끝난 후에는 잘 쉬고 내일을 위해 계획을 세워보는 게 좋을 것 같아. 항상 좋은 결과를 낼 수 있는 것은 아니지만, 최선을 다하는 것이 중요해. 화이팅!'}

 

# temperature 가 높을 수록 창의적이지만 부정확한 답이 출력될 수 있다. 0 과 2사이의 값 선택 (기본 값 1)
# top_p: 방법은 다르지만 temperature와 같은 역할, temperature와 top_p 둘 중 하나만 사용 (기본값:1)
# max_tokens: 답변 문장의 최대 길이를 결정함

 

비율을 조정하면서 보니, 확실히 크기가 클수록 좀 더 자유로운 문장이 있었다. 

 

OpenAI-3.5 Create Image 

# Create image 
model_link = 'https://api.openai.com/v1/images/generations'
headers={"Authorization":f"Bearer {OPENAI_API_KEY}","Content-Type":"application/json"}
data_={
   "prompt": "feeling fresh ocean",
    "n": 2,
    "size": "1024x1024"
}

res=requests.post(model_link,data=json.dumps(data_),headers=headers)
print(res.json())

prompt에 이미지의 설명을 넣고 1000자 이내로 넣는다. 

n는 이미지 생성 개수에 해당하며, 1부터 10 사이이다. 

size는 세개 중에 하나를 선택하여야 한다. 

 

위의 코드로 생성된 아래의 URL은 두 개이다. 

생성된 이미지는 아래와 같다. 

 

 

 

 

 

 

 

 

 

 

더보기

 

반응형