Prompt Compression
프롬프트 압축은 정보량이 적은 토큰을 제거하거나 컨텍스트를 간결하게 인코딩해 LLM 입력을 줄입니다. 답변을 유지하면서 비용과 지연 시간을 낮춥니다.
프롬프트 압축은 대규모 언어 모델(LLM)의 입력을 짧게 줄이면서도 모델이 답변에 필요한 정보를 유지합니다. 이를 통해 요청에 필요한 토큰 수를 줄이고 실행 속도를 높이며 컨텍스트 윈도우 안에 입력을 담을 수 있습니다. 방법은 소형 언어 모델로 예측 가능한 단어를 삭제하는 것부터 긴 대화를 요약하는 것, 전체 문단을 대신하는 압축된 학습 토큰을 만드는 것까지 다양합니다. 검색된 문서를 많이 삽입하는 검색 증강 생성(RAG) 파이프라인, 단계마다 대화 이력이 늘어나는 AI 에이전트, 긴 지시와 예시가 포함된 애플리케이션처럼 프롬프트가 길고 자주 전송될 때 압축 효과가 큽니다. 제공업체는 입력 토큰별로 비용을 청구하고 어텐션 연산량은 입력 길이에 따라 증가하므로 프롬프트를 절반으로 압축하면 입력 비용도 대략 절반으로 줄고 추론 지연 시간도 감소합니다.
프롬프트 압축의 작동 방식#
하드 프롬프트 압축은 텍스트를 더 짧은 텍스트로 변환하므로 폐쇄형 API 모델을 포함한 모든 LLM이 읽을 수 있습니다. 대부분의 방법은 소형 언어 모델을 사용해 토큰별 점수를 계산한 다음, 정보량이 가장 적은 예측하기 쉬운 토큰을 삭제합니다. Selective Context는 이 아이디어를 단어와 구문에 적용하며, Microsoft의 LLMLingua는 지시, 예시, 질문에 서로 다른 압축 비율을 할당하는 예산 제어기와 반복적인 토큰 수준 가지치기를 추가해 성능 저하를 최소화하면서 최대 20배 압축을 달성합니다. LLMLingua-2는 XLM-RoBERTa와 같은 양방향 인코더를 사용한 토큰 분류 문제로 압축을 재구성합니다. 더 큰 LLM에서 증류한 압축 예제로 학습되며, 이전 방법보다 3~6배 빠르게 실행되고 2~5배 압축에서 종단 간 지연 시간을 1.6~2.9배 줄입니다. 추상적 요약 방법은 대신 모델에 컨텍스트를 요약하도록 요청해 더 많이 압축하지만 질문에 필요한 세부 정보를 누락할 수 있습니다.
소프트 프롬프트 압축은 텍스트를 모델이 원래 토큰 대신 읽는, 학습된 몇 개의 임베딩으로 변환합니다. 요약 토큰은 LLaMA-7B와 FLAN-T5-XXL을 학습시켜 지시를 소수의 특수 토큰으로 압축하며, 최대 26배 압축과 최대 40%의 FLOP 감소를 달성합니다. 이러한 방법은 모델 가중치에 접근할 수 있어야 하므로 오픈 모델에 적용됩니다.
토큰 수준 압축의 핵심은 몇 줄의 PyTorch 코드로 구현할 수 있습니다. 이 예제는 Hugging Face Transformers의 1억 2,400만 파라미터 GPT-2를 사용해 각 토큰의 자기 정보량, 즉 앞에 나온 모든 토큰이 주어졌을 때 해당 토큰이 나타날 로그 확률의 음수를 계산하고, 놀라움이 큰 절반을 남깁니다.
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("gpt2")
model = AutoModelForCausalLM.from_pretrained("gpt2")
prompt = (
"The quarterly maintenance report states that, as of the end of the quarter, a total of three conveyor "
"belts on line 4 were found to have worn bearings, and all of them were replaced on March 12 by the night shift."
)
ids = tokenizer(prompt, return_tensors="pt").input_ids[0]
# Self-information of each token, -log p(token | preceding tokens), under a small language model
with torch.no_grad():
logits = model(ids[None]).logits[0, :-1]
info = -logits.log_softmax(-1).gather(1, ids[1:, None]).squeeze(1)
# Keep the first token and the more surprising half of the rest, in their original order
keep = torch.cat([torch.tensor([True]), info > info.median()])
compressed = tokenizer.decode(ids[keep])
print(f"{len(ids)} -> {keep.sum().item()} tokens: {compressed}")46 -> 23 tokens: The quarterly maintenance report states, a three convey on line 4 found worn bearings all replaced on March 12 by night shift을 출력합니다. 4번 라인, 마모된 베어링, 3월 12일, 야간 근무 등의 사실은 유지되지만 "분기 말 기준으로"와 같이 예측 가능한 군더더기는 사라집니다. "conveyor belts"에서 남은 "convey"라는 단편은 토큰 하나씩 가지치기할 때 흔히 발생하는 현상이며, 일부 방법이 단어 전체나 구문 단위로 가지치기하는 이유입니다.
이미지 압축#
비전-언어 모델은 각 이미지를 수백 개의 시각 토큰으로 변환하며, 그중 상당수는 중복됩니다. FastV는 두 번째 레이어 뒤에서 이미지 토큰의 절반을 제거해 성능 저하 없이 LLaVA-1.5-13B의 FLOP를 45% 줄이며, 토큰 병합은 비전 트랜스포머 내부에 유사한 아이디어를 적용합니다. 객체 탐지기도 이미지 압축기 역할을 할 수 있습니다. Ultralytics YOLO26은 사진을 Results.summary(), 즉 각 객체의 클래스 이름, 신뢰도, 박스 좌표가 포함된 목록으로 축약합니다. 따라서 객체의 종류와 위치만 필요한 LLM 파이프라인은 수백 개에서 천 개가 넘는 토큰이 드는 이미지 대신 객체당 수십 개의 토큰만 전송할 수 있습니다.
프롬프트 압축과 관련 기법의 비교#
- 프롬프트 캐싱: 반복되는 프롬프트 접두부에 대해 모델이 계산한 상태를 저장해 재계산하지 않도록 합니다. 프롬프트 길이는 그대로 유지되며, 두 기법을 함께 사용하면 프롬프트의 가변 부분은 압축하고 고정 부분은 캐싱할 수 있습니다.
- KV 캐시 압축: 생성 중 모델 내부의 키-값 상태를 제거하거나 양자화합니다. 프롬프트 압축은 모델이 입력을 처리하기 전에 입력에 적용됩니다.
- 프롬프트 엔지니어링: 사람이 명확하고 간결한 프롬프트를 직접 작성합니다. 압축은 자동으로 수행되며 검색된 문서처럼 사람이 편집하지 않는 콘텐츠에도 적용됩니다.
- 컨텍스트 엔지니어링: 각 단계에서 모델 컨텍스트에 어떤 정보를 포함할지 결정하는 더 넓은 범위의 작업입니다. 압축은 검색 및 필터링과 함께 사용하는 도구 중 하나입니다.
- 프롬프트 보강: 검색되거나 생성된 컨텍스트를 프롬프트에 추가합니다. 파이프라인은 보통 먼저 내용을 보강한 다음 결과를 압축합니다.
실제 적용 사례#
- RAG 파이프라인: 생성 전에 검색된 구절을 압축하면 예산 안에 더 많은 출처를 포함하고 모델이 질문에 답하는 문장에 집중하게 할 수 있습니다.
- 에이전트 대화 이력: 코딩 및 리서치 에이전트는 컨텍스트가 가득 차면 오래된 도구 출력과 대화 내용을 요약으로 대체해 이력을 축약합니다. 긴 컨텍스트가 오래된 정보로 가득 차면 정확도가 떨어지기 때문입니다.
- 퓨샷 프롬프트: 작업 예시가 길게 나열된 프롬프트는 효과적으로 압축할 수 있습니다. LLMLingua의 예산 제어기는 논문의 기본 설정에서 먼저 혼란도를 기준으로 전체 예시를 삭제한 다음, 지시의 85%와 질문의 90%를 유지하면서 개별 토큰을 가지치기합니다.










