Fine-tuning vs RAG - 언제 무엇을 선택할까
LLM을 커스터마이징하는 두 가지 주요 방법인 Fine-tuning과 RAG의 차이점과 선택 기준을 알아봅니다.
개념 비교
| 항목 | Fine-tuning | RAG |
|---|
| 정의 | 모델 자체를 재학습 | 외부 지식을 검색해서 주입 |
| 데이터 | 모델에 내재화 | 외부 DB에서 실시간 검색 |
| 업데이트 | 재학습 필요 | DB만 업데이트 |
| 비용 | 학습 비용 높음 | 검색 인프라 비용 |
Fine-tuning이 적합한 경우
- 특정 도메인 용어/문체 학습 (의료, 법률)
- 일관된 출력 형식이 필요할 때
- 모델의 기본 행동 변경
- 데이터가 자주 변하지 않을 때
- 응답 지연시간이 중요할 때
RAG가 적합한 경우
- 최신 정보가 필요할 때 (뉴스, 주가)
- 데이터가 자주 업데이트될 때
- 출처 인용이 필요할 때
- 대용량 문서 기반 Q&A
- 환각(Hallucination) 방지가 중요할 때
RAG 아키텍처
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 사용자 │────▶│ 임베딩 │────▶│ 벡터 DB │
│ 질문 │ │ 모델 │ │ (검색) │
└─────────────┘ └─────────────┘ └──────┬──────┘
│
┌─────────────┐ ┌─────────────┐ │
│ LLM │◀────│ 프롬프트 │◀───────────┘
│ 응답 │ │ + 컨텍스트 │ 관련 문서
└─────────────┘ └─────────────┘
RAG 구현 예시 (LangChain)
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
# 1. 문서 임베딩 및 저장
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(documents, embeddings)
# 2. 검색 기반 QA 체인 생성
qa_chain = RetrievalQA.from_chain_type(
llm=ChatOpenAI(model="gpt-4o"),
retriever=vectorstore.as_retriever(search_kwargs={"k": 3}),
return_source_documents=True
)
# 3. 질문 응답
result = qa_chain({"query": "회사 휴가 정책이 어떻게 되나요?"})
print(result["result"])
print(result["source_documents"]) # 출처 문서
Fine-tuning 구현 예시 (OpenAI)
# 1. 학습 데이터 준비 (JSONL)
{"messages": [{"role": "user", "content": "질문"}, {"role": "assistant", "content": "답변"}]}
# 2. 파일 업로드
from openai import OpenAI
client = OpenAI()
file = client.files.create(
file=open("training_data.jsonl", "rb"),
purpose="fine-tune"
)
# 3. Fine-tuning 작업 생성
job = client.fine_tuning.jobs.create(
training_file=file.id,
model="gpt-4o-mini-2024-07-18"
)
# 4. 완료 후 사용
response = client.chat.completions.create(
model="ft:gpt-4o-mini:my-org::abc123", # Fine-tuned 모델
messages=[{"role": "user", "content": "질문"}]
)
하이브리드 접근
두 방식을 결합하면 더 좋은 결과를 얻을 수 있습니다.
# Fine-tuned 모델 + RAG
1. Fine-tuning으로 도메인 용어/문체 학습
2. RAG로 최신 데이터 검색 및 주입
3. 두 가지 장점 모두 활용
비용 비교
| 항목 | Fine-tuning | RAG |
|---|
| 초기 비용 | 학습 비용 (높음) | 벡터 DB 구축 (중간) |
| 운영 비용 | 추론 비용만 | 추론 + 검색 비용 |
| 업데이트 | 재학습 비용 | 문서 재인덱싱 (낮음) |
선택 가이드
if 데이터가_자주_변경됨:
return "RAG"
elif 특정_스타일/형식_필요:
return "Fine-tuning"
elif 출처_인용_필요:
return "RAG"
elif 지연시간_매우_중요:
return "Fine-tuning"
else:
return "RAG로 시작 후 필요시 Fine-tuning 추가"
벡터 DB 선택
| DB | 특징 |
|---|
| Pinecone | 관리형, 확장성 좋음 |
| Chroma | 로컬 개발용, 간단 |
| Weaviate | 오픈소스, 자체 호스팅 |
| Milvus | 대규모 처리 |