장시간 에이전트 실행을 위한 토큰 효율성 개선
에이전트가 발전하면서 더 까다로운 작업까지 처리할 수 있게 되자 토큰 소비 양상도 달라졌습니다. 이제 에이전트는 더 오래 작동하고 한 단계에서 다음 단계로 더 많은 컨텍스트를 이어가기 때문에, 그 컨텍스트를 어떻게 구성하고 관리하느냐가 갈수록 중요해지고 있습니다.
Where agent inference spend goes
Production traffic · width = share of total spend · shade = billing type
- Output
- Uncached input
- Cached input
참고: 시스템 및 도구 정의에는 compaction 요약이 포함됩니다. 사용자 텍스트에는 수동으로 첨부한 스킬이 포함됩니다. 스킬 및 플러그인에는 스킬 설명, MCP 도구 설명, 그리고 정적 컨텍스트에 들어가는 규칙이 포함됩니다.
지난 몇 달간 저희는 이러한 변화에 대응해 Cursor 에이전트 하네스의 효율을 개선해 왔습니다. 하네스를 통해 각 요청을 어떻게 구성하고, 컨텍스트를 어떻게 재사용하며, 언제 작업을 여러 에이전트로 나눌지를 직접 제어할 수 있습니다. 이 계층들 전반에 적용한 개선으로 에이전트 품질은 그대로 유지하면서 사용자의 토큰 요금을 7% 절감했습니다.
시스템 프롬프트 다듬기
모든 에이전트 턴에는 모델이 작업을 시작하기 전에 Cursor가 제공하는 컨텍스트가 포함됩니다. 여기에는 시스템 프롬프트와 에이전트가 사용할 수 있는 도구의 정의가 들어 있습니다. 이 컨텍스트는 대화 내내 계속 포함되기 때문에, 우리가 온전히 통제할 수 있는 지출 요인 중에서도 가장 큰 축이 되어 있었습니다.
모델의 성능이 지금보다 낮았을 때는 도구 사용, 작업 관리, 코드 변경 워크플로우에 대한 지침을 일일이 풀어서 적어야 했습니다. 지나치게 긴 해시 덤프, 바이너리 출력, 이모지처럼 엉뚱한 동작도 함께 막아야 했습니다.
모델이 좋아지면서 그런 지시의 상당수는 더 이상 필요하지 않게 되었습니다. "이렇게 하지 마시오", "반드시 ~해야 함", "중요" 같은 문구를 길게 나열하는 대신, 도구가 어떻게 동작하는지만 정의해 두면 모델이 대체로 그대로 따랐습니다. 이는 여러 모델 계열에서 공통으로 나타났고, 덕분에 시스템 프롬프트의 약 66%를 덜어낼 수 있었습니다.
새로운 모델이 새로운 안내를 필요로 할 때마다 지침을 추가하거나 덜어내는 작업은 계속되고 있으며, 그 내용은 다시 이후 모델의 학습에 반영됩니다. 실제 트래픽에 맞춰 하네스를 효과적으로 최적화하려면 대규모 사용자 기반을 대상으로 한 A/B 테스트를 활용하는 것이 매우 중요합니다. eval도 빠르고 유용한 대리 지표가 될 수 있지만, 대개 "어려운" 과제를 대표하기 때문에 실제 사용자 요청의 분포를 제대로 반영하지는 못합니다.
필요할 때만 도구 로드하기
시스템 프롬프트는 Cursor가 매 턴마다 제공하는 컨텍스트의 일부일 뿐입니다. 또 다른 하나는 도구 정의로, 백그라운드 셸 모니터링, 클라우드 하위 에이전트, 더 안정적인 웹 콘텐츠 접근 등 Cursor 에이전트에 더 강력한 기능을 추가하면서 한 해 동안 크게 늘어났습니다. 이 도구들은 대부분 중요하지만, 개별 도구가 실제로 필요한 경우는 전체 대화의 20% 미만입니다.
여기서 도구를 언제든 쓸 수 있는 상태로 두면서도 모든 요청에 전체 정의를 포함하지 않는 방식으로 효율을 높일 기회가 생겼습니다. 올해 초 MCP 도구를 동적 컨텍스트로 옮겨 필요할 때만 로드하도록 하면서 비슷한 문제를 해결한 적이 있습니다. 그 결과 MCP 도구를 호출한 세션 전반에서 총 토큰이 46.9% 줄었습니다.
이제 같은 기법을 자체 내장 도구에도 적용했습니다.
어떤 도구를 정적 컨텍스트에 남길지 정하기 위해, 각 도구가 얼마나 자주 사용되는지와 모델이 처음부터 해당 도구를 알아야 하는지를 기준으로 여러 구성을 A/B 테스트했습니다. 절감 효과가 품질을 떨어뜨리지 않도록 토큰 사용량, 비용, 지연 시간, 도구 호출 오류, 전반적인 에이전트 사용량을 추적했습니다.
Most commonly invoked tools
Share of agent conversations invoking each tool at least once
최종적으로 읽기, 검색, 편집, 셸 사용처럼 사용 빈도가 높은 도구는 정적 컨텍스트에 남겼습니다. 일부 모델이 호출을 환각하는 경향을 보이던 ask_question과, 플랜 모드의 create_plan처럼 특정 제품 흐름에 필수적인 도구도 그대로 두었습니다. 나머지 도구는 이제 에이전트가 필요로 할 때 로드됩니다.
Offloading built-in tools cut static-context description tokens by 60%
- Kept in static context
- Offloaded to dynamic context
캐시 재사용 개선
각 요청에 담기는 정적 컨텍스트의 양을 줄인 뒤에는, 반복되는 컨텍스트를 여러 턴에 걸쳐 얼마나 효과적으로 캐싱할 수 있는지를 개선했습니다.
에이전트는 매 턴마다 도구, 시스템 지침, 설정, 그리고 지금까지의 대화 내용을 담은 긴 요청을 다시 전송합니다. 앞부분의 상당 부분은 턴이 바뀌어도 그대로인 반면, 끝부분의 대화는 계속 길어집니다.
프롬프트 캐싱을 사용하면 모델 제공업체가 변경되지 않은 이 앞부분(앞부분)을 재사용할 수 있습니다. 다만 캐싱을 어디까지 설정할 수 있는지는 제공업체마다 다릅니다. GPT-5.6 이전에는 캐시 경계가 가장 최근 요청을 기준으로 자동 결정되었습니다. 도구와 시스템 지침은 거의 바뀌지 않는데도, 그 자체로 재사용 가능하다고 명확히 표시되지는 않았던 것입니다.
GPT-5.6부터 OpenAI API는 기본으로 제공되는 암묵적 캐싱과 더불어, 클라이언트가 명시적인 캐시 중단점을 지정할 수 있도록 지원합니다. 이제 Cursor는 요청에서 잘 바뀌지 않는 계층 뒤, 그리고 계속 길어지는 대화 앞에 중단점을 배치해, 이후 턴에서 변경되지 않은 앞부분을 더 많이 재사용할 수 있게 합니다.


중단점은 앞부분 자체가 안정적으로 유지될 때만 효과가 있기 때문에, 각 요청의 앞부분에 무엇을 배치할지도 함께 정비했습니다. 도구와 시스템 지침은 거의 바뀌지 않는 내용만 담도록 하고, 변동이 잦은 설정은 캐시 경계 너머의 "팬텀 사용자 메시지"로 옮겼습니다. 이 메시지에는 스킬, 하위 에이전트, 환경 정보처럼 사용자별·요청별 컨텍스트가 담깁니다.
이러한 변경으로 콜드 캐시 미스 비율이 20% 감소했습니다.
파일 읽기 압축하기
토큰 사용량의 또 다른 큰 원인은 에이전트가 작업하면서 쌓아가는 컨텍스트이며, 그중 상당 부분은 파일을 읽는 과정에서 발생합니다.
Cursor의 에이전트는 Read 도구로 파일을 읽는데, 이 도구는 지금까지 모든 줄에 번호를 매겨 왔습니다. 모델은 스스로 줄 수를 세는 데 능숙하지 않고, 사용자에게 특정 구간을 인용해 보여줘야 하기 때문입니다.
줄 번호 하나에 드는 토큰은 서너 개에서 다섯 개 정도에 불과하지만, 에이전트가 한 세션 동안 수만 줄을 읽는다면 모든 줄에 번호를 매기는 것만으로도 상당한 양의 컨텍스트가 추가됩니다.
저희는 열 줄마다 한 번씩만 줄 번호를 넣도록 바꿔 이 부담을 줄였습니다. 이 정도 빈도만으로도 모델이 코드를 제대로 인용하기에 충분했고, 이 변경으로 품질 저하 없이 캐시 읽기 토큰을 1.6% 줄일 수 있었습니다.
하위 에이전트를 전략적으로 활용하기
에이전트 실행이 길어질수록 하위 에이전트에게 작업을 위임할 기회도 많아집니다. 각 하위 에이전트는 보통 상위 에이전트의 전체 대화를 이어받지 않고 새로운 컨텍스트 윈도우에서 시작하기 때문에, 토큰 소비를 줄일 수 있습니다. 하위 에이전트가 결과를 보고하고 나면, 상위 에이전트는 하위 에이전트의 작업 컨텍스트 전체를 떠안지 않고도 작업을 이어갈 수 있습니다.
다만 에이전트와 하위 에이전트 사이의 이러한 컨텍스트 격리에는 조율 비용이 따릅니다. 컨텍스트를 공유하지 않는 에이전트들은 같은 작업을 중복하거나 더 이상 필요 없는 작업을 계속 수행할 수 있기 때문입니다.
불필요한 조율을 늘리지 않으면서 효율성 이점만 살리기 위해 두 가지를 변경했습니다. 먼저, 코드베이스 탐색에 하위 에이전트를 사용하도록 강하게 권장하던 지침을 없앴습니다. 학습 데이터에 하위 에이전트가 더 많이 등장하고 연구자들이 이를 후속 학습 단계에 반영하면서, 모델이 이 패턴을 자체적으로 익혔기 때문입니다. 추가 프롬프팅을 없애자 하위 에이전트 사용이 한층 균형 잡히게 되었습니다.
하위 에이전트가 모델을 선택하는 방식도 더 촘촘하게 다듬었습니다. Cursor는 사용 가능한 모든 모델로 하위 에이전트를 생성할 수 있어, 모델 간의 사각지대를 보완하거나 비용이 높은 계획용 모델과 더 저렴한 구현용 모델을 짝지어 쓸 수 있습니다. 이제는 사용자나 하네스가 지시한 경우에만 에이전트가 다른 모델을 선택하도록 도구 인자를 업데이트했습니다.
하네스 효율 개선을 이어갑니다
앞으로도 긴 실행에서 컨텍스트가 어떻게 누적되는지 측정하고, 에이전트 품질을 해치지 않으면서 하네스가 반복 처리를 줄일 수 있는 지점을 찾아 검증해 나가겠습니다. 시간이 지날수록 에이전트가 처리하는 작업량에 비해 토큰 사용량은 훨씬 더 완만하게 늘어날 것으로 기대합니다. 또한 이렇게 얻은 결과를 Grok 봇에도 적용해, 사용자가 가장 낮은 요금으로 가장 많은 작업을 해낼 수 있도록 Grok 봇 고유의 하네스를 최적화하고 있습니다.