RAG 시스템에서 문서를 작은 청크(Chunk)로 나누는 것은 검색 정밀도를 높이기 위한 기본 전략이다. 하지만 여기에는 근본적인 딜레마가 있다. 청크를 작게 나눌수록 검색은 정확해지지만, 잘려나간 문맥 때문에 LLM이 정보를 제대로 이해하지 못하는 문제가 생긴다.
예를 들어, 어떤 문서에서 "이 방식은 기존 대비 30% 성능 향상을 보였다"라는 청크가 검색되었다고 하자. "이 방식"이 무엇인지, "기존"이 어떤 기준인지 -- 앞뒤 맥락이 없으면 LLM은 이 정보만으로 정확한 답변을 생성하기 어렵다.
Context Enrichment(문맥 보강) 은 바로 이 문제를 해결하는 기법들의 총칭이다. 검색된 청크에 추가적인 맥락 정보를 덧붙여, LLM이 더 정확하고 풍부한 답변을 생성하도록 돕는다. 이 글에서는 대표적인 세 가지 기법인 CCH, Context Window Enhancement, RSE를 살펴본다.
Contextual Chunk Headers (CCH)
텍스트 청크에 문서 제목과 같은 맥락 정보(헤더)를 추가하여, 정보 검색의 정확도를 높이는 기법
핵심 아이디어
CCH의 접근 방식은 단순하다. 청크를 임베딩(Embedding)하기 전에, 해당 청크가 어디서 왔는지를 알려주는 헤더(header)를 청크 앞에 붙이는 것이다.
택배에 비유하면, 물건만 덜렁 보내는 것이 아니라 송장(출처 정보) 을 함께 붙여 보내는 셈이다. 수신자(LLM)는 송장을 보고 이 물건이 어디서 온 건지, 어떤 맥락의 일부인지 즉시 파악할 수 있다.
작동 방식
- 기존 텍스트 청크를 벡터로 변환하기 전에, 해당 청크의 출처나 상위 정보를 담은 헤더를 맨 앞에 붙여 하나의 단위로 만든다.
- 이 헤더가 포함된 청크를 임베딩하면, 벡터 자체에 맥락 정보가 반영된다.
- LLM은 이 헤더를 보고 각 정보 조각이 어디서 왔는지, 어떤 주제의 일부인지 파악할 수 있다.
예를 들어, 원래 청크가 다음과 같다면:
"이 방식은 기존 대비 30% 성능 향상을 보였다."
CCH 적용 후에는 이렇게 된다:
"[문서: RAG 시스템 최적화 가이드 > 섹션: 리랭킹 전략]
이 방식은 기존 대비 30% 성능 향상을 보였다."
장점
- 검색 정확도 향상: 각 청크가 풍부한 문맥 정보를 가지게 되어, 검색 시스템이 의미를 더 정확하게 파악하고 올바른 결과를 반환한다.
- 잘못된 검색(False Positive) 감소: 내용과 관련 없는 청크가 검색 결과에 포함되는 비율이 줄어든다.
- LLM의 오해 방지: 검색된 정보를 바탕으로 답변을 생성할 때, LLM이 각 청크의 의미를 오해할 가능성이 낮아져 더 신뢰도 높은 답변을 생성한다.
CCH는 인덱싱 시점(전처리) 에 적용되는 기법이라는 점이 특징적이다. 검색 후 후처리하는 것이 아니라, 애초에 벡터 저장소에 넣기 전에 맥락을 부여한다. 구현이 간단하면서도 검색 품질에 직접적인 영향을 미치기 때문에, 가장 먼저 적용해볼 만한 기법이다.
Context Window Enhancement
검색된 핵심 청크의 정보가 부족한 문제를 해결하기 위해, 해당 청크의 원본 문서상 앞뒤에 위치한 이웃 청크들을 함께 제공하여 문맥을 보강하는 후처리 기법
핵심 아이디어
Context Window Enhancement는 CCH와 달리 검색 이후(후처리) 에 적용되는 기법이다. 검색으로 찾은 청크를 LLM에 바로 보내지 않고, 원본 문서에서 그 청크의 앞뒤 이웃 청크들을 함께 가져와 하나의 연속된 창(Window)으로 재구성한다.
책을 읽다가 특정 문단이 중요하다고 판단되면, 그 문단만 읽는 것이 아니라 앞뒤 문단까지 함께 읽어 전체 맥락을 파악하는 것과 같은 원리다.
작동 방식
- 작은 단위로 검색: 문서를 작은 크기로 청킹하고, 사용자 질문과 가장 관련성 높은 청크들을 검색한다.
- 주변 문맥 확장: 검색된 청크를 LLM에 바로 보내지 않고, 이 청크들이 원본 문서의 어느 위치에 있었는지 메타데이터에 저장된 인덱스(index) 를 통해 확인한다.
- Window 재구성: 관련성 높은 청크를 중심으로, 그 주변(앞/뒤)의 청크들까지 포함하여 하나의 연속된 창(Window)을 통째로 재구성한다.
- 최종 컨텍스트 전달: 이렇게 재구성된, 문맥적으로 더 풍부해진 창을 LLM에게 전달하여 답변을 생성한다.
구현 포인트
- 청킹 단계에서 각 청크의 순서(index)를 메타데이터에 저장하는 것이 핵심이다.
- 검색 후, 검색된 청크의 index를 기준으로 앞뒤 N개의 이웃 청크를 추가로 가져온다.
- 청크들을 순서에 맞게 합쳐 최종 컨텍스트를 만든다.
num_neighbors파라미터를 조절하여 보강할 문맥의 크기를 쉽게 조절할 수 있다.
장점
- RSE에 비해 구현이 매우 간단하고 직관적이다.
- 단편적인 정보 대신 연결된 문맥을 제공하여 LLM의 이해도를 높이고 답변 품질을 향상시킨다.
num_neighbors파라미터 하나로 보강 범위를 유연하게 조절할 수 있다.
단, 이 방식은 고정된 크기의 창(window) 을 사용한다는 한계가 있다. 질문의 복잡도와 관계없이 항상 동일한 수의 이웃 청크를 가져오기 때문에, 때로는 불필요한 정보가 포함되거나 중요한 정보가 누락될 수 있다. 이 한계를 극복한 것이 바로 다음에 소개할 RSE다.
Relevant Segment Extraction (RSE)
검색된 관련성 높은 청크 주변의 문맥을 동적으로 확장하여, LLM에게 최적의 컨텍스트를 제공하는 기법
핵심 아이디어
RSE는 Context Window Enhancement의 진화형이라 할 수 있다. 고정된 창 크기 대신, 관련성 점수를 기반으로 최적의 연속 구간(Segment) 을 동적으로 결정한다.
핵심적인 차이는 샌드위치 청크(sandwiched chunks) 의 처리에 있다. 검색 순위가 낮아 결과에 포함되지 않았더라도, 관련성 높은 청크들 사이에 끼어있던 청크까지 모두 포함시켜 문맥의 흐름을 유지한다.
작동 방식
- 작은 단위로 검색: 문서를 작은 크기로 청킹하고, 사용자 질문과 가장 관련성 높은 청크들을 검색한다.
- 주변 문맥 확장: 검색된 청크들을 LLM에 바로 보내지 않고, 이 청크들이 원본 문서의 어느 위치에 있었는지 확인한다.
- 구간(Segment) 재구성: 관련성 높은 청크들을 중심으로, 그 주변의 청크들까지 포함하여 하나의 연속된 구간을 통째로 재구성한다. 이때 검색 순위가 낮았더라도, 관련성 높은 청크들 사이에 끼어있던 청크까지 모두 포함시킨다.
- 최종 컨텍스트 전달: 이렇게 재구성된, 마치 문서의 한 섹션과 같은 풍부한 문맥을 LLM에게 전달하여 답변을 생성한다.
구현: 최대 부분 배열 합
RSE의 구현은 알고리즘 관점에서 흥미롭다.
- 검색/리랭킹(Reranking)을 통해 개별 청크들의 관련성 점수를 계산한다.
- 관련성이 낮은 청크에 페널티를 부여해 점수를 음수로 만든다.
- 최대 부분 배열 합(Maximum Subarray Sum) 과 유사한 알고리즘으로, 점수 합이 가장 높은 연속된 청크 구간을 찾는다.
- 이 과정에서 검색 순위가 낮았지만 구간 사이에 끼어있는 청크들도 자연스럽게 포함된다.
관련성 높은 청크들이 밀집된 구간은 점수 합이 높아지고, 관련 없는 청크가 끼어 있어도 주변 청크의 높은 점수가 이를 상쇄한다. 결과적으로 문맥이 연속되는 최적의 구간이 자동으로 추출된다.
장점
- 동적인 문맥 제공: 질문의 복잡도에 따라 짧거나 긴, 최적의 문맥을 LLM에 전달할 수 있다.
- 답변 품질 향상: LLM이 단편적 정보가 아닌 연속된 글을 읽는 것처럼 문맥을 더 잘 이해하여, 정확하고 풍부한 답변을 생성한다.
- 정보 누락 방지: 검색 결과에서는 놓쳤을 수 있는 중요한 주변 청크까지 포함하여 완전한 정보를 제공한다.
세 기법 비교
| 기법 | 적용 시점 | 방식 | 문맥 범위 | 구현 난이도 |
|---|---|---|---|---|
| CCH | 인덱싱 전 (전처리) | 청크에 헤더(출처 정보) 추가 | 문서 메타데이터 수준 | 낮음 |
| Context Window | 검색 후 (후처리) | 고정 크기의 앞뒤 이웃 청크 포함 | 고정 (num_neighbors) | 낮음 |
| RSE | 검색 후 (후처리) | 관련성 점수 기반 동적 구간 추출 | 동적 (질문에 따라 가변) | 중간 |
세 기법은 상호 배타적이지 않다. CCH로 인덱싱 품질을 높이고, 검색 후에는 Context Window나 RSE로 문맥을 보강하는 식으로 조합하여 사용할 수 있다.
간단한 QA 시스템이라면 CCH + Context Window 조합으로 충분하고, 복잡한 질문을 다루는 시스템이라면 RSE까지 도입하는 것이 효과적이다.
정리
RAG에서 청크를 작게 나누면 검색 정밀도는 높아지지만, 문맥 손실이라는 대가를 치른다. Context Enrichment는 이 트레이드오프를 완화하는 핵심 전략이다.
- CCH: 인덱싱 시점에 청크에 출처 헤더를 부착하여 검색 정확도 자체를 향상
- Context Window Enhancement: 검색된 청크의 앞뒤 이웃을 고정 범위로 가져와 문맥 보강
- RSE: 관련성 점수 기반으로 최적의 연속 구간을 동적으로 추출
세 기법 모두 "검색된 청크에 맥락을 더한다"는 공통 목표를 가지지만, 적용 시점과 방식이 다르다. 상황에 맞게 조합하면 RAG 시스템의 답변 품질을 크게 끌어올릴 수 있다.