파이썬으로 OpenAI의 API에 접속하는 방법은 다음과 같습니다.

 

우선 OpenAI 계정(account)를 만들어야 합니다. 계정이 없는 경우 아래 문서의 OpenAI 가입방법을 참고합니다.

 

chatGPT 가입하고 시작하기 / chatGPT text completion 사용방법

 

chatGPT 가입하고 시작하기 / chatGPT text completion 사용방법

IT신기술 쪽에서 NFT 이후 가장 핫하게 주목받고 있는 ChatGPT입니다. ChatGPT는 아직 완성된 버전은 아니지만 미래 사회의 방향성을 보여주는 신박한 세계인 것 같습니다. 인공지능이 어떤 것인지 이

digiconfactory.tistory.com

 

 

로그인 후 OpenAI의 API-Keys 페이지에 들어갑니다.

 

https://platform.openai.com/account/api-keys

 

OpenAI API

An API for accessing new AI models developed by OpenAI

platform.openai.com

 

심플한 페이지 구성입니다.

 

 

 

Create new secret key를 클릭하면 API key가 생성됩니다. 이 키는 단 한번만 알려주므로 만약 이 비밀 키를 잃어버리면 다시 발급받아야 합니다. 당연한 주의사항이지만 API Key를 깃헙이나 다른 사람이 볼 수 있는 곳에 올리면 안됩니다. 타인의 API Key를 탈취하는 해커들이 계정에 엄청난 과금을 물릴 수 있습니다. API는 사용량에 비례하여 돈을 내기 때문에 삽시간에 털릴 수 있으니 항상 주의합니다. API키가 유출되지 않도록 하는 것은 사용자 본인의 책임으로 한번 더 강조합니다 (AWS 등 클라우드 컴퓨터의 사용자들은 이 중요성을 잘 알고 있음)

 

경고 메시지가 나오는 것은 이런 사례가 있기 때문에 OpenAI 측이 미리 공지하는 것 입니다.

 

 

 

다음은 파이썬 환경을 셋업합니다.

 

파이썬 설치 방법 총정리 (윈도우 / 리눅스)

 

파이썬 설치 방법 총정리 (윈도우 / 리눅스)

파이썬 설치하기 파이썬 설치 방법을 총정리한 포스팅입니다. 윈도우와 리눅스로 나눠서 설명합니다. 여러가지 방법 중에 표준적인 방식들을 정리했으니 본인의 컴퓨팅 환경에 맞도록 선택해

digiconfactory.tistory.com

 

openai 모듈을 설치합니다.

 

pip install openai

 

첫번째 예제

 

소스코드로 한번 알아보겠습니다.

 

아래 <OPEN API KEY>에 발급받은 비밀 키를 입력 후 실행합니다. 일단은 실행결과를 보고 설명합니다.

 

import openai

openai.api_key ="<OPEN API KEY>"
response = openai.Completion.create(
  model="text-davinci-003",
  prompt="Say Hello to the World!",
  max_tokens=50,
  temperature=0
)

print(response)

 

 

응답은 openai.openai_object.OpenAIObject 라는 클래스의 형태로 돌려줍니다. 여기서 많은 정보를 알 수 있습니다. 이 코드의 목적은 text_completion 입니다. chatGPT가 사용하는 그 챗봇 서비스가 이 text_completion를 기반으로 합니다.

 

chatGPT개념은 직관적으로 이해가 쉽지만 이걸 풀어서 보면 또 복잡하긴 합니다. 자연어 처리이기 때문입니다. 말, 즉 언어에는 수많은 복잡한 개념이 있지만 우리 인간은 늘상적으로 무의식적으로 사용가능합니다. 이 completion 의 내용을 들여다보면 그 무의식 같은 것들을 하나씩 다 정의해놓은 겁니다. 이것들을 한번에 모두 이해하긴 쉽지 않고 간단한 것부터 몇개만 알아보겠습니다. (포스팅이 길어지는 것은 필자도 싫어함)

 

1. 프롬프트

 

- prompt(프롬프트): 프롬프트는 completion (완성된 텍스트)을 만들기 위한... 뭐라고 할까 텍스트 입니다. 코딩에서는 문자열, 문자배열이라고 하기도 하고, 토큰 배열(array of tokens), 토큰 배열의 배열(array of token arrays)라고도 하고, 인간의 뇌적으로 퉁쳐서 봤을 때는 질문(question)와 대답(answer)의 관계에 질문(question)에 해당한다고도 볼 수 있을겁니다. (뇌피셜이니까 학술에는 응용이 어렵다) 사람들이 "chatGPT에 질문해봐~, chatGPT에 물어봐" 라고 하면 그 질문 내용이 프롬프트입니다.

 

물론 chatGPT에는 질문 뿐 아니라 뭘 시킬 수도 있습니다.  필자는 prompt에 Say Hello to the World! 를 넣었습니다. 이것도 질문인가요? 요청인가요? 여튼 텍스트를 완성하기 위해 (text_completion) 먼저 프롬프트가 들어가야 합니다. openai의 자연어처리 모델은 prompt 를 text_completion 하기 위해 만들어졌습니다. 거꾸로 text가 먼저 입력하고 prompt를 꺼낼 수 있는 방법이 있는지는 모르겠는데요. 아무튼 API는 prompt 입력 text 출력이 되도록 설계되있습니다.

 

거기에 대한 text는

 

"text": "\n\nHello World!"


이렇게 왔는데 \n\n은 두줄 띄우라는거고, Hello World 입니다. Say Hello to the World! 라는 말의 의미를 이해한 것 처럼 보입니다. (머신러닝의 결과)

 

왜냐하면 기계적인 대답은 Hello to the World 라고 말할 수 있는데요.

 

- prompt: '세상에 안녕이라고 말해봐(외쳐봐)!' (Say Hello to the World!)

 

- text: '세상에 안녕' (Hello to the World)

 

이렇게 나와야 컴퓨터 답습니다. (이쪽이 더 마음에 든다면...?)

 

그러나 chatGPT는 다음과 같이 응답합니다.

 

- prompt: '세상에 안녕이라고 말해봐(외쳐봐)!' (Say Hello to the World!)

 

- text: '안녕 세상아!' (Hello World!)

*세상을 향해 안녕이라고 말하는 것

 

그밖에 알아야 할 개념

이것만으로도 openai를 충분히 사용할 수 있겠지만 몇가지 알아야 할 개념을 보겠습니다.

 

모델

 

 

model(모델) : 모델은 여러가지가 있습니다. AI 모델이 하나만 있는게 아니라 특화된 분야에 따라 수십가지입니다. 그 중에서 openai 가 범용 자연어 처리 분야에 추천하는 것은 text-davinci-003 입니다. 사람들이 범용 자연어로 질문을 많이하지요. 그래서 현재 대부분 davinci-003로 시연하는 자료들이 많은 것 같습니다. 아래 코드는 사용가능한 모델의 이름을 뽑을 수 있습니다. 자연어처리 분야에 관심있는 사람은 여러 모델을 가지고 놀기에 좋습니다.

 

import openai

openai.api_key ="<API KEY>"
models = openai.Model.list()

print(type(models))
# print(models)

for model in models['data']:
    print(model['id'])

 

Temperature

 

temperature: 샘플링 온도라고 번역되는데 completion 의 text를 정규화 - 랜덤화 시키는 수준입니다. 가장 정제된 답변(출력)을 원하면 0을 놓고 가장 랜덤한 출력은 2입니다. openai 의 공식문서에는 0.2~0.8 범위를 이야기하는데 top_p나 temperature를 조절하는 것을 추천한다고 합니다. 그 내용을 보니까 수학의 확률을 적용하는 공식같은 내용이라 문외한인 필자는 잘 모르겠습니다. 다만 이것을 조절하면 답변을 랜덤하게 만드는 수준이 정교하게 컨트롤 가능하다는 건 알겠습니다. 사람들이 가장 많이 사용하는 말, 즉 정제된 방식의 문장을 만들려면 수치를 낮게할수록 가까워집니다.

 

예를 들어 temperature를 0으로 놓고 다음의 prompt를 입력해봤습니다.

 

prompt: why does the sun rise everyday? (태양은 왜 매일 떠오르나요?)

text:The sun rises every day because of the Earth's rotation. As the Earth rotates on its axis, the part of the Earth facing the sun is illuminated, creating the sunrise. (태양이 매일 떠오르는 이유는 지구의 자전 때문입니다. 지구가 자전축을 중심으로 자전하면서 태양을 향한 지구의 일부가 비춰져 일출이 만들어집니다.)

 

temperature=0에서 항상 같은 답변이 나옵니다.

 

*그러면 temperature=0.8은 어떨까요?

 

The sun rises everyday because it is constantly moving across the sky as a result of the Earth's rotation. As the Earth rotates, different parts of the world are exposed to the sun's light, causing day and night.

 

태양이 매일 떠오르는 이유는 지구 자전으로 인해 태양이 하늘을 가로질러 끊임없이 움직이기 때문입니다. 지구가 자전함에 따라 세계의 다른 지역이 태양 빛에 노출되어 낮과 밤이 생깁니다.

The sun rises every day because of the Earth's rotation. As the Earth spins on its axis, different parts of the planet face the sun, making it appear to rise in the east and set in the west.


지구의 자전으로 인해 태양은 매일 떠오릅니다. 지구가 자전축을 중심으로 자전함에 따라 지구의 여러 부분이 태양을 향하게 되어 동쪽에서 뜨고 서쪽에서 지는 것처럼 보이게 됩니다.

 

문장의 부분을 랜덤하게 바꿉니다. 영어 시험에선 같은 의미의 문장을 다른 문장으로 바꾸는 것을 paraphrasing (의역)이라고 하는데 우리가 봤을 때는 같은 내용을 다른 말로 바꾸는 것으로 보입니다. 이것은 사용자가 여러번의 테스트를 통해 특성을 파악하면 사용하기가 좋을 듯 합니다.

 

토큰

 

- 마지막으로 토큰(token)은 openai의 모델을 사용하는 단위입니다. token에 따라 AI 모델이 계산량이 달라집니다. 당연히 많은 토큰이 컴퓨팅 리소스를 더 많이 사용하겠지요. 해서 openai의 Competion 을 생성할 때 max_tokens을 설정할 수 있습니다. 모델의 엔진에는 과부하를 막기위해 제한이 걸려있습니다. 모델에 따라 다르다고 하는데 맥시멈 토큰이 4097이라고 합니다. openai의 Object 클래스를 보면 토큰을 얼마나 사용했는지 나옵니다. prompt와 completion 토큰을 합친 사이즈기 때문에 prompt를 잘 정제해서 사용하는게 좋습니다.

 

api에서도 토큰 사용량을 제한할 수 있는데 토큰이 모자라면 텍스트를 생성하다 그냥 멈춥니다. chatGPT를 사용할 때도 이런 현상을 발견할 수 있는데 그 때는 그 context에서 prompt에 continue를 입력하면 됩니다.

 

*토큰이 openai 사용 단위이라는 것은 요금 단위라는 말과 같습니다. openai를 바탕으로한 서비스를 만든다면 token 사용 설계도 되야합니다. (사용자에게도 중요하다)

 

토큰에 대한 더 깊은 설명은 아래 openai 문서를 참고합니다.

 

https://help.openai.com/en/articles/4936856-what-are-tokens-and-how-to-count-them

 

What are tokens and how to count them?

What are tokens and how to count them? Written by Tabarak Khan Updated over a week ago What are tokens?Tokens can be thought of as pieces of words. Before the API processes the prompts, the input is broken down into tokens. These tokens are not cut up exac

help.openai.com

 

두번째 예제

 

import openai

openai.api_key="<발급받은 API KEY>"

print("<OpenAI API Connection>")
print("-------------------------------")

#completion 셋업
prompt = "why should i eat an apple?"
response = openai.Completion.create(model="text-davinci-003",prompt=prompt,temperature=0.8,max_tokens=500)

#openai의 응답에 대해서 확인
print(response)
print(type(response))
print(response["choices"][0]["text"])
print(type(response["choices"][0]["text"]))

#파일에 텍스트를 저장
f=open("log-openai.txt", 'w')
f.write(response["choices"][0]["text"])
f.close()

print("-------------------------------")
print("connection closed...")

 

답변이 길어지면 콘솔에서 보기 불편하니까 텍스트 파일에 저장해서 봅니다. compeltion 만드는 방법은 이전 예제와 비슷하고, 여기서 type을 보면 openai의 OpenAIObject라는 것이고 Json 이나 딕셔너리와 닮았습니다. 이것은 그냥 텍스트 파일로 저장할 수는 없으니까 str을 뽑습니다. ["choices"][0]["text"] 로 문자열을 사용할 수 있습니다.

 

 

 

추가적으로 질문을 주로 영어로 사용하는 이유는 있어 보이려는게 아니라 첫번째는 한글은 토큰수가 영어에 비해 많이 들어가고 한글 문서의 데이터의 부족 때문인지 부정확한 내용들도 좀 있었습니다. 이는 어쩔 수 없는게 머신러닝의 상당수 데이터들이 웹크롤링 자료들이라면 한글 컨텐츠는 영어나 다른 언어에 비해 압도적으로 부족합니다. 데이터의 부족 -> text completion의 한계라고 볼 수 있지요. 이것은 결국 국내 AI 업체들이 노력해야 할 문제라고 봅니다.

 

AI 모델에 따라 다르겠지만 개인적으로는 chatGPT에 한글 prompt를 입력하는 것 보다 영어로 답변을 받은 다음에 deepL과 같은 AI번역기를 사용하는 방법을 추천합니다. 나중에는 한글 completion도 좋아질 겁니다만... 일단 토큰을 많이 사용한다는 점은 좀 이게 개선이 가능한가 봐볼 문제입니다.

 

OpenAI API를 가지고 커스터마이즈한 chatGPT로 사용하는 것도 좋은 생각입니다. OpenAI API에 대한 첫번째 포스팅이라 조금 내용이 길었네요.

공유하기

facebook twitter kakaoTalk kakaostory naver band