Claude Sonnet과 같은 대규모 모델을 포함한 모든 모델은 제한된 컨텍스트 윈도우(context window)를 가질 수 있습니다. 컨텍스트 윈도우란 모델이 한 번의 호출에서 볼 수 있는 모든 것을 의미합니다.
더 큰 모델일수록 작은 모델에 비해 상대적으로 더 큰 컨텍스트 윈도우를 가질 수 있습니다. 컨텍스트 크기가 클수록 작은 모델보다 더 많은 기록을 담을 수 있다는 뜻입니다.
우리는 모델의 컨텍스트 크기에 관계없이 어떻게 컨텍스트 크기를 관리할 수 있는지 알아볼 것입니다.
일반적으로 모든 대화 이력은 로컬 머신의 RAM에 저장됩니다. RAM 용량에는 제한이 있기 때문에 모든 기록을 저장할 수는 없습니다. 따라서 count_tokens_approximately라는 패키지를 사용하여 RAM에 근사적으로 저장될 토큰 수를 계산할 수 있습니다.
messages : 4
tokens used : 87
room left : 6913
...
따라서 우리는 컨텍스트를 위해 미리 예산을 계획해야 합니다. 창이 가득 찼을 때 반응하는 대신, 각 부분이 얼마나 많은 공간을 차지할지 사전에 결정합니다:
WINDOW = 8_000
BUDGET = {"system": 0.05, "memories": 0.10, "retrieved": 0.35, "history": 0.40, "reserve": 0.10}
여기서 시스템(system)이 전체 사용량의 5%를 차지할 수 있도록 정의했습니다. 마찬가지로, 메모리(memories)에는 특정 사용자에게 중요한 사실/정보가 포함되며, 검색된 청크(retrieved chunks)는 RAG에서 가져오고, 최근 기록/대화는 컨텍스트의 일부로 저장됩니다.
할당된 메모리 사용량에 도달하면 알람을 설정하여 오버플로우가 발생하기 전에 조치를 취할 수 있습니다. 어떤 종류의 조치를 취할 수 있을까요? 기록(history)을 자르거나, 오래된 도구 출력물(tool outputs)을 지우고, 대화 요약(summarization)을 수행할 수 있습니다.
트리밍 (Trimming) - 기록이 맞도록 전체 메시지를 삭제합니다. 끝, 시작 또는 중간에서 트리밍할 수 있습니다.
오래된 도구 출력물 지우기 (Clear the old tool outputs) - 가장 최신 도구 출력물은 온전히 유지하고, 오래된 출력물은 한 줄짜리 플레이스홀더로 대체합니다. 동일한 tool_call_id를 유지하여 도구를 요청했던 AI 메시지가 여전히 답변을 가지도록 합니다.
요약 (Summarization) - 단순 삭제(trimming)는 정보 손실을 초래합니다. 순환 요약(rolling summary)은 이전 내용을 짧은 메모로 압축하여 사실들이 살아남게 합니다. 요약을 위해서는 저비용의 LLM을 사용할 것입니다. 요약에 사용되는 프롬프트는 무엇을 유지해야 하는지 알려줍니다: 이름, 숫자, 결정 사항, 그리고 선호도입니다.
가장 비용 효율적인 수정 방법부터 순서대로 행동을 선택합니다. 이는 먼저 이전 도구 출력(tool outputs)을 지우려고 시도하는 것을 의미합니다. 그것으로 충분하지 않다면, 다음으로 자르기(trimming)를 수행하고 그 후에 요약(summarization)을 수행한 뒤, 전체 기록을 장기 메모리(long-term memory)에 저장해야 합니다.