컨텍스트 관리
긴 세션의 비용이 비선형적으로 증가하는 이유와 대화 기록의 크기를 제한하는 패턴.
API는 상태를 저장하지 않습니다. 매 턴마다 전체 대화를 다시 전송하므로 대화 기록이 길어질수록 입력 토큰이 늘어나고, 이후 호출마다 비용도 함께 증가합니다.
문제의 구조
N번의 턴으로 이루어진 대화에서 각 턴마다 약 T개의 토큰이 추가되면, 총 입력 토큰 비용은 NT가 아니라 대략 N²T/2에 비례합니다. 세션 길이가 두 배가 되면 입력 요금은 대략 네 배가 됩니다. 처음 십 분 동안은 저렴하게 느껴졌던 에이전트의 비용이 한 시간 후에는 부담스러워지는 이유입니다.
효과적인 네 가지 패턴
| 패턴 | 방법 | 절충점 |
|---|---|---|
| 슬라이딩 윈도 | 최근 K개의 턴만 유지하고 나머지는 삭제 | 초반 컨텍스트가 완전히 사라짐 |
| 누적 요약 | 주기적으로 이전 턴을 모델이 작성한 요약으로 대체 | 호출 한 번의 추가 비용이 들지만 핵심 내용은 유지 |
| 작업마다 새 세션 시작 | 주제가 바뀌면 새로 시작 | 추가 비용이 없으며 대체로 적절한 방법 |
| 외부 저장 | 상태를 파일이나 데이터베이스에 보관하고 현재 단계에 필요한 내용만 불러오기 | 작업량이 가장 많지만 결과도 가장 좋음 |
이전 턴 요약하기
def compact(history, keep=6):
class="s">""class="s">"Replace everything but the last `keep` turns with one summary turn."class="s">""
if len(history) <= keep:
return history
old, recent = history[:-keep], history[-keep:]
summary = summarise(old) class=class="s">"c"># one cheap Haiku call
return [{class="s">"role": class="s">"user", class="s">"content": fclass="s">"Summary of earlier discussion: {summary}"}] + recent
요약은 저렴한 모델로 실행하세요. 추론 작업이 아니라 압축 작업입니다.
대개 도구 결과가 원인입니다
- 도구가 500개 행을 반환하면 이후의 모든 요청에 500개 행이 포함됩니다. 행 수를 제한하거나, 요약과 함께 필요할 때 세부 정보를 가져올 수 있는 핸들을 반환하세요.
- 에이전트가 읽은 파일의 전체 내용은 컨텍스트에 남습니다. 파일 전체가 아니라 필요한 부분만 읽으세요.
- 스크린샷과 이미지도 다른 콘텐츠와 마찬가지로 다시 전송됩니다. 내용을 설명한 뒤에는 제거하세요.
- 빌드 로그와 스택 트레이스는 처음과 마지막 50줄만 유지하고 중간 부분은 버리세요.
에이전트형 도구에서는 서로 관련 없는 작업 사이에 새 세션을 시작하는 것이 가장 비용이 적게 드는 최적화 방법입니다. Claude Code에서는 다음을 사용합니다
/clear.