Contents
see List대규모 언어 모델(LLM)의 환각(hallucination) 문제를 해결하고, 기업 내부 데이터를 기반으로 정확한 응답을 생성하기 위한 RAG(Retrieval-Augmented Generation) 기술이 2026년에 더욱 정교해지고 있습니다. 단순한 벡터 검색을 넘어 하이브리드 검색, 리랭킹, 쿼리 변환 등 다양한 기법이 조합된 Advanced RAG 파이프라인이 표준으로 자리잡았습니다.
기본 RAG vs Advanced RAG
기본 RAG는 사용자 쿼리를 임베딩하고 벡터 DB에서 유사 문서를 검색한 뒤 LLM에 전달하는 단순한 구조입니다. 하지만 실제 운영 환경에서는 검색 품질 저하, 컨텍스트 윈도우 낭비, 부정확한 응답 등 여러 문제가 발생합니다. Advanced RAG는 이러한 문제를 해결하기 위해 전처리, 검색, 후처리 각 단계를 최적화합니다.
1단계: 문서 처리 및 청킹 전략
RAG의 품질은 문서를 어떻게 분할하느냐에서 시작됩니다. 2026년 현재 가장 효과적인 청킹 전략들을 살펴봅니다.
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_experimental.text_splitter import SemanticChunker
from langchain_openai import OpenAIEmbeddings
# 방법 1: Recursive Character Splitting (기본)
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200,
separators=["\n\n", "\n", ". ", " ", ""]
)
chunks = text_splitter.split_documents(documents)
# 방법 2: Semantic Chunking (의미 기반 분할 - 권장)
semantic_splitter = SemanticChunker(
embeddings=OpenAIEmbeddings(model="text-embedding-3-large"),
breakpoint_threshold_type="percentile",
breakpoint_threshold_amount=90
)
semantic_chunks = semantic_splitter.split_documents(documents)
# 방법 3: Parent-Child Chunking (계층적 분할)
from langchain.retrievers import ParentDocumentRetriever
from langchain.storage import InMemoryStore
child_splitter = RecursiveCharacterTextSplitter(chunk_size=400)
parent_splitter = RecursiveCharacterTextSplitter(chunk_size=2000)
retriever = ParentDocumentRetriever(
vectorstore=vectorstore,
docstore=InMemoryStore(),
child_splitter=child_splitter,
parent_splitter=parent_splitter
)2단계: 하이브리드 검색 구현
벡터 검색(의미적 유사도)만으로는 키워드 매칭이 필요한 경우를 놓칠 수 있습니다. BM25 키워드 검색과 벡터 검색을 결합한 하이브리드 검색이 가장 높은 검색 품질을 보여줍니다.
from langchain_community.retrievers import BM25Retriever
from langchain.retrievers import EnsembleRetriever
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings
# 벡터 검색기
vectorstore = Chroma.from_documents(
documents=chunks,
embedding=OpenAIEmbeddings(model="text-embedding-3-large")
)
vector_retriever = vectorstore.as_retriever(search_kwargs={"k": 5})
# BM25 키워드 검색기
bm25_retriever = BM25Retriever.from_documents(chunks)
bm25_retriever.k = 5
# 하이브리드 앙상블 (벡터 60% + BM25 40%)
ensemble_retriever = EnsembleRetriever(
retrievers=[vector_retriever, bm25_retriever],
weights=[0.6, 0.4]
)3단계: 리랭킹으로 검색 정밀도 향상
초기 검색 결과를 Cross-Encoder 모델로 리랭킹하면 관련성이 높은 문서를 상위로 올릴 수 있습니다.
from langchain.retrievers import ContextualCompressionRetriever
from langchain_cohere import CohereRerank
# Cohere Reranker 적용
reranker = CohereRerank(
model="rerank-v3.5",
top_n=3
)
compression_retriever = ContextualCompressionRetriever(
base_compressor=reranker,
base_retriever=ensemble_retriever
)4단계: 쿼리 변환 기법
사용자의 원본 쿼리가 항상 검색에 최적화되어 있지 않습니다. 쿼리 변환 기법을 적용하면 검색 품질을 크게 향상시킬 수 있습니다.
from langchain.retrievers import MultiQueryRetriever
# Multi-Query: 하나의 질문을 여러 관점에서 재작성
multi_query_retriever = MultiQueryRetriever.from_llm(
retriever=compression_retriever,
llm=ChatAnthropic(model="claude-sonnet-4-20250514")
)
# HyDE: 가상 답변을 생성하여 그 답변으로 검색
from langchain.chains import HypotheticalDocumentEmbedder
hyde_embeddings = HypotheticalDocumentEmbedder.from_llm(
llm=ChatAnthropic(model="claude-sonnet-4-20250514"),
base_embeddings=OpenAIEmbeddings(model="text-embedding-3-large"),
prompt_key="web_search"
)전체 파이프라인 통합
위의 모든 기법을 결합한 완성된 RAG 파이프라인 예시입니다.
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
prompt = ChatPromptTemplate.from_template(
"""다음 컨텍스트를 기반으로 질문에 답변하세요.
컨텍스트에 없는 내용은 모른다고 답변하세요.
컨텍스트: {context}
질문: {question}
답변:"""
)
def format_docs(docs):
return "\n\n".join(doc.page_content for doc in docs)
rag_chain = (
{"context": compression_retriever | format_docs, "question": RunnablePassthrough()}
| prompt
| ChatAnthropic(model="claude-sonnet-4-20250514")
| StrOutputParser()
)
# 실행
result = rag_chain.invoke("2026년 1분기 매출 현황은?")
print(result)Advanced RAG 파이프라인은 각 단계별 최적화를 통해 기본 RAG 대비 응답 정확도를 40-60% 향상시킬 수 있습니다. 특히 Semantic Chunking, 하이브리드 검색, 리랭킹의 조합은 2026년 현재 가장 검증된 베스트 프랙티스로 자리잡았습니다.