RAG의 비접두사 KV 캐시 재사용
검색 문서의 순서가 달라지면 접두사 캐시 재사용이 끊깁니다. 선택적 재계산, 위치 보정, CoinRAG의 토큰 구간 재사용이 각각 해결하는 문제와 평가 기준을 정리합니다.
같은 문서를 다시 검색해도 앞에 놓인 문맥이 달라지면, 저장된 KV를 그대로 재사용할 수 없습니다.
접두사 재사용의 경계
검색 증강 생성(Retrieval-Augmented Generation, RAG)은 검색한 문서를 모델의 입력에 넣습니다. 대규모 언어 모델(Large Language Model, LLM)은 프리필(prefill) 단계에서 입력의 Key와 Value를 계산합니다. 이 값을 저장한 KV 캐시는 이후 토큰을 생성할 때 같은 계산을 반복하지 않도록 합니다.
vLLM의 접두사 캐싱은 이전 요청과 앞부분의 토큰열이 같은 구간을 재사용합니다. 검색된 문서의 조합이나 순서가 바뀌면 공통 접두사가 짧아지므로, 문서가 같아도 재사용되는 계산은 줄어듭니다.
아래는 문서 경계를 토큰 블록 경계와 맞췄다고 가정한 예시입니다. S는 시스템 지시문, A·B·C는 문서 청크, Q는 질문입니다.
| 이전 요청 | 새 요청 | 공통 접두사 |
|---|---|---|
| S → A → B → Q | S → A → C → Q | S → A |
| S → A → B → Q | S → B → A → Q | S |
이 조건은 캐시 키에도 반영됩니다. vLLM의 설계 문서에 따르면 블록 해시는 현재 토큰뿐 아니라 앞선 블록의 해시도 포함합니다. 문서 식별자만 같다는 이유로 같은 캐시를 찾지 않는 구조입니다.
위치와 문맥의 불일치
CacheBlend가 다루는 비접두사 재사용은 청크마다 미리 만든 KV를 요청에 맞춰 조합하는 방식입니다. 그러나 청크 B를 혼자 인코딩한 결과에는 앞선 청크 A를 읽으며 형성할 표현이 없습니다. 특히 앞 계층의 어텐션 결과를 입력으로 받는 후속 계층에서 차이가 남습니다.
위치 정보도 별도로 맞춰야 합니다. 회전 위치 임베딩(Rotary Position Embedding, RoPE)을 사용하는 모델에서는 캐시된 Key의 위치를 새 입력의 위치에 맞게 변환해야 합니다. 청크 캐싱 비교 연구는 위치 정렬과 누락된 교차 청크 어텐션을 별도 문제로 구분합니다.
따라서 위치를 옮기는 연산만으로 전체 프리필과 같은 표현이 복원되지는 않습니다. 예를 들어 A에 인물의 이름, B에 그 인물을 가리키는 대명사가 있다면 두 청크의 연결 관계도 평가해야 합니다. 이는 위치 보정의 성공과 답변 품질을 따로 확인해야 하는 이유입니다.
선택적 재계산
CacheBlend는 캐시를 불러온 뒤 중요한 토큰의 KV만 다시 계산합니다. 선택된 토큰은 현재 요청의 문맥을 참조하고, 나머지는 기존 값을 유지하므로 계산량을 줄입니다. 다만 전체 프리필과 모든 토큰의 표현이 같다는 보장은 없습니다.
CacheClip은 보조 모델로 토큰을 고르고 인접 토큰을 묶어 갱신합니다. 공유 접두사는 내용과 무관하게 초기 토큰에 주의가 몰리는 attention sink의 중복을 완화합니다.
| CacheClip 구성 | 목적 |
|---|---|
| 보조 모델의 질문별 토큰 점수 | 재계산할 위치 선택 |
| 공유 접두사를 한 벌만 유지 | 중복된 attention sink 완화 |
| 슬라이딩 윈도우로 토큰 묶기 | 부분 갱신 시 지역 문맥 유지 |
재계산 대상의 선택과 실제 갱신에는 모두 비용이 듭니다. 따라서 재사용한 토큰 비율만으로 속도를 판단하면 선택 단계에서 늘어난 시간을 놓칩니다.
위치 보정과 어텐션 융합
LazyAttention은 위치 보정을 위해 KV 사본을 다시 만드는 비용에 집중합니다. 위치 인코딩을 어텐션 커널이 실행될 때 적용해, 물리적 캐시 한 벌을 서로 다른 논리적 위치에서 사용합니다. 이 최적화는 위치 이동 비용을 줄이는 것이며, 문서 간 의미 의존성을 자동으로 복원한다는 뜻은 아닙니다.
Decoupled Attention Fusion(DAF)은 문서 간 정보 보정과 질문 처리를 별도 어텐션 경로로 나눕니다. 이후 두 출력의 상태를 결합하며, 각 경로를 밀집 연산으로 구성해 FlashAttention 커널을 활용합니다. 토큰 수를 줄이는 것과 남은 계산을 효율적인 커널로 실행하는 것은 별도 설계 항목입니다.
위 그림은 DAF의 계산 경로를 요약한 것입니다. LazyAttention은 캐시의 위치 처리 비용을, DAF는 보정 연산의 실행 구조를 다루므로 같은 가속 배수로 우열을 정할 수 없습니다.
CoinRAG의 토큰 구간 재사용
CoinRAG의 nugget은 원문 청크 안의 연속 토큰 구간입니다. 청크 전체를 미리 인코딩한 KV에서 해당 구간을 잘라 쓰므로, 구간만 따로 인코딩할 때 빠지는 선행 문맥을 보존합니다.
온라인에서는 청크를 검색한 뒤 내부 nugget을 선택하고 위치를 정렬합니다. 논문은 이 조합 방식에 맞춘 미세조정도 사용하므로, 대표 성능을 캐시 슬라이싱만의 효과로 해석해서는 안 됩니다.
성능 비교의 조건
2026-09 기준으로 이 글의 논문 식별자와 설명을 연결된 1차 자료에서 확인했습니다. 논문마다 측정 구간과 기준선이 다르므로, 가속 배수보다 비교 조건을 먼저 맞춰야 합니다.
| 연구 | 보고된 결과 | 함께 읽어야 할 조건 |
|---|---|---|
| CacheClip 표 6 | 프리필 5.641초 → 1.695초 | 입력 16K, 재계산 20%, Qwen2.5-14B-Instruct, L20 그래픽 처리 장치(GPU)와 중앙 처리 장치(CPU)의 보조 모델 |
| LazyAttention | 첫 토큰 지연 1.37배 개선 | Block-Attention 대비, 문서 요청 분포가 편중된 조건 |
첫 토큰 지연(Time-to-First-Token, TTFT)은 요청 후 첫 출력 토큰까지의 시간입니다. 프리필만 잰 값에는 검색이나 대기 시간이 빠질 수 있으므로, 표의 숫자를 사용자 지연으로 그대로 옮기면 안 됩니다.
F1은 정답과 출력의 토큰 겹침으로 구한 정밀도·재현율의 조화평균입니다. 청크 캐싱 비교 연구는 전체 프리필이 점수를 얻은 질문만 따로 평가하는 보정 F1을 사용합니다.
원래 답하지 못하던 질문이 많으면 캐시 근사로 인한 손실이 평균에서 가려지기 때문입니다. 따라서 품질 유지 주장을 비교할 때는 평가 집합의 차이도 확인해야 합니다.
도입 전 측정 기준
다음 표는 앞선 기법들을 실제 서비스에서 비교하기 위한 제안입니다. 모델·질문·검색 결과를 고정한 상태에서 캐시 경로만 바꾸고, 캐시 적중과 미적중을 나눠 측정해야 원인을 구분할 수 있습니다.
| 관찰할 항목 | 확인할 판단 |
|---|---|
| 동일 청크의 재등장과 접두사 적중의 차이 | 비접두사 재사용이 필요한가 |
| 검색·대기·KV 로드·보정·생성의 소요 시간 | 줄이려는 계산이 실제 병목인가 |
| 여러 문서의 근거를 잇는 질문의 정확도 | 교차 청크 문맥 손실을 감당할 수 있는가 |
| 원문과 모델 변경 후 캐시 재구축 비용 | 사전 계산의 비용을 회수할 수 있는가 |
예를 들어 문서 검색이 대부분의 시간을 차지한다면 프리필 개선만으로 해결할 수 없습니다. 반대로 동일 청크가 반복 검색되면서 순서만 자주 바뀐다면, 접두사 적중률과 청크 재등장률의 차이가 실험 근거가 됩니다.
캐시의 유효성도 실험 조건에 포함해야 합니다. 원문·토크나이저·모델 가중치가 달라진 KV를 섞지 않도록 버전을 구분하고, 동일 버전에서 전체 프리필과 비교하는 방식입니다. 이 글에서는 논문의 서빙 성능을 직접 재현하지 않았으므로, 도입 판단에는 해당 서비스의 측정이 필요합니다.
정리
RAG에서 같은 문서를 다시 찾는 것과 같은 KV를 다시 쓰는 것은 조건이 다릅니다. 비접두사 재사용은 위치 정렬과 문맥 손실을 함께 다뤄야 하며, 보정에도 계산 비용이 듭니다. 적용 여부는 청크 재등장률, 전체 요청 지연, 여러 문서에 걸친 답변 품질을 함께 측정해 판단해야 합니다.