LLM에 넣을 긴 대화 이력이나 문서에서 지금 필요한 정보만 남기고 나머지는 요약하거나 덜어내는 기법이다. 대화가 계속 길어지는 에이전트나 검색해 온 문서가 너무 긴 RAG에서 비용을 줄이고 답의 정확도를 지키려고 쓴다.
| 방식 | 하는 일 | 대표 예 |
|---|---|---|
| 요약 | 오래된 대화를 짧은 사실 요약으로 바꾼다 | ConversationSummaryMemory |
| 골라내기 | 질문과 관련된 문장·문서만 남긴다 | LangChain Contextual Compression |
| 토큰 줄이기 | 덜 중요한 단어를 지워 프롬프트를 짧게 만든다 | LLMLingua, Selective Context |
입력 토큰은 모두 요금으로 잡힌다. 에이전트는 매 턴 이전 대화를 다시 보내므로 대화가 길어질수록 비용이 계속 쌓이고, 결국 컨텍스트 창 한계에 부딪힌다.
정확도도 떨어진다. 긴 입력 속에 묻힌 정보는 모델이 놓치기 쉽다. 관련 없는 내용을 덜어내면 모델이 핵심에 더 잘 집중한다.
압축은 정보를 버리는 일이다. 요약하다가 파일 경로, 숫자, 에러 메시지 같은 세부가 빠지면 뒤에서 엉뚱한 답이 나온다. 그래서 결정 사항, 제약 조건, 아직 안 끝난 작업처럼 꼭 남길 항목을 요약 지시에 적어 두는 게 좋다.
LLM으로 요약하거나 추출하면 그 호출에도 비용과 시간이 든다. 대화가 짧거나 계약서처럼 원문 그대로 인용해야 하는 작업이면 압축하지 않는 편이 낫다.
| 기법 | 줄이는 것 | 방식 |
|---|---|---|
| 컨텍스트 압축 | 이미 모은 컨텍스트의 길이 | 내용 자체를 줄인다 |
| RAG | 처음부터 넣을 문서의 양 | 필요한 문서만 찾아온다 |
| 프롬프트 캐싱 | 반복 입력의 처리 비용 | 내용은 그대로 두고 값만 낮춘다 |
셋은 함께 쓸 수 있다. RAG로 문서를 찾고, 압축으로 다듬고, 매번 똑같이 들어가는 앞부분은 캐싱하면 된다.
가장 흔히 쓰는 곳은 대화가 길게 이어지는 에이전트다. 직접 만든다면 오래된 대화는 요약하고, 최근 몇 턴과 꼭 지켜야 할 조건은 원문으로 남기는 방식부터 시작하면 된다. 검색 결과가 길면 질문과 관련된 부분만 골라 넣는다.
| 상황 | 이렇게 압축한다 |
|---|---|
| 긴 대화 에이전트 | 초기 대화를 "Python 백엔드 개발자, React 사용, Docker 환경"처럼 요약하고, 최근 몇 턴만 원문으로 둔다 |
| RAG 검색 결과 | 검색된 문서에서 질문과 관련된 문장만 뽑아 넣는다 |
| 코딩 에이전트 | 작업이 길어지면 한 일과 남은 일을 요약해 이어 간다 (Claude Code의 /compact) |
LangChain에서는 기존 검색기를 ContextualCompressionRetriever로 감싸고, LLM으로 관련 부분만 뽑아내는 압축기를 지정해서 쓴다.