📎

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 — 사내 매뉴얼·정책 문서로 질의응답 봇 구축 최신 정보 반영 — 모델 재훈련 없이 문서만 업데이트하면 최신 답변 환각 방지 — 출처가 있는 문서 기반 답변으로 거짓 생성 줄이기