대화 압축

대화 압축 (Compaction)

대화가 길어지면 메시지 기록이 모델의 컨텍스트 창(context window)에 가까워질 수 있어요. 압축(compaction)은 오래된 메시지를 줄이거나(정리·삭제·요약) 최근 컨텍스트와 도구 호출의 무결성은 유지하면서 기록을 관리해 주는 기능이에요. 이 문서에서는 Pydantic AI가 제공하는 공급자 네이티브 압축, 직접 작성하는 모델 무관 압축, 그리고 Pydantic AI Harness의 기성 전략까지 압축의 세 가지 수준을 차근차근 설명해 드릴게요.

출처: 문서

본문

공급자 네이티브 압축 (Provider-native compaction)

일부 공급자(provider)는 자체적으로 동작하는 내장 압축 API를 제공해요. Pydantic AI는 이를 capabilities로 감싸서 제공합니다.

각각 해당 공급자의 API를 사용하기 때문에, 그 공급자에서만 사용할 수 있어요.

Pydantic AI는 압축 파트(compaction part)를 앞으로의 요청에 제공되는 상태의 가시 경계(visibility boundary) 로 취급해요. 경계 이전의 도구 발견 정보와 온디맨드 캐퍼빌리티 로드는 초기화되므로, 그 이후의 요청에서 다시 알리게 됩니다. 캐퍼빌리티와 툴셋 작성자는 자신이 파생한 상태에도 같은 규칙을 적용해야 해요. 모델이 반드시 봤어야 하는 것(공지, 공개 정보, 카탈로그)은 인스턴스 속성에 기억해 두지 말고 post_compaction_window에서 계산해서, 압축이 그 상태를 실어 나르던 기록을 대체할 때 스스로 복구되도록 하는 게 좋아요.

도구 호출을 디스패치할 때 Pydantic AI는 응답을 제공한 공급자를 사용해서 그 공급자가 실제로 요청 통신에서 경계를 지켰는지 판단해요. 외부 공급자의 압축 파트, 암호화된 콘텐츠가 없는 OpenAI 파트, 요약 콘텐츠가 없는 Anthropic 파트는 그 공급자가 이전 기록을 모델에 보냈으므로 이전 호출 가능성 증거를 숨기지 못해요. 호출을 포함한 응답 안에서 발행된 경계 역시 그 응답에 대해 모델이 본 내용에는 영향을 미치기에는 너무 늦어요. 응답에 공급자 이름이 없으면 디스패치는 공급자 무관 경계로 폴백합니다.

클라이언트 보관 기록 (Client-held history)

CompactionPartUI 어댑터를 통해 왕복하는데, 그 프로토콜은 클라이언트가 매 요청마다 전체 대화 기록을 전송하도록 하므로 압축된 대화도 그러한 프런트엔드에서 계속 동작해요. 클라이언트가 제출한 압축 항목은 수용됩니다(대화는 압축된 상태로 유지) — 다만 에이전트의 시스템 프롬프트를 대신한다고 신뢰되지는 않아요. 시스템 프롬프트는 미신뢰 기록 불러오기에서 설명한 대로 매 요청마다 여전히 모델에 도달합니다.

만약 런(run)이 자체 서버 측 기록도 함께 받는다면 — 서버 측 영속 패턴처럼 저장된 메시지를 message_history로 전달하고 클라이언트 메시지는 최신 턴만 공급하는 경우 — 클라이언트가 제출한 압축 항목은 대신 무시됩니다. 압축 항목은 그 이전에는 아무것도 모델에 보내지 않는다는 경계를 표시하므로, 클라이언트의 것을 수용하면 클라이언트가 서버가 보유한 기록을 모델로부터 숨기고 그 요약을 컨텍스트로 대체할 수 있게 돼요. 클라이언트 압축 항목은 클라이언트가 전송한 메시지가 전체 대화일 때만 수용됩니다.

그때조차 클라이언트는 서버 공급자 계정이 지금까지 만든 어떤 압축 항목이라도 재생할 수 있어요 — OpenAI에서는 불투명한 암호화 상태, Anthropic에서는 평문 요약이요. 이는 클라이언트 전송 기록이 항상 허용하는 평문 기록의 위조와 종류상 동등한데, 한 가지 차이가 있어요. 서버는 불투명한 항목이 무엇을 담고 있는지 검사할 수 없답니다. 배포에서 이것이 중요하다면 기록을 서버 측에 두세요. 대화별로 전체 메시지 목록을 영속화하고, 클라이언트에는 표시 데이터만 보내고, 매 런마다 저장된 메시지를 message_history로 전달하면 됩니다. 압축 경계 주변에서 저장된 기록을 직접 줄이지 마세요 — 각 모델 어댑터는 자체 공급자의 압축이 대체하는 것을 이미 생략하고, 외부 공급자의 압축 항목을 무시하는 다른 공급자의 모델은 여전히 필요한 더 이른 기록 전체를 받기 때문이에요.

모델 무관 압축 (Model-agnostic compaction)

어떤 모델에서든 압축하려면 history processorProcessHistory 캐퍼빌리티로 감싸서 메시지 기록을 직접 편집하면 돼요 — 모든 공급자에서 동작합니다. 언제 압축할지 결정하려면 ctx.context_window_used를 확인하세요. 마지막 응답 기준으로 모델의 context_window 중 차지한 비율이며, 알 수 없으면 None이에요. 일반적인 패턴:

Pydantic AI Harness

Pydantic AI Harness는 기성의 모델 무관 압축 전략 메뉴를 제공해요. 대부분은 LLM을 쓰지 않는 기록 편집(슬라이딩 윈도우 정리, 오래된 도구 결과 삭제, 반복 파일 읽기 중복 제거, 과대 메시지 파트 클램핑)이고, 그것으로 부족할 때는 LLM 요약을 쓰며, 목표에 맞을 만큼만 저렴한 전략에서 비싼 전략으로 단계적으로 올라가는 TieredCompaction 오케스트레이터(권장 기본값)도 있답니다.

더 알아보기 (Learn more)