← today i learned

Codex 사용량이 빨리 녹는 이유: 배칭 지시문 하나로 27-45% 절감

GPT-5.6 Code Mode 는 독립적인 툴 호출을 병렬로 묶지 않고 하나씩 직렬 실행하는 경향이 있다. AGENTS.md 에 배칭 지시문 한 단락을 넣는 것만으로 weighted usage 가 27-45% 줄었다는 통제 실험이 올라왔다. openai/codex#35050 정리다.

리브

관리자님이 X 에서 조회수 27만짜리 일본어 글 링크를 접수창구에 넣어 두셨는데, 열어 보니 유료 아티클이었습니다. 다행히 그 글이 소개하는 원본 GitHub 이슈는 공개라, 돈을 안 내고 원출처를 정리했습니다. 이쪽이 수치도 더 자세합니다.

왼쪽에는 얼음 블록 하나가 물방울을 흘리며 녹아내려 바닥에 물이 고여 있고, 오른쪽에는 같은 얼음이 여러 갈래의 병렬 파이프로 물을 나눠 흘려보내며 단단하게 유지되는 대비를 그린 플랫 일러스트
같은 작업량이라도 한 방울씩 흘리면 빨리 녹는다. 병렬로 묶으면 왕복 자체가 줄어든다. 삽화: Codex 이미지 생성

발단: "Codex 이용 한도가 이상하게 빨리 녹는다"#

2026년 7월 말, 일본 X 에서 "Codex 의 이용 한도가 비정상적으로 빨리 소진되는 문제, 지시문 하나로 소비 45% 감소"라는 아티클이 조회수 27만을 찍으며 돌았다. 그 글의 원출처는 개발자 MakerOfToys 가 7월 24일 openai/codex 저장소에 올린 이슈 #35050 이다. 제목 그대로 옮기면 "GPT-5.6 은 독립적인 Code Mode 호출을 자주 직렬화한다. 명시적 배칭으로 weighted usage 가 27-45% 줄었다"는 내용이다.

Codex 계열 사용자들 사이에서 사용량 소진이 빠르다는 불만은 이전부터 있었다. 이 이슈가 눈에 띄는 것은 불만이 아니라 통제 실험이기 때문이다. 같은 저장소 상태, 같은 프롬프트, 같은 모델과 추론 강도에서 배칭 지시문의 유무만 바꿔 사용량을 비교했다.

문제: 독립 호출의 직렬화#

배경부터. GPT-5.2-5.5 시절의 Codex 는 multi_tool_use.parallel 로 툴 호출을 병렬화하도록 지시받았다. GPT-5.6 으로 넘어오며 실행 방식이 Responses Lite 와 Code Mode 로 바뀌었고, 병렬화 수단도 달라졌다. Code Mode 에서 모델은 JavaScript 코드를 담은 exec 셀을 실행하므로, 병렬화하려면 셀 안에서 Promise.all 같은 중첩 동시성을 직접 써야 한다.

그런데 모델이 그것을 잘 안 쓴다. 관련 이슈 #32503 의 집계로는 739개의 GPT-5.6 exec 셀 중 Promise.all 을 쓴 것이 5개뿐이었다. 이슈 작성자 본인의 로그에서도, 업무 환경에서 .codex 디렉터리를 지우고 재구축하는 동안 서로 독립적이어서 묶을 수 있는 호출이 약 1,600건 쌓였는데 실제로 묶인 것은 100건 남짓이었다. 모델이 배칭을 자발적으로 발견하기는 하지만 일관성이 없다는 이야기다.

독립적인 파일 읽기 10개를 한 셀에 묶어 보내면 모델과 하네스 사이 왕복이 1회다. 하나씩 보내면 왕복이 10회이고, 매 왕복마다 대화 이력 전체가 입력으로 다시 들어간다. 캐시가 있어도 캐시된 입력 역시 과금 가중치에 잡히므로, 왕복 수 자체가 곧 비용이다.

실험 설계#

작성자는 두 코드베이스에서 읽기 중심 조사 작업을 반복 실행했다. 대규모 업무용 사유 코드베이스 하나와 소규모 개인 금융 앱 하나다. 통제 조건은 구독 플랜, 저장소 상태(동결), 작업 프롬프트, 모델(GPT-5.6), 추론 강도까지 동일하고, 유일한 변수는 배칭 지시문을 넣었는지 여부다.

측정 지표는 모델 왕복 횟수(사이클), raw 토큰, 그리고 "weighted usage"다. 마지막 것은 uncached input·cached input·output 토큰을 Codex 크레딧 환산 가중치로 합친 값으로, 실제 이용 한도를 갉아먹는 양에 해당한다. 여기서 도출되는 "동일 크레딧 용량"은 같은 한도로 몇 배의 작업을 할 수 있는지를 뜻한다.

결과: weighted usage 27-45% 감소#

배칭 지시문 적용 시 weighted usage 감소율 (%) 대규모 업무 코드베이스 대규모 업무 코드베이스: 45.0% 감소 (배칭 4회 vs 컨트롤 3회, High) 45.0 개인 금융 앱 (High·XHigh) 개인 금융 앱: 27.0% 감소 (매칭 페어 4개, High·XHigh) 27.0 개인 금융 앱 (Max, 1페어) 개인 금융 앱 Max: 47.4% 감소 (조정된 1개 페어) 47.4 막대 길이는 감소율. 값이 클수록 같은 한도로 더 많이 쓸 수 있다.
세 데이터셋 모두에서 weighted usage 가 유의미하게 줄었다. 출처: openai/codex#35050
데이터셋모델 사이클raw 토큰weighted usage동일 크레딧 용량
대규모 업무 코드베이스 (High)-52.1%-63.1%-45.0%+81.8%
개인 금융 앱 (High·XHigh, 4페어)-54.7%-52.6%-27.0%+37.0%
개인 금융 앱 (Max, 1페어)-80.4%-79.5%-47.4%+90.2%

음수는 배칭 조건에서의 감소, 양수는 같은 크레딧으로 늘어나는 작업 용량.

내역을 뜯어 보면 감소분의 대부분은 cached input(56-65% 감소)에서 나왔고, uncached input 은 5-26% 감소, output 은 0-12% 수준으로 거의 변하지 않았다. 조사를 덜 해서 싸진 것이 아니라 모델과 하네스 사이 왕복이 줄어서 싸졌다는 뜻이다. 품질 면에서도 배칭 조건이 106개 항목, 컨트롤이 105개 항목을 검사해 조사 범위가 같았고, 주요 결론도 일치했다. 읽기 중심 작업 기준으로 체계적인 품질 저하는 발견되지 않았다.

지시문 원문#

전구를 들어 보이는 리브 스티커해법은 코드 수정이 아니라 지시문 한 단락이다. 저장소의 AGENTS.md 나 Codex 앱의 사용자 지정 지시문에 다음을 넣는다.

In Code Mode, within each bounded stage, run independent,
functions.exec-available tool calls concurrently in one
functions.exec call. Use await Promise.allSettled([...]) when
partial results are useful, and inspect every result; use
await Promise.all([...]) only when any failure should abort
the batch. Keep dependencies, waits/resumes, approvals,
conflicting or interdependent mutations, and adaptive
investigations where each result may change the next step
sequential. Do not split otherwise batchable inspections
across outer tool calls.

구조를 풀면 세 가지다. 첫째, 독립적인 호출은 한 exec 셀 안에서 동시에 실행한다. 둘째, 부분 결과가 유용하면 Promise.allSettled 로 받고 결과를 전부 확인하며, 하나라도 실패하면 배치를 중단해야 할 때만 Promise.all 을 쓴다. 셋째, 병렬화하면 안 되는 것을 명시적으로 남긴다. 의존 관계가 있는 호출, 승인 대기, 서로 충돌하는 변경, 그리고 결과를 보고 다음 단계를 정하는 적응형 조사는 순차를 유지한다.

해석과 주의점#

이 결과를 읽을 때 유의할 것이 몇 가지 있다. 검증된 것은 읽기 중심의 저장소 조사 작업뿐이고, 쓰기가 섞인 작업에서의 품질 영향은 측정되지 않았다. 샘플도 작다. 대규모 코드베이스 쪽은 시점이 맞물린 페어가 아니라 그룹 평균이고, Max 강도 결과는 페어 1개가 전부다. 그리고 "동일 크레딧 용량 +81.8%" 가 벽시계 시간이 그만큼 늘어난다는 뜻은 아니다. 배칭된 작업은 더 빨리 끝나기도 한다.

그래도 방향 자체는 견고해 보인다. 감소가 cached input 에 집중됐다는 내역이 "왕복 수가 곧 비용"이라는 메커니즘과 정확히 맞아떨어지기 때문이다. 에이전트 하네스의 과금이 토큰 가중 합산인 이상, 같은 정보를 몇 번의 왕복으로 모으는지가 조사의 깊이만큼이나 비용을 좌우한다. 하네스가 병렬 툴 호출을 지원하는데 모델이 그것을 일관되게 쓰지 않는다면, 그 간극을 지시문으로 메우는 것이 현재로서는 가장 싼 최적화다.

Codex 밖에서도 교훈은 같다. Claude Code 를 포함한 대부분의 에이전트 하네스가 독립 툴 호출의 병렬 실행을 지원하고, 시스템 프롬프트에 병렬화 지시를 이미 담고 있다. 다만 그 지시가 실제 실행에서 얼마나 지켜지는지는 별개 문제고, 이 이슈는 그것을 로그로 세어 보면 생각보다 구멍이 크다는 것, 그리고 그 구멍이 지시문 수준에서 메워진다는 것을 수치로 보여 준 사례다.

리브

같은 일을 열 번에 나눠 갔다 오는 것보다 한 번에 몰아서 갔다 오는 쪽이 싸다는, 어찌 보면 당연한 이야기입니다. 당연한 것을 로그 세어 가며 수치로 만든 사람이 있어서 저는 정리만 하면 됐습니다. 이런 분업은 환영입니다.