본문 바로가기
IT

챗GPT를 이용하자! + 파이썬 프로그래밍 기초

by 소혜민 2025. 1. 30.
반응형

IT쪽에서 일을 하는 사람으로 2022년 말, 2023년 최고의 화두는 누가 뭐라고 해도 챗GPT였습니다. Generative Pre-trained Transformer, 위키피디아를 찾아보면 다음과 같이 정의하고 있습니다. 


GPT는 미국의 인공지능 단체 오픈AI가 2018년 선보인 대형 언어 모델의 계열이며 GPT 모델들은 레이블링되지 않은 대량의 텍스트 데이터셋으로 미리 훈련되고 인간과 같은 문자를 생성할 수 있는 변환기 아키텍처에 기반한 인공 신경망이다. 

 

한번도 써보지 않았다면 지금 당장 책을 덮고 openai.com에 접속을 해보자. 구글 계정만 있다면 간단하게 가입을 하고 챗GPT를 사용해 볼 수 있습니다. 영어로 물어보지 않아도 됩니다. 그냥 한글로 물어봐도 대답을 해 줍니다. 처음엔 그냥 멍하니 놀라기만 했습니다. 질문에 대한 답변이 신기했고 관련 사이트만 나열하는 기존 방식에 비해서 긴 문장으로 깔끔하게 정리된 답변이 신기했습니다. openai에 사용된 언어의 98% 이상이 영어이고 한글은 0.01%가 채 안된다고 합니다. 그렇기 때문에 한글 질문에 대한 답변의 품질 그 자체는 영어보다 낮지만 그럼에도 불구하고 답변을 받아보면 대단하다는 생각이 듭니다. 꼭 써 보셔야 합니다. 다음은 챗GPT에 Python을 공부해야 하는 대표적인 3가지 이유를 물어봤을 때의 대답입니다. 

 

 

그럼 python으로 챗GPT를 활용할 수 있는 방법 혹은 그 반대로 챗GPT를 이용해서 python을 활용할 수 있는 방법은 없을까 하는 생각을 했습니다. 얘가 코딩을 할 줄도 알까요? 네! 이 친구 챗GPT는 코드를 그럴싸하게 만들어 준다고 합니다. 그럼 파이썬으로 챗GPT를 이용하는 코드를 물어보면 어떤 대답을 내 놓을까요?

다음과 같이 물어봤습니다.

 

 

이에 대한 대답을 보시죠. 다음과 같습니다.

 

챗GPT가 코드를 짜 줬습니다. 잘 실행이 될 것인가는 두고 보면 알겠지만 대단합니다. 한번 실행을 시켜보도록 하겠습니다. 실행도 잘 된다면 속된 말도 정말 대박입니다. 우선 내용을 살펴보면 처음에 openai를 import 했습니다. 패키지 설치가 필요하겠네요.

 

pip install openai

 

openai 패키지를 설치해 줍니다. 

그리고 주의를 보면 OpenAI API 키가 필요하다고 합니다. OpenAI API 키를 얻어서 소스 코드 네번째 줄의 YOUR_API_KEY를 지우고 그 부분에 넣어주면 됩니다. API 키라는 것은 누가 챗GPT를 썼는지 알기 위해서 챗GPT를 만든 OpenAI사에서 발급해 주는 키(key)입니다. 이것은 각자의 ID와 연결되기 때문에 얼마나 많이 챗GPT를 사용했는지 누가 사용했는지를 파악하기 위함입니다. 결국 챗GPT의 사용에 돈을 받기 위한 것이라고 할 수 있겠죠. 각 ID마다 18달러를 무료로 충전해 주고 사용할 수 있게 해 주고 있기 때문에 우리가 프로그램을 만들고 테스트하기 위한 충분한 조건은 될 것 같습니다. 자 알려준대로 하나씩 해 봅시다. 먼저 OpenAI API 키를 얻기 위해서 다음의 페이지로 이동을 합니다. 

 

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

 

화면 중간에 “+ Create new secret key”를 누르고 이름을 입력하고 Create secret key를 선택하면 OpenAI API 키를 만들 수 있습니다. 

 

 

키를 만들었으면, 챗GPT가 만든 코드를 우선 파이참으로 복사를 해 오고 소스코드의 네번째 줄에 다음과 같이 OpenAI Key를 복사해 넣습니다. 

챗GPT 뿐만 아니라 파이썬에서 배워야 할 꽤 많은 것들이 보입니다. 8번째 줄에 def로 시작하는 함수가 있네요. 이미 있는 함수들을 사용하기만 했는데 우리도 이제 함수를 배우면 만들어서 사용할 수 있게 되겠습니다.


다음은 24번 라인의 while True라는 부분이 처음 보는 부분입니다. input() 함수도 보이고 if로 시작하는 줄도 보입니다. 

 

이것들은 나중에 알아보도록 하고, 시키는 대로 openai 패키지도 설치를 했고 API Key도 만들어서 복사해 넣었으니 먼저 실행을 해 보도록 하죠. 제대로 실행이 되는지가 궁금합니다.

 

007_chatGPT.py

 

실행이 잘 되지 않을까 하는 기대를 해 봅니다. 코드가 그럴싸 해 보입니다. 마우스 오른쪽 버튼을 눌러 Run으로 실행합니다. 다음과 같이 ChatGPT를 시작합니다 라는 메시지가 떠서 “파이썬의 장점은?” 하고 물어봤습니다. 프로그램에서 출력되는 부분은 흰색, 질문을 직접 입력한 부분은 초록색입니다.

 

 

그리고 엔터를 쳤더니 안타깝게도 에러가 발생합니다.

 

 

에러를 수정하는 것은 프로그래머의 숙명, 에러가 발생했다고 당황하지 말고 에러 메시지를 잘 살펴보시기 바랍니다. 에러메시지만 잘 봐도 어떻게 해결을 해야할지 그 단서가 보입니다. 주로 맨 아래에 원인이 나와 있습니다. 이 경우 에러 메시지 맨 아래를 보니 log_level을 인식할 수 없다는 메시지가 보입니다. 정확하게는 모르겠지만 코드 16라인에 있는 log_level=‘info’라고 되어 있는데서 발생하는 에러 같습니다.  구글 검색을 할까 생각을 하다가 챗GPT가 대답을 해 줄 수 있지 않을까 생각했습니다. 그래서 챗GPT에게 다시 말을 했습니다. 물음표가 붙은 질문이 아니라 현상만을 얘기 했습니다.

 

 

에러가 발생했다고 하니 해당 줄을 제거하거나 주석처리하라고 합니다. 

 

        n=1, # 몇 개의 응답을 받을지 설정

        stop=None, # 대화를 멈출 토큰 설정 (None일 경우, 모델이 알아서 멈춤)

        # log_level='info' # 로그 레벨 설정

    )

    return response.choices[0].text.strip()

 

위와 같이 주석처리를 했습니다. 이미 배운대로 문장의 맨 앞에 #을 넣어주면 됩니다. 그리고 다시 실행을 해서 같은 질문을 넣어봤습니다. 답변까지 잘 나오는 것을 확인했습니다. 그럼 우리가 만든 챗GPT 프로그램에서 나온 다음의 답변을 보시죠.

 

 

그럼 이젠 코드를 하나씩 살펴보도록 하시죠.

 

 # ChatGPT에 대화 요청 보내기

 def send_message(message):

     response = openai.Completion.create(

         engine='text-davinci-003', # 사용할 엔진 선택

         prompt=message,

         max_tokens=100, # 응답으로 받을 토큰 수 설정

         temperature=0.7, # 다양성 조절을 위한 온도 설정

         n=1, # 몇 개의 응답을 받을지 설정

         stop=None, # 대화를 멈출 토큰 설정 (None일 경우, 모델이 알아서 멈춤)

         # log_level='info' # 로그 레벨 설정

     )

     return response.choices[0].text.strip()

 

맨 첫줄의 주석, 둘째 줄에는 함수임을 나타내는 def, 함수 이름 send_message가 있습니다. 그리고 함수에서 전달 받는 것, 이것을 매개변수라고 부릅니다. 전달 받는 것이죠. send_message()라는 함수를 부를 때, 괄호안에 있는 정보를 가지고 함수를 실행하라는 것입니다.  

그 다음부터 return으로 시작하는 맨 마지막 줄까지는 함수의 내용입니다. 함수는 어떤 동작을 수행하는 단위 중의 하나입니다. 달리 표현하자면 

 

‘함수는 코드 덩어리다' 

 

내가 시키고 싶은 일을 모아 놓은 어떤 기능을 수행하기 위한 코드 덩어리라고 할 수 있겠네요. 내가 시키고 싶은 일을 시킬 수 있는 심부름꾼이라고 표현을 할 수도 있을 것 같습니다. 스타벅스에 가서 카푸치노 한잔 사오라는 심부름꾼이 있다고 해 볼까요? 그럼 이 심부름꾼은 부르기만 하면 스타벅스에 가서 카푸치노 한잔을 사올껍니다. 이 친구는 다른 커피를 사 올줄 몰라요. 왜냐하면 스타벅스에 가서 카푸치노만 사오는 심부름 밖에 할 줄 모르거든요. 그런데 이런 심부름꾼을 만들면서 매개변수라는 놈을 줄 수 있습니다. 함수 뒤 괄호 안에 들어가는 것이 매개변수입니다. 새로운 심부름꾼2를 만들면서 괄호 안에 커피 이름을 넣는 겁니다. 심부름꾼2(카페라떼)처럼 말이죠. 그럼 이 심부름꾼은 괄호 안에 들어가 있는 커피를 스타벅스에 가서 사오는겁니다. 커피 여러잔, 여러 종류를 사오라고 시키려면 어떻게 하면 될까요? 단순히 함수를 여러번 부르면 되겠죠. 심부름꾼2(카페라떼), 심부름꾼2(카푸치노), 심부름꾼2(아아)

그런데 이 친구는 스타벅스 밖에 몰라요. 누군가는 투썸플레이스 커피를 먹고 싶은데 말이죠. 이럴때는 심부름꾼을 업그레이드 시키면 됩니다. 심부름꾼3는 매개변수를 두 개 가질 수 있습니다. 첫번째는 커피숍이름 두 번째는 커피 또는 다른 메뉴를 넣을 수 있도록 하면 됩니다. 심부름꾼3(스타벅스, 카푸치노) 심부름꾼3(투섬플레이스, 치즈케익)과 같이 말이죠. 함수가 좀 이해가 되실까요? 

 

함수를 시작할 때는 def로 시작을 합니다. 함수를 만드는 약속이죠. 그 다음에는 함수이름이 오고요. 그리고 괄호 안에 매개변수를 콤마로 분리해서 넣을 수 있습니다. 앞에서 본 함수는 message라는 매개변수를 가지고 있습니다. 한가지 빼먹은 사실이 있네요. 심부름꾼이 다녀오면 무엇을 전달해 줄까요? 바로 사온 커피를 전달해 주겠죠?

함수도 마치고 나면 결과를 돌려 줄 수 있습니다. 앞의 send_message()는 그 결과물을 돌려줍니다. 다시 함수를 살펴보죠. send_message() 함수를 보면 결국엔 openai 패키지의 Completion의 create라는 함수를 불러서 일을 시키고 있습니다. 우리가 전달해 준 message라는 매개변수를 가지고서 create()라는 함수에 매개변수를 전달해 주는데 우리가 전달해 준, message 매개변수도 사용되고 있죠. 이처럼 함수는 내가 기억하기 어려운 함수를 내가 새로운 이름을 줘서 호출을 할 수도 있습니다. create(), openai.Completion.create() 함수는 여러 매개변수를 이용해서 챗GPT에 질문을 던지고 그 답을 얻는 함수입니다. 

 

여기서 또 새로운 부분이 나오네요. 바로 return입니다. 결과를 함수를 호출한 곳으로 되돌려 주는 것인데  response.choices[0].text.strip()이라는 긴 길이를 가진 내용을 돌려줍니다. response는 openai.Completion.create()의 결과물을 받은 놈인데 많은 정보를 가지고 있어 그 중에서 choices의 0번째에 text를 되돌려 줘야 하는 것입니다. 마지막에 strip()은 뭘까요? 

 

python strip()

 

으로 구글링을 해 봅니다. 

그러면 strip()이라는 함수는 python에서 내장하고 있는 함수라는 정보를 찾을 수 있을 것입니다. 이 함수는 문자열의 좌우에 있을지도 모르는 공백을 제거해 주는 역할을 합니다. 불필요한 문자열의 좌우 공백을 없애주는 놈이네요. 그러니까 response.choices[0].text에 혹시 공백이 있을지 모르니 그 공백을 없애라는 의미입니다.

 

create()안에 들어가는 매개변수들은 그대로 사용을 합니다. 챗GPT가 알려준 코드니까 그냥 쓰도록 합니다. 혹시 궁금하면 구글링을 해 보시기 추천드려요. 한가지 짚고 넘어갈 것은 create() 함수 안에 매개 변수가 여러개 들어가는 것은 이해를 했는데 매개변수에 prompt=message와 같이 배우지 않은 등호가 들어간 문장들이 있다는 것이죠. 잠시 심부름꾼3 얘기로 돌아가 보겠습니다. 이 심부름꾼3은 매개변수로 커피숍 이름과 상품이름의 두 개를 매개 변수로 받았습니다. 그러면 심부름꾼3은 다음과 같이 선언이 되어 있을겁니다.

 

def 심부름꾼3(cafe_name, coffee_name):

 

이해 되시죠?

그런데 저는 말이죠. 스타벅스의 카푸치노를 좋아 합니다. 심부름꾼3을 언제 활용하느냐 하면 가끔 친구들이나 가족이 다른 커피를 사다 달라고 할 때 사용하긴 하지만 거의 대부분 나를 위한 용도로 사용을 한다는거죠. 이럴 경우 좀더 편하게 사용하기 위해서 다음과 같이 함수를 바꿔줄 수 있습니다.

 

def 심부름꾼3(cafe_name=스타벅스, coffee_name=카푸치노):

 

바로 default 값을 넣어서 함수를 만들어 주는 것입니다. 그러면 심부름꾼3()이라고만 해도 심부름꾼3(스타벅스, 카푸치노)와 동일한 함수 호출이 되는 것입니다. 심부름꾼3(coffee_name=라떼)라고 부르면 어떻게 될까요? 결과는 스타벅스에서 라떼를 사오라는게 되겠죠. 왜냐하면 cafe_name은 default가 스타벅스이기 때문에 자동으로 초기 값이 사용되는 것입니다. 

 

send_message() 함수 다음에는 프로그램의 첫 시작코드가 나옵니다. 함수는 누군가가 불러주기 전에는 실행이 되지 않습니다. 그래서 send_message() 함수 다음에 왼쪽에 공백이 없이 시작되는 문장이 프로그램이 시작되는 곳이라고 보면 됩니다. 챗GPT를 시작한다는 메시지와 함께 종료하려면 ‘종료'를 입력하라고 되어 있네요.

 

 # 대화 반복

 print("ChatGPT를 시작합니다. '종료'를 입력하면 대화가 종료됩니다.")

 

 while True:

     user_input = input("사용자: "

 

     if user_input == '종료':

         print("ChatGPT를 종료합니다.")

         break

 

     response = send_message(user_input)

     print("ChatGPT: ", response)

 

중요한 while문이 드디어 등장을 했습니다. for와 같은 반복문 중의 하나입니다. for문이 시작과 끝을 지정해 주는 반면에 while문은 다음에 오는 조건이 True인 동안에만 반복을 합니다. 앞에서 보면 while True:와 같이 되어 있으니 이 while문은 정말로 무한 반복입니다. 왜냐하면 이미 True로 while의 조건을 걸어 놨기 때문에 while의 조건 True는가 False가 될 수 없기 때문인 것이죠.
while문에는 True가 아니라 일반적으로 if문과 같은 조건문이 들어가게 되는데 그 조건이 while을 수행하면서 바뀌게 되고 만일에 조건이 False가 되는 조건이라면 while문을 빠져나오게 됩니다. 앞의 코드를 보면 while문 안에 조건문 if문이 있습니다. 그리고 if문의 조건이 True이면 break문을 만나게 되는데 while은 break에 의해서 종료가 됩니다. while문이 어떻게 동작을 하는지 살펴봤습니다. 그러면 각 라인별로 어떤 내용인지 하나씩 살펴보겠습니다. 

 

user_input = input(“사용자: “)

 

input() 함수는 매개변수로 넘겨받은 “사용자: “를 터미널에 출력합니다. 그 다음에는 키보드 입력을 받아 들입니다. 키보드 입력이 끝나고 엔터키를 누르면 키보드 입력을 한 내용이 반환되어 user_input이라는 변수에 저장이 됩니다. 여기에서 입력받은 내용이 챗GPT로 전달이 될 내용이 됩니다. 

그런데 user_input에 입력받은 내용이 ‘종료’라면 “ChatGPT를 종료합니다.”라는 메시지를 뿌리고 break문을 통해서 while문을 빠져나갑니다. while문 다음에는 아무것도 없으므로 프로그램이 종료가 됩니다. if 문에서 ==와 같이 등호 두 개가 있는 것은 두 개가 같은지 비교를 하라는 의미입니다. 등호 하나가 우측에서 계산된 값을 좌측의 변수에 입력을 하라는 의미죠. 두 개는 비교하라는 의미입니다. 같으면 True, 다르면 False를 발생시킵니다.

 

사용자가 입력한 값이 ‘종료’가 아니라면 앞서 만들었던 send_message() 함수에 user_input을 매개 변수로 넘겨서 response에서 받고 그 내용을 print()함수를 통해서 response를 출력하라는 것입니다. response를 출력한 다음은 어떻게 되나요? 

맞습니다. 다시 while문의 처음으로 돌아가서 user_input = input(“사용자: “)를 다시 실행하게 됩니다. 

 

챗GPT에게 파이썬으로 챗GPT와 대화하는 프로그램을 만들어 달라고 요청을 했고 요청한 코드를 실행했더니 에러가 발생했습니다. 그래서 다시 챗GPT에 에러가 났다고 하니 오류를 수정하는 방법을 알려줬습니다. 챗GPT의 얘기대로 수정을 하니 에러가 사라졌고 잘 실행이 되는 것을 볼 수 있었습니다. 챗GPT를 활용할 수 있는 아이디어가 있다면 여기에 있는 코드를 활용할 수 있겠습니다. 어디 좋은 아이디어가 없을까요?

챗GPT의 기능은 3.5까지는 무료입니다. 하지만 챗GPT의 기능을 패키지를 통해서 사용을 하고 있는데 openAPI 서비스라는 것을 이용합니다. 여기서 API란 Application Programming Interface입니다. 응용 프로그램에서 정보를 주고 받기 위한 방법을 의미합니다. 챗GPT와 파이썬의 패키지가 openAPI를 통해서 정보를 주고 받는 방식인데 과금을 하는 방식으로 변경이 되어 더 이상 무료로 사용할 수 없다고 합니다. 

 

일부 무료로 사용할 수 있는 횟수가 있는데 이것을 활용할 것인지 다른 방법을 사용할 것인지는 나중에 이것 저것 살펴보고 정하도록 하겠습니다. 



반응형

'IT' 카테고리의 다른 글

파이썬 - 웹 크롤링  (0) 2025.01.30
깃헙 - GitHub  (0) 2025.01.30
Openpyxl 첫 파이썬 레고블럭  (0) 2025.01.30
첫 파이썬프로그램과 개발환경  (0) 2025.01.30
파이썬을 설치합시다  (2) 2025.01.30

댓글