반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리


반응형

윈도우즈의 명령창 (Command Prompt) 에서 OpenAI 를 사용할 때 아래와 같은 에러 메세지가 뜰 수 있습니다.

 

 

이것은 fine_tunes.create 을 사용할 때 나온 에러입니다.

자세한 내용은 아래 페이지에 있습니다.

 

https://github.com/openai/openai-cookbook/blob/main/examples/Fine-tuned_classification.ipynb

 

GitHub - openai/openai-cookbook: Examples and guides for using the OpenAI API

Examples and guides for using the OpenAI API. Contribute to openai/openai-cookbook development by creating an account on GitHub.

github.com

 

에러 메세지는 아래와 같습니다.

 

Error: No API key provided. You can set your API key in code using 'openai.api_key = <API-KEY>', or you can set the environment variable OPENAI_API_KEY=<API-KEY>). If your API key is stored in a file, you can point the openai module at it with 'openai.api_key_path = <PATH>'. You can generate API keys in the OpenAI web interface. See https://onboard.openai.com for details, or email support@openai.com if you have any questions.

 

오류: API 키가 제공되지 않았습니다. 'openai.api_key = <API-KEY>'를 사용하여 코드에서 API 키를 설정하거나 환경 변수 OPENAI_API_KEY=<API-KEY>)를 설정할 수 있습니다. API 키가 파일에 저장되어 있는 경우 'openai.api_key_path = <PATH>'로 openai 모듈을 가리킬 수 있습니다. OpenAI 웹 인터페이스에서 API 키를 생성할 수 있습니다. 자세한 내용은 https://onboard.openai.com을 참조하거나 질문이 있는 경우 support@openai.com으로 이메일을 보내십시오.

 

해결 방법이 몇가지 나오는데 저 같은 경우는 환경변수를 세팅 해서 해결 했습니다.

 

 

System Properties에서 Environment Variables 버튼을 클릭합니다.

그 다음 밑에 있는 패널인 System variables에서 New 버튼을 클릭합니다.

 

이렇게 환경 변수에 OPENAI_API_KEY 를 세팅 한 후 모두 OK 버튼을 눌러서 닫습니다.

 

이렇게 하면 OpenAI CLI 를 사용할 수 있게 됩니다.

 

사용하기 전에 기존에 실행중이던 JupyterNotebook 이나 JupyterLab local server 는 shutdown 하시고 윈도우즈 Command Prompt 창도 닫습니다.

 

그리고 새로운 윈도우즈 명령창 (Command Prompt) 에서 Jupyter 를 실행하신 다음에 사용하시면 됩니다.

 

그러면 아래와 같이 에러 없이 사용할 수 있습니다.

 

반응형


반응형

아래와 같이 command 창에서 openai 를 인식하지 못하는 문제를 해결하는 방법을 알아 보겠습니다.

'openai' is not recognized as an internal or external command, operable program or batch file.

 

저같은 경우는 Windows에서 Python 하고 Openai를 install 해서 사용하고 있습니다.

Python file에서 openai를 import 해서 사용하는데에는 아무 문제 없습니다.

 

그런데 command 창에서 openai를 사용하려고 하면 위와 같이 openai를 recognized 하지 못한다고 나옵니다.

 

이런 경우는 openai 실행 파일이 System path 에 설정 돼 있지 않아서 그렇습니다.

 

System path 에 openai.exe의 경로를 넣으려면 먼저 openai.exe가 어디에 있는지 부터 알아야 합니다.

 

저는 Windows의 File Explorer 에서 C 드라이브로 가서 openai.exe로 검색했습니다.

 

윈도우즈 사용이 아주 능숙한 편이 아니라서요.

다른 좋은 방법 아시는 분은 그 방법을 사용하시면 됩니다.

 

그 다음은 openai.exe가 있는 곳의 path를 복사 합니다.

openai.exe에서 오른쪽 마우스 클릭을 해서 Properties 를 클릭하시면 아래 그림처럼 Location에 해당 파일의 path가 나와 있습니다.

아니면 Properties말고 Open File Location을 선택하시면 해당 폴더로 이동하는데 거기서 주소창에 있는 path를 복사하시면 됩니다.

 

일단 이 path가 복사 됐으면 System path에 넣어 주시면 됩니다.

 

 

위와 같이 Windows의 System Properties 창을 열고 Environment Variable 버튼을 누릅니다.

그러면 Environment Variables 창이 뜨는데 거기서 아래  System variables 패널에서 에서 Path를 선택하고 Edit 버튼을 누릅니다.

그 다음은 새창에서 new 버튼을 누르고 빈칸에 복사한 path를 붙여넣기 하시면 됩니다.

 

그 다음엔 모두 OK 버튼을 눌러서 닫습니다.

 

Command 창을 다시 열어서 openai라고 넣으면 이제 에러 메세지가 아닌 아래와 같은 openai 에서 제공하는 메세지를 보게 됩니다.

 

이렇게 문제를 해결하면 됩니다.

반응형


반응형

오늘은 Open AI API 에서 제공하는 기본 Embedding 예제 소스 코드를 살펴 보겠습니다.

 

 

아래 글을 보시면 해당 API 페이지의 내용을 보실 수 있습니다.

 

https://coronasdk.tistory.com/1237

 

Embeddings - openai.Embedding.create()

https://beta.openai.com/docs/api-reference/embeddings Embeddings Get a vector representation of a given input that can be easily consumed by machine learning models and algorithms. 기계 학습 모델 및 알고리즘에서 쉽게 사용할 수 있는 주

coronasdk.tistory.com

이 예제 코드를 실행하기 위해서 약간 고친 저의 코드는 아래와 같습니다.

 

 

print를 좀 이쁘게 하기 위해서 pprint를 import 했고 api key를 전달하는 부분을 파일에서 읽어서 전달하도록 바꾸었습니다.

openai.Embedding.create() 부분은 예제와 똑 같습니다

 

이것을 실행하면 이렇게 나옵니다.

 

 

시작하는 부분은 이렇습니다.

입력 값은 "The food was delicious and the waiter..." 입니다. 

이에 대한 응답은 JSON 형식으로 response를 받게 되고 data 밑에 embedding 이라는 항목이 있고 그 안데 배열 형식으로 수 많은 숫자들이 있습니다. 모든 숫자는 0 이하의 부동 소숫점이고 양수와 음수들이 번갈아 가며 있습니다.

소숫점 아래 숫자들은 18자리 입니다.

이 부동 소숫점 들이 몇개나 있는지 알아봤습니다.

총 1536개가 있었습니다.

 

이것만 가지고는 무슨 의미인지 전혀 알 수 없습니다.

 

이 embeddings 기능을 사용하려면 이 response를 조금 가공 해야 합니다.

의미를 알 수 있도록 가공하는 방법에 대해서는 다음 글에서 자세하게 다룰 예정입니다.

 

오늘은 간단한 방법만 알아 보겠습니다.

 

일단 response 부분을 더 보겠습니다.

 

response의 맨 아랫부분을 보면 이렇습니다.

 

 

부동 소숫점 배열이 있는 embedding 부분이 끝나면 index 가 있습니다.

현재 값은 0 입니다.

이것은 우리가 request를 할 때 한가지만 전달해서 그렇습니다.

 

request의 input 부분에 여러개를 전달하면 각각에 대한 embedding 값을 반환하고 index는 0,1,2,3 이렇게 증가하면서 몇번째 request에 대한 임베딩 값인지 알 수 있게 해 줍니다.

 

그 다음 object는 embedding 이라는 것을 말해 줍니다.

 

그 다음은 모델 정보가 나옵니다. 우리는 request에서 text-embedding-ada-002를 사용했습니다.

응답에 나온 것을 보니까 정확하게는 text-embedding-ada-002-v2 모델을 사용했네요.

 

밑줄엔 object 아이템이 있고 이것은 list 를 사용했다고 알려 주는 것 같습니다.

 

그 밑에 usage 부분에는 사용된 토큰 값이 표시 됩니다.

이 토큰의 양에 따라서 사용료가 부과가 되니까 이것도 중요한 정보 입니다.

 

우리가 사용한 토큰은 총 8개 입니다.

 

토큰에 대해 알고 싶으시면 아래 글에 간단히 설명 돼 있습니다.

 

https://coronasdk.tistory.com/1257

 

GPT-3 API로 초간단 Chatbot 만들기

오늘은 Python 과 ChatGPT API로 간단한 챗봇을 만들어 보겠습니다. import os import openai def open_file(filepath): with open(filepath, 'r', encoding='utf-8') as infile: return infile.read() openai.api_key = open_file('openaiapikey.txt') wh

coronasdk.tistory.com

 

일단 여기서 핵심 정보는 embedding 부분입니다.

 

이것을 다루려면 이 부분만 따로 추려서 다루어야 합니다.

 

response 중에 embedding 만을 따로 추리는 방법은 아래와 같습니다.

 

embeddings = response['data'][0]['embedding']

 

당연히 이 부분을 출력하면 embedding 값들만 나오겠죠.

 

 

이 embedding은 대개 유사성을 측정하는데 사용합니다.

그렇기 때문에 두개 이상의 대상에 대해 유사성을 측정하게 되는데요.

 

이 경우 이 값들을 유의미하게 사용하기 위해서 numpy의 dot() 이라는 메소드를 사용합니다.

이 dot() 메소드는 두개의 input array가 1차원인 벡터들인 경우 사용합니다.

 

다음 글에서는 이 embedding 을 가지고 유의미하게 사용하는 예제를 만들고 분석해 보겠습니다.

반응형

OpenAI API : GPT-3 : Embeddings Sample Code

2023. 2. 9. 00:36 | Posted by 솔웅


반응형

OpenAI 에서 제공하는 서비스에는 아래처럼 5가지로 분류할 수 있습니다.

Text completion

Code completion

Image generation

Fine-tuning

Embeddings

 

이 중 챗봇은 맨 처음의 Text completion 서비스를 사용했습니다.

오늘은 이 중 Embeddings에 대해 알아 보겠습니다.

좀 어려운 부분입니다.

 

OpenAI의 Embeddings 의 개념에 대해 알아보려면 여기를 참조하세요.

https://coronasdk.tistory.com/1222

 

Guides - Embeddings

https://beta.openai.com/docs/guides/embeddings/what-are-embeddings OpenAI API An API for accessing new AI models developed by OpenAI beta.openai.com Embeddings What are embeddings? OpenAI’s text embeddings measure the relatedness of text strings. Embeddi

coronasdk.tistory.com

Embeddings관련 openai API를 알아보려면 여기를 참조하세요.

https://coronasdk.tistory.com/1237

 

Embeddings - openai.Embedding.create()

https://beta.openai.com/docs/api-reference/embeddings Embeddings Get a vector representation of a given input that can be easily consumed by machine learning models and algorithms. 기계 학습 모델 및 알고리즘에서 쉽게 사용할 수 있는 주

coronasdk.tistory.com

그리고 이 Tensorflow.org의 자료도 참고하시면 더 깊게 이해하는데 좋습니다. (한글로도 제공됩니다.)

https://www.tensorflow.org/text/guide/word_embeddings

 

단어 임베딩  |  Text  |  TensorFlow

이 페이지는 Cloud Translation API를 통해 번역되었습니다. Switch to English 단어 임베딩 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 이 자습서에는 단어 임베딩

www.tensorflow.org

 

Embeddings는 OpenAI 의 GPT-3 가 사용자로부터 받은 파라미터가 다양한 보기에 얼마나 유사성이 있는지를 반환해 주는 서비스 입니다.

반환값은 여러개의 유사성들이 되죠. 이는 벡터 Vector 입니다.

벡터란 1 dimensional matrix를 말합니다.

embedding = vector with semantic meaning (어떤 의미가 있는 vector)

 

예를 들어 아래와 같은 벡터가 있습니다.

[X, Y]

 

여기에 의미를 부여해 보겠습니다.

 X는 social power 이고 값은 max 1.0 - min -1.0 입니다.

Y는 gender이고 max 1.0 - min -1.0 입니다. 1.0 은 완전 남성이고 -1.0은 완전 여성입니다.

 

그러면 값이 [1.0 , 1.0]  은 황제를 나타낼 수 있겠죠. 사회적 최강자이고 남성성도 만빵인 황제요.

황제가 [1.0 , 0.5] 일 수도 있죠. 사회적 최 강자 이지만 약간 덜 남성적인 성격일 수도 있으니까요.

 

[-1.0, 0]인 값은 사회적 파워가 없는 사람, 자유가 박탈된 사람이 되겠죠. 감옥에 있는 사람이 되겠죠. 그리고 성별은 중성인 무엇인가가 될 것입니다.

이렇듯 제공된 벡터를 가지고 그 사람이 제공된 조건에서 어디쯤에 속할지를 가늠하는 것이 Embedding의 역할 입니다.

 

여기서는 2개의 dimension을 사용했습니다. 참고로 OpenAI의 모델별 output dimensions는 아래와 같습니다. 

 

이제 기본적인 개념 정리는 여기까지 하고 OpenAI API에서 이 Embedding 기능을 사용하는 간단한 파이썬 예제를 보겠습니다.

 

 

우선 2번째 줄의 numpy는 python의 기본 수학 모듈입니다.  배열을 다룰 때 많이 사용됩니다. 

자세한 사항은 아래 웹사이트를 참조하세요.

https://numpy.org/

 

NumPy

Powerful N-dimensional arrays Fast and versatile, the NumPy vectorization, indexing, and broadcasting concepts are the de-facto standards of array computing today. Numerical computing tools NumPy offers comprehensive mathematical functions, random number g

numpy.org

 

https://ko.wikipedia.org/wiki/NumPy

 

NumPy - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. NumPy("넘파이"라 읽는다)는 행렬이나 일반적으로 대규모 다차원 배열을 쉽게 처리할 수 있도록 지원하는 파이썬의 라이브러리이다. NumPy는 데이터 구조 외에도

ko.wikipedia.org

 

import numpy as np 는 numpy를 사용하기 위해 import 하는 것이고 이 numpy를 np 라는 이름으로 사용하겠다는 것입니다.

pprint는 pritty print의 약자로 이쁘게 프린트 해 주는 python의 메소드 입니다.

 

그 다음의 open_file() 함수는 반복되서 나오는 거라서 설명을 생략하겠습니다.

 

gpt3_embedding() 함수가 openAI의 API를 사용하기 위해 만든 함수입니다.

엔진은 text-embedding-ada-002를 사용했습니다.

 

2022년 12월 15일에 발표된 자료에 따르면 이 모델이 성능도 좋으며 가장 저렴한 모델이라고 소개 돼 있습니다.

 

https://openai.com/blog/new-and-improved-embedding-model/

 

New and Improved Embedding Model

We are excited to announce a new embedding model which is significantly more capable, cost effective, and simpler to use. The new model, text-embedding-ada-002, replaces five separate models for text search, text similarity, and code search, and outperform

openai.com

 

이 함수에서 가장 중요한 부분은 openai.Embedding.create() 입니다.

OpenAI의 embedding 기능을 사용하기 위한 API 를 호출하는 겁니다.

파라미터로는 input 과 engine 이 있습니다.

여기서 engine은 model로 사용해도 됩니다. model이 아마 최근에 바뀐 파라미터 이름인 것 같습니다.

 

 

이 함수는 content를 받아서 ASCII 형식으로 인코딩 한 값을 다시 디코드해서 content에 담습니다.

(이 부분은 따로 하지 않아도 작동 됩니다.)

 

이 전달받은 content를 openai.Embedding.create() 을 사용해서 OpenAI에 사용할 모델 이름과 함께 보내고 거기서 받은 값을 response 변수에 담습니다.

 

받은 응답 (JSON 형식) 중에 data 배열의 첫번째 항목에서 embedding  부분을 vector에 담다서 이를 리턴합니다.

 

그 다음 함수는 similarity인데요.

이는 두 개의 파라미터 (벡터 형식)를 받아서 numpy의 dot 메소드를 사용해서 처리한 다음에 그 값을 반환하는 겁니다.

 

이 메소드는 벡터의 각 element들을 곱한 값들을 더한 값을 반환합니다.

 

파이썬의 이 dot 메소드는 여기에서 보시면 됩니다.

https://numpy.org/doc/stable/reference/generated/numpy.dot.html

 

numpy.dot — NumPy v1.24 Manual

Output argument. This must have the exact kind that would be returned if it was not used. In particular, it must have the right type, must be C-contiguous, and its dtype must be the dtype that would be returned for dot(a,b). This is a performance feature.

numpy.org

그 다음 22번째 줄에서는 openai에 openaiapikey.txt 파일에 저장돼 있는 key 값을 전달하고 있습니다.

이 key 값이 valid 하면 openai api를 사용할 수 있는 권한을 가지게 됩니다.

 

그 다음 함수는 match_class() 함수 입니다.

이 함수는 vector와 classes라는 두 개의 파라미터를 받습니다.

 

아래에 보시면 알겠지만 classes 는 35번째 줄에 있는 categories 값입니다.

위에 설명했지만 openai 의 각 모델들은 수 많은 dimention을 가지고 있습니다. 

이렇게 카테고리를 설정해 주지 않으면 아주 많은 리턴값이 나오게 됩니다.

그래서 이 함수를 만든건데요. 

우선 반환값은 list() 로 할 겁니다.

그 다음 classes (categories) 에 있는 값들을 하나 하나 for loop를 돌면서 처리 합니다.

두 벡터값을 similarity() 함수로 보내서 np.dot 값을 받아 오는 것이죠.

그 반환된 값은 score에 저장이 되고 그 값은 아래 info 변수에서 활용 됩니다.

info에는 각 카테고리별로 similarity에서 받아온 score를 넣습니다.

그 값들을 전부 results에 넣게 되고 이 값을 반환하게 됩니다.

 

이제 함수에 대한 설명은 다 됐고 실제 이것이 어떻게 실행이 되는지 보겠습니다.

 

34번째 if 문은 여러번 설명한 파이썬 문법입니다. 이 파이썬 파일이 실행 됐을 경우 아래 내용들이 처리 됩니다.

다른 파이썬 파일에서 import 되면 아래 내용이 처리되지않을 겁니다.

 

categories = ['plant', 'reptile', 'mammal', 'fish', 'bird', 'pet', 'wild animal']

 

카테고리는 이렇게 7개를 정했습니다. 사용자가 입력한 값이 이 중 어느것에 가장 가까운지 알아 볼 겁니다.

여기에는 다른 값들을 추가해도 됩니다.

예를 들어 food 나 brand 뭐 이런것을 추가해도 될 겁니다. 

 

그 다음은 classes라는 list()를 생성했습니다.

 

그리고 나서 for 루프가 나오는데요. 이 for 루프는 categories에 있는 인수들 만큼 루프를 돌립니다.

첫번째로 gpt3_embedding(c) 에 각 인수를 전달해서 그 값을 vector에 담습니다.

그 다음 info 에서는 이를 category 별로 그 vector 값이 담기게 합니다.

그리고 아까 만들었든 classes라는 리스트에 이 값을 담습니다.

 

이러면 categories의 각 인수들 마다 gpt 3 에서 받은 벡터값이 있게 됩니다.

 

이 벡터값을 이제 사용하게 됩니다.

 

43번째 줄을 보면 while 무한 루프를 만들었습니다.

사용자로부터 계속 입력값을 받기 위함이죠.

 

44번째 줄은 파이썬의 input() 메소드를 사용해서 사용자로부터 입력 받은 값을 a 라는 변수에 넣는 겁니다.

 

이 사용자가 입력한 값의 벡터값을 gpt3-embedding() 함수를 통해서 받습니다.

 

이러면 우리는 입력한 값의 벡터값과 아까 설정해 두었던 categories에 있는 각 인수들의 벡터값을 갖고 있습니다.

 

그러면 이제 입력한 값이 categories의 각 인수들과 얼마나 유사한지 알 수 있습니다.

 

47번째 줄에서는 match_class() 함수로 이 두 값을 보내서 각 카테고리별로 유사성 점수가 어떤지 정리한 값을 받습니다.

그 값은 result에 담기게 되고 pprint()를 이용해서 그 값을 이쁘게 출력을 하게 됩니다.

 

이걸 실행해 봤습니다.

 

 

첫번째로 frog 개구리는 새일 가능성이 가장 높고 그 다음은 물고기일 가능성이 높다고 나오네요. 

그 다음 파충류일 가능성이 세번째로 높습니다.

양서류라는 보기가 없어서 그럴까요?

 

그 다음 sockeye는 연어의 종류인데요. 결과는 물고기일 확률이 제일 높게 나옵니다. 그 다음은 새, 그리고 음식 뭐 이런 순으로 나가네요.

 

그 다음은 개구리를 대문자 F를 사용해서 입력했습니다.

그러면 파충류일 가능성이 제일 높다고 나오네요.

 

다음 호랑이는 야생동물일 가능성이 가장 높게 나오고 그 다음은 포유류와 유사성이 높다고 나옵니다.

 

국수를 입력했을 때는 역시 음식이 가장 유사하고 그 다음은 물고기, 식물 뭐 이런 순으로 나옵니다.

 

구찌를 입력했을 때는 브랜드와 가장 유사하고 그 다음은 음식, 그 다음은 새 이렇게 나옵니다.

 

아까 개구리가 약간 이상하게 나와서... 보기에 양서류 (amphibians)를 추가 했습니다.

 

 

 

그 결과는 Frog 일 경우 양서류와 가장 유사하고 그 다음이 파충류로 나옵니다.

 

frog 일 경우에는 새일 가능성이 가장 높고 그 다음이 물고기 - 파충류 - 양서류 이런 순서네요.

 

일단 답은 100% 만족스럽지 않지만 Openai GPT 3 의 Embedding 기능에 대해서 어느 정도 감이 잡혔습니다.

 

참고로 이 임베딩은 아래와 같은 경우에 사용될 수 있습니다.

 

  • Search (where results are ranked by relevance to a query string)
  • Clustering (where text strings are grouped by similarity)
  • Recommendations (where items with related text strings are recommended)
  • Anomaly detection (where outliers with little relatedness are identified)
  • Diversity measurement (where similarity distributions are analyzed)
  • Classification (where text strings are classified by their most similar label)

전체 소스 코드는 아래에 있습니다.

 

import openai
import numpy as np  # standard math module for python
from pprint import pprint


def open_file(filepath):
    with open(filepath, 'r', encoding='utf-8') as infile:
        return infile.read()


def gpt3_embedding(content, model='text-embedding-ada-002'):
    content = content.encode(encoding='ASCII',errors='ignore').decode()
    response = openai.Embedding.create(input=content,model=model)
    vector = response['data'][0]['embedding']  # this is a normal list
    return vector


def similarity(v1, v2):  # return dot product of two vectors
    return np.dot(v1, v2)


openai.api_key = open_file('openaiapikey.txt')


def match_class(vector, classes):
    results = list()
    for c in classes:
        score = similarity(vector, c['vector'])
        info = {'category': c['category'], 'score': score}
        results.append(info)
    return results


if __name__ == '__main__':
    categories = ['plant', 'reptile', 'mammal', 'fish', 'bird', 'pet', 'wild animal', 'food', 'brand',  'amphibians']
    classes = list()
    for c in categories:
        vector = gpt3_embedding(c)
        info = {'category': c, 'vector': vector}
        classes.append(info)
    #print(classes)
    #exit(0)
    while True:
        a = input('Enter a lifeform here: ')
        vector = gpt3_embedding(a)
        #print(a, vector)
        result = match_class(vector, classes)
        pprint(result)

반응형


반응형

이전 글에서 GPT 3 API로 초 간단 챕봇을 만들었습니다.

아래 내용이 그 소스 코드 입니다. (자세한 사항은 이전 글을 참조하세요)

https://coronasdk.tistory.com/1257

 

 

GPT-3 API로 초간단 Chatbot 만들기

오늘은 Python 과 ChatGPT API로 간단한 챗봇을 만들어 보겠습니다. import os import openai def open_file(filepath): with open(filepath, 'r', encoding='utf-8') as infile: return infile.read() openai.api_key = open_file('openaiapikey.txt') wh

coronasdk.tistory.com

 

오늘 볼 소스 코드는 아래와 같습니다.

 

이전 소스코드 보다 많이 복잡해 진 것 같지만 별다른 변화는 없고 그냥 26번째 줄 list를 추가했다는 내용밖에 없습니다.

 

우선 1~8번째 줄은 openai api를 사용하기 위해 api key를 제공하는 겁니다. 이전에 다룬 부분이니까 넘어가겠습니다.

 

그다음 10~23번째 줄은 openai.Completion.create() api를 사용하기 위해 만든 함수 입니다.

이전 초간단 챗봇 코드 보다 전달하는 파라미터를 많이 설정했습니다.

이 부분도 이전 글에서 다루었습니다.

 

https://coronasdk.tistory.com/1254

 

OpenAI API 첫 소스코드 분석 (초보자를 위한 해석)

지난번에 OpenAI API 연결을 테스트 하기 위해 만들었던 소스코드를 분석해 보겠습니다. 첫번째 import OpenAI는 OpenAI API 를 사용하기 위해 필요한 겁니다. 이것은 로컬에 OpenAI 를 깔았기 때문에 사용

coronasdk.tistory.com

25번째 줄은 이 파이썬 파일을 실행 했을 경우 그 아래 코드를 실행하라는 의미 입니다.

다른 파이썬 파일을 실행하고 그 파이썬 파일에서 이 파일을 import 한다면 그 아래 내용은 실행되지 않습니다.

그 설명도 윗 글에서 했습니다.

 

그 아래 while 문도 바로 전 글에서 다룬 부분인데 다른 부분은 list()를 추가 했다는 겁니다.

list()를 추가 한 이유는 대화를 할 때 이전 대화와 맥락이 맞는 답변을 받기 위해서 입니다.

 

그러기 위해서는 이전의 질문과 대답을 모두 같이 보내면 됩니다.

그러기 위해서 list를 사용하구요.

 

우선 26번째 줄에서 conversation 이라는 변수를 만들었고 이 변수에는 리스트가 담길 것이라고 선언했습니다.

아래 줄 while True: 는 그냥 아래 내용을 계속 실행하라는 무한 루프이구요.

user_input = input('USER: ') 는 사용자로 부터 입력 받은 내용을 user_input에 담는 겁니다.

이전 소스코드에소 그대로 있습니다. 다른 부분은 아래 라인 입니다.

 

이 user_input을 그대로 prompt로 사용하는 것이 아니라 위에 만들어 놓은 conversation이라는 리스트에 담는 겁니다.

 

conversation.append('USER: %s' % user_input)

 

%s 는 자바에서도 사용하는 것인다. string 형식의 내용이 담길 것이라는 거고 그 string은 ' ' 이 작은 따옴표 밖에 있는 % 에 나오는 내용이 됩니다.

 

그러면 conversation에 user_input 이 담기게 됩니다.

그 다음에 prompt 변수가 나옵니다.

 

여기서는 prompt_chat.txt 라는 파일의 내용을 불러오게 되는데요.

이 파일에는 다름과 같은 내용이 담겨져 있습니다.

이 대화는 USER 와 JAX가 나누는 대화이고 JAX는 세계 평화를 목표로 하는 감성적인 기계이다 라고 상황을 설정해 놓았습니다.

이렇게 상황을 설정하면 GPT 3 는 JAX 의 성격에 맞는 답변을 찾아서 보내 줍니다.

그 아래 <<BLOCK>> 은 의미가 없고 그냥 31번째 줄에서 보여 주듯이 위에서 설정한 text_block을 replace 해주기 위해 만들어 놓은 겁니다.

 

prompt = open_file('prompt_chat.txt').replace('<<BLOCK>>', text_block)

 

이렇게 되면 prompt에는 prompt_chat.txt에 기존에 있는 내용에 text_block을 합한 내용이 저장되게 됩니다.

 

prompt = prompt + '\JAX: '

 

부분은 답변을 표시할 때 그 앞에 JAX: 를 나타내기 위해서 만든 겁니다.

 

그러면 이제 질문이 완성 됐습니다.

 

이 질문을 이용해서 opanai.Completion.create() api를 사용해서 질문을 던지고 답변을 받으면 됩니다.

이 일을 하는 함수는 그 위에 gpt3_completion() 입니다.

 

response = gpt3_completion(prompt)

 

그 함수에 prompt를 던지고 openai로 부터 받는 응답은 response에 담기게 됩니다.

 

그 다음은 그 응답을 print 하는 겁니다.

 

이 대답은 다시 conversation에 추가 됩니다.

 

conversation.append('JAX: %s' % response)

 

이렇게 하면 다음번 질문을 할 때 이전 질문과 대답까지 다 합해서 openai의 GPT3에게 보내서 이전 대화와 맥락이 맞는 답변을 듣게 됩니다.

 

 

이렇게 미리 설정해 놓은 상황과 이전 응답에 맥락이 맞는 대화를 할 수 있는 챗봇을 만들었습니다.

다시 말씀 드리지만 위 응답은 GPT3의 가장 저렴한 테스트 모델인 text-ada-001을 사용했습니다.

비용 절감 차원에서 이 모델로 테스트 하고 있습니다.

text-davinci-003 모델을 사용하면 좀 더 그럴 듯한 대화를 나누실 수 있습니다.

 

전체 소스코드는 아래와 같습니다.

 

import openai

def open_file(filepath) :
    with open(filepath, 'r', encoding='utf-8') as infile :
        return infile.read()
        

openai.api_key=open_file('openaiapikey.txt')

def gpt3_completion(prompt, engine='text-davinci-003', temp=0.7, top_p = 1.0, tokens =400, freq_pen=0.0, pres_pen=0.0, stop=['JAX: ', 'USER: ']) :
    prompt = prompt.encode(encoding='ASCII', errors='ignore').decode()
    response = openai.Completion.create(
        #engine=engine,
        engine='text-ada-001', 
        prompt=prompt,
        temperature=temp,
        max_tokens=tokens,
        top_p=top_p,
        frequency_penalty=freq_pen,
        presence_penalty=pres_pen,
        stop=stop)
    text = response['choices'][0]['text'].strip()
    return text
  
if __name__ == '__main__' :
    conversation = list()
    while True:
        user_input = input('USER: ')
        conversation.append('USER: %s' % user_input)
        text_block = '\n'.join(conversation)
        prompt = open_file('prompt_chat.txt').replace('<<BLOCK>>', text_block)
        prompt = prompt + '\JAX: '
        response = gpt3_completion(prompt)
        print('JAX: ', response)
        conversation.append('JAX: %s' % response)
        

 

반응형

GPT-3 API로 초간단 Chatbot 만들기

2023. 2. 8. 00:13 | Posted by 솔웅


반응형

오늘은 Python 과 ChatGPT API로 간단한 챗봇을 만들어 보겠습니다.

 

import os
import openai

def open_file(filepath):
    with open(filepath, 'r', encoding='utf-8') as infile:
        return infile.read()

openai.api_key = open_file('openaiapikey.txt')

while True:
    prompt = input("\n Ask OpenAI Anything: ")
    completions = openai.Completion.create(prompt = prompt,
                                            engine='text-ada-001', #engine="text-davinci-003",
                                            max_tokens=100)   
    print(completions)  

아직 완성된 코드는 아닙니다. 하나 하나 보겠습니다.

 

Openai.api_key 부분 까지는 계속 반복되는 코드 블럭입니다.

Openai에게 api 사용 권한을 받기 위해 api key를 제공하는 부분 입니다.

 

챗봇 기능이 이뤄지는 부분은 while 문 부터 입니다.

 

while True: 는 무한 루프 입니다.

이 프로그램을 실행하면 끝마치는 방법은 강제 종료 (Ctrl Z) 해야 합니다.

 

그 다음은 prompt 변수 부분입니다.

이 변수는 openai.Completion.create api를 사용할 때 필요한 건데요. 이전 글에서도 봤듯이 사용자가 궁금해 하는 질문이 여기에 들어가게 됩니다.

prompt = input("\n Ask OpenAI Anything: ")

 

input()은 Python 의 메소드로 사용자의 입력을 받겠다는 겁니다.

이 부분은 실행되면 "" 안에 있는 내용이 출력 되고 Python은 사용자의 입력을 받을 준비를 하게 됩니다.

 

 

그 다음 부분이 openai의 API 입니다.

openai.Completion.create() api를 사용해서 질문을 던지고 대답을 받습니다.

파라미터는 간단하게 3가지만 전달합니다.

질문은 prompt 이구요. 여기에는 사용자가 입력한 질문이 들어가게 됩니다.

사용하는 openai 모델은 text-ada-001 입니다. 가장 저렴한 모델입니다.

좋은 모델을 사용하려면 text-davinci-003을 쓰면 됩니다.

요즘 유행하는 ChatGPT는 아직 api가 공개 되지 않았습니다.

나중에 공개 되면 그 모델 이름을 넣으면 ChatGPT API를 사용할 수 있습니다.

마지막 파라미터로는 max_tokens 가 사용 됐습니다.

Token 에 대해서는 여기서 알아 보세요.

 

https://platform.openai.com/tokenizer

 

OpenAI API

An API for accessing new AI models developed by OpenAI

platform.openai.com

 

여기서는 특정 문장이 몇개의 토큰으로 이뤄 졌는지 알 수 있는데요.

예를 들어 What is a capital city of South Korea? 가 몇개의 토큰으로 이뤄 져 있는지 알아 보겠습니다.

 

 

글자 수는 총 38자 이지만 토큰은 9개 이네요. 이 토큰은 GPT 모델이 사용하는 단위 입니다. 대개 한 단어가 1개의 토큰으로 이뤄 집니다. (그렇지 않은 경우도 있구요.)

위 경우를 보면 tokenized는 token과 ized 이렇게 두개의 토큰으로 간주 하는 것을 볼 수 있습니다.

 

하여간 이 코드에서 사용한 아래 스크립트 내용은 최대 100개의 토큰까지 허용하겠다는 겁니다.

max_tokens=100

 

토큰이 많으면 비용과 시간이 늘어 날 수 있겠죠.

 

이렇게 openai.Completion.creat() api를 이용해서 질문을 보내면 response를 받게 되는데요.

이 response는 completions라는 변수에 담기게 됩니다.

 

print(completions) 는 이 completions를 출력하라는 python 메소드 입니다.

 

이 코드를 실행해서 질문을 던져 보겠습니다.

 

남한의 수도는 어디냐고 물어봤더니 긴 Json 형식의 대답을 받았습니다.

openai.Completion.creat() api 는 질문에 대한 답을 이런 형식으로 줍니다.

다양한 정보가 담겨 있습니다.

 

질문에 대한 답변은 choices 에 있는 text 부분입니다.

서울이 남한의 수도라는 대답이 담겨 있습니다.

 

이 부분만 따로 뽑아서 표시해야 제대로 된 chatbot이 될 것 같습니다.

 

그 방법은 아래와 같이 하면 됩니다.

 

completion = completions.choices[0].text

print(completion)

 

completions의 choices 라는 배열 안에 있는 text 값만 따로 completion이라는 변수에 담아서 이것을 출력 하는 겁니다.

 

이렇게 하면 다음과 같이 질문을 계속 주고 받을 수 있습니다.

 

답변이 모두 정답은 아닙니다.

왜냐하면 여기서 사용한 모델은 가장 저렴한 테스트 용인 text-ada-001 이기 때문입니다.

좀 더 정확한 답을 받으려면 text-davinci-003 를 사용하면 됩니다. 이 모델이 조금 더 비싸죠.

 

이 모델은 남한의 수도만 서울이라고 맞히고 북한, 캐나다, 호주의 수도는 다 틀렸습니다.

(정답은 북한 - 평양, 캐나다 - 오타와, 호주 - 캔버라 입니다.)

 

이렇게 계속 질문을 하고 답변을 받는 채팅 기능이 완성 됐습니다.

 

전체 코드는 아래와 같습니다.

 

import os
import openai

def open_file(filepath):
    with open(filepath, 'r', encoding='utf-8') as infile:
        return infile.read()

openai.api_key = open_file('openaiapikey.txt')

while True:
    prompt = input("\n Ask OpenAI Anything: ")
    completions = openai.Completion.create(prompt = prompt,
                                            engine='text-ada-001', #engine="text-davinci-003",
                                            max_tokens=100)
    completion = completions.choices[0].text
    print(completion)

 

 

한가지 불완전한 부분이 있는데요.

 

GPT3와 응답을 하게 되면 GPT3 가 이전 질문을 기억하고 그 맥락에 맞는 답변을 하게 됩니다.

그런데 이렇게 openai.Completion.create() api 에 질문을 하나만 넣으면 이 전에 대화 했던 내용은 전혀 참고가 될 수 없습니다.

 

맥락이 있는 대화를 할 수 있는 챗봇을 만들려면 이 질문 부분에 이전의 질문까지 다 같이 보내야 합니다.

 

이 부분은 list를 사용해서 간단히 해결 할 수 있습니다.

 

그 소스는 다음 글에서 분석해 보겠습니다.

반응형


반응형

지난번에 OpenAI API 연결을 테스트 하기 위해 만들었던 소스코드를 분석해 보겠습니다.

 

첫번째 import OpenAI는 OpenAI API 를 사용하기 위해 필요한 겁니다.

이것은 로컬에 OpenAI 를 깔았기 때문에 사용 가능하게 된 것입니다.

지난 글에 아래 명령어를 사용해서 OpenAI를 깔았었습니다.

 

pip install openai

pip install openai --upgrade

 

Pip 명령어는 Python을 깔았기 때문에 사용 가능한 것입니다.

자세한 사항은 이전 글을 참조하세요.

 

https://coronasdk.tistory.com/1252

 

로컬 개발 환경 세팅하기 : Python , OpenAI Install

OpenAI API 를 사용하기 위해서는 OpenAI 를 로컬에 깔아야 하고 이 OpenAI API를 사용해서 어플리케이션을 만들 언어도 깔아야 합니다. 저는 파이썬을 깔겠습니다. 파이썬은 이곳에서 다운 받아서 인스

coronasdk.tistory.com

 

두번째는 함수 입니다. 

 

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

 

Completions - openai.Completion.create()

https://beta.openai.com/docs/api-reference/completions Completions Given a prompt, the model will return one or more predicted completions, and can also return the probabilities of alternative tokens at each position. 프롬프트가 주어지면 모델은

coronasdk.tistory.com

 

 

여기서 제일 중요한 파라미터는 prompt 입니다.

내가 OpenAI 에 질문할 내용이죠.

11번째 줄은 이 prompt 변수는 ASCII 형식으로 인코딩을 한 다음에 다시 디코딩을 한다는 내용입니다.

사실 이 부분이 없어도 이 스크립트는 에러 없이 실행 됩니다. ASCII 형식으로 한다는 것을 확실하게 하기 위해 이 부분을 넣었습니다.

 

두번째로 중요한 부분은 model 입니다.

내가 OpenAI의 어떤 모델을 사용할 것인가를 API에 알려 주는 것이죠.

 

모델들에 대해 알고 싶다면 제 블로그의 Open AI > GET STARTED > Get Started - Models를 참고하세요.

 

https://coronasdk.tistory.com/1212

 

Get Started - Models

https://beta.openai.com/docs/models/overview OpenAI API An API for accessing new AI models developed by OpenAI beta.openai.com Models Overview The OpenAI API is powered by a family of models with different capabilities and price points. You can also custom

coronasdk.tistory.com

 

 

이 예제에서는 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

 

Python String strip() Method

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.w3schools.com

22번째 줄에서는 이 text를 리턴 합니다.

 

여기까지가 gpt3_completion() 함수의 내용입니다.

요약하면 이 함수는 openai.Completion.create() API를 이용해서 Open AI에 질문을 하고 응답을 받은 후 그 내용을 반환하는 함수입니다.

 

가장 핵심적인 부분이죠.

 

여기까지가 함수 들이었구요. 이제 실질적으로 실행되는 부분이 24번째 줄에 있습니다.

 

일단 __name__ 이라는 변수가 나오는데 이 변수는 파이썬에 내장 돼 있는 변수입니다.

여기에는 일단 이 파이썬 파일의 이름 (모듈 이름)이 담기게 됩니다.

만약 다른 파이썬 파일을 실행 시키는데 그 파일에서 현재의 파일을 import 해서 사용하는 경우에 __name__ 변수에 현재의 파이썬 파일 이름 (모듈 이름) 이 담기게 됩니다.

하지만 이 파일 안에서 이 함수를 실행시키면 __name__ 변수에는 파일 이름이 아니라 __main__이라는 값이 들어가게 됩니다.

 

그러므로 if 문은 이 파일이 외부에서 import 된 것이 아니라 이 파일 자체가 실행이 돼었다면 이라는 뜻입니다.

자세한 내용은 이 글을 참조하세요.

 

https://lovelydiary.tistory.com/297

 

파이썬) __name__ 변수는 뭐지? (+if __name__=="__main__"의 의미..)

#1. 변수를 정의할 때 꼭 필요한 문장? 함수를 정의하는 것과 관련하여 파이썬 강의를 듣는 중이었다. 함수의 기능을 열심히 정의를 하고 나서 선생님이 꼭 마지막에 희한한 무언가를 붙이셨다.

lovelydiary.tistory.com

그러므로 이 파이썬을 실행하게 되면 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 테스트를 위해 만든 소스코드를 해석해 봤습니다.

 

반응형


반응형

OpenAI API 를 사용하기 위해서는 OpenAI 를 로컬에 깔아야 하고 이 OpenAI API를 사용해서 어플리케이션을 만들 언어도 깔아야 합니다.

 

저는 파이썬을 깔겠습니다.

 

파이썬은 이곳에서 다운 받아서 인스톨 하면 됩니다.

 

https://www.python.org/downloads/

 

Download Python

The official home of the Python Programming Language

www.python.org

다 깐 다음에는 아래 명령어로 버전을 확인 하고 최신버전으로 업그레이드도 합니다.

python --version

pip install pip --upgrade

 

 

그 pip을 이용해서 openAI를 인스톨 합니다.

 

pip install openai

pip install openai --upgrade

 

여기까지 하면 openai API로 어플리케이션을 개발 할 수 있습니다.

 

저는 참고로 소스 관리를 위해 github 세팅을 했고 편집 툴로 notepad++를 깔았습니다.

 

https://github.com/

 

GitHub: Let’s build from here

GitHub is where over 94 million developers shape the future of software, together. Contribute to the open source community, manage your Git repositories, review code like a pro, track bugs and feat...

github.com

https://notepad-plus-plus.org/downloads/

 

Downloads | Notepad++

 

notepad-plus-plus.org

 

이제 첫번째 파일을 한번 만들어 보죠. (저는 notepad ++를 사용해서 만들었습니다.)

 

import openai

def open_file(filepath) :
    with open(filepath, 'r', encoding='utf-8') as infile :
        return infile.read()
        

openai.api_key=open_file('openaiapikey.txt')

def gpt3_completion(prompt, engine='text-davinci-002', temp=0.7, top_p = 1.0, tokens =400, freq_pen=0.0, pres_pen=0.0, stop=['<<END>>']) :
    prompt = prompt.encode(encoding='ASCII', errors='ignore').decode()
    response = openai.Completion.create(
        engine=engine,
        prompt=prompt,
        temperature=temp,
        max_tokens=tokens,
        top_p=top_p,
        frequency_penalty=freq_pen,
        presence_penalty=pres_pen,
        stop=stop)
    text = response['choices'][0]['text'].strip()
    return text
  
if __name__ == '__main__' :
    prompt = 'When will South Korea and North Korea be unified?:'
    response = gpt3_completion(prompt)
    print(response)

 

이렇게 만들었습니다.

소스 코드 설명은 아래 카테고리에 있는 글들을 참고하세요.

https://coronasdk.tistory.com/category/Open%20AI

 

'Open AI' 카테고리의 글 목록

개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들

coronasdk.tistory.com

참고로 8번째 줄의 openaiapikey.txt 는 같은 폴더에 이 파일을 만들고 그 안에 OpenAI로부터 받은 API Key를 넣으면 됩니다.

 

Open AI 에 던진 질문은 남한과 북한은 언제 통일이 될까? 입니다.

When will South Korea and North Korea be unified?:

 

이제 이것을 실행하고 그 답을 볼까요?

실행은 아래와 같이 합니다.

python hello_world.py

 

응답은 이렇게 나왔네요.

 

한국말로 번역하면

"한반도와 지역 전체의 정치적 상황을 포함한 여러 요인에 따라 변동성이 크기 때문에 남북한이 언제 통일될지 예측할 수 없습니다."

 

이렇게 나왔습니다.

 

한번 더 질문을 해 보겠습니다.

 

"확실한 답은 없지만 많은 전문가들은 가까운 미래에 통일이 이루어질 가능성은 낮다고 보고 있습니다."

첫번째와는 조금 다르게 나왔는데요. 뭐 크게 다르지는 않네요.

 

한번만 더 해보죠.

 

"통일 시기는 북한의 비핵화, 경제 발전, 남북 관계 등 여러 요인에 따라 달라지기 때문에 정해진 날짜는 없다."

 

표현은 약간 다르지만 대충 언제 통일 될지는 알 수 없고 여러 대내외적 요인에 따라 달라질 수 있으며 가까운 미래에 통일될 가능성은 낮다는 내용입니다.

 

이로서 로컬에 개발 환경 세팅하고 OpenAI API 와 처음으로 소통해 봤습니다.

 

성공~~~~~~

 

P.S.

참고로 이 API를 이용하는 것은 유료입니다.

위와 같이 세번 이용한 금액은 0.00262 달러 입니다.

원화로 하면 3.23원 쯤 됩니다. 그러니까 저런 간단한 질문 하나 하면 1원 쯤 지불 해야 하네요.

이렇게 작업한 내용은 아래와 같이 github repository에 저장합니다.

 

git add . ==> 업데이트되거나 새로 생성된 파일을 추가한다.

git status

git commit -am "initial commit"

git push

 

이러면 내 소스파일을 github에 저장할 수 있습니다.

 

 

그럼....

반응형
이전 1 다음