에이전트가 스스로 하는 컨텍스트 압축
TMTTL;DR: 우리는 모델이 적절한 시점에 스스로 컨텍스트 창을 압축할 수 있도록 하는 도구를 Deep Agents SDK (Python)와 CLI에 추가했습니다.
우리가 이 기능을 도입한 이유
컨텍스트 압축은 에이전트의 작업 메모리 안에 있는 정보를 줄이는 액션입니다. 오래된 메시지들은, 현재 수행 중인 작업에 관련된 내용은 유지하면서 에이전트의 진행 상황을 요약하거나 응축한 표현으로 대체됩니다. 이 액션은 유한한 컨텍스트 창을 수용하고 컨텍스트 부패을 줄이기 위해 종종 필요합니다.
에이전트 하니스는 보통 고정된 토큰 임계값에서 컨텍스트를 압축하는 방식으로 이 동작을 제어합니다 (deepagents는 model profiles를 사용해 각 모델 컨텍스트 한도의 85% 지점에서 압축을 수행합니다). 하지만 이 설계는 최적이라고 보기 어렵습니다. 압축하기 좋은 타이밍과 좋지 않은 타이밍이 존재하기 때문입니다:
- 복잡한 리팩터링의 한가운데에서 압축하는 것은 바람직하지 않습니다.
- 새로운 작업을 시작하거나, 이전 컨텍스트의 관련성이 떨어질 것이라고 판단될 때 압축하는 것이 더 좋습니다.
많은 인터랙티브 코딩 도구들은 /compact 같은 명령어를 제공하여, 사용자가 적절한 시점에 직접 컨텍스트 압축 단계를 트리거할 수 있게 합니다. 우리는 최신 deepagents 릴리스에서 이 아이디어를 한 단계 더 확장하여, 에이전트가 스스로 컨텍스트 압축을 트리거할 수 있는 도구를 툴로 노출했습니다. 이를 통해, 여러분 애플리케이션의 사용자가 유한한 컨텍스트 창을 신경 쓰거나 특정 명령을 입력하지 않아도, 더 적절한 시점에 기회주의적으로(compact opportunistically) 압축을 수행할 수 있게 됩니다.
이 도구는 현재 Deep Agents CLI 에서는 기본 활성화되어 있으며, deepagents SDK에서는 옵트인 방식으로 제공됩니다.
가능한 한 하니스는 앞에 나서서 이것저것 통제하기보다는 한쪽으로 물러나, 기본 추론 모델이 좋아진 만큼 그대로 이득을 보게 해 주는 편이 낫다고 우리는 전반적으로 보고 있습니다. 이건 bitter lesson의 한 사례이기도 합니다. 즉, 사람이 일일이 하니스를 튜닝하지 않아도 되도록, 에이전트가 자기 컨텍스트를 스스로 더 많이 제어하게 만들 수 없을까 하는 질문입니다.
언제 컨텍스트를 압축하는 게 좋을까?
컨텍스트 압축 액션이 필요해질 수 있는 상황은 다양합니다.
명확한 작업 경계에서:
- 사용자가 새로운 작업으로 넘어가겠다는 신호를 보내고, 그 이전 컨텍스트가 해당 작업과는 크게 무관할 것 같은 경우
- 에이전트가 하나의 결과물을 완성했고, 사용자가 작업 완료를 확인해 준 경우
대량의 컨텍스트에서 결과를 추출한 이후:
- 리서치 작업처럼, 에이전트가 많은 양의 컨텍스트를 소비해 사실, 결론, 요약 또는 그 외의 결과를 얻어낸 경우
새로운 대량 컨텍스트를 소비하기 직전:
- 에이전트가 긴 초안(draft)을 생성하려는 상황
- 에이전트가 새로운 대량의 컨텍스트를 읽으려는 상황
복잡한 다단계 프로세스에 진입하기 전에:
- 에이전트가 긴 리팩터링, 마이그레이션, 다중 파일 수정, 인시던트 대응과 같은 장기 프로세스를 시작하려는 경우
- 에이전트가 이미 계획(plan)을 만들어 두었고, 이제 그 단계를 실행하려는 경우
이전에 쌓인 컨텍스트를 대체하는 결정이 내려졌을 때:
- 새 요구사항이 등장해 이전 컨텍스트를 무효화한 경우
- 많은 곁가지나 막다른 시도들이 존재하며, 이를 요약으로 줄일 수 있는 경우
가능한 모든 상황을 일일이 나열하는 것은 현실적이지 않지만, 우리의 관찰에 따르면 사람과 LLM 모두 이런 상황을 인지하고 적절한 타이밍에 압축을 수행할 수 있습니다. 이렇게 하면 컨텍스트 창이 한계에 가까워졌을 때 뒤늦게 압축 단계를 수행할 필요가 줄어듭니다. 이 도구에 대해 모델에 제공하는 가이던스는 [system prompt] (https://github.com/langchain-ai/deepagents/blob/537ed6cf153f9f6e50546c9d8674c32587540942/libs/deepagents/deepagents/middleware/summarization.py#L91)에서 확인할 수 있습니다.
이 도구를 호출하면 어떻게 동작하나요?
이 도구는 기존 Deep Agents의 summarization middleware와 동일한 방식으로 파라미터가 설정됩니다. 전체 사용 가능한 컨텍스트의 10%에 해당하는 최근 메시지는 그대로 유지하고, 그 이전 내용을 요약합니다. 최근 메시지에는 컨텍스트 압축 도구 호출과 그에 대한 응답도 포함되어, 모두 최근 컨텍스트에 유지됩니다.
예제 Trace를 참고해 주세요.
사용 방법
이 도구는 별도의 미들웨어로 구현되어 있으므로, create_deep_agent에서 미들웨어 리스트에 추가하는 것만으로 활성화할 수 있습니다:
from deepagents import create_deep_agent
from deepagents.backends import StateBackend
from deepagents.middleware.summarization import (
create_summarization_tool_middleware,
)
backend = StateBackend # if using default backend
model = "openai:gpt-5.4"
agent = create_deep_agent(
model=model,
middleware=[
create_summarization_tool_middleware(model, backend),
],
)자세한 내용은 SDK docs를 참고하세요.
CLI에서는, 단순히 새로운 작업으로 넘어가거나 컨텍스트를 줄일 준비가 되었을 때 /compact를 호출하면 됩니다.
이 기능을 써 본 결과
이 기능은 꽤 보수적으로 동작하도록 설정했습니다. Deep Agents는 가상 파일 시스템에 모든 대화 기록을 보존해 요약 이후에도 컨텍스트를 복구할 수 있지만, 잘못된 시점에 컨텍스트를 압축해 버리면 워크플로우가 깨지기 쉽습니다. 그래서 우리는 다음과 같은 방식으로 이 기능을 검증했습니다:
- 커스텀 평가 수트: (우리의) LangSmith 트레이스를 활용해, 압축이 필요하거나 필요하지 않은 스레드에 후속 프롬프트를 주입하는 방식으로 테스트를 구성했습니다.
- terminal-bench-2: 여기에서는 자율적인 컨텍스트 압축이 발생한 사례를 관찰하지 못했습니다.
- Deep Agents CLI에서 우리가 직접 수행한 코딩 작업들.
실제 사용에서는 에이전트가 압축을 트리거하는 데 상당히 보수적이지만, 막상 압축을 수행할 때는 워크플로우가 확실히 개선되는 시점을 골라서 실행하는 경향이 있습니다.
Autonomous context compression 자체는 작은 기능이지만, 에이전트 설계가 나아가야 할 더 큰 방향을 보여 줍니다. 즉, 모델이 자기 작업 메모리를 더 많이 스스로 통제하게 만들고, 하니스에 박아 넣은 딱딱한 수작업 규칙들은 줄여 나가는 쪽입니다. 장시간 돌아가거나 인터랙티브한 에이전트를 만들고 있다면 Deep Agents SDK나 CLI에서 이 기능을 한 번 써 보고, 어떤 점이 좋았는지, 또 앞으로 어떤 패턴까지 다뤄주기를 바라는지 피드백을 들려주면 좋겠습니다.