파인튜닝 vs RAG: 프로덕션 LLM에서 각 접근법을 언제 사용해야 할까

파인튜닝 vs RAG: 프로덕션 LLM에서 각 접근법을 언제 사용해야 할까

LLM을 프로덕션배포하다 보면 어느 순간 반드시 이 질문에 부딪힌다. “우리 서비스에 맞게 모델을 커스터마이징해야 하는데, 파인튜닝을 해야 할까, RAG를 써야 할까?”

팀 전체가 회의실에 모여 열띤 토론을 벌이는 상황—누군가는 “모델을 직접 학습시켜야 진짜 성능이 나온다”고 주장하고, 다른 누군가는 “그냥 문서 넣어서 검색하면 되는 거 아닌가요?”라고 말한다. 둘 다 틀리지 않았다. 문제는 어떤 상황에서 무엇을 선택하느냐다.

이 글은 그 선택을 잘못했을 때 치르는 비용—수백만 원짜리 GPU 학습 비용, 몇 달짜리 개발 일정, 배포 후 발견한 치명적 한계—을 경험하기 전에 올바른 결정을 내릴 수 있도록 돕기 위해 쓰였다. 솔직히 고백하자면, 나도 첫 번째 프로젝트에서 이 선택을 틀렸다. RAG로 충분했을 시스템에 파인튜닝을 먼저 시도하면서 몇 주를 날렸다.


파인튜닝과 RAG, 무엇이 다른가

먼저 두 접근법이 근본적으로 무엇을 해결하는지부터 짚고 넘어가야 한다.

파인튜닝(Fine-tuning)은 사전학습된 모델의 가중치를 도메인 특화 데이터로 추가 학습시키는 방법이다. 모델 내부에 지식을 “새겨넣는” 방식이라고 볼 수 있다. 학습이 끝나면 그 지식은 추론 시 별도의 외부 참조 없이 모델 자체에서 나온다.

RAG(Retrieval-Augmented Generation)는 모델 가중치는 건드리지 않고, 질의가 들어올 때마다 외부 데이터 소스에서 관련 문서를 검색해 컨텍스트로 주입하는 방법이다. 모델에게 “참고자료를 줘가며 답변하게 하는” 방식이다.

이 차이가 왜 중요하냐면, 두 접근법은 서로 다른 문제를 해결하기 때문이다. 이걸 헷갈리는 팀이 생각보다 많다.

구분파인튜닝RAG
해결 문제행동 방식, 어조, 형식지식의 최신성, 출처 추적
지식 갱신재학습 필요문서 업데이트로 즉시 반영
초기 비용높음 (GPU 학습)낮음 (인프라 구축)
운영 복잡도낮음 (추론만)높음 (검색 파이프라인 유지)
설명 가능성낮음높음 (출처 제공 가능)

파인튜닝이 진짜 필요한 순간

파인튜닝이 압도적 우위를 보이는 시나리오가 분명히 있다. 아래 세 가지가 그 핵심이다.

특정 출력 형식과 어조가 핵심일 때

법률 문서 검토 서비스를 만든다고 해보자. 사용자가 계약서를 올리면 리스크 포인트를 뽑아주는 기능이 필요하다. 여기서 중요한 건 단순히 “법률 지식”이 아니라, 출력의 형식이다. 조항 번호를 어떻게 인용하는지, 심각도 등급을 어떤 기준으로 분류하는지, 문장의 단호함은 어느 정도여야 하는지—이런 것들은 RAG로 주입할 수 있는 “정보”가 아니라 모델이 내면화해야 할 “행동 패턴”이다.

# 파인튜닝 학습 데이터 예시 (JSONL 형식)
{
  "messages": [
    {
      "role": "user",
      "content": "다음 조항을 검토해주세요: '본 계약의 지식재산권은 갑에게 귀속됩니다.'"
    },
    {
      "role": "assistant", 
      "content": "【리스크 등급: 높음】\n【해당 조항: 제7조 1항】\n\n귀속 대상이 '을이 개발한 성과물' 전체로 해석될 수 있어 계약 종료 후에도 을의 독자적 사용이 제한될 수 있습니다.\n\n【권고사항】 '본 계약 이행 목적으로 특별히 개발된 산출물'로 범위를 한정하는 문구 추가를 검토하십시오."
    }
  ]
}

이 형식—대괄호 태그, 조항 인용, 권고사항 분리—을 프롬프트로 지시해도 어느 정도 동작하지만, 수만 건의 실제 사례로 파인튜닝된 모델은 이 패턴을 훨씬 안정적으로, 훨씬 짧은 프롬프트로 재현한다. 내 경험상 프롬프트 길이가 절반 이하로 줄고, 형식 이탈 빈도도 눈에 띄게 낮아진다. 토큰 비용도 자연히 줄어든다.

모델이 특수한 언어나 기호 체계를 다뤄야 할 때

의료 분야의 SNOMED CT 코드, 금융의 FIX 프로토콜 메시지, 특정 회사만의 내부 DSL—이런 것들은 범용 모델이 제대로 이해하기 어렵다. RAG로 “FIX 메시지 형식 설명서”를 넣어줄 수는 있지만, 모델이 그 형식으로 직접 생성하거나 파싱하는 능력은 학습을 통해 길러지는 쪽이 훨씬 효과적이다.

추론 속도와 프롬프트 길이가 제약 조건일 때

모바일 앱에 탑재하거나 실시간 응답이 필요한 경우, RAG가 추가하는 레이턴시(검색 + 컨텍스트 구성)와 토큰 증가가 치명적일 수 있다. 파인튜닝된 소형 모델(7B~13B)이 RAG 없이도 충분한 성능을 낸다면, 전체 시스템 아키텍처가 단순해진다.


RAG가 압도적으로 유리한 상황

반대로, RAG가 유일한 현실적 선택지인 상황도 분명히 존재한다.

지식이 자주 바뀔 때

회사 내부 정책, 제품 문서, 규정—이런 것들은 분기마다, 심지어 매달 바뀐다. 파인튜닝된 모델은 재학습 없이 이 변화를 반영할 수 없다. 반면 RAG는 문서 저장소를 업데이트하는 것만으로 즉시 반영된다.

# RAG 파이프라인 기본 구조 (LangChain 사용 예)
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
from langchain.chains import RetrievalQA

# 문서 업데이트 시 벡터 저장소만 갱신
embeddings = OpenAIEmbeddings()
vectorstore = Chroma(
    collection_name="company_docs",
    embedding_function=embeddings,
    persist_directory="./chroma_db"
)

# 새 정책 문서 추가 (재학습 불필요)
vectorstore.add_documents(new_policy_docs)

# QA 체인 구성
llm = ChatOpenAI(model="gpt-4o", temperature=0)
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    retriever=vectorstore.as_retriever(search_kwargs={"k": 5}),
    return_source_documents=True  # 출처 추적 가능
)

result = qa_chain.invoke({"query": "재택근무 장비 지원 기준이 어떻게 되나요?"})
print(result["result"])
print("출처:", [doc.metadata["source"] for doc in result["source_documents"]])

답변의 근거를 제시해야 할 때

금융, 의료, 법률 영역에서는 “왜 그렇게 답했는가”를 추적할 수 있어야 한다. RAG는 어떤 문서에서 어떤 내용을 참조했는지 출처를 함께 반환할 수 있다. 파인튜닝된 모델의 지식은 가중치 속에 분산되어 있어 출처 추적이 근본적으로 불가능하다—이건 규제 환경에서는 치명적인 약점이다.

도입 속도와 초기 비용이 중요할 때

MVP를 빠르게 검증해야 하는 스타트업이나 파일럿 프로젝트라면, 파인튜닝의 학습 파이프라인 구축—데이터 수집, 정제, 학습, 평가, 배포—에 드는 시간과 비용을 감당하기 어려울 수 있다. RAG는 벡터 데이터베이스 세팅과 문서 임베딩만으로 며칠 안에 프로토타입을 만들 수 있다.

긴 문서나 대용량 지식 베이스를 다룰 때

수천 개의 제품 매뉴얼, 수년치 판례, 회사 전체의 위키—이런 분량을 모두 파인튜닝 데이터로 쓰는 건 비효율적이다. 컨텍스트 윈도우 한계로 인해 한 번에 처리할 수 없는 대용량 문서는 RAG의 검색 메커니즘이 필요하다.


비용과 운영 복잡도: 현실적인 계산

의사결정에서 기술적 적합성만큼 중요한 게 운영 현실이다.

파인튜닝의 실제 비용 구조

  • 초기 학습: GPT-4o 파인튜닝 기준, 학습 데이터 1M 토큰당 약 $25. 1만 건의 고품질 예시가 평균 500 토큰이라면 약 $125. 여기에 데이터 수집·정제 인건비가 훨씬 크다.
  • 재학습 주기: 지식이 바뀔 때마다 반복 발생
  • 추론 비용: 파인튜닝된 모델은 베이스 모델 대비 추론 비용이 높은 경우가 많다 (OpenAI 기준 2~4배)
  • 평가 비용: 파인튜닝 후 성능 회귀 여부를 검증하는 평가 파이프라인이 필요하다

RAG의 실제 비용 구조

  • 인프라: 벡터 DB (Pinecone, Weaviate, pgvector 등) 월 $50~$500+ (규모에 따라)
  • 임베딩 비용: 문서 업데이트 시마다 발생. OpenAI text-embedding-3-small 기준 1M 토큰당 $0.02로 저렴하지만, 수백만 문서라면 누적된다
  • 검색 레이턴시: 평균 100~300ms 추가. 실시간 서비스에서 체감될 수 있다
  • 유지보수: 청킹 전략, 임베딩 모델 업데이트, 검색 품질 모니터링 등 지속적 관리 필요

가장 흔한 실수는 RAG를 “단순히 문서 붙이면 되는 것”으로 과소평가하는 것이다. 청킹 전략 하나만 봐도—고정 길이, 의미 단위, 계층적 청킹, 문서 구조 기반 청킹—제대로 설계하는 데 상당한 노력이 든다. 실제로 나는 512 토큰 고정 청킹으로 시작했다가 검색 품질이 너무 들쑥날쑥해서 전체 파이프라인을 뜯어고친 경험이 있다. 처음부터 도메인 구조에 맞는 청킹을 설계하는 게 훨씬 낫다.


실무 결정 프레임워크

파인튜닝 vs RAG 선택 시 아래 질문들을 순서대로 답해보자.

1. 지식이 주기적으로 바뀌는가?
   → YES: RAG 우선 검토
   → NO: 다음 질문으로

2. 답변 출처 추적이 필수 요건인가?
   → YES: RAG 필수
   → NO: 다음 질문으로

3. 모델의 출력 형식/어조/스타일이 핵심 차별점인가?
   → YES: 파인튜닝 검토
   → NO: 다음 질문으로

4. 특수 기호 체계나 도메인 언어를 생성해야 하는가?
   → YES: 파인튜닝 강력 권고
   → NO: 다음 질문으로

5. 초기 데이터가 충분한가? (최소 수천~수만 건의 고품질 예시)
   → YES: 파인튜닝 진행 가능
   → NO: RAG로 시작 후 파인튜닝 검토

6. 추론 레이턴시가 100ms 이하여야 하는가?
   → YES: 파인튜닝된 소형 모델 검토
   → NO: 요구사항에 따라 선택

하이브리드 접근법: 둘 다 써야 할 때

실무에서 가장 성능이 좋은 시스템 중 상당수가 파인튜닝과 RAG를 함께 쓴다. 역할을 명확히 나누면 시너지가 난다.

파인튜닝이 담당하는 것:
– 출력 형식과 어조 일관성
– 도메인 특화 언어 이해
– 짧은 프롬프트로도 원하는 행동 유도

RAG가 담당하는 것:
– 최신 정보 주입
– 구체적 사실 관계 (수치, 날짜, 이름)
– 출처 제공

# 하이브리드 패턴 예시
from openai import OpenAI

client = OpenAI()

def hybrid_query(user_question: str, retrieved_docs: list[str]) -> str:
    # 파인튜닝된 모델이 형식과 어조를 담당
    # RAG가 가져온 문서가 최신 지식을 공급
    context = "\n\n".join(retrieved_docs)

    response = client.chat.completions.create(
        model="ft:gpt-4o-mini:your-org:legal-reviewer:abc123",  # 파인튜닝 모델
        messages=[
            {
                "role": "system",
                "content": "당신은 법률 문서 검토 전문가입니다."
            },
            {
                "role": "user",
                "content": f"참고 자료:\n{context}\n\n질문: {user_question}"
            }
        ],
        temperature=0.1
    )
    return response.choices[0].message.content

다만 하이브리드는 복잡도도 두 배다. 두 시스템을 모두 유지·개선해야 하므로, 팀 규모와 역량을 냉정하게 평가한 뒤 도입해야 한다. “일단 다 쓰면 더 좋겠지”라는 생각으로 시작했다가 유지보수 부담에 지치는 팀을 꽤 봤다.


자주 저지르는 실수 3가지

1. 데이터 없이 파인튜닝 계획 세우기
“파인튜닝하면 잘 되겠지”라는 기대로 시작했다가, 고품질 학습 데이터 수집이 프로젝트 전체 일정의 80%를 잡아먹는 경우가 흔하다. 파인튜닝을 결정하기 전에 학습 데이터 확보 계획부터 세워라.

2. RAG 청킹을 대충 설계하기
512 토큰 고정 청킹으로 시작해서 “왜 검색이 엉뚱한 걸 가져오지?”를 반복하다가 결국 전체를 다시 설계하는 팀이 많다. 도메인에 맞는 청킹 전략—FAQ는 Q&A 단위, 기술 문서는 섹션 단위, 계약서는 조항 단위—을 처음부터 고민하라. (그리고 청킹 전략을 바꾸면 기존 임베딩을 전부 재생성해야 한다는 것도 미리 염두에 두자.)

3. 평가 없이 배포하기
파인튜닝 후 “느낌상 좋아진 것 같다”로 배포하거나, RAG 검색 품질을 수동으로만 확인하는 경우가 많다. 정량 평가 지표—파인튜닝은 포맷 일치율, RAG는 검색 정밀도(Precision@K)와 답변 충실도—를 배포 전에 반드시 측정하라.


기술보다 요구사항이 먼저다

파인튜닝 vs RAG는 “무엇이 더 좋은가”의 문제가 아니다. 어떤 문제를 해결하려는가에 따라 답이 달라지는 도구 선택의 문제다.

지식이 자주 바뀌고 출처 추적이 필요하다면 RAG가 맞다. 출력의 형식과 스타일이 차별점이고 학습 데이터가 있다면 파인튜닝이 맞다. 둘 다 필요하다면 하이브리드를—단, 그 복잡도를 감당할 준비가 됐을 때만.

가장 실용적인 조언은 이것이다: 먼저 베이스 모델 + RAG로 시작하라. 이게 충분하지 않은 구체적인 이유가 발견됐을 때 파인튜닝을 추가해라. 반대 순서로 하면 불필요한 비용과 시간을 낭비하는 경우가 더 많다—내가 그랬던 것처럼.


다음 단계로 고민 중이라면:

실제 프로젝트에서 파인튜닝 또는 RAG를 적용하면서 겪은 구체적인 문제—학습 데이터 설계, 청킹 전략, 평가 파이프라인 구성—가 있다면 댓글로 남겨주세요. 후속 글에서 실제 사례 기반으로 다뤄보겠습니다.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top