문제 설명
AI 봇과의 장시간 대화 중 다음과 같은 오류가 발생할 수 있습니다:
[openclaw:gateway] Error: Context length exceeded. Model maximum: 128000 tokens, requested: 135842 tokens.
또는 자동 압축 실패를 나타내는 로그:
[openclaw:gateway] Context compaction triggered (usage: 92%)
[openclaw:gateway] Error during context compaction: Model returned empty summary
[openclaw:gateway] Falling back to truncation strategy
사용자에게 표시되는 또 다른 시나리오:
Bot 응답: 죄송합니다. 대화 기록이 너무 길어 계속 처리할 수 없습니다. /reset을 보내 대화 기록을 초기화해 주세요.
OpenClaw은 각 사용자에 대해 메시지 기록과 시스템 프롬프트를 포함하는 대화 컨텍스트를 유지합니다. 대화가 길어지면 토큰 수가 AI 모델의 최대 컨텍스트 윈도우 제한을 초과할 수 있습니다.
작동 원리
OpenClaw의 컨텍스트 관리 흐름은 다음과 같습니다:
- 각 사용자 메시지와 AI 응답이 컨텍스트에 추가됩니다
- API 요청을 보내기 전에 OpenClaw이 현재 컨텍스트의 토큰 수를 계산합니다
- 토큰 사용량이 설정된 임계값(기본 85%)을 초과하면 자동 압축이 트리거됩니다
- 압축 프로세스는 이전 대화 기록을 AI 모델로 보내 요약을 생성합니다
- 압축된 요약이 원래의 오래된 메시지를 대체하여 컨텍스트 공간을 확보합니다
진단 단계
현재 사용자의 컨텍스트 상태를 확인합니다:
openclaw context list
이 명령은 모든 활성 세션과 토큰 사용량을 표시합니다:
Channel User ID Tokens Model Max Usage
telegram 12345678 98500 128000 77%
whatsapp 8612345 125000 128000 98% ⚠️
압축 로그를 확인합니다:
DEBUG=openclaw:context* openclaw start
설정에서 컨텍스트 관리 설정을 확인합니다:
cat ~/.openclaw/openclaw.json | grep -A 20 context
해결 방법
방법 1: 자동 압축 설정 조정
~/.openclaw/openclaw.json에서 압축 전략을 최적화합니다:
{
"context": {
"compaction": {
"enabled": true,
"triggerThreshold": 0.75,
"targetUsage": 0.5,
"strategy": "summarize",
"summaryModel": "gpt-4o-mini",
"summaryPrompt": "Please compress the following conversation history into a concise summary, preserving key information and user preferences:",
"maxRetries": 3
}
}
}
주요 매개변수 설명:
triggerThreshold: 압축을 트리거하는 사용량 임계값입니다. 이 값을 낮추면 압축이 더 일찍 트리거되어 경계 상황의 오버플로우를 방지합니다targetUsage: 압축 후 목표 사용량입니다. 0.5로 설정하면 압축 후 컨텍스트가 용량의 50% 이하를 차지합니다summaryModel: 요약 생성에 사용되는 모델입니다.gpt-4o-mini같은 저비용 모델을 권장합니다maxRetries: 압축 실패 시 재시도 횟수입니다
방법 2: 수동 컨텍스트 정리
자동 압축이 실패하면 특정 사용자의 컨텍스트를 수동으로 처리할 수 있습니다:
# 특정 사용자의 컨텍스트 세부 정보 확인
openclaw context show --channel telegram --user 12345678
# 특정 사용자의 컨텍스트 수동 압축
openclaw context compact --channel telegram --user 12345678
# 특정 사용자의 대화 기록 초기화 (모든 컨텍스트 삭제)
openclaw context reset --channel telegram --user 12345678
사용자도 채팅에서 /reset 명령을 직접 보내 자신의 대화 기록을 초기화할 수 있습니다.
방법 3: 더 큰 컨텍스트 윈도우를 가진 모델로 전환
사용 사례에서 길고 연속적인 대화가 필요한 경우, 더 큰 컨텍스트 윈도우를 가진 모델을 사용하는 것을 고려하세요:
{
"models": {
"default": {
"provider": "anthropic",
"model": "claude-sonnet-4-20250514",
"maxContextTokens": 200000
}
}
}
Claude 모델은 200K 토큰 컨텍스트 윈도우를 지원하고, GPT-4o는 128K, Gemini 1.5 Pro는 최대 1M을 지원합니다. 필요에 맞는 모델을 선택하세요.
방법 4: 폴백 전략으로 잘라내기 설정
압축이 실패할 경우를 대비하여 잘라내기 전략을 설정하여 시스템이 중단되지 않도록 합니다:
{
"context": {
"compaction": {
"enabled": true,
"strategy": "summarize",
"fallback": {
"strategy": "truncate",
"keepSystemPrompt": true,
"keepRecentMessages": 10
}
}
}
}
잘라내기 전략은 시스템 프롬프트와 최근 N개의 메시지를 유지하고 오래된 메시지를 완전히 삭제합니다. 이전 컨텍스트는 손실되지만 대화가 계속될 수 있도록 보장합니다.
방법 5: 개별 메시지 길이 제한
사용자가 과도하게 긴 메시지를 보내 컨텍스트가 빠르게 증가하는 것을 방지합니다:
{
"context": {
"maxMessageTokens": 4000,
"truncateMessage": true
}
}
maxMessageTokens 제한을 초과하는 개별 메시지는 잘려지며, 사용자에게 메시지가 너무 길다는 알림이 전송됩니다.
모니터링 및 예방
컨텍스트 사용량 알림을 설정하여 임계값에 도달하기 전에 알림을 받습니다:
{
"context": {
"alerts": {
"warningThreshold": 0.7,
"criticalThreshold": 0.9,
"webhook": "https://your-webhook-url.com/alerts"
}
}
}
비활성 세션 컨텍스트를 정기적으로 정리하여 메모리를 확보합니다:
# 7일 이상 비활성인 세션 정리
openclaw context cleanup --inactive-days 7
이렇게 하면 오래 유휴 상태인 세션이 시스템 리소스를 소모하는 것을 방지합니다.