AI 챗봇을 써보셨다면 한 번쯤 이런 경험이 있으실 거예요. 분명히 존재하는 사실을 물었는데 AI가 자신 있게 틀린 답을 내놓는 경우, 또는 최신 정보가 반영되지 않아 쓸모없는 답변을 받는 경우요. 이 문제를 해결하는 핵심 기술이 바로 RAG(Retrieval-Augmented Generation)입니다.
이번 글에서는 RAG의 개념부터 로컬 LLM에서 직접 구현하는 방법까지 초심자도 이해할 수 있게 단계별로 설명해드릴게요.
RAG란 무엇인가?
RAG(Retrieval-Augmented Generation)는 AI가 답변을 생성할 때 외부 문서나 데이터베이스에서 관련 정보를 먼저 검색(Retrieve)한 뒤, 그 정보를 바탕으로 답변을 생성(Generate)하는 기술입니다.
쉽게 말하면:
- 일반 LLM: “내가 학습한 데이터로만 답변”
- RAG + LLM: “관련 문서 먼저 찾아보고 그걸 참고해서 답변”
사람으로 비유하면, 시험을 외운 내용만으로 보는 것(일반 LLM)과 오픈북 시험(RAG)의 차이예요.
RAG가 왜 필요한가?
문제 1: 할루시네이션(Hallucination)
LLM은 학습 데이터에 없는 정보도 그럴 듯하게 만들어냅니다. 이를 할루시네이션이라 하는데, 잘못된 정보를 사실처럼 제시하는 치명적인 문제입니다.
RAG는 실제 문서를 참조하기 때문에 할루시네이션을 크게 줄일 수 있습니다.
문제 2: 학습 데이터 컷오프
LLM은 특정 시점까지의 데이터만 학습합니다. 2025년 이후 최신 뉴스, 신제품 정보, 업데이트된 문서는 알 수 없어요.
RAG를 쓰면 최신 문서를 데이터베이스에 추가하는 것만으로 최신 정보를 반영할 수 있습니다.
문제 3: 회사 내부 문서 활용
사내 규정, 제품 매뉴얼, 고객 데이터 등은 LLM이 학습한 적 없는 정보입니다. RAG를 활용하면 이런 내부 문서 기반 AI 챗봇을 만들 수 있어요.
RAG 동작 원리
RAG는 크게 두 단계로 이루어집니다.
1단계: 인덱싱 (문서 준비)
| 단계 | 내용 |
|---|---|
| 문서 로드 | PDF, Word, 웹페이지 등 문서 수집 |
| 청킹 | 문서를 작은 단위로 분할 |
| 임베딩 | 각 청크를 벡터로 변환 |
| 저장 | 벡터 DB에 저장 |
2단계: 검색 + 생성 (질문 처리)
1. 사용자 질문을 벡터로 변환
2. 벡터 DB에서 유사한 문서 청크 검색
3. 검색된 문서 + 질문을 LLM에 전달
4. LLM이 문서를 참고해서 답변 생성
로컬 LLM에서 RAG 구현하기
이제 실제로 PC에서 RAG를 구현해봅시다. Ollama + LangChain + ChromaDB 조합을 사용합니다.
필요 도구
- Ollama: 로컬 LLM 실행 (이전 편 참고)
- LangChain: RAG 파이프라인 구축 라이브러리
- ChromaDB: 벡터 데이터베이스 (로컬, 무료)
환경 설치
pip install langchain langchain-community chromadb ollama
pip install langchain-ollama pypdf
Ollama에서 임베딩 모델 다운로드
# 임베딩용 모델 (가볍고 빠름)
ollama pull nomic-embed-text
# 답변 생성용 모델
ollama pull qwen2.5:7b
RAG 파이프라인 구현 코드
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain_ollama import OllamaEmbeddings, ChatOllama
from langchain.chains import RetrievalQA
# 1. 문서 로드 (PDF 예시)
loader = PyPDFLoader("내문서.pdf")
documents = loader.load()
# 2. 청킹 (문서 분할)
splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50
)
chunks = splitter.split_documents(documents)
# 3. 임베딩 + 벡터 DB 저장
embeddings = OllamaEmbeddings(model="nomic-embed-text")
vectorstore = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory="./chroma_db"
)
# 4. RAG 체인 구성
llm = ChatOllama(model="qwen2.5:7b", temperature=0)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vectorstore.as_retriever(search_kwargs={"k": 3})
)
# 5. 질문하기
result = qa_chain.invoke("이 문서의 핵심 내용은?")
print(result["result"])
웹사이트 내용으로 RAG 만들기
PDF 외에도 웹페이지 내용을 실시간으로 가져와 RAG에 활용할 수 있습니다.
from langchain_community.document_loaders import WebBaseLoader
# 웹페이지 로드
loader = WebBaseLoader("https://example.com/docs")
docs = loader.load()
실전 활용 예시
예시 1: 회사 내부 문서 챗봇
사내 규정집, 제품 매뉴얼을 PDF로 만들어 ChromaDB에 저장하면 “연차는 어떻게 신청하나요?” 같은 질문에 정확하게 답변하는 사내 AI 챗봇을 만들 수 있습니다.
예시 2: 개인 지식 베이스
읽은 책, 메모, 블로그 글을 모아두면 “저번 달에 읽은 마케팅 책에서 SEO 관련 내용 요약해줘” 같은 질문도 가능합니다.
예시 3: 고객 서비스 챗봇
FAQ, 제품 설명서를 기반으로 고객 문의에 자동으로 답변하는 챗봇을 구축할 수 있습니다.
성능 높이는 팁
청크 사이즈 조정: 너무 크면 관련 없는 내용 포함, 너무 작으면 맥락 부족. 문서 유형에 따라 300~800 토큰이 적절합니다.
검색 결과 수(k) 조정: k=3은 상위 3개 청크를 참조합니다. 복잡한 질문은 k=5로 높이세요.
리랭킹 적용: 검색된 문서를 다시 한 번 관련도 순으로 정렬하면 정확도가 올라갑니다.
마무리
RAG는 로컬 LLM의 단점(최신 정보 부재, 할루시네이션)을 효과적으로 보완하는 핵심 기술입니다. 오늘 소개한 Ollama + LangChain + ChromaDB 조합은 무료로 PC에서 완전히 구동되기 때문에 비용 걱정 없이 실험해볼 수 있어요.
다음 편에서는 Ollama + n8n으로 RAG 자동화 워크플로우 구축하는 방법을 다룰 예정입니다. 이전 Qwen LLM 설치 가이드(1~3편)도 함께 참고해보세요!
핑백: n8n + Ollama로 완전 무료 AI 자동화 워크플로우 만들기 2026 - Aria AI
https://shorturl.fm/RHG3G
https://shorturl.fm/RLGjH
https://shorturl.fm/ODgqA