모-던한 코딩 에이전트들은 무엇을 하고 있나
시작
절대 내가 만들어 쓰던 자작툴 망해서 분노해서 쓰는 글 아님.
Claude code 짝퉁 자작툴?
https://www.mihaileric.com/The-Emperor-Has-No-Clothes/
에 대해서 논하자면, mini-swe-agent가 보여주듯 의외로 간단한 툴만 써도 최신 모델을 적용함으로써 벤치마크 점수가 크게 뒤떨어지지 않게 만들 수는 있다. 나 또한 minimal-coding-agent에 claude pro subscription을 연동해서 그럭저럭 사용하고 있었다. 당장 오늘 망하기 전까지는…
왜 자작 툴을? - 작업 환경에 있어서 내가 원하는 요구사항과 툴의 간극
- 나는 툴과 대화를 주고받기를 원하지 않는다.
- 나는 처음에 모든 요구사항을 한번에 때려넣고, 설령 30분~1시간이 걸리더라도 최종 결과물만 보기를 원한다.
- 에이전트가 어떤 툴을 쓰던지 pre-approval하고 싶진 않지만, post-review는 할 필요가 있다.
이렇게 하다가 툴이 sudo를 남발해서 급 강제종료한 적도 있긴 하지만 어쨌든 기본적으로 tool을 믿고 맡기되, 진행상황을 로그 형태로 볼 수 있기만 하면 된다 이말이다.
자작 툴의 장점 - custom observability
즉, 내 툴은 다음과 같이 실행하고, 다음과 같이 로그를 남긴다
$ cat prompt.md | ak
T: I'm going to run ...
bash: blahblah...
T: Now reading ...
read: path...
T: Let's ...
edit: ...
T: Done!
$
자작 툴의 단점 1 - heavy cost
동일한 작업을 자작 툴(with Sonnet) vs claude-code(with Opus)로 처리하는 경우를 비교해 보자. claude-code는 짜잘한 subtask는 haiku 모델에게 위임하는 방식으로 비용 + 컨텍스트 낭비를 절약하지만, 자작 툴의 경우 Sonnet 모델로 처음부터 끝까지 실행하기 때문에 토큰을 훨씬 많이 쓰는 것을 볼 수 있다. 심한 경우 프롬프트 하나 실행하는데 5시간 quota를 바로 넘어버리는 것도 가능하다.
즉, 모-던한 툴과 내가 대충 만든 야매툴을 비교했을 때 가장 큰 차이는 LLM을 얼마나 낭비하냐는 점에 있지, 실행 결과물에서 느낄 수 있을 정도의 차이는 별로 없더라는 것이다. (주관적 판단입니다 - 실패한 프롬프트 모아서 벤치마크를 만들 정도의 정성은 없다)
자작 툴의 단점 2 - less tools
당연히, claude-code에 있는 모든 툴을 다시 구현하진 않았기 때문에, 상대적으로 LLM이 사용할 수 있는 툴도 좀 부족하긴 하다. 내가 opencode마냥 본격적으로 LLM 툴을 만들 생각이었다면 동일한 프롬프트를 더 잘 실행할 수 있는 system prompt와 툴 조합 같은것들을 ABTest해가면서 만들었을 것 같긴 한데 당연히 그 수준으로 뭔가를 해본 것은 아니다.
결말: 아시발망함
연말에 시간이 남고 claude code가 사용량 2배로 풀어줘서 마구 돌려서 weekly limit을 두번정도 때렸는데, 왠지 그것때문에 외부 툴 못쓰게 막아버린 것인지 찜찜한 느낌이다. 하여튼 이번 구독 끝날때까지는 얌전히 claude-code나 쓰다가 구독 끝나면 무료모델이나 써야할 듯…
Opencode의 github-issue (해당 이슈에 관한 HN 포스트)
덤 1: 뭐 굳이 자작툴 쓸 필요 있냐: claude-code + --output-format stream-json
claude -p --dangerously-skip-permissions --output-format stream-json --verbose
JSON이라 읽기 힘들지만 어쨌든 내가 원하는 중간결과를 내뱉기는 한다. 이 JSON을 적당히 가공해서 읽기좋게 만들면 자작 툴과 비슷한 결과가 나오긴 할 텐데, 아직 귀찮아서 “적당히 가공”에 해당하는 툴을 아직 안만들었다.
덤 2: 내가 즐겨쓰는 프롬프트 양식
1. Tool이 처음 시작해야 하는 Entrypoint를 지정한다.
2. 작업의 Context를 설명한다
3. 내가 원하는 결과물에 대해 설명한다
예제:
Look at `git diff`
Currently I'm adding a new feature blahblah, where it should write value
as 치명타, but it's writing as claudxk.
Update the code to fix the error.