RAG 시스템 구축이 쉬워졌다: LangChain + ChromaDB로 30분 만에 시작하기
RAG 시스템 구축이 쉬워졌다: LangChain + ChromaDB로 30분 만에 시작하기
"ChatGPT는 2021년 이후 데이터를 모른다." 이 문제를 해결하려고 PDF 파일을 업로드해봤는데, 정작 제대로 된 답변을 못 받은 경험 있으신가요? 또는 회사 내부 문서, 고객 데이터, 기술 매뉴얼처럼 외부 AI가 절대 알 수 없는 정보를 기반으로 챗봇을 만들고 싶었지만 어디서부터 시작해야 할지 막막했나요?
답은 RAG(Retrieval-Augmented Generation) 시스템입니다. 2026년 현재, RAG는 더 이상 연구실 프로젝트가 아닙니다. LangChain과 ChromaDB 덕분에 개발자 경험 1년 차도 30분 만에 작동하는 RAG 챗봇을 만들 수 있습니다.
RAG란 무엇인가? (Retrieval-Augmented Generation)
기존 LLM의 한계
GPT-4, Claude, Gemini 같은 대형 언어 모델(LLM)은 학습 데이터 기준 시점까지의 정보만 압니다.
- GPT-4 Turbo (2024년 4월 학습 종료)
- Claude 3.5 Sonnet (2024년 상반기 학습 종료)
- 당신 회사의 내부 문서? 전혀 모릅니다
RAG의 작동 원리
RAG는 이 문제를 3단계로 해결합니다:
- 문서 임베딩(Embedding): 텍스트를 숫자 벡터로 변환 (의미 기반 검색 가능)
- 벡터 저장소(Vector Store): ChromaDB/Pinecone/Weaviate 같은 벡터 데이터베이스에 저장
- 검색 + 생성(Retrieval + Generation): 사용자 질문과 유사한 문서 찾기 → LLM에게 컨텍스트로 제공 → 답변 생성
예시:
사용자: "2025년 3분기 매출은 얼마야?"
[RAG 시스템]
1. 질문을 벡터로 변환
2. 벡터 DB에서 유사 문서 검색 → "2025 Q3 재무 보고서.pdf" 찾음
3. 관련 페이지 내용을 GPT에게 전달:
"이 문서에 따르면 2025년 3분기 매출은 45억원입니다. 답변해줘."
4. GPT: "2025년 3분기 매출은 45억원입니다. (출처: 2025 Q3 재무 보고서)"
2026년 RAG 구축이 쉬워진 이유
1. LangChain: RAG 프레임워크의 표준
LangChain은 RAG 구축에 필요한 모든 컴포넌트를 제공합니다:
- Document Loaders: PDF, Word, Markdown, 웹페이지 로딩
- Text Splitters: 긴 문서를 청크(chunk) 단위로 분할
- Embeddings: OpenAI, Cohere, HuggingFace 임베딩 통합
- Vector Stores: ChromaDB, Pinecone, Weaviate, FAISS 연동
- Retrieval Chains: 검색 → LLM 호출을 자동화
2. ChromaDB: 가장 쉬운 벡터 데이터베이스
- 설치 30초:
pip install chromadb - 별도 서버 불필요: 로컬 파일 기반 실행 가능
- 프로덕션 확장 가능: 클라이언트-서버 모드 지원
- 무료 오픈소스: 상업적 이용 가능
3. 완전 작동하는 코드가 공개됨
2026년 1-2월, 수십 개의 완전한 RAG 튜토리얼이 공개되었습니다:
- DEV Community: "Build AI Chatbot with LangChain & ChromaDB"
- Tech Insider: "Build a RAG Chatbot in 30 Min with Python"
- Optijara: "Complete Step-by-Step Tutorial"
모두 실제 작동하는 코드를 제공합니다. 복붙 가능합니다.
30분 만에 RAG 시스템 구축하기 (실전 가이드)
필요 조건
- Python 3.8+
- OpenAI API 키 (또는 다른 LLM API)
- 기본적인 Python 지식
1단계: 라이브러리 설치 (2분)
pip install langchain chromadb openai pypdf
2단계: 문서 로딩 및 청킹 (5분)
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
# PDF 로딩
loader = PyPDFLoader("company_docs.pdf")
documents = loader.load()
# 청킹 (1000자 단위, 200자 오버랩)
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)
chunks = text_splitter.split_documents(documents)
핵심 팁: chunk_size는 1000-1500자가 적당합니다. 너무 작으면 문맥 손실, 너무 크면 검색 정확도 하락.
3단계: 임베딩 + 벡터 저장 (10분)
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
# 임베딩 모델 (OpenAI text-embedding-3-small)
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
# ChromaDB에 저장
vectorstore = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory="./chroma_db" # 로컬 저장
)
비용: OpenAI 임베딩은 100만 토큰당 $0.02. 10,000페이지 PDF도 $5 이하.
4단계: 검색 체인 구성 (8분)
from langchain.chains import RetrievalQA
from langchain.chat_models import ChatOpenAI
# LLM 설정
llm = ChatOpenAI(model="gpt-4-turbo", temperature=0)
# RAG 체인
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff", # 모든 검색 결과를 한번에 전달
retriever=vectorstore.as_retriever(search_kwargs={"k": 3}), # 상위 3개 검색
return_source_documents=True # 출처 문서 반환
)
5단계: 질문하기! (5분)
query = "2025년 3분기 매출은 얼마인가요?"
result = qa_chain({"query": query})
print("답변:", result["result"])
print("출처:", result["source_documents"][0].metadata)
결과 예시:
답변: 2025년 3분기 매출은 45억원입니다.
출처: {'source': 'company_docs.pdf', 'page': 12}
프로덕션 환경으로 확장하기
1. 벡터 DB 선택: ChromaDB vs Pinecone vs Weaviate
| DB | 장점 | 단점 | 추천 용도 |
|---|---|---|---|
| ChromaDB | 설치 간단, 무료, 로컬 실행 | 대규모 확장 제한적 | MVP, 프로토타입 |
| Pinecone | 관리형 서비스, 무한 확장 | 유료 ($70/월~) | 프로덕션, 대용량 |
| Weaviate | 오픈소스, 하이브리드 검색 | 자체 호스팅 필요 | 온프레미스, 커스터마이징 |
| FAISS | Meta 개발, 초고속 | 메모리 기반, 영속성 없음 | 실험, 벤치마킹 |
2. 청킹 전략 개선
문제: "1000자로 자르면 문장이 중간에 끊깁니다"
해결책:
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200,
separators=["
", "
", ". ", " ", ""] # 우선순위대로 분할
)
3. 하이브리드 검색 (Semantic + Keyword)
벡터 검색만으로는 정확한 키워드 매칭이 약합니다. 하이브리드 검색 추가:
from langchain.retrievers import BM25Retriever, EnsembleRetriever
# BM25 (키워드 검색)
bm25_retriever = BM25Retriever.from_documents(chunks)
# 벡터 검색
vector_retriever = vectorstore.as_retriever()
# 하이브리드 (50:50 가중치)
ensemble_retriever = EnsembleRetriever(
retrievers=[bm25_retriever, vector_retriever],
weights=[0.5, 0.5]
)
실전 사례: RAG로 해결한 문제들
1. 고객 지원 챗봇
회사: B2B SaaS 스타트업
문제: 고객 문의 중 80%가 "이미 문서에 있는 내용"
해결: 700페이지 기술 문서 → RAG 챗봇 구축
결과:
- 고객 지원 티켓 65% 감소
- 평균 응답 시간 24시간 → 2분
- 고객 만족도 4.2 → 4.8/5
2. 법률 문서 검색
회사: 로펌
문제: 변호사들이 판례 검색에 하루 2-3시간 소비
해결: 10년치 판례 문서(50,000건) → Pinecone + GPT-4 RAG
결과:
- 검색 시간 3시간 → 15분
- 검색 정확도 92% (키워드 검색 대비 +35%)
3. 사내 지식 베이스
회사: 중견 제조업체
문제: 신입 사원 온보딩에 3개월 소요
해결: 작업 매뉴얼, 사내 위키, 과거 프로젝트 문서 → RAG 시스템
결과:
- 온보딩 기간 3개월 → 3주
- 반복 질문 90% 감소
주의사항: RAG도 완벽하지 않다
1. 할루시네이션(Hallucination) 여전히 존재
RAG로 검색한 문서를 줬는데도 LLM이 지어내는 경우가 있습니다.
대책:
temperature=0으로 설정 (창의성 제거)- "문서에 없으면 '모르겠습니다'라고 답하세요" 프롬프트 추가
2. 청킹이 잘못되면 답변 품질 급락
예: "Q3 매출은 45억" 문장이 두 청크로 나뉘면 검색 실패.
대책: chunk_overlap=200 이상 설정
3. 비용 관리
- OpenAI 임베딩: 저렴 (100만 토큰 $0.02)
- GPT-4 호출: 비쌈 (100만 토큰 $10-30)
대책:
- 자주 묻는 질문은 캐싱
- GPT-3.5 Turbo 사용 (품질 약간 하락, 비용 1/10)
미래 전망: RAG는 AI 앱의 필수 요소가 된다
가트너는 2026년까지 엔터프라이즈 AI 앱의 70%가 RAG를 사용할 것이라 예측했습니다. 이유는 간단합니다:
- LLM을 재학습시키는 것보다 1000배 저렴
- 데이터 업데이트가 실시간 가능
- 출처 추적으로 신뢰도 향상
당신의 프로젝트에도 "AI가 우리 데이터를 알아야 한다"는 요구사항이 있다면, RAG가 답입니다. 30분만 투자해서 첫 프로토타입을 만들어보세요. 🚀
어떤 문서를 RAG로 만들고 싶으신가요? 회사 매뉴얼? 고객 FAQ? 기술 블로그? 댓글로 공유해주세요!