LLM 컨텍스트 예산을 어떻게 나눌 것인가

긴 작업을 에이전트에 맡길 때 컨텍스트 창을 시스템 프롬프트·도구 출력·대화 이력에 어떻게 배분하는지 정리.

에이전트에게 긴 작업을 맡기면 결국 컨텍스트 창이 문제가 됩니다. 모델이 똑똑한지보다 무엇을 창 안에 남겨 둘 것인가가 결과를 더 크게 가릅니다.

세 가지 소비자

컨텍스트를 쓰는 주체는 대략 셋입니다.

  1. 고정 비용 — 시스템 프롬프트, 도구 정의. 작업 내내 바뀌지 않는다.
  2. 도구 출력 — 파일 내용, 명령 결과. 가장 빠르게 불어난다.
  3. 대화 이력 — 모델의 추론과 사용자 메시지.

도구 출력이 늘 문제입니다. 파일 하나를 통째로 읽으면 몇천 토큰이 사라지는데, 실제로 필요한 건 그중 열 줄인 경우가 대부분입니다.

규칙 몇 가지

  • 파일은 필요한 범위만 읽는다. 전체를 읽어야 할 이유가 있을 때만 전체를 읽는다.
  • 검색 결과는 요약본만 남기고, 원본 덤프는 하위 에이전트에 격리한다.
  • 같은 사실을 두 번 확인하지 않는다. 앞에서 확인한 것은 확인된 것으로 둔다.

예산 계산 예시

도구 호출 기록을 토큰 단위로 집계해 보면 어디서 새는지 바로 보입니다.

from collections import Counter

def budget_by_tool(events):
    spent = Counter()
    for e in events:
        if e["type"] == "tool_result":
            spent[e["tool"]] += e["tokens"]
    total = sum(spent.values())
    for tool, n in spent.most_common():
        print(f"{tool:12s} {n:>8,}  {n / total:5.1%}")

대개 read_file 하나가 절반을 넘습니다. 그걸 줄이는 것이 첫 번째 일입니다.

정리

컨텍스트는 자원이고, 자원은 예산이 필요합니다. 예산은 측정에서 시작합니다.