ChatGPT는 OpenAI에서 개발한 대화형 인 공지능(AI) 도구입니다. 이는 2022년 말에 공개되었으며, 전례 없는 놀라운 성능으로 전 세계에 GPT 열풍을 불러일으켰습니다. 그 결과, ChatGPT가 나온 지 반년이 지난 지금도 생성형 AI 뉴스는 끊임없이 쏟아지고 있습니다. AI API를 이용한 다양한 도구도 계속 등장하고 있고요.
GPT 열풍과 맞물려 요즘 주목받는 도구가 있습니다. 바로 ‘GPT 엔지니어’인데요. 이는 AI로 프로젝트 생성을 돕는 도구입니다. 프롬프트에 빌드하고 싶은 걸 입력하면 GPT 엔지니어가 코드베이스를 생성해 주죠. 생성형 AI 시대에 엔지니어는 프로젝트, 코드베이스 생성을 돕는 자동화 도구를 활용해 생산성과 효율성을 높여야 합니다. 이번 포스팅에서는 GPT 엔지니어를 알아보고, 이를 활용한 프로젝트 생성 방법을 살펴보겠습니다.
본 문서는 2023.6.24 기준으로 작성되었습니다.
GPT 엔지니어 개념과 구조
GPT 엔지니어는 최근 많은 관심을 받는 프로젝트입니다. 이 프로젝트는 초기 단계 프로젝트로 현재 v0.0.6을 배포했습니다. 그런데도 GitHub 스타 수는 2023년 6월 24일 기준 3만 명을 넘어섰습니다. GitHub 스타 순위를 살펴보면, 100위 권 프로젝트는 대부분 몇 년간 진행된 프로젝트입니다. 또, 100위 프로젝트의 스타 수는 약 6만 명입니다. GPT 엔지니어의 짧은 역사와 GitHub 상위 프로젝트 스타 수를 고려하면 GPT 엔지니어의 스타 수가 상당히 높은 것을 알 수 있습니다.
GPT 엔지니어란
GPT 엔지니어는 프로젝트 생성을 쉽게 도와주는 도구입니다. 사용자는 하나의 프롬프트에 ‘무엇을 빌드하고 싶은지’ 적으면 됩니다. 추가 정보가 필요하면 AI가 설명을 요청합니다.
주요 특징
- 적응성 및 확장성: GPT 엔지니어는 사용자의 코딩 스타일과 선호도에 맞게 설계되었습니다. 필요에 따라 기능을 쉽게 확장할 수 있습니다.
- 코드 생성: 프롬프트를 기반으로 전체 코드베이스를 생성할 수 있습니다. 이로써 시간과 노력을 절약할 수 있습니다.
- AI steps: AI는 “steps.py”에 정의된 일련의 단계를 따릅니다. 새 단계를 쉽게 추가하거나 기존 단계를 수정하여 상황에 맞게 GPT 엔지니어를 최적화할 수 있습니다.
- Resumable Computation: 모든 계산은 재개할 수 있습니다. 로그를 남겨 작업을 잃지 않도록 보장합니다.
- 상호작용 경험: GPT 엔지니어를 사용하면 높은 수준의 프롬프트를 달성할 수 있습니다. 이는 AI에 피드백을 제공하고, AI와 인간 사이의 간극을 줄일 수 있습니다.
구조
GPT 엔지니어는 사전에 정의된 단계에 따라 프롬프트를 실행합니다. 실행 결과, 마크업 형식으로 소스 코드를 얻으며 이를 추후 실제 파일로 변환합니다. 프로젝트 소스 코드는 workspace 폴더에 생성되고, 관련 로그는 memory 폴더에 생성됩니다.
이제 핵심이 되는 STEPS
부터 자세하게 알아봅시다.
STEPS
steps.py
에는 프롬프트를 실행할 단계 코드가 있습니다. 아래의 부분을 수정하여 AI를 실행하는 단계를 추가하거나 수정할 수 있습니다.
STEPS = {
Config.DEFAULT: [
clarify,
gen_clarified_code,
gen_entrypoint,
execute_entrypoint,
],
Config.BENCHMARK: [simple_gen, gen_entrypoint],
Config.SIMPLE: [simple_gen, gen_entrypoint, execute_entrypoint],
Config.TDD: [
gen_spec,
gen_unit_tests,
gen_code,
gen_entrypoint,
execute_entrypoint,
],
...
Config.USE_FEEDBACK: [use_feedback, gen_entrypoint, execute_entrypoint],
Config.EXECUTE_ONLY: [execute_entrypoint],
}
PrePrompt
STEPS의 내부에 정의된 함수들을 살펴보면, 사전 프롬프트를 이용하는 것을 확인할 수 있습니다. 사전 프롬프트는 “preprompts” 폴더에서 볼 수 있습니다. 아래의 예시를 확인하면 setup_sys_prompt 함수는 generate
, philosophy
프롬프트를 사용하는 것을 알 수 있습니다.
def setup_sys_prompt(dbs):
return (
dbs.preprompts["generate"] + "\nUseful to know:\n" + dbs.preprompts["philosophy"]
)
사전 프롬프트는 어떤 내용으로 이루어졌을까요?
위의 예시 함수에서 사용한 generate
프롬프트를 살펴보겠습니다.
You will get instructions for code to write.
You will write a very long answer. Make sure that every detail of the architecture is, in the end, implemented as code.
Make sure that every detail of the architecture is, in the end, implemented as code.
Think step by step and reason yourself to the right decisions to make sure we get it right.
You will first lay out the names of the core classes, functions, methods that will be necessary, as well as a quick comment on their purpose.
Then you will output the content of each file including ALL code.
Each file must strictly follow a markdown code block format, where the following tokens must be replaced such that
FILENAME is the lowercase file name including the file extension,
LANG is the markup code block language for the code's language, and CODE is the code:
FILENAME
``LANG
CODE
``
You will start with the "entrypoint" file, then go to the ones that are imported by that file, and so on.
Please note that the code should be fully functional. No placeholders.
Follow a language and framework appropriate best practice file naming convention.
Make sure that files contain all imports, types etc. Make sure that code in different files are compatible with each other.
Ensure to implement all code, if you are unsure, write a plausible implementation.
Include module dependency or package manager dependency definition file.
Before you finish, double check that all parts of the architecture is present in the files.
위의 내용을 요약하면 다음과 같습니다.
- 코드 작성 지시사항: 코드는 완벽히 작동하도록 작성되어야 합니다.
- 구조적 설계와 구현: 체계적인 설계 및 구현 절차를 요구하고 있습니다. 필요한 모든 클래스, 함수, 메서드의 이름과 목적을 먼저 정리하고, 각 파일의 모든 코드를 작성해야 합니다. 또한, 코드는 다른 파일과의 호환성을 유지하면서 세부 사항을 구현하여야 합니다.
- 마크다운 코드 블록 형식의 파일 출력: 코드는 마크다운 코드 블록 형식으로 출력되어야 합니다.
- 모듈 또는 패키지 매니저 의존성 정의 파일 포함: 프로젝트의 모듈 또는 패키지 의존성을 정의하는 파일도 포함하여야 합니다.
- 완전성 검증: 모든 작업이 완료되기 전에, ‘모든 아키텍처 요소가 파일에 존재하는지’ 확인해야 합니다.
- 파일명 작성 규칙: 파일 이름 작성 시 언어 및 프레임워크의 Best Practice를 따라야 합니다.
이러한 내용은 ‘프롬프트가 코드 구조화와 아키텍처 설계에 중점을 두고 있음’을 보여줍니다. AI에 단순히 기능을 구현하는 것 이상의 작업을 요구하며, 코드의 구조, 의존성 관리, 그리고 코드의 문서화에 심도 있는 이해가 필요합니다.
시작하기
설치 방법
설치 방법은 두 가지가 있습니다. 둘 중 하나를 선택하여 설치할 수 있습니다.
GPT 엔지니어를 설치하려면 다음과 같이 명령어를 입력하세요.
- Stable version
pip install gpt-engineer
- 개발용
git clone git@github.com:AntonOsika/gpt-engineer.git
cd gpt-engineer
pip install -e .
GPT 엔지니어를 사용하려면 OPENAI API 키가 필요합니다. 링크에서 API 키를 발급받으세요. API 키를 발급받은 후, 다음과 같이 API 키를 설정하세요.
- API 키 설정 방법
export OPENAI_API_KEY=s...5i
사용 방법은 다음과 같습니다.
- 새 프로젝트 폴더를 만듭니다.
- 'main_prompt' 파일에 원하는 프롬프트를 입력합니다.
- GPT 엔지니어 명령어를 실행합니다.
위 단계를 거치면 workspace
, memory
폴더가 생성되고 workspace 폴더에 프로젝트가 생성됩니다. 이제 GPT 엔지니어를 사용하여 프로젝트를 만들 수 있습니다.
테스트
GPT 모델은 gpt-3.5-turbo로 진행했습니다. 기본값은 gpt-4입니다.
1. 예시 프롬프트
GPT 엔지니어에서 제공하는 예시 프롬프트를 사용하여 프로젝트를 생성해 봅니다. MVC 패턴으로 지렁이 게임 코드를 요청합니다.
We are writing snake in python. MVC components split in separate files. Keyboard control.
이제 아래의 명령어를 실행하여, 프로젝트를 생성해 봅니다.
gpt-engineer [PATH] --model gpt-3.5-turbo
명령어를 실행하면, 프로젝트 설명이 먼저 나오고 이후 소스 코드를 생성합니다.
생성 결과 workspace는 다음과 같습니다.
.
├── README.md
├── __pycache__
│ ├── controller.cpython-311.pyc
│ ├── food.cpython-311.pyc
│ ├── game.cpython-311.pyc
│ ├── snake.cpython-311.pyc
│ └── view.cpython-311.pyc
├── all_output.txt
├── controller.py
├── food.py
├── game.py