반응형

OpenAI에서 제공하는 API를 활용하여 다양한 기능을 사용하기 위한 기초 내용으로, 프로그램에서 OpenAI API를 사용하는 기초 방법에 대해서 설명합니다.
이 내용을 습득하시고 나면 Python 프로그램에서 OpenAI API를 호출하여 사용할 수 있습니다. 이것은 향후 조금만더 공부해 나간다면 개별 프로그램에서도 OpenAI의 ChatGPT와 같은 기능을 사용 할 수 있게 개발할 수 있습니다.
학습의 많은 내용은 OpenAI의 Documentation 에 있는 Quickstart의 내용을 참고하였습니다. https://platform.openai.com/docs/quickstart?context=python
(참고로 아래 내용과 함께, API Key만들기, API 지불방법 설정 등의 내용을 포함한 유투브 영상입니다.)
https://www.youtube.com/watch?v=HTzFYEr4Ai8)
 
시작해 보겠습니다.
 
좀더 구체적으로 이 글을 통해서 다음과 같은 내용을 배울 수 있습니다.

  • 개발 환경을 어떻게 설정하는지
  • 최신 SDKs(소프트웨어 개발 킷)을 설치하는지
  • OpenAI API에 대한 기본적인 개념
  • API 요청을 어떻게 보내는지

 
진행에 앞서 필요한 것이 있습니다. 그것은 OpenAI 계정API Key 입니다. 링크를 클릭하셔서 만드실 수 있습니다. 그리고 파이참, 비주얼 스튜디오 코드 등 통합개발환경(IDE: integrated development environment) 프로그램을 설치하시면 개발하기에 더 편하십니다.
이제 부터 파이썬 환경에서의 내용을 기준으로 설명하겠습니다.

전체적인 절차 단계는 아래와 같습니다.
1. 파이썬 설정
2. API Key 설정
3.  API 요청 테스트
즉, 프로그래밍 언어 소프트웨어인 파이썬을 설치하고, API 호출에 필요한 API Key를 설정하고, 마지막으로 프로그램에서 API를 요청해 봅니다.
 

1. 파이썬 설정

파이썬 설정을 위해서는 파이썬 다운로드 및 설치, (선택적으로) 가상환경 설치, 그리고 OpenAI 라이브러리 설치가 필요합니다.
 
프로그램 환경에서 API를 이용하려한 것이니까 당연하게도 프로그래밍 언어의 설치가 필요합니다.  파이썬 설치는 파이썬 다운로드 페이지에 접속하셔서 사용중인 OS(Windows, MacOS, Unix)에 맞는 파이썬 설치 파일을 다운로드 받아서 설치하시면 됩니다.
선택적이긴 하지만 가상환경을 설치할 수 있습니다. 파이썬은 여러 라이브러리를 다운로드 받아 사용하는데 이러한 라이브러리 간의 사용 통일성과 프로젝트간의 간섭 방지를 위해서 관리가 필요합니다. 이러한 환경을 프로젝트 별로 관리할 수 있도록 해주는, 가상환경이라는 것을 만들 수 있습니다. 
 
먼저 프로젝트 폴더를 하나 만들고 터미널이나 CMD명령창에서 프로젝트 폴더로 이동 한 뒤에, 다음의 명령어로 가상환경을 만들 수 있습니다.(주의: 이후부터는 프로젝트 폴더의 위치에서 아래의 명령어 들을 실행하세요)

python -m venv openai-env

이 내용을 설명해보면 파이썬 프로그램의 venv 모듈을 실행시켜서 openai-env 라는 가상환경을 만들라는 명령입니다.
이렇게 가상환경을 만들고 나서 가상환경으로 들어간 뒤 라이브러리를 설치하게 되면, 설치된 라이브러리 들은 들어간 가상환경에서만 사용할 수 있게 됩니다.  Windows에서 가상환경으로 들어가는 명령어는 아래와 같습니다.

openai-env\Scripts\activate

Unix나 MacOS에서의 명령어는 아래와 같습니다. 터미널에서 아래를 실행시키면 됩니다.

source openai-env/bin/activate

가상환경으로 들어가게 되면 터미널/명령창의 프롬프트가 바뀌게 됩니다. 보통 환경명이 나옵니다. 예를 들면 (openai-env) $ 이렇게 됩니다.
 
OpenAI 라이브러리 설치는 매우 간단합니다. 앞에서 만든 가상환경으로 들어간뒤에 아래의 명령어를 실행시키면 됩니다.

pip install --upgrade openai

 
 
 

2. API Key 설정

API Key는 매우 중요합니다. 왜냐하면 돈과 연결되어 있어서지요. 따라서 다른 사람이 모르도록 보안에 신경써야 합니다. 프로그램에서 사용하면서도 노출되지 않도록 설정하는 방법은 다음과 같이 2가지가 있습니다. 첫번째는 환경변수에 설정해주는 방법이고 두번째는 프로젝트 폴더에 .env 파일로 설정하는 방법입니다.
 
첫번째 환경변수에 설정하는 방법은 환경변수 OPENAI_API_KEY라는 변수에 발급받은 Key 값을 설정해 놓으면 됩니다. MaC 에서는 아래와 같이 터미널에 입력하면 됩니다. 

export OPENAI_API_KEY='your-api-key-here'

Windows에서는 아래와 같이 명령창에 입력하면 됩니다.

setx OPENAI_API_KEY "your-api-key-here"

환경변수는 (.bash_profile 또는 .zshrc 파일에) 별도로 설정해 주지 않으면 터미널 종료 시 사라지게됩니다. 따라서 계속적인 사용을 위해서는 Profile 파일에 추가로 설정이 필요합니다. 
 
두번째는 '.env' 파일에 설정하는 방법입니다. 하나의 프로젝트에서 사용 할 수 있도록 설정하는 방법입니다. 프로젝트 폴터 안에서 .env 라는 이름의 파일을 새로 만듭니다. 그리고 그 파일의 내용을 아래와 같이 입력하세요.

# Once you add your API key below, make sure to not share it with anyone! The API key should remain private.
OPENAI_API_KEY=abc123

abc123의 위치에 발급받은 OpenAI API Key를 입력하시면 됩니다.
이렇게 입력하고 저장을 하시면 프로그램시 아래와 같은 내용으로 Key를 불러올 수 있습니다.

from openai import OpenAI

client = OpenAI()
# defaults to getting the key using os.environ.get("OPENAI_API_KEY")
# if you saved the key under a different environment variable name, you can do something like:
# client = OpenAI(
#   api_key=os.environ.get("CUSTOM_ENV_NAME"),
# )

이렇게 하면 코딩 내용에서는 API Key 내용이 없기 때문에 보안에 유리합니다.
 
 

3.  API 요청 테스트

자, 이렇게 파이썬 준비도 끝나고 API Key설정도 끝났으면 실제로 사용해볼 차례 입니다. 위에서 만든 프로젝트 폴더에 openai-test.py라는 이름의 파일을 새로 만들어주세요. 내용을 아래와 같이 입력하세요.

from openai import OpenAI
client = OpenAI()

completion = client.chat.completions.create(
  model="gpt-3.5-turbo",
  messages=[
    {"role": "system", "content": "You are a poetic assistant, skilled in explaining complex programming concepts with creative flair."},
    {"role": "user", "content": "Compose a poem that explains the concept of recursion in programming."}
  ]
)

print(completion.choices[0].message)

프로그램의 내용을 간단히 설명 드리면 OpenAI 라이브러리의 API를 이용하여 문장완성을 요청합니다. 모델을 gpt-3.5-turbo를 사용하고, 전달 메시지로, API 또는 모델이 마치 프로그래밍 컨셉을 설명할 수 있는 능력이 있는 시 작성 도우미라고 설정하고(system), recursion의 컨셉을 설명하는 시를 한편 지어보라(user)는 명령 입니다.
위의 내용을 입력후 저장한뒤에, 터미널/명령창 에서 아래와 같이 실행시키면 프로그램이 실행하게 됩니다.

python openai-test.py

프로그램이 잘 실행된다면 아래와 같이 텍트스 문장이 표시될 껍니다. (아, 저는 파일이름을 openai_api_test.py로 했네요.)

 
 

마무리

이렇게 해서 OpenAI API와 관련해서 기초를 배워 봤습니다. 프로그래밍 환경으로 파이썬을 설정했고, API Key를 코딩할때 쓸 수 있도록 설정했습니다. 마지막으로는 간단한 내용의 시를 작성하는 명령을 OpenAI API를 이용하여 프로그램에서 실행해 보았습니다.
OpenAI 라이브러리에는 엄청나게 많은 기능을 제공하고 있습니다. 어플리케이션 프로그램에서 ChatGPT와 같은 서비스를 할 있게 만들 수 있습니다.  프로그램이 가능하기 때문에 ChatGPT의 채팅 창에서 하는 것 보다 더 복잡하고 정교하고 서비스에 필요한 질문과 답변을 할 수 있습니다.
OpenAI API를 이해하는데 있어서 여러분에게 도움이 되셨길 바랍니다.
감사합니다.
 
 
 

반응형
반응형

아래는 Google CoLab에서 AWS RDS MySQL DB에 접속하려고 할때 작성한 코드와 발생 에러 메세지입니다.

 

from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://id:pwd@dev.cluster-cziqwp.ap-northeast-2.rds.amazonaws.com:3306/dbname', pool_pre_ping=True)
 
engine = engine.execution_options(autocommit=True)
 
db_conn = engine.connect()
 
result = db_conn.execution_options(autocommit=True).execute('select count(*) from dbname.t where batch_date = "20231121";')
print("result: ", result)
 
result.close()

---------------------------------------------------------------------------
TimeoutError                              Traceback (most recent call last)
/usr/local/lib/python3.10/dist-packages/pymysql/connections.py in connect(self, sock)
    612                         try:
--> 613                             sock = socket.create_connection(
    614                                 (self.host, self.port), self.connect_timeout, **kwargs

44 frames
TimeoutError: timed out

During handling of the above exception, another exception occurred:

OperationalError                          Traceback (most recent call last)
OperationalError: (2003, "Can't connect to MySQL server on 'dev.cluster-czafliq9kcwp.ap-northeast-2.rds.amazonaws.com' (timed out)")

The above exception was the direct cause of the following exception:

OperationalError                          Traceback (most recent call last)
/usr/local/lib/python3.10/dist-packages/pymysql/connections.py in connect(self, sock)
    662                 if DEBUG:
    663                     print(exc.traceback)
--> 664                 raise exc
    665 
    666             # If e is neither DatabaseError or IOError, It's a bug.

OperationalError: (pymysql.err.OperationalError) (2003, "Can't connect to MySQL server on 'dev.cluster-czafliq9kcwp.ap-northeast-2.rds.amazonaws.com' (timed out)")
(Background on this error at: https://sqlalche.me/e/14/e3q8)

 

Error Messages — SQLAlchemy 1.4 Documentation

Previous: Third Party Integration Issues Next: Changes and Migration Up: Home On this page: Error Messages Connections and Transactions DBAPI Errors SQL Expression Language Object Relational Mapping AsyncIO Exceptions Core Exception Classes ORM Exception C

docs.sqlalchemy.org

 

아무리 찾아봐도 연결이 안될 이유가 없었습니다.

먼저 AWS Sagemaker Jupyter Notebook에서 연결을 확인해보니 잘 되었습니다.

이로 확실한 것은 Sagemaker에서는 접속이되니 DB 문제는 아니라는 것,

그래서 가능한 원인은 두가지 중 하나 입니다.

1. 네트워크 문제  또는 2. 롤(권한)의 문제

1. 네크워크 문제는 Colab에서 IP를 확인하여 AWS VPC에서 Colab의 IP가 연결 오픈 되어있는지 확인하면 됩니다. 안되어있으면 추가해주어야 겠지요.

2. 롤문제는 접속시 AWS CLI를 통해 임시 권한을 받고 이를 통해 접속해 보면 확인 됩니다. 이역시 안되어있을 경우 IAM Role을 만들어서 해결 가능 합니다.

 

 

 

 

 

반응형
반응형


세이지메이커 주피터 노트북 터미널에서 파이썬 스크립트 실행시, 잘 수행되다가 갑자기
Killed
메시지 하나만 달랑 나오는 경우가 있습니다. 많이 당황 스러웠습니다. ㅠㅠ



나중에 알고보니 이런 혐상의 원인 중 하나는 메모리 부족입니다.
실행중인 인스턴스의 메모리보다 처리하려는 데이터가 많아서 Out of memory 가 발생하는 것 입니다.
따라서 해결 방법으로는 메모리 사이즈를 늘려주면 됩니다.
배치 인스턴스의 메모리 크기는 AWS Batch 메뉴중 작업정의(Job Definitions)에서 해당하는 작업정의의 내용을 수정할 수 있습니다.

기본 단위는 Mega Byte 이며 숫자로 입력하면 됩니다.

 

반응형
반응형

모바일 앱을 개발해 보고 싶은 마음이 들어서 유투브를 찾아보던중에 찾은 강의 입니다.

모바일 앱 개발을 위해서는 코틀린이라는 새로운 언어를 배워야 하기 때문에 가장 기본적인 입문 내용을 찾아 보았습니다.  자바로도 되지만 요즘 대세는 코틀린이라네요.

여러개의 유투브 동영상 강의중 마음에 드는 강의가 있어 정리해 보았습니다. Joyce 님의 코틀린 3강으로 끝내기 내용이고요 그 중에서 1,2강 내용을 정리한 글입니다. 

1강, 2강은 주로 코틀린 언어의 문법을 설명하고 3강에서 간단한 앱을 실제로 만들면서 강의합니다. 그래서 1강, 2강에서는 앱개발과는 살짝 다른 느낌을 받지만 기본이되는 내용이니 잘 이해하고 넘어가면 나중에 좋을 것 같습니다.

기본적인 코딩 경험이 있으시고 안드로이드 앱 개발을 배우고 싶으신 분들께 추천하는 강의 입니다. 

 

 

코틀린 3강으로 끝내기 - 1편 기본 문법

1강  =========  https://www.youtube.com/watch?v=IDVnZPjRCYg

 

 

0. IDE 설치

최신 버전의 설치파일 다운로드 주소 : https://developer.android.com/studio?gclid=Cj0KCQiA7bucBhCeARIsAIOwr--wnY7TyI53kQugOceR69MqvskUSVN9toBlgwo1hw_F6w-g_oJH5JAaAvSQEALw_wcB&gclsrc=aw.ds 

 

Download Android Studio & App Tools - Android Developers

Android Studio provides app builders with an integrated development environment (IDE) optimized for Android apps. Download Android Studio today.

developer.android.com

 

이전 버전의 설치파일을  다운로드하는 주소 : https://developer.android.com/studio/archive?hl=ko

 

 

1. 함수

 

 

 

2. val / var

val = value : 값 변경 불가

var = variable : 값 변경 가능

 

 

3. String 템플랫

 

 

 

4.  조건식

// if

3항 연산자가 없어서 대신 아래와 같이 사용 가능

fun whichOneIsBig (a: Int, b: Int) : Int = if(a>b) a else b

 

// when

fun checkNum (score: Int) : Bool {

    when(score) {

        0 -> println("This is zero")

        1,2 -> println("This is 1 or 2")

//        in 10..100 -> println("This is 10 ~ 100")

        else -> println("This is over2")

    }

}

 

// Expression vs Statement

Expression: 결과적으로 값을 만드는 표현, 문장, 문단(모든 코틀린 함수는 expression 왜냐하면 무엇이든 최소한 하나는 값을 반환하니까)

Statement는 Expression이 아닌 것, 명령을 지시하는, 값을 만들지 않는 표현, 문장, 문단

 

 

5. Array vs List

Array는 처음에 크기가 정해져서 생성됨

immutable(수정불가) List 와 mutable(수정가능) List 가 있음. 

fun array() {

    val array : Array<Int> = arrayOf(1,2,3)

    val list : List<Int> = listOf(1,2,3)

    val array2 : Array<Any> = arrayOf(1,"a",3.4f)

    val list2 : List<Any> = listOf(1,"a",3L)

    array[1] = 2

    var result : Int = list.get(0) // 수정불가 값을 가져올 수만 있음.

    val arrayList : ArrayList<Int> = arrayListOf<Int>() // 추가 삭제 가능

    arrayList.add(10)

    arrayList.add(20)

}

 

 

6. 반복문   for / while

 

fun forAndWhile (){

    val students : ArrayList<String> = arrayListOf("Kim", "Lee", "Park")

    for (name : String in students){

        println("${name}")

    }

}

 

for ( i :Int in 1..10 ) {     }  // 1부터 10까지 1씩 증가하며 10번 실행

for ( i :Int in 1..10 step 2 ) {     }  // 1부터 10까지 2씩 증가하며 5번 실행

for ( i :Int in 10 downTo 1 ) {      }  //10부터 1까지 감소하며 10번 실행

for ( i :Int in 1 untill 10 ) {      }.  // 1~ 9까지 1씩 증가하며 9번 실행

// 인덱스와 내용함께 사용하는 방법

for (( index : Int, name : String) in students.withIndex()) {

    println("${index+1}번째 학생: ${name}")

}

 

 

while

var index = 0

while (index < 10) {

    println("${index}")

    index ++

} // 0부터 9까지 10번 수행

 

7. NonNull , Nullable

NPE : Null Point Exception Error  Java에서는 런타임에 에러가 나서 확인이 어려웠는데 코틀린에서는 컴파일 타임에( 코드를 작성하는 시점에) 에러 발생을 미리 알려줌. null이 가능한 변수와 아닌변수를 미리 구분해 줌으로써 실행중에 발생하는 에러를 예방할 수 있음.

var name : String = "James"     // NonNull type 변수로 null 이 들어갈 수 없음. 에러발생

var nullableName : String? = null   // nullable 변수로 null 할당에도 에러가 없음. 이를 위해서 type옆에 ?(물음표)를 추가해줘야함

var nameInUpperCase : String = name.toUpperCase()

var nullableNameInUpperCase : String? = nullableName?.toUpperCase()   // nullableName이 null 인 경우 대문자로 변환하려하면 에러가 이니라 null을 제공함

// ?:

위와 같은 경우 null 값이 아니라 디폴트 값을 제공하고 싶은 경우 엘비스 연산자를 사용(?:)

val lastName : String? = null

val fullName : String = name + " " + (lastName?: "No last name")   // lastName 이 null 인경우 "No last name"을 사용

// !!

개발자가 null 이 아님을 보장한다는 의미. 사용 권장하지 않음. 

// ignore null

fun ignoreNulls(str : String?) {

    val email : String? = "id@email.com"

    email?.let{

        println("my email is ${email}")    

    } // email 이 null이 아니면 my email ~ 출력, null이면 null 출력

}

 

 

8. Class

생성자를 추가한 클래스. init 이 먼저 실행되고 그다음에 constructor가 실행됨

// 클래스 상속, 오버라이딩 overriding

Korean 객채 생성 후 singASong 을 실행하면 상속 받았기 때문에 Human의 메소드가 실행됨.

lalala가 출력됨

오버라이딩을 위해 모class의 singASong 메소드를 앞에서 open 해주고, 자식class(Korean)에서 override 오버라이딩 함

라라랄 이 출력됨

오버라이딩한 메소드 대신에 상위 클래스(Human)의 메소드를 그대로 사용하고 싶을땐 super를 이용하면 됨.

lalala와 라라랄 이 출력됨

상위 클래스의 프로퍼티도 사용할 수 있음. Human 에서 생성자에 name 이 있으므로 별도 할 당 없이도 디폴트 값을 읽어올 수 있음.

my name is :Anonymous 가 출력됨

 

 

 

 

 

 

 

 

 

 

코틀린 3강으로 끝내기 - 2편 고급 문법 ====================

2강 =======  https://www.youtube.com/watch?v=Q5noYbbc9uc

 

1. Lambda

아래는 정의 내용과, 입력받은 숫자의 제곱을 반환하는 square 람다를 만드는 예시. 그리고 이름, 나이를 입력받아 출력하는 람다 예시.

 

확장함수

 

람다의 인풋 파라메터가 하나인 경우 변수를 it으로 사용할 수 있다. 

아래에서 this 는 람다(introduceMyself)를 호출하는 객체(name)를 말한다. 그래서 this 대신에 ariana가 들어가서 "I am ariana and 27 years old"가 출력된다. 

// 람다의 Return

// 람다 표현 방법

정의한 ivokeLamda에 인자로 lamda 함수를 사용. 제일 아래 줄의 형태는 마지막 파라미터가 람다식일때 보여짐. 

// 익명 내부 함수     자바 인터페이스, 하나의 변수만 사용할때 사용가능

 

 

 

2. Data Class

 

 

3. Companion Object

프라이빗 클래스의 프로퍼티나 메소드를 사용할 수 있게 해줌. java의 static 과 같은 역할 

인터페이스를 사용

 

 

4. Object

오브젝트는 실행 시 처음 한번만 만들어짐 singleton pattern

 

 

 

 

 

 

 

 

 

 

코틀린 3강으로 끝내기 - 3편 심리테스트 앱 만들기  ====================

3강 ======= https://www.youtube.com/watch?v=M1e2tLnzVPo&t=2733s 

 

 

 

반응형

+ Recent posts