RAG 제대로 이해하기 - LLM에 '내 지식'을 붙이는 법
LLM은 똑똑하지만 두 가지 약점이 있습니다. 모르는 걸 아는 척(할루시네이션) 하고, 학습 시점 이후의 최신 정보나 우리 회사 내부 문서를 모른다는 점입니다. 이 둘을 가장 현실적으로 해결하는 방법이 RAG(Retrieval-Augmented Generation, 검색 증강 생성) 입니다.
이 글에서는 RAG가 무엇이고, 어떤 흐름으로 동작하며, 실무에서 어디를 조심해야 하는지를 정리합니다.
1. RAG는 한 문장으로
"질문과 관련 있는 문서를 먼저 찾아서, 그 내용을 프롬프트에 같이 넣어주고 답하게 하는 것."
모델을 다시 학습시키지 않습니다. 대신 답변 직전에 필요한 지식을 컨텍스트로 주입합니다. 비유하자면, 시험을 앞두고 머리에 다 외우게 하는 게 아니라 오픈북 시험처럼 관련 페이지를 펼쳐서 보여주는 것입니다.
2. 왜 파인튜닝이 아니라 RAG인가
"내 데이터를 넣고 싶으면 파인튜닝하면 되지 않나요?" 라는 질문을 많이 합니다. 셋을 비교하면 선택이 쉬워집니다.
| 방법 | 하는 일 | 강점 | 약점 |
|---|---|---|---|
| 프롬프트 | 요청할 때 예시·지침을 직접 넣음 | 가장 쉬움, 즉시 반영 | 넣을 수 있는 양 한계 |
| RAG | 관련 문서를 찾아 컨텍스트로 주입 | 최신성·출처 추적·비용 저렴 | 검색 품질에 좌우됨 |
| 파인튜닝 | 모델 가중치를 재학습 | 말투·형식·도메인 체화 | 비용·시간↑, 지식 갱신 어려움 |
핵심 감각:
- "무엇을 아는가(지식)" 를 바꾸고 싶다 → RAG
- "어떻게 말하는가(스타일·형식)" 를 바꾸고 싶다 → 파인튜닝
- 지식은 계속 바뀌는데 파인튜닝으로 넣으면, 문서 하나 바뀔 때마다 재학습해야 합니다. 그래서 변하는 지식은 RAG가 정답입니다.
3. RAG 파이프라인 전체 흐름
RAG는 크게 ① 색인(Indexing) 과 ② 질의(Query) 두 단계로 나뉩니다.
[색인 - 미리 준비]
문서 → 청킹(Chunking) → 임베딩(Embedding) → 벡터 DB 저장
[질의 - 사용자가 물어볼 때]
질문 → 임베딩 → 벡터 DB에서 유사 청크 검색 → 프롬프트에 주입 → LLM 답변
하나씩 뜯어봅니다.
3-1. 청킹(Chunking) — 문서를 잘게 나누기
문서를 통째로 넣을 수 없으니 의미 단위로 자릅니다.
- 너무 크게 자르면: 관련 없는 내용까지 딸려와 노이즈가 됩니다.
- 너무 작게 자르면: 문맥이 끊겨 검색해도 의미가 안 통합니다.
- 보통 300~800 토큰 + 약간의 오버랩(겹침) 으로 시작해 튜닝합니다.
// 아주 단순화한 청킹 예시
function chunk(text: string, size = 500, overlap = 50): [] {
: [] = [];
( i = ; i < text.; i += size - overlap) {
chunks.(text.(i, i + size));
}
chunks;
}