지난번에 OpenAI API 연결을 테스트 하기 위해 만들었던 소스코드를 분석해 보겠습니다.
첫번째 import OpenAI는 OpenAI API 를 사용하기 위해 필요한 겁니다.
이것은 로컬에 OpenAI 를 깔았기 때문에 사용 가능하게 된 것입니다.
지난 글에 아래 명령어를 사용해서 OpenAI를 깔았었습니다.
pip install openai
pip install openai --upgrade
Pip 명령어는 Python을 깔았기 때문에 사용 가능한 것입니다.
자세한 사항은 이전 글을 참조하세요.
https://coronasdk.tistory.com/1252
두번째는 함수 입니다.
OpenAI를 사용하기 위해서는 내가 Open AI로 부터 받은 API KEY를 제공해서 인증을 받아야 합니다. 일정의 비밀번호이죠.
Open AI API는 유료입니다.
지난 글에서 간단한 질문 하나 하는데 1원정도가 청구 되는 걸 보았습니다.
유료이기 때문에 나의 API KEY를 사용해서 인증을 받고 그 다음에 사용하는 만큼 금액이 청구 됩니다.
당연히 이 API KEY를 보내지 않으면 OpenAI API를 사용할 수 없습니다.
이 API KEY를 보내는 방법은 8번째 줄에 있습니다.
openai.api_key = "My API KEY"
그런데 여기에 키를 하드 코딩 하면 보안상 문제가 될 수 있고 또한 이 키가 변경이 되었을 때 일일이 모든 파일에 있는 키 정보를 업데이트 해야 합니다. 관리상의 문제가 있죠.
그래서 보통 이런 경우는 별도의 파일을 만들어서 관리를 하고 파이썬 파일 안에서는 이 파일을 열고 그 내용을 읽어서 사용합니다.
이렇게 파일을 열고 그 내용을 읽는 부분을 함수로 만든 부분이 3~5째 줄에 있는 내용입니다.
def open_file(filepath) :
with open(filepath, 'r', encoding='utf-8') as infile :
return infile.read()
파이썬에서 함수를 만들려면 def 로 시작하면 됩니다. 그 다음은 함수 이름이 오고 그 다음 괄호 안에 파라미터들을 넣습니다.파라미터가 여러개 있는 경우 쉼표 , 로 구분합니다. 그리고 마지막엔 : 로 끝납니다.
그 다음 줄은 함수의 내용입니다.
파이썬에서 파일을 열고 읽는 방법은 아래와 같습니다.open("파일 이름", r,)두번째 파라미터인 r은 이 파일을 읽겠다는 겁니다. w 는 파일에 내용을 쓸 때 사용하고 a는 파일 내용 마지막에 새로운 내용을 추가할 때 사용할 수 있습니다.일반적으로 프로그래밍에서는 파일을 열었으면 마지막에 더 이상 사용하지 않을 때 이 파일을 close()해주어야 합니다. file_data = open("file.txt")print(file_data.readline(), end="")file_data.close()
이렇게 해야 되는데요. with를 사용해면 이 close() 부분을 자동으로 해 줍니다.아래 두 줄은 위의 세 줄과 똑 같은 겁니다.
with open("file.txt) as file_data:print(file_data.readline(), end="")
Close()는 with 문을 나올 때 이루어 집니다.
참고로 파이썬에서는 들여쓰기로 영역을 지정합니다.자바에서는 함수 (메소드)를 선언 할 때 {}로 지정하는 것과 차이가 있습니다.
그러므로 파이썬에서는 들여쓰기를 할 때 주의 해야 합니다.If, for, class, def 등을 사용할 때 그 줄 끝에 : 가 나오게 되는데 그 다음줄은 반드시 들여쓰기를 해야 합니다.그리고 블럭 내의 들여쓰기 칸 수는 같습니다.
위반시에는 indentationError: unexpected indent 라는 에러를 출력합니다.
이제 위의 코드를 해석할 수 있는 사전 지식은 다 갖추었습니다.
open_file()이라는 함수를 만든다는 것이 첫째줄에서 이야기 하는 겁니다. 파라미터는 filepath 입니다.
다음에 칸을 들여써서 with open() 을 사용해서 파일을 엽니다.
열 파일은 filepath입니다. 나중에 이 함수를 호출 할 때 제공해 주어야 합니다.
r은 이 파일을 읽겠다는 의미이고 세번째 파라미터는 그 파일의 인코딩 형식입니다. Txt 파일은 Ute-8이라고 선언해 주면 됩니다.
세번째 파라미터는 생략해도 작동을 할 겁니다. 보다 정확하게 하기 위해 선언 해 주셔도 됩니다.
as infile 은 변수 이름이 infile 이라는 겁니다.
파일을 열었으니까 그 내용이 infile에 저장 돼 있는 겁니다.
그 다음은 infile의 내용을 read()를 사용해서 가져오고 그 내용을 return 하는 겁니다.
이로서 open_file() 함수는 다 이해 했습니다.
이 함수를 사용하는 부분이 바로 8번째 줄입니다.
openai.api_key=open_file('openaiapikey.txt')
openai.api_key 는 OpenAI에서 정한 규칙입니다. API 키를 제공하기 위해서는 이 변수에 API 키 정보를 담으면 됩니다.
= 이후에 내용이 아까 만들었던 함수를 호출하는 부분입니다.
파라미터는 openaiapikey.txt 입니다. 따로 폴더 정보가 없으면 현재 폴더에서 해당 파일을 찾아서 열게 됩니다.이 텍스트 파일은 미리 만들어서 그 안에 API 키 정보를 넣어 두어야 합니다.
자 이러면 OpenAI 에 내 API 키를 제공했고 이 키가 유효하다면 지금부터 OpenAI API 를 사용할 수 있습니다.
10번째 줄은 또 다른 함수를 선언 한 것입니다.
gpt3_completion() 이란 함수를 선언했고 파라미터는 8개나 되네요.이 파라미터들은 함수 안에서 사용하게 될 겁니다.
이 줄은 :로 끝났고 그 아래서 부터는 들여쓰기를 해서 이 함수의 영역을 나타냅니다.
이 함수는 OpenAI 의 Completion.create() API 를 사용하기 위해 만드는 겁니다.
우선 Completion.create()에 대해 알아야 합니다.
이것은 제 블로그의 Open AI > API REFERENCE > Completions - openai.Completion.create() 를 보시면 자세한 사항을 볼 수 있습니다.
https://coronasdk.tistory.com/1234
여기서 제일 중요한 파라미터는 prompt 입니다.
내가 OpenAI 에 질문할 내용이죠.
11번째 줄은 이 prompt 변수는 ASCII 형식으로 인코딩을 한 다음에 다시 디코딩을 한다는 내용입니다.
사실 이 부분이 없어도 이 스크립트는 에러 없이 실행 됩니다. ASCII 형식으로 한다는 것을 확실하게 하기 위해 이 부분을 넣었습니다.
두번째로 중요한 부분은 model 입니다.
내가 OpenAI의 어떤 모델을 사용할 것인가를 API에 알려 주는 것이죠.
모델들에 대해 알고 싶다면 제 블로그의 Open AI > GET STARTED > Get Started - Models를 참고하세요.
https://coronasdk.tistory.com/1212
이 예제에서는 text-davinci-003 이란 모델을 사용하겠다고 API에게 전달하고 있습니다.다음에는 테스트용으로는 text-Ada-001을 사용해야 겠습니다. 비용이 가장 저렴한 것 같네요.
이 저렴한 모델을 사용했더니 대답이 이렇게 나오네요.The two Koreas will be unified under a single government and president by 2020.
2020년 까지 통일이 된다네요.
이 모델로 하면 내용은 신뢰할 수 없을 것 같습니다. 그냥 API 테스트 용으로만 사용해야 될 것 같네요.
그 외의 파라미터 들은 https://coronasdk.tistory.com/1234 를 참조하세요.
이 함수는 openai.Completion.create()을 사용하기 위한 함수라고 했습니다.
그렇긴 때문에 가장 중요한 부분은 12번째 줄부터 있는 response 변수 부분입니다.
이 변수에는 openai.Completion.create() 이 들어가고 각각의 파라미터들이 세팅 돼 있습니다.
이렇게 되면 response라는 변수에 Open AI 의 GPT 3가 질문에 대답한 내용이 담기게 됩니다.
질문은 prompt에 있었구요.
21번째 줄에서는 이 응답 내용 앞과 뒤에 공백이 있다면 그 공백을 없애기 위해 strip()을 사용해서 그 결과를 text 에 담았습니다.
이 strip() 함수는 파이썬 함수입니다.
Python 튜토리얼을 참조하세요.
https://www.w3schools.com/python/ref_string_strip.asp
22번째 줄에서는 이 text를 리턴 합니다.
여기까지가 gpt3_completion() 함수의 내용입니다.
요약하면 이 함수는 openai.Completion.create() API를 이용해서 Open AI에 질문을 하고 응답을 받은 후 그 내용을 반환하는 함수입니다.
가장 핵심적인 부분이죠.
여기까지가 함수 들이었구요. 이제 실질적으로 실행되는 부분이 24번째 줄에 있습니다.
일단 __name__ 이라는 변수가 나오는데 이 변수는 파이썬에 내장 돼 있는 변수입니다.
여기에는 일단 이 파이썬 파일의 이름 (모듈 이름)이 담기게 됩니다.
만약 다른 파이썬 파일을 실행 시키는데 그 파일에서 현재의 파일을 import 해서 사용하는 경우에 __name__ 변수에 현재의 파이썬 파일 이름 (모듈 이름) 이 담기게 됩니다.
하지만 이 파일 안에서 이 함수를 실행시키면 __name__ 변수에는 파일 이름이 아니라 __main__이라는 값이 들어가게 됩니다.
그러므로 if 문은 이 파일이 외부에서 import 된 것이 아니라 이 파일 자체가 실행이 돼었다면 이라는 뜻입니다.
자세한 내용은 이 글을 참조하세요.
https://lovelydiary.tistory.com/297
그러므로 이 파이썬을 실행하게 되면 25~27번째 줄이 실행 됩니다.
prompt 는 질문이 들어가게 됩니다.
이 소스코드에서는 When will South Korea and North Korea be unified?: <- 이렇게 질문 했습니다.
그 다음에는 response 변수에 gpt3_completion() 함수에서 반환 된 값을 저장하게 됩니다.
그리고 마지막 줄인 27번째 줄에서는 이 response 에 담겨 있는 답변을 print 하게 됩니다.
이 파일을 실행하면 같은 모델이라도 매번 다른 답변이 나옵니다.
여러 모델 별로도 답변의 질이 다르구요.
아래는 가장 저렴한 text-ada-001을 사용했을 때 답변 중 하나입니다.
여기에서는 북한의 리더인 F Mkotsoalae 가 살해 되면 통일 될 것이라고 나오네요.
북한의 리더 이름도 틀렸고 내용도 좀 허접합니다.
가장 좋은 모델인 text-davinci-003 을 사용해 보겠습니다.
통일이 될지 안 될지 그리고 된다면 언제쯤 될지 예측하는 것은 불가능 하다네요. 2차대전 이후로 갈라 졌고 협상이 이어지고 있지만 통일에 대한 타임라인은 없다는게 이 모델의 응답입니다.
이것은 text-davinci-003 모델이 답한 겁니다.
요즘 OpenAI 에서 ChatGPT라는 좀 더 진보된 인공지능 모델을 선보여서 화제입니다.
이 모델은 아직 API 가 제공되지 않고 있습니다.
조만간 제공하겠다는 안내문은 있습니다.
CharGPT 웹사이트로 가서 질문해 보니 아래와 같은 답변을 얻을 수 있었습니다.
text-davinci-003과 거의 유사한 답변을 얻을 수 있었습니다.
답변이 조금 더 세련 된 것 같기도 하고......
하여간 지금까지 OpenAI API 테스트를 위해 만든 소스코드를 해석해 봤습니다.
'Open AI > Practice' 카테고리의 다른 글
NO API key provided. error when using OpenAI command-line interface (CLI) (0) | 2023.03.12 |
---|---|
openai 명령어를 command 창에서 인식을 하지 못 할 때... (0) | 2023.03.11 |
Open AI API - GPT 3 - Embedding API 예제 살펴 보기 (0) | 2023.02.11 |
OpenAI API : GPT-3 : Embeddings Sample Code (0) | 2023.02.09 |
GPT3 초간단 chatbot 업그레이드 하기 (0) | 2023.02.08 |
GPT-3 API로 초간단 Chatbot 만들기 (0) | 2023.02.08 |
로컬 개발 환경 세팅하기 : Python , OpenAI Install (0) | 2023.01.27 |