본 포스팅은 생성형 AI의 발전에 따라,
개발자들의 개발 효율을 높일 수 있는 Tool 중의 하나인 CURSOR를 다뤄보고자 합니다.
CURSOR란?
Anysphere라는 AI SW 연구실에서 개발한 AI기반 Code Editor입니다. 사용자의 의도를 이해하고 맥락에 맞는 도움을 제안해 주는 Tool이라고 볼 수 있습니다. 자연어로 코드 생성이 가능하며, 실시간 오류 감지 및 수정을 제안하는 등의 특징을 가지고 있습니다.
이러한 CURSOR를 사용하여 간단한 프로그램을 개발해보도록 하겠습니다.
CURSOR Installation
우선 CURSOR Offical Website에 들어가서 Editor를 Download 합니다.
Cursor - The AI Code Editor
Built to make you extraordinarily productive, Cursor is the best way to code with AI.
www.cursor.com
설치를 한 후, 실행시키면 다음과 같은 초기 설정 과정이 진행됩니다.
Cursor는 VSCode를 기반(= Forking)으로 개발된 IDE이기 때문에 기존에 VSCode에서 사용하던 Extension들을 가져올 수 있습니다.
참고로 Cursor는 다음과 같은 요금 정책을 따르고 있습니다.
요금제 | 가격 | 주요 기능 |
Hobby | Free | * 2주간의 Pro Plan Trial 제공 * 2000 Competions * 50 Slow Premium Requests |
Pro | $ 20 / month | * Completion 무제한 * 500 Fast Premium Requests / month * 무제한 Slow Premium Requests * 10 o1-mini / day |
Business | $ 40 / user / month | 모든 기능 제공 |
개인이 사용하는 경우는 Hobby 또는 Pro 정도가 적당하지 않을까 싶습니다.
위와 같은 간단한 과정을 거치면 설치가 끝난 것입니다. 설치가 끝났으니 바로 사용하면 됩니다. 이제 구체적인 프로그램을 생성하면서 CURSOR의 기능들을 활용해 보도록 하겠습니다.
Develop program using CURSOR AI
개발에 앞서 다음과 같은 상황이라고 가정해 봅시다.
"나는 미로 탈출 게임을 하고 있었다. 그런데 어떻게 탈출하면 좋을지 도저히 모르겠다. 미로 탈출 프로그램을 통해 문제를 해결해보고 싶으나 적당한 프로그램도 못 찾겠고... 그래서 프로그램을 만들어서 사용해보고자 한다. 그런데 개발을 해본 적이 없는 일반 인이다. 강화 학습이라는 것을 통해 문제를 해결할 수 있다고 어디선가 들어보았다."
위 가정에 따라 '강화 학습 방식을 활용하여, 어떤 미로를 탈출하는 프로그램'을 만들면 됩니다.
우선, 'maze_game'이라는 Folder를 생성하고 그 안에 main.py라는 File을 생성합니다.
미로 탈출 게임을 어떻게 만드는지 모르므로 AI에게 물어봐서 작성해야 합니다. 다음과 같은 과정을 통해 초기 코드를 작성해 봅시다.
- "Ctrl + L"을 누르면 AI와 대화할 수 있는 창이 열립니다.
- 자연어로 질문을 입력하면 AI가 답변을 제공합니다.
위 이미지와 같이 오른쪽 창에 Chat Window가 Open 되고, 여기에 요청사항을 입력하면 AI가 답변해 줍니다. 답변 내용 중 Code가 있다면 Code 우측 상단의 "Apply"를 누르면 해당 내용이 왼쪽에 적용됩니다.
AI가 작성해 준 코드에 대해 잠깐 다뤄봅시다.
AI가 코드를 작성해 주면서 해당 코드에 대한 내용을 다음과 같이 설명해 주었습니다.
Class & Function | MazeEnvironment Class | QLearningAgent Class | train Function | play_game Function |
설명 | > 미로 환경 생성 & 관리 > 벽, 빈공간, 목표 지점 설정 > 에이전트의 행동에 따른 상태 변화와 보상 처리 |
> Q-learning 알고리즘 구현 > 상태-행동 가치를 저장하는 Q-table 관리 > 입실론-탐욕 정책을 통한 행동 선택 |
> 지정된 에피소드 동안 에이전트 학습 > 환경과 상호작용하며 Q-table 업데이트 |
> 학습된 에이전트로 게임 실행 |
코드를 실행하면 빈 공간은 흰색 박스로, 벽은 파란색 박스로, 목표는 '목표 아이콘'으로, 현재 에이전트는 '로봇 아이콘'으로 표시해 준다고 하였습니다.
AI가 작성해 준 코드니까 실행해 봅니다.
우선, 코드는 1000개의 Episode를 통한 Train이 진행되고 이후, Train 된 Agent에서 Inference 한 결과를 Draw 해줍니다. 결과는 다음과 같습니다.
고정된 Maze Map에서 Goal을 찾는 방법에 대해 학습하였고 학습이 제대로 수행되어, 올바른 Route를 찾아 Goal에 도달하는 것을 확인할 수 있었습니다.
필자는 생각했습니다. "오! 미로 찾기 프로그램을 개발하였어, 개발에 대해 하나도 모르는 내가!" 그러나 문제는 미로 맵이 원하는 맵이 아니라는 것입니다. 내가 원하는 맵의 모양으로 맵을 바꿔야 합니다.
개발에 대해 모르기 때문에 다시 AI에게 물어봅니다. "미로 맵이 생성되는 부분은 코드의 어느 부분일까?"
이와 같은 질문에 대해 AI는 다음과 같이 답변하였습니다.
def __init__(self, size=5):
self.size = size
# 미로 생성 (0: 빈 공간, 1: 벽, 2: 목표)
self.maze = np.zeros((size, size)) # 먼저 모든 공간을 빈 공간(0)으로 초기화
self.maze[1:4, 2] = 1 # 벽 설치 - (1,2), (2,2), (3,2) 위치에 벽(1) 설정
self.maze[size-1, size-1] = 2 # 목표 지점 - 우측 하단 끝에 목표(2) 설정
위 코드에서 np.zeros((size, size))로 초기화하고 있으며, self.maze [1:4, 2] = 1을 통해 중앙에 세로로 벽을 설치하고 self.maze [size-1, size-1] = 2로 우측 하단 끝에 목표 지점을 설정한다고 설명해 주었습니다.
필자는 이 답변을 듣고 이제는 내가 원하는 맵의 형태로 코드를 수정하여 직접 바꿔보자고 생각했습니다. 이에 따라 다음과 같이 코드를 수정했습니다.
def __init__(self, size=5):
self.size = size
self.maze = np.zeros((size, size))
self.maze[1:3, 5] = 1
self.maze[1:5, 2] = 1
self.maze[size-1, 0] = 2
그리고 이를 실행하였습니다. 그랬더니 다음과 같은 Error를 맞이하게 되었습니다.
필자는 "엥? 이게 뭐지 왜 이런 게 뜨는 거야?" 싶었습니다. Terminal에 작성된 IndexError 부분을 드래그해 보니 옆에 Add to Chat ("Ctrl + Shitf + L")이라는 것이 떴습니다. 눌러보았습니다.
AI는 self.maze [1:3, 5] 부분이 문제가 되고 있으며, size가 5인 경우 인덱스는 0 ~ 4까지만 가능한데 5에 접근하려 했기 때문에 문제가 발생했다고 설명하고 있습니다. 이와 더불어 코드 수정도 제안하고 있습니다.
이에 따라 필자는 원하는 Code 부분을 드래그한 후 "Ctrl + K"를 통해 해당 코드에 대해 질문 및 요청을 해보았습니다.
그랬더니, AI가 요청에 따른 수정 제안(= 초록 Block)을 제안했습니다. 이 코드를 적용할지, 적용하지 않을지, 우측의 Accept (= Ctrl + Shift + Y) 또는 Reject (= Ctrl + N)을 통해 여부를 선택할 수 있습니다.
위와 같은 과정을 통해 적용한 후, 벽을 좀 더 적용해보고 싶어 self.maze~를 작성하고자 했습니다. 그랬더니 하단 이미지의 빨간 박스와 같이 추천 Code가 떴습니다.
이처럼 Editor에서는 Cursor Copilot이 자동으로 코드를 추천해 주며, tab key를 누르면 해당 코드를 바로 적용할 수 있습니다.
필자는 갑자기, 작성된 Code의 구조에 대해 의문이 들었습니다. AI가 작성해 준 코드는 main.py라는 파일에 모두 작성되어 있는데 그래도 되는지 싶습니다. 그래서 AI에게 class별로 별도의 python file에 작성해 달라고 요청해 보았습니다.
그랬더니, AI는 main.py, maze_environment.py, q_learning_agent.py로 코드를 분할해 주었고 maze_environment.py에는 MazeEnvironment Class, q_learning_agent.py에는 QLearningAgent Class, main.py에는 train 및 play_game Function이 작성해 놓았습니다.
여담이지만, 요청을 했더니 이전에 수정했던 Code는 적용되지 않았습니다. CHAT에 쌓인 데이터를 기준으로 코드가 리팩토링되었기 때문입니다. 따라서 현재 코드를 기준으로 리팩토링을 해달라는 요청을 해야 합니다. (질문과 요청을 정교하게 해야 합니다.)
필자는 개발자가 아니기 때문에 이와 같은 구조를 한 번에 확인해보고 싶습니다. 그래서 다음과 같이 Simbol (= @Codebase)을 이용하여 코드의 관계와 역할을 Mermaid로 시각화해 달라고 요청하였습니다.
(참고로, Mermaid AI는 markdown을 통해 텍스트를 다이어그램으로 시각화할 수 있는 툴입니다.)
위와 같이, 프로젝트에 포함된 3개의 파일(= main.py, maze_environment.py, q_learning_agent.py)을 기준으로 요청을 처리하고 있습니다. 그리고 머메이드뿐만 아니라, 각각의 Class와 Function에 대한 기능과 관계를 구두로도 설명해주고 있습니다.
- main.py : 프로그램의 진입점으로, `MazeEnvironment`와 `QLearningAgent` 클래스를 임포트 하고, 학습 및 게임 플레이를 위한 함수를 호출합니다.
- MazeEnvironment : 미로 환경을 정의하는 클래스입니다. 미로를 생성하고, 에이전트의 위치를 관리하며, 행동에 따른 상태 변화를 처리합니다.
- QLearningAgent : Q-learning 알고리즘을 구현하는 클래스입니다. Q-table을 관리하고, 에이전트의 행동을 결정하며, 학습을 수행합니다.
- train() : 에이전트를 학습시키는 함수로, `MazeEnvironment`와 `QLearningAgent`와 상호작용합니다.
- play_game() : 학습된 에이전트를 사용하여 게임을 실행하는 함수로, `MazeEnvironment`와 `QLearningAgent`를 사용합니다.
앞서 @Codebase라는 것을 잠깐 사용해 보았습니다. 이처럼 Cursor에는 Chat이나 Mini Prompt에서 Chat을 사용할 때, Simbol (= @)로 검색기능을 바꿀 수 있습니다. 제공되는 Simbol은 다음과 같습니다.
- @Codebase : 전체 코드 베이스를 스캔하여 답변을 합니다. 프로젝트 및 파일 전체를 대상으로 질문 및 요청을 하고 싶을 때 사용하면 좋습니다.
- @Docs : 라이브러리를 참조하거나 원하는 문서의 Website Link를 입력하여 참조할 수 있습니다. 이러한 문서를 토대로 질문 및 요청을 할 수 있습니다.
- @Web : 인터넷에서 최신 정보를 검색하여 요약한 내용을 바탕으로 답변을 해줍니다.
이와 같이, 비개발자의 입장에서 Cursor AI를 활용해 보았습니다. 그러나 보통은 개발자들이 Cursor를 많이 사용하겠죠? 개발자의 관점에서 좀 더 본인에게 맞는 Tool로 만들기 위해서는 Setting이나 Model 관점에서 고민해 볼 필요가 있습니다.
Cursor Settings (= Ctrl + Shift + J)를 통해 AI 규칙을 설정할 수 있습니다. 해당 설정을 통해 좀 더 본인에게 맞는, 상황에 최적화된 환경을 세팅할 수 있습니다.
또한 사용하고자 하는 Model을 바꿀 수도 있습니다. "Ctrl + /"을 통해 Model을 변경할 수 있으며, 아래 이미지와 같이 빨간 박스 부분을 클릭하여 변경할 수도 있습니다.
제공되는 Model은 claude-3.5-sonnet, gpt-4o, gpt-4o-mini, o1-mini, o1-preview, o1, o3-mini, gpt-4o-mini가 있습니다. 각각의 모델별로 특징이 있기에, 사용해 보면서 상황에 적합한 모델을 사용하면 더 좋은 생산성을 낼 수 있을 것입니다.
지금까지 CURSOR AI를 활용하여 프로그램을 개발해 나가는 과정을 간단히 다루었습니다. 사용해 보면서 느낀점은 Website와 왔다갔다하면서 개발하지 않아도 된다는 점에서 편리했고, 무엇보다 Codebase Indexing 기능을 지원하기 때문에 큰 Size의 코드나 프로젝트 단위의 질문 및 요청을 처리해줄 수 있다는 점이 CURSOR의 가장 큰 기술이지 않을까 싶습니다.
여기까지 CURSOR AI를 활용한 개발에 대해 다뤄보았습니다.
좀 더 깊은 기능과 내용은 사용해보면서 알아가야 할 것 같습니다.
포스트는 여기서 마치도록 하겠습니다.
'Technology > Products, Tools' 카테고리의 다른 글
[GitHub] GitHub를 통한 코드 관리 - 기초 (feat. Git Bash) (0) | 2023.04.13 |
---|---|
[Version Control] SVN, Git, GitHub, GitLab (0) | 2023.04.06 |
[LIDAR] Slamtec RPLIDAR A1/A2 (2) | 2023.02.17 |
[Touch Sensor] Zytronic Zyfilm 사용기 (0) | 2023.02.01 |
[Motion Capture Sensor] 퍼셉션 뉴런과 로코코 스마트 수트 사용기 (0) | 2023.01.26 |
댓글