심화 마무리
Contextual Retrieval: 더 나은 RAG
RAG의 핵심 가정은 「올바른 Chunk를 검색하면 올바른 답을 얻을 수 있다」는 것입니다. 그러나 실제로는 근본적인 문제가 있습니다: Chunk 분할 과정 자체가 핵심 정보를 잃어버립니다. Contextual Retrieval은 바로 이 문제를 해결하기 위해 설계되었습니다.
전통적인 RAG의 핵심 문제
전통적인 RAG 워크플로우: 문서를 작은 Chunk로 나누고, 각 Chunk를 벡터화하고, 사용자가 질문할 때 가장 유사한 Chunk를 검색하여 LLM에 제공해 답변을 생성합니다. 이 플로우에는 치명적인 결함이 있습니다:
문맥을 잃은 Chunk는 모호해집니다
문서가 Chunk로 분할되면, 각 Chunk는 원문에서의 위치 정보를 잃어버립니다. 원문에서는 의미가 명확했던 텍스트가 단독으로 꺼내면 전혀 이해할 수 없게 될 수 있습니다.
대표적인 사례
"The company's Q2 revenue increased by 3% over the previous quarter."
어느 회사인가요? 몇 년도인가요? Q1 기준치는 얼마인가요? 이 성장률은 업계에서 좋은 것인가요 나쁜 것인가요? 이 모든 핵심 맥락이 Chunk 분할 시 사라집니다. 벡터 검색이 이 Chunk를 찾을 수 있지만, Chunk 자체가 담고 있는 정보는 심각하게 부족합니다.
전체 문서
Chunk 분할
문맥 소실
검색 모호
Contextual Retrieval의 핵심 아이디어
Embedding 전에 LLM으로 각 Chunk에 문맥 접두어를 추가합니다
아이디어는 매우 직관적입니다: Chunk를 벡터화하기 전에, LLM이 전체 문서를 읽고 각 Chunk에 대한 짧은 문맥 설명을 접두어로 생성합니다. 이렇게 하면 각 Chunk가 검색될 때 필요한 맥락 정보를 자체적으로 갖게 됩니다.
BEFORE -- 맨 Chunk
"The company's Q2 revenue
increased by 3% over the
previous quarter."
누구? 언제? 알 수 없습니다.
AFTER -- 문맥이 있는 Chunk
"This chunk is from the company's
2024 Annual Report, specifically
the Financial Performance section.
The company's Q2 revenue
increased by 3% over the
previous quarter."
LLM이 생성한 접두어가 출처, 시기, 섹션을 자동으로 보완합니다.
3단계 점진적 최적화
LAYER 01
Contextual Embeddings
각 Chunk에 문맥 접두어를 추가한 후 벡터화합니다. 접두어에는 문서 제목, 섹션 위치, 핵심 개체 등의 정보가 포함됩니다. 검색 시 Chunk가 자체적으로 맥락을 담고 있어 의미적 매칭이 더 정확해집니다.
LAYER 02
Contextual BM25
전통적인 BM25 키워드 검색에도 문맥 접두어를 추가합니다. 접두어의 키워드(예: 회사명, 연도)를 통해 BM25가 맥락 부족으로 기존에 매칭되지 않던 Chunk를 찾을 수 있습니다. 벡터 검색 + BM25 이중 경로 리콜로 서로의 사각지대를 보완합니다.
LAYER 03
Reranking
검색 후 Reranker 모델로 후보 Chunk를 재정렬합니다. Reranker는 Chunk와 쿼리의 관련성을 더 정밀하게 판단하여 가장 관련성 높은 결과를 상위에 올립니다. 3단계 모두 적용 시 효과가 가장 좋습니다.
성능 데이터
검색 실패율 감소 폭
검색 실패율 67% 감소는 무엇을 의미할까요? 이전에는 100번의 검색 중 30번이 올바른 Chunk를 찾지 못했다고 가정하면(실패율 30%), 최적화 후 실패율이 약 10%로 떨어져 검색 오류의 3분의 2가 제거됩니다. RAG에 의존하는 프로덕션 시스템에서 이는 질적인 도약입니다.
비용 트레이드오프
공짜 점심은 없습니다
전처리 비용 증가: 각 Chunk마다 문맥 접두어 생성을 위한 추가 LLM 호출이 필요합니다. 대규모 문서 라이브러리의 경우 이 전처리 비용을 무시할 수 없습니다.
Prompt Caching으로 비용 절감 가능: 같은 문서의 다른 Chunk들은 동일한 문서 수준의 문맥을 공유합니다. Prompt Caching을 활용하면 전체 문서를 반복적으로 전송하는 것을 피할 수 있습니다.
고정확도 시나리오에 적합: RAG 시스템이 매우 높은 정확도를 요구하는 경우(예: 법률 문서 검색, 의료 Q&A, 금융 컴플라이언스 조회), 추가적인 전처리 비용은 충분히 가치 있습니다. 허용 오차가 높은 시나리오(예: 캐주얼 추천)는 경제적이지 않을 수 있습니다.
RAG는 Chunk 분할과 벡터 검색만으로는 충분하지 않습니다 — 각 Chunk는 자체적으로 문맥을 가져야 합니다. Contextual Retrieval의 핵심 통찰: 검색 품질의 병목은 Chunk 자체의 정보 완결성에 있으며, 더 강력한 벡터 모델로의 교체는 도움이 제한적입니다. Chunk에 잃어버린 맥락을 보완하면 검색 실패율을 3분의 2 줄일 수 있습니다.