rtk: 코딩 에이전트의 LLM 토큰 소비를 줄여주는 Rust 기반 CLI 프록시

rtk 소개

LLM 기반 코딩 에이전트(Coding Agent)를 일상적으로 사용하는 개발자라면 한 번쯤 토큰 소비량에 놀란 경험이 있을 것입니다. Claude Code, Cursor, Codex, Gemini CLI 같은 도구는 셸(Shell) 명령을 실행하고 그 출력 전부를 다시 LLM의 컨텍스트(Context)에 넣어 다음 행동을 결정합니다. git status, cargo test, ls -la처럼 자주 호출되는 명령들은 출력에 노이즈가 많고, 컴파일러 경고나 빌드 로그처럼 본질적으로 반복적인 메시지가 컨텍스트의 큰 비중을 차지합니다. 그 결과 30분짜리 코딩 세션에서도 10만 토큰 이상이 단순한 출력 인용에 사용되며, 비용과 응답 속도, 그리고 컨텍스트 윈도우(Context Window)가 모두 함께 압박을 받게 됩니다.

rtk는 이러한 상황을 해결하기 위해 셸 명령 출력을 LLM이 읽기 직전에 가로채어 압축하고 정리하는 CLI 프록시(Proxy)입니다. Rust로 작성된 단일 바이너리로 동작하며, 의존성 없이 한 번 설치하면 100여 개의 명령에 대해 사전 정의된 필터를 적용하여 토큰을 60~90% 줄여줍니다. 핵심 아이디어는 단순한 잘라내기(Truncation)가 아니라, 명령 종류별로 의미 있는 정보를 보존하면서 잡음만 걷어내는 것입니다. 예를 들어 git status는 카테고리별 파일 수만 남기고, git diff는 변경 라인 위주로 응축하며, cargo testpytest는 실패한 테스트만 추려서 보여주는 식의 방식이 적용됩니다.

rtk는 Claude Code, Cursor, Gemini CLI, Codex, Windsurf, Cline, OpenCode, OpenClaw 등 12개 주요 코딩 에이전트와 통합되며, 각 에이전트의 훅(Hook) 시스템을 활용해 사용자가 명령을 의식적으로 바꾸지 않아도 자동으로 rtk가 적용되도록 합니다. 명령 실행 자체는 기존 셸 도구가 그대로 처리하고, rtk는 그 출력을 한 번 더 가공해 에이전트가 본 결과만 압축된 형태가 되도록 합니다. 또한 명령이 실패했을 때는 원본 출력을 별도 파일에 보존(tee 모드)하여 LLM이 필요할 때 재실행 없이 전체 로그를 확인할 수 있는 안전망까지 갖추고 있습니다.

rtk가 줄여주는 토큰 사용량

저장소에서 공개한 30분 Claude Code 세션 시뮬레이션 결과를 정리하면, 자주 사용되는 12개 명령군 전체 평균에서 약 80%의 토큰 절약이 측정됩니다.

명령 빈도 표준 출력 rtk 절감률
ls / tree 10회 2,000 400 -80%
cat / read 20회 40,000 12,000 -70%
grep / rg 8회 16,000 3,200 -80%
git status 10회 3,000 600 -80%
git diff 5회 10,000 2,500 -75%
git add/commit/push 8회 1,600 120 -92%
cargo test / npm test 5회 25,000 2,500 -90%
pytest 4회 8,000 800 -90%
go test 3회 6,000 600 -90%
합계 ~118,000 ~23,900 -80%

수치는 중간 규모의 TypeScript/Rust 프로젝트를 기준으로 한 추정치이며, 프로젝트 크기와 명령 실패 빈도에 따라 실제 절감률은 달라질 수 있습니다.

rtk의 동작 원리

rtk는 명령 자체를 새로 구현하지 않고, 기존 셸 도구(git, cargo, pytest 등)의 출력을 한 단계 더 가공하는 얇은 레이어로 동작합니다. 흐름을 단순화하면 다음과 같습니다.

  rtk 미사용:                                   rtk 사용:

  Agent  --git status-->  shell  -->  git        Agent  --git status-->  rtk  -->  git
    ^                                   |          ^                      |          |
    |        ~2,000 tokens (raw)        |          |   ~200 tokens         | filter   |
    +-----------------------------------+          +-------- (filtered) ---+----------+

이 과정에서 rtk는 명령 카테고리별로 다음 네 가지 전략을 조합해 적용합니다.

스마트 필터링(Smart Filtering) : 주석, 공백, 보일러플레이트(Boilerplate) 같은 비핵심 토큰을 제거합니다. 예를 들어 cargo test의 컴파일 경고와 진행 표시 같은 부분을 걷어내고 실패 정보만 남깁니다.

그룹화(Grouping) : 비슷한 항목을 묶어서 표현합니다. 디렉터리 단위 파일 묶기, 동일한 종류의 컴파일러 오류 합치기 등이 여기에 해당합니다.

잘라내기(Truncation) : 의미 있는 컨텍스트는 보존하고 같은 메시지의 반복 부분만 줄입니다. 단순히 끝 부분을 자르는 것이 아니라, 어떤 부분이 핵심인지 명령별 휴리스틱(Heuristic)으로 판단합니다.

중복 제거(Deduplication) : 같은 줄의 반복 로그는 횟수만 표시하고 한 번만 출력합니다. 예: Compiling... (×42) 형식.

이 모든 과정의 추가 지연 시간은 명령당 10ms 미만으로 보고되어, 사용자 입장에서는 거의 체감되지 않습니다.

rtk의 주요 기능

100개 이상 명령 지원 : 파일 작업(ls, cat, find, grep, diff), Git 워크플로(git status, git log, git diff 등), GitHub CLI(gh pr/issue/run), 테스트 러너(jest, vitest, pytest, go test, cargo test, rspec, playwright), 빌드/린트(cargo build, eslint, ruff 등), 패키지 매니저(npm, pip, cargo)까지 광범위하게 다룹니다.

12개 코딩 에이전트와의 투명한 통합 : rtk init -g 한 줄로 Claude Code의 PreToolUse 훅, Gemini CLI의 BeforeTool 훅, Cursor의 hooks.json, Windsurf의 .windsurfrules 등 각 에이전트의 네이티브 확장점에 연결됩니다. 에이전트는 자신이 호출한 명령이 자동으로 rtk 버전으로 재작성된다는 사실을 인식할 필요가 없으며, 결과만 압축된 형태로 받습니다.

실패 시 원본 보존(tee 모드) : 명령이 실패하면 rtk는 원본 출력을 ~/.local/share/rtk/tee/ 디렉터리에 저장하고, 압축된 출력 끝에 파일 경로를 함께 표시합니다. LLM이 더 자세한 로그가 필요하다고 판단하면 해당 파일을 직접 읽어 추가 컨텍스트를 확보할 수 있습니다.

프로젝트별/명령별 설정 : ~/.config/rtk/config.toml(macOS는 ~/Library/Application Support/rtk/config.toml)에서 특정 명령을 훅에서 제외하거나, tee 모드의 동작 방식(failures, always, never)을 조정할 수 있습니다. 보수적인 환경에서 시작해 점진적으로 적용 범위를 넓히는 운영이 가능합니다.

옵트인 텔레메트리(Opt-in Telemetry) : rtk는 익명 집계 텔레메트리를 지원하지만, 기본값은 비활성화이며 사용자가 명시적으로 동의해야 활성화됩니다. 수집되는 데이터도 명령 카테고리 분포와 절감 토큰 수, 실패율 같은 집계 지표 위주이며, 소스 코드나 명령 인자, 파일 경로는 수집하지 않습니다.

rtk 설치와 사용법

가장 간단한 방법은 Homebrew를 통한 설치입니다.

brew install rtk

다른 방법으로는 인스톨 스크립트, Cargo, 사전 빌드 바이너리 다운로드가 제공됩니다.

# Linux/macOS 인스톨 스크립트
curl -fsSL https://raw.githubusercontent.com/rtk-ai/rtk/refs/heads/master/install.sh | sh

# Cargo로 직접 설치
cargo install --git https://github.com/rtk-ai/rtk

설치 후에는 사용 중인 코딩 에이전트별로 한 줄 초기화 명령을 실행하면 됩니다.

# Claude Code / Copilot (기본)
rtk init -g

# Gemini CLI
rtk init -g --gemini

# Codex (OpenAI)
rtk init -g --codex

# Cursor
rtk init -g --agent cursor

# Windsurf
rtk init --agent windsurf

# Cline / Roo Code
rtk init --agent cline

이후 에이전트를 재시작하면, 사용자가 의식하지 않아도 git status 같은 명령은 자동으로 rtk git status로 재작성되어 압축된 출력이 LLM에 전달됩니다. 직접 사용 시에도 동일하게 동작합니다.

rtk read src/main.rs                  # 스마트 파일 읽기
rtk read src/main.rs -l aggressive    # 함수 시그니처만 남김
rtk grep "TODO" .                     # 그룹화된 검색 결과
rtk git status                        # 압축된 git status
rtk pytest                            # 실패 테스트만 추출
rtk gain                              # 누적 절감 토큰 통계

rtk init -g --uninstall로 언제든 훅을 제거할 수 있고, cargo uninstall rtk 또는 brew uninstall rtk로 바이너리를 깨끗하게 지울 수 있습니다.

라이선스

rtk는 Apache 2.0 라이선스로 공개되어 있어 개인 및 상업적 목적으로 자유롭게 사용, 수정, 배포할 수 있습니다.

:house: rtk 공식 홈페이지

:books: rtk 사용 가이드

:github: rtk GitHub 저장소

더 읽어보기




이 글은 GPT 모델로 정리한 글을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다. :hugs:

:pytorch:파이토치 한국 사용자 모임:south_korea:이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일:love_letter:로 보내드립니다! (기본은 Weekly지만 Daily로 변경도 가능합니다.)

:wrapped_gift: 아래:down_right_arrow:쪽에 좋아요:+1:를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~ :star_struck: