RAG 검색기능 향상 기법

Shin Dae Hwan·2026년 2월 2일

GDG AI Project Track을 진행하던 중 RAG 검색기능 향상 기법에 대해 조사할 기회가 생겼다.
이에 따라 이번주 블로그는 회고록 형식이자, 정보제공을 목적으로 작성할 예정이다.


RAG란?
RAG(검색 증강 생성)는 LLM이 학습하지 않은 최신 데이터나 특정 기업의 내부 문서를 외부 저장소에서 검색하여, 그 내용을 바탕으로 답변을 생성하는 기술이다. 모델의 환각 현상을 줄이고 정보의 정확성을 높이는 핵심 전략인 것.


RAG 검색 성능 향상을 위한 6가지 기법

1. Parent Document Retriever

  • 무엇인가?
    문서를 아주 작은 조각(Child)으로 나누어 검색 성능을 높이되, 실제 모델에게 전달할 때는 그 조각이 포함된 더 큰 맥락(Parent)을 전달하는 방식.
  • 언제 사용하는가?
    검색을 위해 텍스트를 너무 작게 자르면 의미가 파편화되어 답변 품질이 떨어질 때 사용함. "정교한 검색"과 "충분한 맥락 정보"라는 두 마리 토끼를 잡고 싶을 때 필수적.

[핵심코드]
from langchain.retrievers import ParentDocumentRetriever
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.storage import InMemoryStore

#1. 부모(크게)와 자식(작게) 분할기 설정
parent_splitter = RecursiveCharacterTextSplitter(chunk_size=2000)
child_splitter = RecursiveCharacterTextSplitter(chunk_size=400)

#2. 리트리버 구성
retriever = ParentDocumentRetriever(
vectorstore=vectorstore,
docstore=InMemoryStore(),
child_splitter=child_splitter,
parent_splitter=parent_splitter,
)


2. Contextual Chunking

  • 무엇인가?
    단순히 글자 수나 토큰 단위로 자르는 것이 아니라, 문장의 의미가 끊기지 않도록 의미적 경계를 기준으로 데이터를 나누는 기법. 최근에는 각 청크 앞에 전체 문서의 요약을 덧붙여 문맥을 보존하기도 한다.
  • 언제 사용하는가?
    문서의 구조(목차, 섹션)가 복잡하여 물리적으로만 나눴을 때 정보가 왜곡될 위험이 있는 경우 효과적.

3. Hybrid Search

  • 무엇인가?
    키워드 기반의 키워드 검색(BM25)과 의미 기반의 벡터 검색(Semantic Search)을 결합한 방식.
  • 언제 사용하는가?
    고유 명사나 전문 용어(제품명, 코드 번호 등)에 대한 정확한 매칭이 필요하면서, 동시에 사용자의 질문 의도(의미)를 파악해야 하는 일반적인 비즈니스 환경에서 가장 권장되는 표준 방식.

4. Multi-Query

  • 무엇인가?
    사용자의 질문을 LLM을 이용해 다양한 관점의 유사 질문으로 재작성한 뒤, 여러 개의 질문으로 검색을 수행하고 결과를 취합하는 방식.
  • 언제 사용하는가?
    사용자의 질문이 모호하거나 너무 짧아서 검색 엔진이 관련 문서를 제대로 찾지 못할 때 유용.

[핵심코드]
from langchain.retrievers.multi_query import MultiQueryRetriever
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(temperature=0)
retriever_from_llm = MultiQueryRetriever.from_llm(
retriever=vectorstore.as_retriever(), llm=llm
)


5. Re-ranking

  • 무엇인가?
    1차적으로 검색된 수십 개의 문서 후보들을 더 정교한 모델(Cross-Encoder 등)을 통해 질문과의 관련도 순으로 다시 정렬하는 과정.
  • 언제 사용하는가?
    검색 엔진이 가져온 상위 결과들 중에 노이즈가 섞여 있어, LLM에게 전달할 최적의 'TOP 3' 혹은 'TOP 5' 문서를 엄선해야 할 때 사용.

[핵심코드]
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import FlashrankRerank

#검색된 결과를 다시 순위 매기는 압축기 설정
compressor = FlashrankRerank()
compression_retriever = ContextualCompressionRetriever(
base_compressor=compressor, base_retriever=retriever
)


6. Corrective RAG

  • 무엇인가?
    검색된 문서가 질문과 정말 관련이 있는지 자체적으로 평가하는 단계를 추가한 기법. 관련도가 낮으면 웹 검색을 통해 새로운 정보를 가져오거나 답변을 거부함.
  • 언제 사용하는가?
    잘못된 검색 결과로 인해 발생하는 '그럴싸한 오답(환각)'을 엄격하게 차단해야 하는 신뢰도가 중요한 서비스에서 사용.

[정리]

기법주요 개선 지표난이도비용(Token/Latency)추천 사용 케이스
Parent Document컨텍스트 보존율 (Context Recall)"문서 구조가 복잡한 기술 문서, 법률"
Contextual Chunking정보 밀도 (Precision)"문맥이 끊기면 안 되는 소설, 리포트"
Hybrid Search검색 정확도 (Recall+Precision)전문 용어와 일상어가 섞인 서비스
Multi-Query검색 누락 방지 (Search Coverage)사용자 질문이 모호할 때
Re-ranking최상위 결과 정밀도 (Precision)정확한 근거 답변이 필수일 때
Corrective RAG신뢰성 (Grounding)환각을 엄격히 방지해야 하는 엔터프라이즈

0개의 댓글