📎
RAG — 모델을 재훈련하지 않고 \"참고자료\"를 붙여주는 방법
검색(Retrieval) + 생성(Generation) — 모델의 가중치는 안 바꾸고 외부 지식을 프롬프트에 첨부
파인튜닝 vs RAG — 근본적 차이
파인튜닝: 모델의 가중치를 바꾼다 (머릿속 지식을 바꿈)
RAG: 모델의 가중치는 안 바꾼다 (참고자료를 줄 뿐)
비유:
파인튜닝 = 의사한테 새로운 질병을 가르침 (교육, 시간 오래 걸림)
RAG = 의사한테 환자 차트를 건네줌 (참고, 즉시)
작동 원리
사용자: "우리 회사 휴가 정책이 어떻게 돼?"
[1단계 — 검색 (Retrieval)]
→ 회사 문서 DB에서 "휴가 정책" 관련 문서를 검색
→ "연차 15일, 반차 가능, 3일 전 신청..." 문서를 찾음
[2단계 — 프롬프트 조립]
→ "아래 참고자료를 바탕으로 질문에 답해줘.
참고자료: 연차 15일, 반차 가능, 3일 전 신청...
질문: 우리 회사 휴가 정책이 어떻게 돼?"
[3단계 — 생성 (Generation)]
→ model(프롬프트) → "우리 회사 연차는 15일이고, 반차도 가능합니다. 3일 전에 신청해야 합니다."
모델의 가중치는 1도 안 바뀌었다. 그냥 프롬프트에 참고자료를 끼워넣은 것뿐이다.
가장 간단한 RAG 코드
# 이게 RAG의 본질이다. 진짜 이게 전부.
from transformers import pipeline
# 1. 모델 (가중치 변경 없음)
qa = pipeline("question-answering")
# 2. 외부 문서 (검색 결과라고 가정)
context = """우리 회사 휴가 정책:
- 연차: 15일
- 반차: 가능
- 신청: 3일 전까지
- 승인: 팀장"""
# 3. 질문 + 참고자료를 합쳐서 모델에 전달
result = qa(question="연차가 며칠이야?", context=context)
print(result)
# → {'answer': '15일', 'score': 0.98}
이게 RAG다. 모델을 훈련시키지 않았다. 참고자료를 같이 넘겼을 뿐이다.
실전 RAG — 문서가 많을 때
문서가 수천 개면 전부 프롬프트에 넣을 수 없다. 그래서 벡터 검색으로 관련 문서만 골라낸다:
# pip install sentence-transformers chromadb
from sentence_transformers import SentenceTransformer
import chromadb
# 1. 임베딩 모델로 문서를 벡터로 변환
embedder = SentenceTransformer("all-MiniLM-L6-v2")
# 2. 벡터 DB에 문서 저장
client = chromadb.Client()
collection = client.create_collection("company_docs")
docs = [
"연차는 15일이다. 반차 사용 가능.",
"출장비는 1일 10만원 한도.",
"재택근무는 주 2회까지 가능.",
]
collection.add(
documents=docs,
ids=[f"doc_{i}" for i in range(len(docs))]
)
# 3. 질문과 가장 비슷한 문서 검색
results = collection.query(query_texts=["휴가가 며칠이야?"], n_results=1)
print(results["documents"])
# → [['연차는 15일이다. 반차 사용 가능.']]
# 4. 검색된 문서를 프롬프트에 첨부 → 모델에 전달
파인튜닝 vs LoRA vs RAG
| 파인튜닝 | LoRA | RAG | |
|---|---|---|---|
| 가중치 변경 | ✅ 전부 | ✅ 일부 (어댑터) | ❌ 안 바꿈 |
| 훈련 필요 | 있음 | 있음 | 없음 |
| 데이터 업데이트 | 재훈련 필요 | 재훈련 필요 | 문서만 교체 |
| 비유 | 새 지식을 가르침 | 플러그인 끼움 | 참고자료 제공 |
| 환각 방지 | 보통 | 보통 | 강함 (출처 있음) |
RAG의 가장 큰 장점: 데이터가 바뀌면 문서만 업데이트하면 된다. 모델을 재훈련할 필요가 없다.
핵심 개념
1
사용자가 질문한다
2
문서 DB에서 관련 문서를 검색(Retrieval)한다 — 벡터 유사도 기반
3
검색된 문서를 프롬프트에 첨부한다 — \"이 참고자료를 바탕으로 답해줘\"
4
model(프롬프트 + 참고자료) → 답변 생성(Generation)
5
모델 가중치는 1도 안 바뀌었다 — 데이터 업데이트 = 문서만 교체
사용 사례
회사 내부 문서 QA — 사내 매뉴얼·정책 문서로 질의응답 봇 구축
최신 정보 반영 — 모델 재훈련 없이 문서만 업데이트하면 최신 답변
환각 방지 — 출처가 있는 문서 기반 답변으로 거짓 생성 줄이기