챗GPT 데이터 사이언스

챗GPT(ChatGPT)

챗GPT와 데이터 사이언스 환경을 설정합니다.

저자
소속

1 환경설정

“챗GPT와 유닉스 쉘(Unix Shell)”은 전세계적으로 수천번의 워크샵과 국내에서도 수년동안 소프트웨어 카펜트리 워크샵 경험을 정식 교재를 통해서 한글화하여 출판을 준비하면서 최근에 큰 반향을 일으키고 있는 챗GPT 관련 내용도 담아내어 한번 학습하여 평생토록 활용할 수 있는 것에 방점을 두고 있다.

1.1 챗GPT 연동

OpenAI GPT 제품은 파이썬이 주 개발언어로 되어 있어 파이썬을 기준으로 챗GPT 개발을 진행한다. 일반적인 API를 활용한 파이썬 개발작업흐름은 먼저, 가상환경을 구축하고, API KEY를 발급받고 해당 openai 패키지를 설치하고 헬로월드를 찍고 본격적인 AI 제품 개발을 진행하는 방식으로 추진한다.

graph LR
  A["1. 가상환경 구축"] --> B["2. API KEY 발급받기"]
  B --> C["3. API KEY 저장"]
  C --> D["4. openai 패키지 설치"]
  D --> E["5. 헬로 월드"]

1.1.1 가상환경 설정

다양한 가상환경이 있어 필요한 패키지를 사용하여 파이썬 가상환경을 구축한다. 파이썬 3.3 버전부터 내장된 venv, 많이 사용되는 virtualenvwrapper, virtualenv 등이 유명하다. 본인 취향에 맞는 가상환경을 특정하여 업무에 사용한다. 다음은 venv를 사용해서 가상 개발환경을 구축하는 것을 예시로 보여주고 있다.

## 디렉토리 생성 및 프로젝트 디렉토리 이동
mkdir myproject
cd myproject

## 가상환경 생성
python -m venv myenv

## 가상환경 활성화
myenv\Scripts\activate # 윈도우즈
source myenv/bin/activate # 리눅스/맥

## 가상환경 비활성화
deactivate

1.1.2 API KEY 얻기

가상환경을 구축한 다음 OpenAI에서 제공하는 공식 API에 접근할 수 있는 API 키를 생성하는 것이다. https://openai.com/api/ 1 로 이동하여 계정을 만듭니다.

안내에 따라 계정을 생성한 다음 https://platform.openai.com/account/api-keys 2 로 이동하여 API 키를 생성한다.

API 키는 조직에 속해야 하며, 조직을 생성하라는 메시지가 표시되는 경우 조직명을 입력한다. 하나의 조직에 속한 경우 조직 ID(Organization ID)를 별도 생성할 필요는 없다. OpenAI 계정을 통해서는 생성한 API KEY는 다시 볼 수 없기 때문에 생성한 비밀 키를 안전하고 접근하기 쉬운 곳에 저장한다.

1.1.3 API KEY 저장

API KEY를 환경변수로 지정하여 호출하는 방식도 있고, 작업 프로젝트 디렉토리에 로컬 파일에 저장하여 사용하는 방식도 있다. 먼저 윈도우에서 시스템으로 들어가서 환경 변수로 지정하면 해당 변수(OPENAI_API_KEY)를 다양한 프로그램에서 호출하여 사용할 수 있다.

다른 방식은 .env와 같은 파일을 프로젝트 디렉토리 아래 숨긴 파일에 지정하여 사용하는 방식이다. 이런 경우 .gitignore 파일에 버전제어 대상에서 제외시켜 두는 것을 필히 기억한다.

1.1.4 헬로월드

OpenAI API KEY도 준비가 되었으면 헬로월드 프로그램을 작성해보자. 개발자가 하나의 조직에 속한 경우, API KEY를 운영체제 환경변수로 지정한 경우 다음과 같이 시스템 환경에서 OPENAI_API_KEY 키를 가져와서 OpenAI에서 제공하는 모델목록을 확인할 수 있다.

#> {
#>   "created": 1677532384,
#>   "id": "whisper-1",
#>   "object": "model",
#>   "owned_by": "openai-internal",
#>   "parent": null,
#>   "permission": [
#>     {
#>       "allow_create_engine": false,
#>       "allow_fine_tuning": false,
#>       "allow_logprobs": true,
#>       "allow_sampling": true,
#>       "allow_search_indices": false,
#>       "allow_view": true,
#>       "created": 1683912666,
#>       "group": null,
#>       "id": "modelperm-KlsZlfft3Gma8pI6A8rTnyjs",
#>       "is_blocking": false,
#>       "object": "model_permission",
#>       "organization": "*"
#>     }
#>   ],
#>   "root": "whisper-1"
#> }

다른 방식은 로컬 파일에 API KEY와 ORG ID 를 저장하고 이를 불러와서 개발에 사용하는 방식이다.

#> {
#>   "created": 1677532384,
#>   "id": "whisper-1",
#>   "object": "model",
#>   "owned_by": "openai-internal",
#>   "parent": null,
#>   "permission": [
#>     {
#>       "allow_create_engine": false,
#>       "allow_fine_tuning": false,
#>       "allow_logprobs": true,
#>       "allow_sampling": true,
#>       "allow_search_indices": false,
#>       "allow_view": true,
#>       "created": 1683912666,
#>       "group": null,
#>       "id": "modelperm-KlsZlfft3Gma8pI6A8rTnyjs",
#>       "is_blocking": false,
#>       "object": "model_permission",
#>       "organization": "*"
#>     }
#>   ],
#>   "root": "whisper-1"
#> }

1.1.5 OpenAI 모형

OpenAI에서 제공하는 다양한 모델을 확인할 수 있다. system이 소유한 GPT 모형을 살펴보자.

created id object owned_by

프로그램 코드(code) 관련된 GPT 모형도 확인할 수 있다.

created id object owned_by
2022-04-29 babbage-code-search-code model openai-dev
2022-04-29 babbage-code-search-text model openai-dev
2022-04-29 code-search-babbage-text-001 model openai-dev
2022-04-29 code-search-babbage-code-001 model openai-dev
2022-04-29 ada-code-search-code model openai-dev
2022-04-29 code-search-ada-text-001 model openai-dev
2022-04-29 ada-code-search-text model openai-dev
2022-04-29 code-search-ada-code-001 model openai-dev
2022-04-14 code-davinci-edit-001 model openai

1.2 윈도우 쉘 환경

윈도우 운영체제에서 유닉스 쉘(Shell)을 사용하는 방법은 여러가지가 있다. 윈도우 운영체제에 내장된 명령 프롬프트(cmd.exe)는 OS/2, 윈도우 임베디드, 윈도우 NT 5.0 이상 기반 시스템의 명령어 인터프리터로 친숙하고 최근에 파워쉘(PowerShell)은 마이크로소프트가 개발한, 확장 가능한 명령 줄 인터페이스 셸 및 스크립트 언어를 특징으로 하는 명령어 인터프리터다. 하지만, 이런 cmd, PowerShell은 윈도우 운영체제에서만 동작된다는 한계가 있다. 맥과 리눅스 특히, 클라우드를 지배하고 있는 유닉스 쉘을 윈도우에서도 무리없이 사용하게 된다면 모든 운영체제에서 공통작업을 수행하는데 큰 도움이 될 것이다. 이를 위해 WSL(Windows SubSystem for Linux)를 통해 다양한 리눅스 운영체제를 설치하는 경우와 Git Bash를 설치하여 유닉스 쉘을 윈도우에서도 활용이 가능하다.

1.2.1 WSL

WSL(Linux용 Windows 서브시스템)을 통해 우분투(Ubuntu), 데비안(Debian)를 포함한 다양한 리눅스 배포판을 설치할 수 있다. 여기서 데비안를 설치하는 경우를 살펴보자. 기본적인 작업흐름은 다른 리눅스 배포판 설치와 동일한데 먼저 WSL을 설치하고 이어서 데비안 리눅스 배포판을 설치한다.

윈도우즈 PowerShell을 통해 WSL(Linux용 Windows 하위 시스템)을 설치한다.

$ wsl --install

상기 명령을 실행하면 시스템이 WSL과 Linux 배포판(기본값은 우분투)을 설치하고 PC를 재시작한다.

‘가상 머신 플랫폼’ 선택적 구성 요소를 활성화시킨다. 새 Linux 배포판을 설치하기 전에 ‘가상 머신 플랫폼’ 구성 요소가 활성화되어 있는지 확인해야 하고, 관리자 권한으로 PowerShell을 다시 열고 실행한다.

$ dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

PC를 다시 시작하여 WSL 설치 및 WSL 2로 업데이트를 완료하고, WSL 2를 기본 버전으로 설정한다.

$ wsl --set-default-version 2

wsl --install 디폴트로 우분투 리눅스 배포판이 설치되지만 -d Debian 인자를 넣게 되면 데비안 리눅스 배포판을 설치할 수 있다.

$ wsl --install -d Debian

정상으로 WSL 데비안 배포판이 설치되었는지 확인한다.

$ cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

1.2.2 ShellGPT

OpenAI의 ChatGPT(GPT-3.5)는 콘텐츠 생성에 주된 방점이 있지만 다양한 프로그래밍 코드도 작성함은 물론 유닉스 쉘 프로그램도 작성하여 CLI 생산성을 높이는데 사용될 수 있다. ChatGPT 기능을 활용하여 쉘 명령, 코드 스니펫, 주석, 문서 등을 생성할 수 있다. 즉, 데이터 과학자를 비롯한 개발자가 기존에 업무를 수행하던 방식이 전혀 다르게 된다. 즉, 책, 매뉴얼, 비밀노트(Cheat Sheet), 인터넷 북마크, 구글링 같은 검색없이 바로 터미널에서 바로 정확한 답변을 얻어 귀중한 시간과 노력을 절약할 수 있다. 예를 들어 앞서 프로젝트를 할 때 해당 유닉스 쉘 명령어가 기억나지 않는다고 하면 ShellGPT를 사용하여 해당 작업을 신속하게 수행할 수 있다

ShellGPT를 사용하기 위한 설정은 다음과 같다. ShellGPT가 파이썬으로 개발되어 WSL 데비안 혹은 우분투로 설치한 경우 다음 순서대로 설치를 해야한다.

cURL은 다양한 통신 프로토콜을 이용하여 데이터를 전송하기 위한 라이브러리와 명령 줄 도구를 제공하는 컴퓨터 소프트웨어로 쉘에서 설치하는데 파이썬 설치파일을 전송받는데 필요하다.

$ sudo apt install curl

파이썬을 설치하기 위해서 get-py.py 파일이 필요한데 설치에 앞서 python3-distutils 파일을 설치한다.

$ sudo apt-get install python3-distutils

파이썬 설치파일을 다운로드하고 파이썬을 설치하고 python3 명령어를 통해 버전을 확인한다.

$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
$ sudo python3 get-pip.py
$ python3 --version
Python 3.9.2

Python 3.x는 Python 2.x가 설치된 시스템에서 python3로 설치되는 경우가 많으며, python 명령은 이전 버전(Python 2.x)에 링크되어 있는 경우가 많고 리눅스 배포판에서 일반적이다. Python 3.x에서 python 명령을 사용하려면 별칭(alias)을 만들어야 한다.

nano 편집기를 열고 alias python=python3을 추가하고 저장한다.

$ nano ~/.bashrc
alias python=python3

다시 쉘에서 변경사항을 적용시키면 python 명령어를 실행하게 되면 python3 가 대신 실행되는 것을 확인할 수 있다.

$ source ~/.bashrc
$ python --version
Python 3.9.2

ShellGPT를 설치한다.

$ sudo pip install shell-gpt==0.9.2

sgpt를 처음 실행하게 되면 OpenAI API Key를 입력해야 한다. OpenAI에서 API Keys를 생성하여 붙여넣기 하면 ~/.config/shell_gpt/.sgptrc 파일에 저장되어 ShellGPT를 사용하게 된다.

$ sgpt
Please enter your OpenAI API key:

cat 명령어로 OPENAI_API_KEY가 정상등록된 것을 확인하고 헬로월드를 보내보자. sgpt 다음에 자연어로 지시사항을 보내면 gpt-3.5-turbo 엔진을 통해 자연어를 해석하고 이를 결과로 반환해준다.

$ cat ~/.config/shell_gpt/.sgptrc
CHAT_CACHE_PATH=/tmp/chat_cache
CACHE_PATH=/tmp/cache
CHAT_CACHE_LENGTH=100
CACHE_LENGTH=100
REQUEST_TIMEOUT=60
DEFAULT_MODEL=gpt-3.5-turbo
OPENAI_API_HOST=https://api.openai.com
DEFAULT_COLOR=magenta
ROLE_STORAGE_PATH=/home/xxxxxxxx/.config/shell_gpt/roles
SYSTEM_ROLES=false
DEFAULT_EXECUTE_SHELL_CMD=false
OPENAI_API_KEY=sk-wUxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxFf
$ sgpt "대한민국의 수도는 어디야?"
서울입니다.

sgpt 다음에 “현재 폴더 및 하위 폴더에 있는 모든 txt 파일을 보여주세요.” 명령어를 보내면 이를 쉘 명령어로 변환한 후 유닉스 쉘 명령어를 제시하여 준다.

$ sgpt "현재 폴더 및 하위 폴더에 있는 모든 txt 파일을 보여주세요."
현재 폴더 및 하위 폴더에 있는 모든 txt 파일을 보여드리겠습니다. 아래 명령어를 입력해주세요.

find . -name "*.txt"
tidyverse@dl:/mnt/d/tcs/gpt-shell/shell-lesson-data$ find . -name "*.txt"
./exercise-data/numbers.txt
./exercise-data/writing/haiku.txt
./exercise-data/writing/LittleWomen.txt
./north-pacific-gyre/NENE01729A.txt
./north-pacific-gyre/NENE01729B.txt
./north-pacific-gyre/NENE01736A.txt
./north-pacific-gyre/NENE01751A.txt
./north-pacific-gyre/NENE01751B.txt
./north-pacific-gyre/NENE01812A.txt
./north-pacific-gyre/NENE01843A.txt
./north-pacific-gyre/NENE01843B.txt
./north-pacific-gyre/NENE01971Z.txt
./north-pacific-gyre/NENE01978A.txt
./north-pacific-gyre/NENE01978B.txt
./north-pacific-gyre/NENE02018B.txt
./north-pacific-gyre/NENE02040A.txt
./north-pacific-gyre/NENE02040B.txt
./north-pacific-gyre/NENE02040Z.txt
./north-pacific-gyre/NENE02043A.txt
./north-pacific-gyre/NENE02043B.txt

한단계 더 들어가 -s 매개변수를 제공하면 실행([E]xecute) 명령어 기술([D]escribe) 혹은 중단([A]bort)을 지정할 수 있다.

$ sgpt -s "현재 폴더 및 하위 폴더에 있는 모든 txt 파일을 보여주세요."
find . -name "*.txt"
[E]xecute, [D]escribe, [A]bort: D
Searches for all files with the extension ".txt" in the current directory and its subdirectories.
[E]xecute, [D]escribe, [A]bort: E
./exercise-data/numbers.txt
./exercise-data/writing/haiku.txt
./exercise-data/writing/LittleWomen.txt
./north-pacific-gyre/NENE01729A.txt
./north-pacific-gyre/NENE01729B.txt
./north-pacific-gyre/NENE01736A.txt
./north-pacific-gyre/NENE01751A.txt
./north-pacific-gyre/NENE01751B.txt
./north-pacific-gyre/NENE01812A.txt
./north-pacific-gyre/NENE01843A.txt
./north-pacific-gyre/NENE01843B.txt
./north-pacific-gyre/NENE01971Z.txt
./north-pacific-gyre/NENE01978A.txt
./north-pacific-gyre/NENE01978B.txt
./north-pacific-gyre/NENE02018B.txt
./north-pacific-gyre/NENE02040A.txt
./north-pacific-gyre/NENE02040B.txt
./north-pacific-gyre/NENE02040Z.txt
./north-pacific-gyre/NENE02043A.txt
./north-pacific-gyre/NENE02043B.txt

사용방법은 Git Bash를 설치한 후 터미널을 열구 sgpt --shell 혹은 sgpt -s 다음에 자연어를 넣게 되면 해당되는 쉘 명령어를 알려준다. 이를 실행하게 되면 유닉스 쉘을 이용하여 해당 자동화 작업에 생산성을 높일 수 있다. 얼마전까지만해도 한국어는 지원하지 않아 한글로 작성한 다음 번역기를 사용하여 영어로 입력해야 하고 결과를 얻게 되면 이를 실행하는 방식이 활용되었지만 지금은 유닉스 쉘 개념을 이해하여 한국어로 말을 풀어주게 되면 구현이 가능하다.

$ sgpt --shell 'List the contents of the current directory and display a special character at the end of each filename to indicate its file type.'
ls -F
[E]xecute, [D]escribe, [A]bort: E
goodiff.sh*      NENE01729B.txt*  NENE01751B.txt*  NENE01843B.txt*  NENE01978B.txt*  NENE02040B.txt*  NENE02043B.txt*
goostats.sh*     NENE01736A.txt*  NENE01812A.txt*  NENE01971Z.txt*  NENE02018B.txt*  NENE02040Z.txt*
NENE01729A.txt*  NENE01751A.txt*  NENE01843A.txt*  NENE01978A.txt*  NENE02040A.txt*  NENE02043A.txt*
$ sgpt -s '현재 디렉터리 콘텐츠를 나열하고 각 파일 이름 끝에 파일 유형을 나타내는 특수 문자를 표시합니다.'
ls -F
[E]xecute, [D]escribe, [A]bort: E
goodiff.sh*      NENE01729B.txt*  NENE01751B.txt*  NENE01843B.txt*  NENE01978B.txt*  NENE02040B.txt*  NENE02043B.txt*
goostats.sh*     NENE01736A.txt*  NENE01812A.txt*  NENE01971Z.txt*  NENE02018B.txt*  NENE02040Z.txt*
NENE01729A.txt*  NENE01751A.txt*  NENE01843A.txt*  NENE01978A.txt*  NENE02040A.txt*  NENE02043A.txt*

1.3 실습 데이터 준비

실습데이터는 소프트웨어 카펜트리 유닉스 쉘 학습 페이지에서 직접 다운로드 받을 수 있다. WSL 우분투 혹은 데비안 쉘을 실행시켜 cd 명령어로 다음 디렉토리로 이동한다.

$ cd /mnt/c/users/사용자명/Desktop

curl 명령어로 shell-lesson-data.zip를 다운로드 받고 저장 파일명도 -o 옵션을 주고 동일한 shell-lesson-data.zip 파일명으로 바탕화면(Desktop)에 저장한다.

$  curl https://swcarpentry.github.io/shell-novice/data/shell-lesson-data.zip -o shell-lesson-data.zip

unzip 명령어로 shell-lesson-data.zip 파일 압축을 바탕화면(Desktop) 디렉토리에 -d . 선택옵션을 주어 작업을 실행한다.

$ unzip shell-lesson-data.zip -d .

tree 명령어로 디렉토리 구조만 -d 옵션을 주어 압축을 푼 shell-lesson-data 폴더 아래 구조를 확인한다.

$ tree -d shell-lesson-data
shell-lesson-data
├── exercise-data
│   ├── alkanes
│   ├── animal-counts
│   ├── creatures
│   └── writing
└── north-pacific-gyre

6 directories
-bash: tree: command not found

tree 명령어를 실행할 수 없는 경우 다음 명령어로 패키지를 설치하여 문제를 해결한다.

$ sudo apt-get install tree