에이전트와 개발

TokenEconomizer 공개, 코딩 에이전트 비용 최대 30.9% 절감

Microsoft Research와 UC Berkeley 연구진이 코딩 에이전트의 실행 비용을 줄이는 오픈소스 플러그인 TokenEconomizer를 공개했다. SWE-bench 과제 277개 실험에서 평균 비용이 18.4~30.9% 낮았다.

루카스 ·

Microsoft Research와 UC Berkeley 연구진이 코딩 에이전트의 실행 비용을 줄이는 오픈소스 플러그인 TokenEconomizer를 공개했다. 연구진은 SWE-bench 과제 277개를 에이전트와 모델 조합 5가지로 돌려 측정했고, 평균 비용이 18.4~30.9% 낮아졌다고 밝혔다. 저장소 6곳과 조합 5가지를 곱한 30개 칸에서 모두 비용이 줄었고, 한 번에 푸는 비율인 Pass@1은 5개 조합 중 4개에서 올랐다.1

플러그인은 Claude Code, Codex, GitHub Copilot CLI, Pi에서 쓸 수 있고 opencode는 실험적으로 지원한다. 설치에는 Python 3.10 이상이 필요하며, 플러그인은 자체 API 키를 요구하지 않고 인증 정보도 다루지 않는다. 에이전트에 로그인한 방식이나 요금제를 그대로 쓰면 된다. 라이선스는 Apache 2.0이다.1,2

연구진이 찾은 비용 낭비 세 가지

코딩 에이전트는 매 턴마다 시스템 프롬프트, 불러온 도구 정의, 지금까지의 대화를 다시 처리한다. 개발자가 같은 저장소에서 같은 에이전트를 반복해 쓰기 때문에 이 비용 상당 부분이 되풀이된다고 프로젝트 문서는 설명한다. TokenEconomizer는 에이전트의 모델과 가중치, 코드를 건드리지 않고, 한 저장소에서 쌓인 세션 기록으로 다음 세션의 낭비를 줄인다.1

연구진은 Claude Code와 Opus 4.8로 저장소 6곳의 SWE-bench 과제 60개를 분석했다. 앞서 과제 5개가 끝난 뒤에는 도구 호출의 30%가 이전 행동의 반복이었다. 매 턴 불러오는 도구 정의 23개 중 16개는 한 번도 호출되지 않았고, 3개가 호출의 98%를 차지했다. 실패한 실행 10건은 전체 과제의 17%인데 총 지출의 32%를 썼다.

연구진은 고정 전략 세 가지도 비교했다. 셸 출력을 압축하는 RTK, 심볼 단위 코드 도구를 MCP 서버로 제공하는 Serena, 저장소 심볼 지도를 프롬프트에 넣는 Aider의 RepoMap이다. 셋 다 모든 저장소에서 싸지는 않았고, Django에서는 비용을 줄였지만 SymPy에서는 늘렸다.2

세 가지 장치의 작동 방식

마이크로 스킬(micro-skills)은 저장소가 돌아가는 방식을 기억한다. 먼저 실행해야 하는 빌드 단계, pytest가 없을 때 쓰는 python -m pytest 같은 명령 표기, 명령에 필요한 환경 변수, 생성 파일 위치처럼 세션마다 다시 알아내던 사실이 대상이다. 여러 세션에서 반복된 실패와, 3세션마다 최근 세션을 검토하는 모델의 제안에서 사실을 얻는다. 세션 3개가 확인한 사실만 이후 세션 시작 때 알려 주고, 나중 세션이 반박하면 뺀다.1

논문 설명을 옮긴 marktechpost에 따르면 각 사실에는 정규식 감지기가 붙어 모델 호출 없이 이후 기록을 검사한다. 사실이 프롬프트에 들어가려면 수정 파일이 겹치지 않는 과제 3건에서 확인돼야 하고 필요율이 0.4 이상이어야 한다. 반박 1건은 확인 5건으로 계산해 틀린 사실이 빨리 빠진다.2

도구 가지치기(tool pruning)는 쓰지 않는 도구의 정의를 요청에 싣지 않게 한다. 기본값은 프롬프트 10개 이상에 걸쳐, 적어도 2개 세션에서 쓰이지 않았거나 길이에 상관없이 5개 세션 동안 쓰이지 않은 도구를 다음 세션에서 제외하는 것이다. 제외는 에이전트 자체 설정으로 하며 명령 한 번으로 되돌린다. marktechpost가 전한 논문 설명은 기준이 다르다. 셸, 읽기, 쓰기, 편집 도구는 항상 두고 나머지는 연속 3개 과제에서 안 쓰이거나 모델 판정이 무관하다고 하면 가리며, 5개 과제마다 전체 목록을 되살려 다시 검사한다. Django와 Claude Code 조합에서는 과제 2의 첫 요청이 토큰 43,351개에서 16,295개로 줄었다.1,2

도구 목록이 바뀐 뒤 이어 가는 대화는 전체 이력을 프롬프트 캐시에 다시 써야 한다. 그래서 플러그인은 해당 저장소의 세션이 60분 동안 쉬었을 때, 늦어도 목록이 만들어진 지 하루 뒤에 제외 목록을 쓴다.

실패 반복 개입(loop guard)은 같은 실패가 되풀이되는 턴을 잡는다. 저장소에서 잘 끝난 턴이 일정 수 쌓여야 평소 길이를 학습해 작동한다. 같은 실패나 오류 폭증이 보이면 판정 모델이 막힌 상태인지 보고, 확신도가 0.7 이상이면 다른 방법을 시도하라는 짧은 메모를 컨텍스트에 넣는다. 기본값은 턴당 1회다. 평소 길이의 2.5배를 넘기며 같은 수정과 실패를 되풀이하는 턴은 판정 없이 바로 이 메모를 받는다.1

메모를 받고도 막혀 있으면 플러그인은 멈추는 방법을 안내하는 한 줄만 띄운다. 프로젝트 문서는 플러그인이 턴을 직접 멈추지 않으며 중단은 사용자가 정한다고 밝혔다. marktechpost는 막힌 에이전트에게 개입을 한 번 한 뒤 같은 고리가 재발하면 중단한다고 적었다. 두 설명이 다르므로, 설치해 쓰는 쪽은 프로젝트 문서의 동작을 기준으로 보는 편이 안전하다.1,2

측정 결과

실험은 저장소 6곳의 SWE-bench 과제 277개를 에이전트와 모델 조합 5가지로 돌렸다. 과제마다 별도 세션으로 실행했고 저장소별로 순서대로 진행했으며, 처음에는 학습한 내용이 없는 상태에서 시작했다. 비용에는 TokenEconomizer가 호출한 모델 비용이 모두 들어 있다. 저장소와 조합별로 보면 비용은 5~40% 줄었다. 설정마다 시드를 3개씩 썼다.1,2

SWE-bench 조합별 평균 비용 변화와 Pass@1 (기준은 플러그인 없는 기본 설정)2
조합비용 변화Pass@1 기본Pass@1 적용
Claude Code + Sonnet 5-23.6%74.776.0
Claude Code + Opus 4.8-30.9%74.073.0
Codex + GPT-5.6 Terra-24.7%73.874.7
Codex + GPT-5.6 Sol-26.1%80.181.7
Copilot CLI + Sonnet 5-18.4%75.077.6

Opus 4.8 조합은 비용이 가장 많이 줄었지만 Pass@1이 1.0포인트 내려갔다. RTK와 함께 쓰면 이 조합의 절감폭은 33.2%였다. 비교 대상 중 RTK는 평균 비용 변화가 -8.9%에서 +4.5% 사이였고 30개 칸 중 12곳에서 비용이 올랐다. RepoMap은 -6.1%에서 +6.5%였고 15곳에서 올랐다. TokenEconomizer가 비용이 오른 칸은 0곳이었다. Serena는 본 실험에 넣지 않았다.

추론 강도를 낮추는 방법은 비용을 줄였지만 Pass@1이 1.8~10.3포인트 떨어졌다. 절감 효과는 시간이 갈수록 쌓였다. 대부분의 저장소는 초반에 비용이 더 들었으나 여섯 번째 과제에서는 모든 저장소가 더 쌌다. Claude Code에서 장치를 하나씩만 켰을 때 절감폭은 도구 가지치기 13.2~17.7%, 마이크로 스킬 11.8~14.3%, 실패 반복 개입 5.4~7.1%였다.2

SWE-bench 밖의 벤치마크에서도 비용이 줄었다. Web-Bench에서 16.0~21.2%, 과제마다 새 저장소가 나오는 보안 감사 벤치마크 CredData에서 16.5~19.6%, 같은 유형의 ReposVul에서 6.4~9.3% 낮았다. ReposVul의 절감폭이 가장 작았던 이유로 marktechpost는 실행이 짧아 덜어낼 몫이 적었다는 점을 들었다.1,2

설치와 설정

Claude Code에서는 저장소를 내려받아 마켓플레이스로 추가한 뒤 claude plugin install tokeneconomizer@tokeneconomizer를 실행한다. 이어 claude를 시작해 폴더를 신뢰하고 /tokeneconomizer:status로 설치를 확인한다. 기기마다 한 번, 그리고 Claude Code를 업데이트한 뒤에도 /tokeneconomizer:toolprune refresh-catalog를 실행해야 한다. 이 명령은 모델 호출 없이 세션이 불러온 도구를 모두 기록해 가지치기 대상에 넣는다.

기본값에서는 도구 가지치기와 실패 반복 개입이 켜져 있고 마이크로 스킬은 꺼져 있다. 마이크로 스킬은 제안 모델이 호출을 늘리고 절감폭이 저장소와 작업에 따라 달라서다. 기본 설정에서 플러그인이 모델을 부르는 경우는 턴이 반복 조짐을 보일 때의 판정과 그때 쓰는 메모 작성뿐이다. 이 호출은 사용자의 에이전트를 거쳐 같은 요금제로 나가며 비용은 보고서에 포함된다. 학습한 내용은 기기의 ~/.tokeneconomizer에만 남고, 플러그인이 어느 부분에서 실패해도 세션은 설치하지 않은 것처럼 이어진다.1,2

  • 각 장치는 microskills, toolprune, loopguard 스위치로 켜고 끈다. 예를 들어 config set microskills=on으로 마이크로 스킬을 켜고, --global을 붙이면 모든 저장소에 적용한다.
  • toolprune=propose는 제외 목록만 제안하고 toolprune apply를 실행해야 반영한다. microskills=envfacts는 반복 실패에서만 사실을 배워 모델 호출이 없다.
  • 세션 하나만 바꾸려면 TE_DISABLE=1 claude처럼 환경 변수를 준다. toolprune restore는 플러그인이 넣은 항목만 지우고 돌려준 도구는 다시 제외하지 않는다.
  • 제외 목록은 Claude Code는 .claude/settings.local.json, Codex는 .codex/config.toml, Copilot CLI는 .github/copilot/settings.local.json에 쓰며 Pi는 도구가 네 개뿐이라 제외할 것이 없다. 사용자가 적은 거부 규칙은 건드리지 않는다.

지원 범위에는 제약이 있다. Codex 0.141.0 미만은 플러그인 훅을 실행하지 않는다. Pi 0.99.x는 pi install 대신 저장소를 복제해 확장 파일 경로를 지정해야 한다. opencode는 1.19.5와 2.2.0에서만 시험했고 2.x 터미널 UI에서는 시험하지 않았다. Pi에서 Ctrl+C는 헤드리스 실행을 끝내지만 이미 시작된 명령은 끝까지 돈다. Claude Code는 플러그인이 낸 줄을 상세 기록(Ctrl+O)에만 보여 주므로, 막힘 안내는 Claude에게 답변에서 되풀이해 달라고 요청하는 방식이라 모델이 표현을 바꾸거나 빼먹을 수 있다.

실험 코드는 저장소의 experiments 폴더에 있다. Claude Code, Codex, Copilot CLI를 SWE-bench와 Web-Bench에서 돌리는 하네스와 실행 스크립트, 평가 과제 목록이 들어 있고, 설치되는 플러그인과는 tokeneconomizer 폴더만 공유한다. 패키지는 표준 라이브러리만 쓴다.1

댓글

기사에 대한 의견이나 틀린 내용 제보를 남겨 주세요.

댓글을 불러오고 있습니다.