3개월 전 대화도 기억하는 AI — RAG 아키텍처 완전 가이드
RAG(검색 증강 생성)는 LLM이 우리 회사 내부 문서를 기억하게 만드는 아키텍처입니다. 벡터 DB 선택부터 프로덕션 배포까지 실전 구축 과정을 단계별로 안내합니다.
3개월 전 대화도 기억하는 AI — RAG 아키텍처 완전 가이드
문제 정의: LLM은 왜 "우리 회사"를 모르는가
GPT-4o든 Claude든, 아무리 똑똑한 LLM도 우리 회사 내부 문서를 알지 못한다. 학습 데이터에 포함되지 않은 사내 위키, 계약서, 고객 히스토리는 모델의 지식 범위 밖이다. 그렇다고 매번 전체 문서를 프롬프트에 넣을 수도 없다 — 토큰 제한과 비용 문제가 즉시 발생한다.
RAG(Retrieval-Augmented Generation)는 이 문제를 해결하는 아키텍처 패턴이다. 질문과 관련된 문서만 검색해서 LLM에게 컨텍스트로 전달하는 방식으로, 최신 정보 반영, 환각(hallucination) 감소, 비용 효율화를 동시에 달성한다.
아키텍처 개요
RAG 파이프라인은 크게 **인덱싱(Indexing)**과 쿼리(Query) 두 단계로 나뉜다.
┌─────────────────────────────────────────────────────┐
│ 인덱싱 파이프라인 │
│ │
│ [문서] → [청킹] → [임베딩] → [벡터DB 저장] │
│ PDF Chunk text- ChromaDB │
│ Notion Split embedding Pinecone │
│ Slack -3-large Qdrant │
└─────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│ 쿼리 파이프라인 │
│ │
│ [사용자 질문] → [임베딩] → [벡터 검색] → [리랭킹] │
│ │ │ │ │
│ │ ▼ ▼ │
│ └──────────────── [프롬프트 조합] → [LLM 생성] │
│ 질문 + 검색결과 응답 │
└─────────────────────────────────────────────────────┘
구현 예시: LangChain + ChromaDB
2026년 기준 LangChain(v0.3+)과 LlamaIndex(v0.14+)가 양대 프레임워크다. LangChain은 워크플로우 오케스트레이션에, LlamaIndex는 문서 인덱싱/검색에 강점이 있다. 여기서는 LangChain + ChromaDB 조합으로 핵심 로직을 구현한다.
1단계: 문서 로드 및 청킹
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 문서 로드
loader = PyPDFLoader("company_manual.pdf")
documents = loader.load()
# 청킹: 의미 단위로 분할
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500, # 토큰이 아닌 문자 기준
chunk_overlap=50, # 문맥 유지를 위한 오버랩
separators=["\n\n", "\n", ". ", " "] # 우선순위별 분할 기준
)
chunks = text_splitter.split_documents(documents)
print(f"총 {len(chunks)}개 청크 생성")2단계: 임베딩 및 벡터DB 저장
from langchain_openai import OpenAIEmbeddings
from langchain_chroma import Chroma
# 임베딩 모델 (text-embedding-3-large 권장)
embeddings = OpenAIEmbeddings(model="text-embedding-3-large")
# ChromaDB에 저장 (로컬 영속화)
vectorstore = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory="./chroma_db",
collection_name="company_docs"
)3단계: 검색 + LLM 생성
from langchain_openai import ChatOpenAI
from langchain.chains import RetrievalQA
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import CrossEncoderReranker
# 기본 리트리버
base_retriever = vectorstore.as_retriever(
search_type="mmr", # Maximum Marginal Relevance
search_kwargs={"k": 10, "fetch_k": 20}
)
# 리랭커 추가 (정확도 향상의 핵심)
from langchain_community.cross_encoders import HuggingFaceCrossEncoder
reranker = HuggingFaceCrossEncoder(model_name="BAAI/bge-reranker-v2-m3")
compressor = CrossEncoderReranker(model=reranker, top_n=5)
retriever = ContextualCompressionRetriever(
base_compressor=compressor,
base_retriever=base_retriever
)
# QA 체인 구성
llm = ChatOpenAI(model="gpt-4o", temperature=0)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
retriever=retriever,
return_source_documents=True
)
# 실행
result = qa_chain.invoke({"query": "우리 회사 연차 정책이 어떻게 되나요?"})
print(result["result"])실전 팁: RAG 성능을 좌우하는 5가지
1. 청킹 전략이 80%를 결정한다
| 전략 | chunk_size | 적합한 경우 |
|---|---|---|
| 고정 크기 분할 | 300~500자 | 범용, 빠른 프로토타입 |
| 의미 기반 분할 | 가변 | 기술 문서, 법률 문서 |
| 문서 구조 기반 | 섹션별 | Markdown, HTML |
| 계층적 청킹 | 부모+자식 | 긴 보고서, 매뉴얼 |
작은 청크(300자)는 정밀도가 높고, 큰 청크(1000자+)는 맥락이 풍부하다. 소형 청크로 검색하되, 상위 청크(부모)를 컨텍스트로 확장하는 Parent-Child 패턴을 권장한다.
2. 하이브리드 검색으로 커버리지 확보
벡터 검색(의미 유사도)만으로는 부족하다. 키워드 검색(BM25)을 병행하는 하이브리드 검색이 실전에서 훨씬 안정적이다. 특히 한국어 고유명사, 약어, 코드명 검색에서 키워드 검색이 유리하다.
3. 리랭킹은 선택이 아닌 필수
초기 검색 결과(top-20)를 Cross-Encoder로 재정렬해 최종 top-5를 선별하면 정확도가 크게 향상된다. BAAI/bge-reranker-v2-m3는 다국어(한국어 포함)에서 강력한 성능을 보여준다.
4. 메타데이터 필터링
모든 청크에 출처(source), 날짜(date), 부서(department) 등 메타데이터를 부착하라. "최근 1년간 인사팀 문서에서만 검색"과 같은 필터링이 가능해진다.
5. 평가 루프 구축
"RAG is more than embeddings" — Jason Liu
검색 품질 없이 생성 품질은 없다. RAGAS, DeepEval 등 프레임워크로 Faithfulness, Answer Relevancy, Context Recall 지표를 정기적으로 측정하라.
비용 구조
월 10,000건 질의 기준 예상 비용:
| 항목 | ChromaDB (셀프호스팅) | Pinecone (매니지드) |
|---|---|---|
| 벡터DB | 서버 비용 ~$20/월 | $70~/월 (Starter) |
| 임베딩 API | ~$5/월 | ~$5/월 |
| LLM API (GPT-4o) | ||
| 리랭커 | 로컬 무료 / API $10 | 로컬 무료 / API $10 |
| 합계 |
프로토타입은 ChromaDB로 시작하고, 벡터 1천만 건 이상이면 Pinecone이나 Qdrant Cloud로 마이그레이션하는 것이 일반적이다. ChromaDB는 2025년 Rust 재작성으로 쓰기/쿼리 속도가 4배 향상되어 소규모 프로덕션에서도 충분히 활용 가능해졌다.
결론
RAG는 단순히 "임베딩 + 검색"이 아니라, 청킹 전략 → 하이브리드 검색 → 리랭킹 → 평가 전체 파이프라인을 설계하는 엔지니어링이다. 잘 구축된 RAG 시스템은 3개월 전 대화도, 5년 전 계약서도 정확하게 참조하는 AI를 만들어준다.
이런 시스템을 우리 회사에도 구축하고 싶다면 → 기술 상담 신청
우리 회사, 어디부터 자동화할 수 있을까?
무료 업무 진단으로 반복 업무를 찾아드립니다. 30분 통화로 월 몇 시간을 아낄 수 있는지 바로 확인하세요.
관련 글
AI 자동화 인사이트를 받아보세요
새로운 가이드와 사례가 올라올 때 알려드립니다. 스팸 없이, 유용한 글만.