헤드룸이 뭐예요?

한 줄로 말하면 AI 에이전트가 LLM에 보내는 것들 — 도구 출력, 로그, RAG 조각, 대화 기록 — 을 로컬에서 압축하고, 필요할 때 원문을 다시 꺼낼 수 있게 하는 계층이에요.
이름부터 좋아요. "헤드룸(headroom)"은 원래 오디오·엔지니어링에서 "여유 공간"을 뜻해요. 소리가 클리핑되지 않도록 남겨두는 헤드 위 공간처럼, LLM에도 컨텍스트를 밀어넣을 여유가 필요하다는 뜻이에요.
GitHub 저장소는 chopratejas/headroom입니다. Apache-2.0 라이선스이고 Python·Rust·TypeScript가 섞인 하이브리드 프로젝트예요. 인기가 어마무시한 레포인데요. 스타수 및 트랜딩 랭킹만 보아도 현재 전세계 개발자들이 엄청나게 관심있어하는 오픈소스이구나~ 를 느낄 수 있습니다.
https://github.com/headroomlabs-ai/headroom
왜 이런 게 필요한가
AI 에이전트를 조금이라도 오래 굴려본 사람은 다 알아요. 컨텍스트가 금방 차요. 특히 요즘 유행하는 "에이전트가 도구를 여러 번 호출하는" 흐름에서요.
간단한 코드 리팩터링 작업 하나만 시켜도 이런 게 컨텍스트에 다 들어가요.
ls결과 (수백 줄)grep검색 결과 (수천 줄)- 파일 전체 읽기 (수만 자)
- 이전 대화 기록
- RAG로 가져온 관련 문서 조각
- 시스템 프롬프트
한 번쯤 다들 경험이 있을 거예요. 에이전트한테 "이 리포 분석해줘" 하고 시작했는데 3~4번의 도구 호출 후에 컨텍스트가 40만 토큰을 넘어가면서 실행이 느려지고 비용이 폭증하는 상황이요.
컨텍스트 윈도우(context window): LLM이 한 번의 요청에서 볼 수 있는 최대 텍스트 양. GPT-5는 400K, Claude Opus 4는 200K 토큰이 기본. 여기를 넘기면 요청이 실패하거나 앞부분이 잘려요. 대략 200K 토큰 = A4 400페이지 분량이다.
여기서 두 가지 문제가 생겨요.
첫째, 비용이에요. 요청 하나당 입력 토큰이 30만 개라면 그것만으로도 몇 백원씩 나가요. 하루에 수십 번 요청하는 에이전트라면 하루 몇 만원이 순식간이에요. 구독제라면 단순 주간 리밋이 빠르게 찬다정도지만, API 과금 형태를 사용한다면 순식간에 몇백달러가 차기도 하는 큰 문제에요ㅠ
둘째, 품질 저하입니다. 최근 연구들이 반복해서 보여준 게, 컨텍스트가 길어질수록 모델이 중간 정보를 잊어버리는 경향이 있어요("lost in the middle" 현상이에요). 결국 넣어봤자 안 읽어요.
여기서 나온 발상이에요. "정말 필요한 것만 압축해서 보내고, 원문은 나중에 필요할 때만 다시 꺼내자."
어떻게 동작하는가
헤드룸의 핵심 아이디어는 네 가지예요. 하나씩 뜯어볼게요.
1) ContentRouter — "이건 어떻게 압축할까"를 결정해요
에이전트가 보내는 컨텍스트는 종류가 다양해요. JSON 응답도 있고 코드 스니펫도 있고 자연어 대화도 있고 이미지 URL도 있어요. 이걸 다 똑같이 압축하면 안 돼요.
JSON은 키 이름 반복이 많으니까 구조화된 압축이 유리해요. 코드는 공백·주석 처리를 다르게 해야 하고 자연어는 요약이 잘 먹혀요. ContentRouter는 입력을 보고 어떤 압축기를 쓸지 라우팅해요.
라우터(router) 패턴: 여러 종류의 입력을 받아서 각각에 맞는 처리기로 보내는 디자인 패턴. HTTP 라우터, 이벤트 라우터 같은 게 같은 원리예요. headroom에서는 "콘텐츠 유형 → 압축기"의 라우팅이에요.
2) CCR (Compressed Context with Retrieval) — 원문으로 되돌아갈 수 있어요
여기가 헤드룸의 핵심이에요. 압축하면서 원문에 접근할 수 있는 도구 인터페이스도 같이 심어놔요.
비유하면 이래요. 도서관에서 두꺼운 백과사전을 통째로 들고 다닐 수 없으니까 요약본만 가지고 다녀요. 그런데 요약본에는 "이 항목의 원본은 3층 서가 B-24에 있어요" 같은 위치 정보가 붙어 있어요. 에이전트가 "이 부분 더 자세히 봐야겠어" 하면 서가에서 원본을 꺼내와요.
그래서 이름이 Compressed Context with Retrieval이에요. 압축된 컨텍스트 + 필요할 때 원문 조회. 이 조회가 빠지면 압축은 그냥 정보 손실이에요.
3) CacheAligner — 프로바이더 캐시 히트를 노려요
OpenAI나 Anthropic 같은 프로바이더는 프롬프트의 앞부분(prefix)이 같으면 캐시를 태워서 요금을 할인해줘요. 최대 90% 할인까지 가요. 여기에 함정이 있어요.
앞부분에 매번 바뀌는 값(현재 시각, 랜덤 ID, 세션 정보)이 하나라도 있으면 캐시가 안 먹어요. 개발자가 무심코 넣은 datetime.now() 한 줄 때문에 모든 요청이 캐시 미스가 되는 흔한 실수예요.
CacheAligner는 프롬프트의 불안정한 prefix 부분을 감지해서 캐시 히트가 잘 되도록 위치를 조정하거나 안정화해요. 이 부분은 프로바이더별로 캐시 규칙이 조금씩 달라서 어댑터가 여럿 필요해요.
용어: 프롬프트 캐싱: 같은 프롬프트 앞부분을 프로바이더가 서버 측에 캐시해두고, 다음 요청에서 재사용하는 기능이에요. Anthropic은 cache_control 마커로, OpenAI는 자동으로 처리해요. 잘 쓰면 비용이 70~90% 줄어요.
4) Cross-agent memory — 여러 에이전트가 기억을 공유해요
한 에이전트가 학습한 컨텍스트를 다른 에이전트도 쓸 수 있게 공유 저장소를 만들어요. 예를 들어 Claude로 코드베이스를 파악한 결과를 저장해두면, 나중에 Codex로 이어서 작업할 때 그 요약본을 재사용할 수 있어요.
팀 단위에서 특히 유용해요. "지난주에 누가 이 리포 분석했었나" 하는 반복을 줄여줘요.
네 가지 사용 모드
헤드룸이 재밌는 게, 기존 에이전트 흐름에 끼워 넣는 방법을 네 가지나 제공한다는 점이에요.
| 모드 | 어떤 경우에 쓰나 | 침습성 |
|---|---|---|
| 라이브러리 (SDK) | 내가 만드는 에이전트 코드에 직접 통합 | 코드 수정 필요 |
| 프록시 | 기존 앱을 건드리지 않고 HTTP 레이어에서 가로채기 | 무침습 (URL만 변경) |
| 래퍼 | Claude Code, Codex 같은 CLI 에이전트를 감싸기 | 명령어만 변경 |
| MCP 서버 | Claude Desktop, MCP 지원 에이전트에 도구로 붙이기 | MCP 설정만 추가 |
이 네 가지가 왜 다 필요한지 알겠어요? 압축은 어디에서 끼어들 수 있는지에 따라 다른 방식이 유리하기 때문이에요.
새 프로젝트를 만들 때는 SDK로 처음부터 통합하는 게 깔끔해요. 이미 만들어진 서비스라면 코드를 안 건드리고 프록시로 앞에 세우는 게 편해요. Claude Code 같은 완제품 CLI는 래퍼로 감싸는 게 자연스럽고 Cursor나 Windsurf처럼 MCP를 지원하는 앱은 MCP 서버 붙이는 게 정석이에요.
실제로 어떻게 쓰나
README에 제시된 명령들을 정리하면 이래요.
이 명령들은 정적 분석 기준이라 실제 실행 결과는 각자 확인해봐야 합니다.
설치
설치 (Python 또는 Node)
# Python
pip install "headroom-ai[all]"
# Node
npm install headroom-ai
에이전트 래핑 (가장 쉬운 시작)
Claude Code나 Codex를 래핑
# Claude Code 감싸기
headroom wrap claude
# Codex CLI 감싸기
headroom wrap codex
Claude Code를 그냥 실행하는 대신 headroom wrap claude로 실행하면 그 세션의 모든 요청이 헤드룸을 거쳐요. 컨텍스트 압축·CCR·캐시 정렬이 자동으로 적용돼요. 코드 수정이 전혀 필요 없어요.
프록시 모드
프록시 서버 실행
headroom proxy --port 8787
내 앱의 OPENAI_BASE_URL이나 ANTHROPIC_BASE_URL을 http://localhost:8787로 바꾸면 끝이에요. 헤드룸이 요청을 받아서 압축·전달·복원까지 처리해요. 이미 만들어진 앱에 붙이기 좋아요.
효과 측정
압축 효과 확인
headroom perf
실제로 얼마나 절약됐는지 리포트를 뽑아줘요. 도입 초기에 ROI 근거로 쓰기 좋아요.
아키텍처: Python + Rust 하이브리드
코드 구조를 잠깐 뜯어보면 아래와 같습니다.
Python 패키지 (headroom/) — 사용자 대면 부분이에요.
Python 쪽 주요 모듈
headroom/
├── cli/main.py # CLI 진입점
├── compress.py # 라이브러리 방식 진입점
├── compression/universal.py # 콘텐츠 유형별 압축 정책
├── ccr/ # 압축 + retrieval 도구 주입
├── memory/ # cross-agent 공유 저장소
├── cache/ # provider 캐시 최적화
└── providers/ # OpenAI/Anthropic/Bedrock/Vertex 어댑터
Rust 워크스페이스 (crates/) — 성능이 중요한 부분이에요.
Rust 쪽 크레이트 구성
crates/
├── headroom-core # 핵심 압축·복원 로직
├── headroom-proxy # HTTP 프록시 서버
├── headroom-py # Python 바인딩
└── headroom-parity # Python-Rust 결과 대조 (동등성 검증)
왜 두 언어를 섞었을까요?
Python 쪽은 SDK로 쓸 때 접근성이 좋아요. AI 커뮤니티는 Python이 표준이니까요. 그런데 프록시 서버처럼 요청을 계속 받는 부분은 Python으로 짜면 처리량이 아쉬워요. GIL(Global Interpreter Lock) 때문에 병렬 처리가 제대로 안 되고 메모리도 많이 먹어요.
성능이 중요한 코어와 프록시는 그래서 Rust로 옮겼어요. headroom-parity라는 크레이트도 있는데, Python 구현과 Rust 구현이 같은 결과를 내는지 대조하는 테스트 하네스예요. 두 언어로 같은 로직을 유지하는 데 필수적인 안전장치죠.
Parity 테스트: 두 개 이상의 구현체가 같은 입력에 같은 출력을 내는지 검증하는 방식. C와 Rust로 다시 짠 Linux 유틸리티(coreutils)도 이런 걸 해요. 언어를 마이그레이션할 때 회귀를 잡는 데 유용해요.
도입 전에 확인할 것들
정적 분석 기준이라 실제로 도입할 때는 몇 가지 체크가 필요해요.
1) 압축 손실이 우리 워크로드에 치명적인가
압축은 원래 정보 손실이에요. CCR로 원문을 다시 꺼낼 수 있다지만, 에이전트가 "지금 원문이 필요하다"는 판단을 잘못하면 놓치는 정보가 생겨요. 코드 리뷰나 요약처럼 정보 손실이 크게 문제 안 되는 태스크에는 잘 맞아요. 반대로 법률 문서나 의료 정보처럼 원문 정확성이 중요한 곳은 조심해야 해요.
2) 프로바이더별 실패 모드가 넓어요
OpenAI, Anthropic, Bedrock, Vertex, LiteLLM 등 여러 프로바이더 어댑터가 있어요. 각각 인증 방식, 요청 스키마, 캐시 규칙이 달라요. 도입 전에 우리가 쓰는 프로바이더 어댑터가 안정적인지 확인해야 해요.
3) 캐시·생성 파일이 저장되는 위치
압축 대상에는 대화 기록도 들어갈 수 있어요. 이게 로컬 어디에 저장되는지, 회사 정책상 허용되는 위치인지 먼저 봐야 해요. 사내 코드나 개인정보가 들어간 요청을 압축·저장할 때는 특히요.
4) benchmarks 결과 재현
저장소에 benchmarks와 docs/content/docs/benchmarks.mdx가 있어요. 정확도·비용·지연시간·캐시 히트율 같은 지표가 정리돼 있는데, 우리 워크로드에 맞는지 자체 벤치마크로 재확인하는 게 좋아요.
마무리
컨텍스트 압축은 요즘 AI 인프라의 뜨거운 주제예요. 모델은 계속 커지는데, 그만큼 프롬프트도 무거워지고 있거든요. 헤드룸은 이 문제를 로컬 계층 하나 추가하는 방식으로 풀어보려는 시도예요.
두 가지가 눈에 띄는데요.
첫째, 도입 마찰을 줄인 설계.
네 가지 사용 모드를 다 제공한다는 건, 사용자가 어떤 상태에서든 자기 상황에 맞게 끼워 넣을 수 있다는 거예요. 새 프로젝트든, 기존 앱이든, 완제품 CLI든 상관없어요.
둘째, Python + Rust 하이브리드.
SDK 접근성과 프록시 성능을 둘 다 잡으려는 실용적인 선택이에요. Parity 테스트로 두 언어 구현의 일관성을 유지하려는 것도 좋은 엔지니어링이에요.
물론 조심할 부분도 있어요. 압축은 원래 정보 손실이라 CCR retrieval이 얼마나 잘 동작하느냐가 실사용성을 좌우해요. 프로바이더 어댑터가 여러 개라 실패 모드도 넓어요. 도입 전에 우리 워크로드에서 실제로 통하는지 자체 벤치마크로 확인하는 게 안전해요.
궁금하면 저장소 한 번 훑어보세요. README.md의 How it works와 When to use부터 읽고, headroom/compression, headroom/ccr, headroom/cache 순서로 보면 개념이 잘 잡혀요.
참고:
- headroom 저장소: https://github.com/chopratejas/headroom
- Anthropic 프롬프트 캐싱: https://docs.claude.com/en/docs/build-with-claude/prompt-caching
- Lost in the Middle 논문: https://arxiv.org/abs/2307.03172
'노트 > AI' 카테고리의 다른 글
| 하네스 엔지니어 완벽정리 (1) | 2026.04.18 |
|---|---|
| 당근의 GenAI 플랫폼 — AI 활용에 가장 앞선 당근은 어떻게 만들어졌나 (0) | 2026.02.25 |
| Claude Code을 폰으로 돌려보자 (원격 제어 초보 가이드) (1) | 2026.02.25 |
| 컬리 OMS에서 Claude AI로 4명이 16명처럼 일하는 법 (0) | 2026.02.22 |








