개요

RAG(Retrieval-Augmented Generation)는 대규모 언어 모델의 환각(hallucination) 문제를 완화하고, 최신 정보나 도메인 특화 지식을 제공하기 위한 핵심 기법입니다. 이 가이드에서는 LangChain과 벡터 데이터베이스를 활용한 프로덕션 레벨의 RAG 시스템 구축 방법을 다룹니다.

RAG의 작동 원리

RAG는 크게 세 단계로 구성됩니다:

  • 문서 인덱싱: 원본 문서를 청크로 분할하고 벡터 임베딩으로 변환하여 저장
  • 검색(Retrieval): 사용자 쿼리를 임베딩하여 관련성 높은 문서 청크 검색
  • 생성(Generation): 검색된 문서를 컨텍스트로 제공하여 LLM이 답변 생성

기본 RAG 파이프라인의 한계를 극복하기 위한 고급 기법도 함께 살펴보겠습니다.

환경 설정 및 의존성

pip install langchain langchain-community langchain-openai
pip install chromadb tiktoken
pip install pypdf unstructured

문서 로딩 및 청킹 전략

문서를 효과적으로 분할하는 것이 RAG 성능의 핵심입니다. 너무 작으면 맥락이 부족하고, 너무 크면 검색 정확도가 떨어집니다.

from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter

loader = PyPDFLoader("technical_manual.pdf")
documents = loader.load()

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,
    chunk_overlap=200,
    length_function=len
)

chunks = text_splitter.split_documents(documents)

청킹 파라미터 가이드라인:

  • 기술 문서: chunk_size=1000~1500, overlap=200~300
  • 대화/채팅 로그: chunk_size=500~800, overlap=100~150
  • 코드: 함수/클래스 단위로 분할

프로덕션 최적화 기법

  • 캐싱: 동일 쿼리의 임베딩과 검색 결과를 캐싱하여 응답 속도 향상 (Redis 활용)
  • 배치 임베딩: 대량 문서 인덱싱 시 배치 단위로 임베딩하여 API 비용 절감
  • 메타데이터 필터링: 날짜, 카테고리 등 메타데이터 기반 사전 필터링으로 검색 범위 축소
  • 하이브리드 검색: 벡터 검색 + 키워드 검색(BM25) 결합으로 정확도 향상

마무리

RAG는 LLM의 지식 한계를 극복하는 실용적인 방법입니다. 청킹 전략, 임베딩 모델 선택, 검색 알고리즘, 프롬프트 엔지니어링 등 각 단계를 세심하게 설계해야 프로덕션 레벨의 성능을 얻을 수 있습니다. 작은 데이터셋으로 프로토타입을 만들고, 실제 사용자 쿼리로 지속적으로 평가하며 개선하는 것이 성공의 열쇠입니다.